annotate TrainingMessageOrganiser.h @ 14:f83635861187

rewrote sequence controller. ticks show relevant UI modes. images show for preset textures (but greenish?)
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Tue, 21 Oct 2014 16:39:39 +0100
parents ab3e0e980c82
children 2da0350a4aa2
rev   line source
rt300@8 1 //
rt300@8 2 // TrainingMessageOrganiser.h
rt300@8 3 // riftathon
rt300@8 4 //
rt300@8 5 // Created by Robert Tubb on 17/10/2014.
rt300@8 6 //
rt300@8 7 //
rt300@8 8
rt300@8 9 #ifndef __riftathon__TrainingMessageOrganiser__
rt300@8 10 #define __riftathon__TrainingMessageOrganiser__
rt300@8 11
rt300@8 12 #include <iostream>
rt300@9 13 #include "MessageOrganiser.h"
rt300@10 14 #include "SequenceController.h"
rt300@11 15 #include "globalVariables.h"
rt300@12 16 #include "IconPanel.h"
rt300@12 17
rt300@10 18 extern ExplorePresetManager expPresetManager;
rt300@10 19
rt300@9 20 class TrainingMessageOrganiser : public MessageOrganiser {
rt300@9 21 public:
rt300@14 22 int numParamsToUse;
rt300@9 23 void init( PDSynthWrapper& cs, PDSynthWrapper& ts){
rt300@9 24
rt300@9 25 MessageOrganiser::init(cs,ts);
rt300@11 26
rt300@11 27 TickListenerFunction callback;
rt300@11 28 callback = boost::bind(&TrainingMessageOrganiser::onNextTick, this, _1);
rt300@11 29 candidateSynth.registerForTicks(callback);
rt300@12 30
rt300@14 31 numParamsToUse = 3;
rt300@14 32
rt300@11 33 }
rt300@14 34
rt300@9 35 void setupDefaultMapping(){
rt300@9 36 vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
rt300@9 37
rt300@9 38 controlPanelType cpt = REVISITABLE;
rt300@9 39 vector<controllerType> elemList;
rt300@14 40 for(int i = 0; i < numParamsToUse; i++){
rt300@9 41 elemList.push_back(SLIDER);
rt300@9 42 }
rt300@9 43
rt300@9 44 vector<UIElement*> UIElemHandles = panel->generateControls(elemList, cpt);
rt300@9 45
rt300@9 46 mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
rt300@9 47
rt300@9 48 bottomPanel->show();
rt300@9 49 }
rt300@9 50
rt300@9 51 vector<int> getMappingIDsFromSynths(){
rt300@9 52 vector<int> index;
rt300@14 53 for(int i = 0; i < numParamsToUse; i++){
rt300@9 54 index.push_back(i);
rt300@9 55 }
rt300@9 56 vector<int> mids = candidateSynth.getMappingIDForIndices(index);
rt300@9 57
rt300@9 58 return mids;
rt300@9 59 }
rt300@9 60
rt300@9 61 void setupNewTest(){
rt300@14 62
rt300@9 63
rt300@9 64 };
rt300@10 65
rt300@12 66 void setIconPanel(IconPanel * ip){
rt300@12 67 presetIconPanel = ip;
rt300@12 68 }
rt300@14 69 void setInstructionPanel(TextPanel * ip){
rt300@14 70 instructionPanel = ip;
rt300@14 71 instructionPanel->show();
rt300@14 72 }
rt300@14 73 //-----------------------------------------------------------------------
rt300@14 74 void displayInstructions(Step s){
rt300@14 75
rt300@14 76
rt300@14 77 if (s.type == Step::COUNT_IN){
rt300@14 78 instructionPanel->setText("GET READY");
rt300@14 79 }
rt300@14 80 if (s.type == Step::PREVIEW_DISPLAY){
rt300@14 81 instructionPanel->setText("MEMORISE");
rt300@14 82 panel->setColor(ofColor(0,0,0));
rt300@14 83 }
rt300@14 84 if (s.type == Step::PREVIEW_PLAY){
rt300@14 85 instructionPanel->setText("MEMORISE");
rt300@14 86 panel->setColor(ofColor(0,0,0));
rt300@14 87 }
rt300@14 88 if (s.type == Step::MATCHING_INTERACTION){
rt300@14 89 instructionPanel->setText("MATCH:");
rt300@14 90 panel->setColor(ofColor(100,0,0));
rt300@14 91 }
rt300@14 92 if (s.type == Step::MATCHING_RESULT){
rt300@14 93 instructionPanel->setText("RESULT");
rt300@14 94 panel->setColor(ofColor(0,100,0));
rt300@14 95 }
rt300@14 96 }
rt300@14 97 //-----------------------------------------------------------------------
rt300@10 98 void onNextTick(int tickNumber){
rt300@11 99 cout << "TICK " << tickNumber << endl;
rt300@14 100
rt300@14 101 // only first beat in bar is active one
rt300@14 102 if ( tickNumber % 4 != 0){
rt300@14 103 return;
rt300@14 104 }
rt300@14 105 // load next target preset
rt300@11 106
rt300@14 107 Step newStep = sequenceController.getNextStep();
rt300@14 108 displayInstructions(newStep);
rt300@14 109
rt300@14 110 if(newStep.isLastOfAll){
rt300@14 111 // do finished run stuff, show summary
rt300@14 112 candidateSynth.stopMetronome();
rt300@14 113 cout << "FINISHED BLOCK" << endl;
rt300@10 114 }
rt300@14 115 if(newStep.isLastOfRun){
rt300@13 116 // do finished run stuff, show summary
rt300@13 117 candidateSynth.stopMetronome();
rt300@13 118 cout << "FINISHED RUN" << endl;
rt300@13 119 }
rt300@14 120
rt300@14 121 float t = newStep.getTimeBetweenTicks();
rt300@14 122 candidateSynth.setMetroTime(t);
rt300@14 123
rt300@14 124 if(newStep.type == Step::COUNT_IN){
rt300@14 125 // count in
rt300@14 126 return;
rt300@13 127 }
rt300@14 128
rt300@14 129 if(newStep.presetIndex >= 0 && newStep.presetIndex <= 8){
rt300@14 130 currentTargetPreset = expPresetManager.getPreset(newStep.presetIndex);
rt300@14 131 }
rt300@14 132
rt300@14 133 if(newStep.showsTargetIcon){
rt300@14 134 presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage());
rt300@14 135 presetIconPanel->show();
rt300@14 136 }else{
rt300@14 137 presetIconPanel->hide();
rt300@14 138 }
rt300@14 139
rt300@14 140 if(newStep.showsControlSettings){
rt300@14 141 targetSynth.setAllParams(currentTargetPreset->getValues());
rt300@14 142 setSlidersToTarget();
rt300@14 143
rt300@14 144 }else{
rt300@14 145 //setSlidersToDefault();
rt300@14 146
rt300@14 147 }
rt300@14 148
rt300@14 149 if(newStep.playsTarget){
rt300@14 150 targetSynth.setAllParams(currentTargetPreset->getValues());
rt300@14 151 targetSynth.trigger();
rt300@14 152 }
rt300@14 153
rt300@14 154 if(newStep.playsCandidate){
rt300@14 155 triggerCandidateSound();
rt300@14 156 }
rt300@14 157
rt300@14 158 if(newStep.allowsCandidateControl){
rt300@14 159 panel->setActive(true);
rt300@14 160 }else{
rt300@14 161 panel->setActive(false);
rt300@14 162 }
rt300@14 163
rt300@14 164 if(newStep.showsMatchResults){
rt300@14 165 // do something
rt300@14 166 }
rt300@14 167
rt300@14 168 if(newStep.showsControlGuides){
rt300@14 169
rt300@14 170 panel->setHintValues(currentTargetPreset->getValues());
rt300@14 171 panel->showHint(true);
rt300@14 172 }else{
rt300@14 173 panel->showHint(false);
rt300@14 174 }
rt300@14 175
rt300@10 176 }
rt300@14 177
rt300@14 178 //-----------------------------------------------------------------------
rt300@9 179 protected:
rt300@12 180 void showUserHowTheyDid(){
rt300@12 181 // colour flash
rt300@12 182 // distance ?
rt300@12 183 // score
rt300@12 184
rt300@12 185 }
rt300@10 186 void loadPreset(string pname){
rt300@10 187
rt300@10 188 vector<int> values = expPresetManager.recallPreset(pname);
rt300@10 189 if (values.size()){
rt300@10 190 candidateSynth.setAllParams(values);
rt300@10 191 setAllSlidersToValues(values);
rt300@10 192 }else{
rt300@10 193 cout << "ERROR, no preset found" << endl;
rt300@10 194 }
rt300@10 195 }
rt300@10 196
rt300@10 197
rt300@14 198 //-----------------------------------------------------------------------
rt300@10 199 void showATargetPresetWithGuide(Preset * p){ // this is when demoing the sequence to the user
rt300@10 200 // p.show icon
rt300@10 201 vector<int> values = p->getValues();
rt300@10 202 if (values.size()){
rt300@10 203 candidateSynth.setAllParams(values);
rt300@10 204 setAllSlidersToValues(values);
rt300@10 205 }else{
rt300@10 206 cout << "WARNING, preset to show had no values" << endl;
rt300@10 207 }
rt300@10 208 }
rt300@14 209 //-----------------------------------------------------------------------------
rt300@10 210
rt300@9 211 void mapSlidersToParams(vector<UIElement*> elems, vector<int> mids){
rt300@9 212
rt300@9 213 vector<UIElement*>::iterator elit;
rt300@9 214 vector<int> typeListLog;
rt300@9 215 int i = 0;
rt300@9 216 for(elit=elems.begin(); elit<elems.end();elit++){
rt300@9 217 if ( (*elit)->getType() == SLIDER){
rt300@9 218 if(i >= mids.size()){
rt300@9 219
rt300@9 220 cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl;
rt300@9 221 }
rt300@9 222
rt300@9 223 ButtronSlider* theSlider = (ButtronSlider*)(*elit);
rt300@9 224 mapControlToParam((*elit), mids[i]);
rt300@9 225 theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i]));
rt300@9 226 cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl;
rt300@9 227 theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])));
rt300@9 228 i++;
rt300@9 229 typeListLog.push_back(int(SLIDER));
rt300@9 230
rt300@9 231 }else{
rt300@9 232 cout << "ERROR ERROR: ui type not handled my mapping function !" << endl;
rt300@9 233 }
rt300@9 234 }
rt300@9 235
rt300@9 236 eventLogger.logEvent(CONTROL_LIST,typeListLog);
rt300@9 237 };
rt300@14 238 //-----------------------------------------------------------------------------
rt300@9 239
rt300@9 240 void buttonPressCallback(int mappingID, int value){
rt300@9 241 if(mappingID == VOLUME_CHANGE_ID){
rt300@9 242 targetSynth.sendVolume(value);
rt300@9 243 candidateSynth.sendVolume(value);
rt300@10 244 return;
rt300@9 245 }
rt300@14 246
rt300@9 247 if (mappingID == TRIGGER_CANDIDATE_ID){
rt300@14 248 //triggerCandidateSound();
rt300@10 249 // compare to target
rt300@14 250 candidateSynth.setMetroTime(sequenceController.getStartTickTime());
rt300@11 251 candidateSynth.startMetronome();
rt300@10 252 return;
rt300@10 253 }
rt300@10 254 if(mappingID == SAVE_PRESET_HIT){
rt300@10 255 expPresetManager.savePreset("blah", candidateSynth.getAllParamValues());
rt300@10 256 return;
rt300@10 257 }
rt300@10 258 if(mappingID == RECALL_PRESET_HIT){
rt300@10 259
rt300@10 260 loadPreset("blah");
rt300@9 261 return;
rt300@9 262 }
rt300@9 263 }
rt300@14 264 //-----------------------------------------------------------------------------
rt300@14 265
rt300@10 266 SequenceController sequenceController;
rt300@10 267 bool sequencePreview;
rt300@10 268 Preset * currentTargetPreset;
rt300@12 269 IconPanel* presetIconPanel;
rt300@14 270 TextPanel* instructionPanel;
rt300@8 271 };
rt300@8 272 #endif /* defined(__riftathon__TrainingMessageOrganiser__) */