rt300@8
|
1 //
|
rt300@8
|
2 // TrainingMessageOrganiser.mm
|
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 #include "TrainingMessageOrganiser.h"
|
rt300@21
|
10
|
rt300@45
|
11 void TrainingMessageOrganiser::init( PDSynthWrapper& cs, PDSynthWrapper& ts, bool soundOnlyMode, controlPanelType whichInterfaceAreWeUsing, bool demoMode ){
|
rt300@21
|
12
|
rt300@21
|
13 MessageOrganiser::init(cs,ts);
|
rt300@21
|
14
|
rt300@21
|
15 TickListenerFunction callback;
|
rt300@27
|
16 callback = boost::bind(&TrainingMessageOrganiser::onNextTickAnim, this, _1);
|
rt300@21
|
17 candidateSynth.registerForTicks(callback);
|
rt300@21
|
18
|
rt300@21
|
19 numParamsToUse = TOTAL_NUM_PARAMS;
|
rt300@42
|
20
|
rt300@49
|
21 sequenceController = new SequenceController();
|
rt300@49
|
22 sequenceController->init(soundOnlyMode,whichInterfaceAreWeUsing, demoMode);
|
rt300@42
|
23
|
rt300@43
|
24 setup(whichInterfaceAreWeUsing);
|
rt300@21
|
25 }
|
rt300@21
|
26
|
rt300@27
|
27 void TrainingMessageOrganiser::setup(controlPanelType whichInterfaceAreWeUsing){
|
rt300@27
|
28
|
rt300@27
|
29 setupDefaultMapping(whichInterfaceAreWeUsing);
|
rt300@27
|
30
|
rt300@39
|
31 candidateSynth.setAllParams(expPresetManager.getNeutralPreset()->getValues());
|
rt300@36
|
32
|
rt300@36
|
33 doHand(true);
|
rt300@42
|
34 doGuides(false,expPresetManager.getNeutralPreset());
|
rt300@42
|
35 bottomPanel->showAllElements();
|
rt300@43
|
36
|
rt300@27
|
37 }
|
rt300@43
|
38
|
rt300@38
|
39 void TrainingMessageOrganiser::setForgotButton(Buttron* butt){
|
rt300@38
|
40 forgotButton = butt;
|
rt300@38
|
41 }
|
rt300@27
|
42 //----------------------------------------------------------------------------------------
|
rt300@22
|
43 void TrainingMessageOrganiser::showMyPanels(){
|
rt300@22
|
44 presetIconPanel->show();
|
rt300@22
|
45 instructionPanel->show();
|
rt300@22
|
46 bottomPanel->show();
|
rt300@27
|
47 controlPanel->show();
|
rt300@37
|
48 if (panelType == LEAP6DOF){
|
rt300@37
|
49 okToGetMidi = true; // allow midi input to thing
|
rt300@37
|
50 }else{
|
rt300@37
|
51 okToGetMidi = false;
|
rt300@37
|
52 }
|
rt300@22
|
53 }
|
rt300@21
|
54
|
rt300@21
|
55 //-----------------------------------------------------------------------
|
rt300@27
|
56 void TrainingMessageOrganiser::displayInstructions(string text){
|
rt300@42
|
57
|
rt300@28
|
58 instructionPanel->setText(text);
|
rt300@27
|
59 instructionPanel->show();
|
rt300@42
|
60
|
rt300@21
|
61 }
|
rt300@21
|
62
|
rt300@21
|
63 //-----------------------------------------------------------------------
|
rt300@21
|
64
|
rt300@21
|
65 void TrainingMessageOrganiser::showUserHowTheyDid(){
|
rt300@21
|
66 // colour flash
|
rt300@21
|
67 // distance ?
|
rt300@21
|
68 // score
|
rt300@21
|
69
|
rt300@21
|
70 }
|
rt300@21
|
71
|
rt300@32
|
72
|
rt300@43
|
73
|
rt300@21
|
74 //-----------------------------------------------------------------------------
|
rt300@21
|
75
|
rt300@21
|
76 void TrainingMessageOrganiser::buttonPressCallback(int mappingID, int value){
|
rt300@21
|
77 if(mappingID == VOLUME_CHANGE_ID){
|
rt300@21
|
78 targetSynth.sendVolume(value);
|
rt300@21
|
79 candidateSynth.sendVolume(value);
|
rt300@21
|
80 return;
|
rt300@21
|
81 }
|
rt300@21
|
82
|
rt300@29
|
83 if (mappingID == START_TRAINING_SEQUENCE_ID){
|
rt300@38
|
84 // start next run
|
rt300@38
|
85 if (candidateSynth.isMetronomeRunning()){
|
rt300@38
|
86 // skip to next run?
|
rt300@38
|
87 eventLogger.logEvent(RUN_SKIPPED);
|
rt300@38
|
88 }else{
|
rt300@49
|
89 candidateSynth.setMetroTime(sequenceController->getStartIntervalTime()/4.);
|
rt300@42
|
90 candidateSynth.startMetronome();
|
rt300@47
|
91 candidateSynth.playDownbeatBlip();
|
rt300@42
|
92 bottomPanel->hide();
|
rt300@42
|
93
|
rt300@42
|
94 vector<int> details;
|
rt300@42
|
95 details.push_back(panelType);
|
rt300@43
|
96 // TODO sequence length
|
rt300@42
|
97
|
rt300@42
|
98 eventLogger.logEvent(START_NEW_RUN, details);
|
rt300@38
|
99 }
|
rt300@21
|
100 return;
|
rt300@21
|
101 }
|
rt300@21
|
102
|
rt300@37
|
103 if(mappingID == TO_MENU_ID){
|
rt300@37
|
104 // tell testapp to start again?
|
rt300@49
|
105 // candidateSynth.stopMetronome();
|
rt300@49
|
106 // controlPanel->hide();
|
rt300@49
|
107 // controlPanel->setColor(ofColor::black);
|
rt300@49
|
108 // sequenceController->clearAll();
|
rt300@49
|
109 // seqNumPanel->hide();
|
rt300@49
|
110 // eventLogger.logEvent(RUN_SKIPPED);
|
rt300@49
|
111 // eventLogger.saveSessionToFile();
|
rt300@49
|
112 reset();
|
rt300@38
|
113 }
|
rt300@37
|
114
|
rt300@38
|
115 if(mappingID == FORGOT_SEQ_ID){
|
rt300@38
|
116 //
|
rt300@38
|
117 eventLogger.logEvent(FORGOT_SEQ);
|
rt300@38
|
118 cout << "FORGOT" << endl;
|
rt300@37
|
119 }
|
rt300@43
|
120 if(mappingID == SKIP_RUN_ID){
|
rt300@49
|
121 sequenceController->skipRun();
|
rt300@49
|
122 int r = sequenceController->getCurrentRunNumber();
|
rt300@43
|
123 stringstream s;
|
rt300@49
|
124 s << ">> " << r+1;
|
rt300@43
|
125 skipButton->setLabel(s.str());
|
rt300@43
|
126
|
rt300@43
|
127
|
rt300@43
|
128 }
|
rt300@37
|
129
|
rt300@21
|
130 }
|
rt300@21
|
131 //-----------------------------------------------------------------------------
|
rt300@27
|
132
|
rt300@27
|
133 //-----------------------------------------------------------------------
|
rt300@27
|
134 void TrainingMessageOrganiser::onNextTick(int tickNumber){
|
rt300@27
|
135 static int showingCountdown = false;
|
rt300@42
|
136
|
rt300@27
|
137 downCounter = 4 - tickNumber % 4;
|
rt300@27
|
138
|
rt300@27
|
139 if (showingCountdown){
|
rt300@27
|
140 middlePanel->setText(ofToString(downCounter));
|
rt300@27
|
141 }
|
rt300@27
|
142
|
rt300@27
|
143 // only first beat in bar is active one
|
rt300@27
|
144 if ( tickNumber % 4 != 0){
|
rt300@27
|
145
|
rt300@27
|
146 return;
|
rt300@27
|
147 }
|
rt300@27
|
148
|
rt300@27
|
149 }
|
rt300@32
|
150 void TrainingMessageOrganiser::lastOfRun(int which){
|
rt300@27
|
151 candidateSynth.stopMetronome();
|
rt300@32
|
152 stringstream s;
|
rt300@32
|
153
|
rt300@49
|
154 s << "FINISHED RUN " << which << " OF " << sequenceController->getTotNumRuns() << endl;
|
rt300@50
|
155
|
rt300@50
|
156 if ((which % 3) == 0){
|
rt300@50
|
157 s << "sequence will be 1 sound long";
|
rt300@50
|
158 }
|
rt300@50
|
159 if ((which % 3) == 1){
|
rt300@50
|
160 s << "sequence will be 2 sounds long";
|
rt300@50
|
161 }
|
rt300@50
|
162 if ((which % 3) == 2){
|
rt300@50
|
163 s << "sequence will be 3 sounds long";
|
rt300@50
|
164 }
|
rt300@27
|
165 controlPanel->hide();
|
rt300@36
|
166 controlPanel->setColor(ofColor::black);
|
rt300@36
|
167 middlePanel->setText(s.str());
|
rt300@27
|
168 middlePanel->show();
|
rt300@32
|
169 //playCandidateButton->setLabel("NEXT");
|
rt300@44
|
170 s.str("");
|
rt300@50
|
171 s << "skp" << which+1;
|
rt300@43
|
172 skipButton->setLabel(s.str());
|
rt300@43
|
173
|
rt300@29
|
174 bottomPanel->show();
|
rt300@32
|
175 seqNumPanel->hide();
|
rt300@42
|
176 forgotButton->hide();
|
rt300@49
|
177 instructionPanel->setText("");
|
rt300@33
|
178 eventLogger.logEvent(FINISHED_RUN);
|
rt300@34
|
179 eventLogger.saveSessionToFile();
|
rt300@43
|
180 // TODO keep track of how far we are into experiment
|
rt300@27
|
181 }
|
rt300@27
|
182 void TrainingMessageOrganiser::lastOfAll(){
|
rt300@27
|
183 candidateSynth.stopMetronome();
|
rt300@29
|
184 cout << "FINISHED BLOCK" << endl;
|
rt300@27
|
185 controlPanel->hide();
|
rt300@36
|
186 controlPanel->setColor(ofColor::black);
|
rt300@43
|
187 middlePanel->setText("CONGRATULATIONS.\n FINISHED BLOCK!");
|
rt300@27
|
188 middlePanel->show();
|
rt300@50
|
189 //bottomPanel->showOnlyElementNamed("MENU");
|
rt300@29
|
190 bottomPanel->show();
|
rt300@35
|
191 seqNumPanel->hide();
|
rt300@42
|
192 forgotButton->hide();
|
rt300@50
|
193 eventLogger.logEvent(FINISHED_RUN);
|
rt300@34
|
194 eventLogger.saveSessionToFile();
|
rt300@27
|
195 }
|
rt300@32
|
196
|
rt300@42
|
197 void TrainingMessageOrganiser::logNewStep(AnimStep newStep, vector<int> targetVals){
|
rt300@32
|
198
|
rt300@32
|
199 vector<int> details;
|
rt300@32
|
200 details.push_back(int(newStep.type));
|
rt300@32
|
201 details.push_back(newStep.whichInSequence);
|
rt300@32
|
202 details.push_back(newStep.showsGuides);
|
rt300@32
|
203 details.push_back(newStep.showsIcons);
|
rt300@32
|
204 details.push_back(newStep.presetIndex);
|
rt300@32
|
205 details.push_back(newStep.tempo);
|
rt300@42
|
206 details.insert(details.end(),targetVals.begin(), targetVals.end());
|
rt300@32
|
207 eventLogger.logEvent(NEW_STEP, details);
|
rt300@32
|
208
|
rt300@32
|
209 }
|
rt300@32
|
210
|
rt300@27
|
211 //-----------------------------------------------------------------------------
|
rt300@27
|
212 void TrainingMessageOrganiser::onNextTickAnim(int tickNumber){
|
rt300@31
|
213 static AnimStep oldStep;
|
rt300@35
|
214 static vector<int> lastPosition = zeros<int>(TOTAL_NUM_PARAMS);
|
rt300@27
|
215
|
rt300@35
|
216 //cout << "TICK " << tickNumber << endl;
|
rt300@27
|
217
|
rt300@50
|
218 // HALF METRO
|
rt300@50
|
219 bool halfMetro = false;
|
rt300@50
|
220
|
rt300@50
|
221 if ( halfMetro){
|
rt300@50
|
222 downCounter = 2 - tickNumber % 2;
|
rt300@50
|
223
|
rt300@50
|
224 if ( tickNumber % 2 != 0) {
|
rt300@50
|
225 if (tickNumber % 2 == 1){
|
rt300@50
|
226 targetSynth.sendAllParams();
|
rt300@50
|
227 }
|
rt300@50
|
228 return;
|
rt300@50
|
229 };
|
rt300@50
|
230 }else{
|
rt300@50
|
231 downCounter = 4 - tickNumber % 4;
|
rt300@50
|
232
|
rt300@50
|
233 updateCountdown(downCounter);
|
rt300@50
|
234 // only first beat in bar is active one (at the moment)
|
rt300@50
|
235 // send next target values 1 step before them play
|
rt300@50
|
236 if ( tickNumber % 4 != 0) {
|
rt300@50
|
237 if (tickNumber % 4 == 3){
|
rt300@50
|
238 targetSynth.sendAllParams();
|
rt300@50
|
239 }
|
rt300@50
|
240 return;
|
rt300@50
|
241 };
|
rt300@50
|
242 }
|
rt300@27
|
243
|
rt300@27
|
244
|
rt300@31
|
245 Preset* previousTargetPreset;
|
rt300@31
|
246 vector<int> curCandidateSettings = candidateSynth.getAllParamValues();
|
rt300@31
|
247 if (oldStep.showsResultsAtEnd){
|
rt300@42
|
248 // this if should be in getpreset
|
rt300@31
|
249 if(oldStep.presetIndex == -1){
|
rt300@31
|
250 previousTargetPreset = expPresetManager.getNeutralPreset();
|
rt300@31
|
251 cout << "SHOULDNT SCORE NEUTRAL??" << endl;
|
rt300@31
|
252 }else{
|
rt300@31
|
253
|
rt300@31
|
254 previousTargetPreset = expPresetManager.getPresetAtIndex(oldStep.presetIndex);
|
rt300@31
|
255 }
|
rt300@33
|
256
|
rt300@33
|
257 eventLogger.logEvent(FINISH_POS, curCandidateSettings);
|
rt300@31
|
258 TrainingTestResult result = doResults(oldStep,
|
rt300@31
|
259 previousTargetPreset,
|
rt300@31
|
260 lastPosition,
|
rt300@31
|
261 curCandidateSettings);
|
rt300@31
|
262
|
rt300@31
|
263 flashResult(result);
|
rt300@31
|
264 }
|
rt300@31
|
265
|
rt300@49
|
266 AnimStep newStep = sequenceController->getNextStep(); // ADVANCES COUNTS
|
rt300@27
|
267
|
rt300@42
|
268
|
rt300@32
|
269
|
rt300@27
|
270 if(newStep.isLastOfAll){
|
rt300@49
|
271 oldStep = newStep;
|
rt300@27
|
272 lastOfAll();
|
rt300@27
|
273 return;
|
rt300@27
|
274 }
|
rt300@27
|
275 if(newStep.isLastOfRun){
|
rt300@49
|
276 oldStep = newStep;
|
rt300@32
|
277 lastOfRun(newStep.runNumber);
|
rt300@27
|
278 return;
|
rt300@27
|
279 }
|
rt300@50
|
280 if(halfMetro){
|
rt300@50
|
281 candidateSynth.setMetroTime(newStep.getTimeBetweenTicks()*2);
|
rt300@50
|
282 }else{
|
rt300@50
|
283 candidateSynth.setMetroTime(newStep.getTimeBetweenTicks());
|
rt300@50
|
284 }
|
rt300@35
|
285 Preset * currentTargetPreset;
|
rt300@35
|
286 if(newStep.presetIndex == -1){
|
rt300@35
|
287 currentTargetPreset = expPresetManager.getNeutralPreset();
|
rt300@37
|
288
|
rt300@35
|
289 }else{
|
rt300@35
|
290
|
rt300@35
|
291 currentTargetPreset = expPresetManager.getPresetAtIndex(newStep.presetIndex);
|
rt300@35
|
292 if (currentTargetPreset == NULL){
|
rt300@50
|
293 displayInstructions("No stored preset!\n please restert and choose EXP");
|
rt300@43
|
294
|
rt300@43
|
295 bottomPanel->show();
|
rt300@50
|
296 //bottomPanel->showOnlyElementNamed("MENU");
|
rt300@35
|
297 candidateSynth.stopMetronome();
|
rt300@35
|
298 return;
|
rt300@35
|
299 }
|
rt300@35
|
300 }
|
rt300@27
|
301
|
rt300@27
|
302 switch (newStep.type){
|
rt300@27
|
303 case AnimStep::PREVIEW_NEUTRAL_COUNT :
|
rt300@35
|
304 previewNeutralCount(newStep,currentTargetPreset);
|
rt300@27
|
305 break;
|
rt300@27
|
306 case AnimStep::PREVIEW_MOVE :
|
rt300@35
|
307 previewMove(newStep,currentTargetPreset);
|
rt300@27
|
308 break;
|
rt300@35
|
309 case AnimStep::PREVIEW_LAST :
|
rt300@35
|
310 previewLast( newStep,currentTargetPreset);
|
rt300@27
|
311 break;
|
rt300@27
|
312 case AnimStep::MATCHING_NEUTRAL_COUNT :
|
rt300@35
|
313 //matchingNeutralCount( newStep,currentTargetPreset);
|
rt300@27
|
314 break;
|
rt300@27
|
315 case AnimStep::MATCHING_MOVE :
|
rt300@35
|
316 matchingMove( newStep,currentTargetPreset);
|
rt300@27
|
317 break;
|
rt300@35
|
318 case AnimStep::MATCHING_LAST :
|
rt300@35
|
319 matchingLast( newStep,currentTargetPreset);
|
rt300@27
|
320 break;
|
rt300@31
|
321 case AnimStep::GUIDED_MOVE :
|
rt300@35
|
322 //guidedMove( newStep);
|
rt300@31
|
323 break;
|
rt300@31
|
324
|
rt300@31
|
325 case AnimStep::GUIDED_HIT :
|
rt300@35
|
326 //guidedHit( newStep);
|
rt300@31
|
327 break;
|
rt300@31
|
328 default:
|
rt300@31
|
329 break;
|
rt300@27
|
330 }
|
rt300@42
|
331 logNewStep(newStep, currentTargetPreset->getValues());
|
rt300@31
|
332 oldStep = newStep;
|
rt300@31
|
333 lastPosition = curCandidateSettings;
|
rt300@31
|
334
|
rt300@27
|
335 }
|
rt300@27
|
336 //-----------------------------------------------------------------------------
|
rt300@27
|
337 void TrainingMessageOrganiser::updateCountdown(int n){
|
rt300@27
|
338
|
rt300@27
|
339 }
|
rt300@27
|
340 //-----------------------------------------------------------------------------
|
rt300@35
|
341 void TrainingMessageOrganiser::previewNeutralCount(AnimStep newStep, Preset * currentTargetPreset){
|
rt300@32
|
342 okToGetMidi = false;
|
rt300@37
|
343 candidateSynth.playDownbeatBlip();
|
rt300@28
|
344 middlePanel->hide();
|
rt300@42
|
345
|
rt300@27
|
346 // your 'hand' is hidden
|
rt300@27
|
347 controlPanel->showValueIndicators(false);
|
rt300@27
|
348
|
rt300@27
|
349
|
rt300@27
|
350 // guide is set to neutral values
|
rt300@27
|
351 currentTargetPreset = expPresetManager.getNeutralPreset();
|
rt300@27
|
352 vector<int> newTargetValues = currentTargetPreset->getValues();
|
rt300@35
|
353 controlPanel->setValues(newTargetValues);
|
rt300@27
|
354 presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
|
rt300@27
|
355 presetIconPanel->show();
|
rt300@42
|
356
|
rt300@27
|
357 controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
|
rt300@36
|
358 doHand(false);
|
rt300@36
|
359 controlPanel->show();
|
rt300@27
|
360
|
rt300@27
|
361 targetSynth.setAllParams(newTargetValues);
|
rt300@36
|
362 //candidateSynth.setAllParams(newTargetValues);
|
rt300@27
|
363
|
rt300@50
|
364 displayInstructions("Prepare for next \n sequence preview");
|
rt300@32
|
365 seqNumPanel->hide();
|
rt300@49
|
366
|
rt300@36
|
367 controlPanel->setColor(ofColor::black);
|
rt300@27
|
368 }
|
rt300@27
|
369 //-----------------------------------------------------------------------------
|
rt300@35
|
370 void TrainingMessageOrganiser::previewMove(AnimStep newStep, Preset * currentTargetPreset){
|
rt300@42
|
371
|
rt300@35
|
372 targetSynth.trigger(); // PLAYS LAST TARGET
|
rt300@42
|
373
|
rt300@42
|
374
|
rt300@27
|
375 vector<int> newTargetValues = currentTargetPreset->getValues();
|
rt300@42
|
376
|
rt300@31
|
377 targetSynth.setAllParamsWithoutSend(newTargetValues);
|
rt300@27
|
378
|
rt300@35
|
379 doGuides(newStep.showsGuides, currentTargetPreset);
|
rt300@42
|
380
|
rt300@35
|
381 doHand(false, newStep.showsGuides, newStep.getTimeBetweenTicks()*4, newTargetValues);
|
rt300@32
|
382
|
rt300@35
|
383 doIcons(newStep.showsIcons, currentTargetPreset);
|
rt300@42
|
384
|
rt300@42
|
385
|
rt300@27
|
386 controlPanel->show();
|
rt300@42
|
387
|
rt300@35
|
388 displayInstructions("PREVIEW");
|
rt300@48
|
389 if(newStep.showsGuides){
|
rt300@48
|
390 showSeqNum(newStep.whichInSequence);
|
rt300@48
|
391 }else{
|
rt300@48
|
392 showSeqNum(-1);
|
rt300@48
|
393 }
|
rt300@36
|
394
|
rt300@36
|
395 controlPanel->setColor(ofColor::black);
|
rt300@39
|
396 bottomPanel->hide();
|
rt300@38
|
397 forgotButton->hide();
|
rt300@38
|
398 forgotButton->turnOff();
|
rt300@27
|
399 }
|
rt300@35
|
400
|
rt300@35
|
401
|
rt300@27
|
402 //-----------------------------------------------------------------------------
|
rt300@32
|
403 // lest setep of preview seq - plays moves back to neutral pos?
|
rt300@35
|
404 void TrainingMessageOrganiser::previewLast(AnimStep newStep, Preset * currentTargetPreset){
|
rt300@35
|
405 targetSynth.trigger();
|
rt300@42
|
406
|
rt300@35
|
407 // wrong?
|
rt300@35
|
408 targetSynth.setAllParamsWithoutSend(currentTargetPreset->getValues());
|
rt300@27
|
409
|
rt300@35
|
410 // your hand shows, we dont bother animating back to neutral!?
|
rt300@35
|
411 doHand(true);
|
rt300@42
|
412
|
rt300@35
|
413 doIcons(newStep.showsIcons,currentTargetPreset);
|
rt300@27
|
414
|
rt300@35
|
415 doGuides(newStep.showsGuides, currentTargetPreset);
|
rt300@42
|
416
|
rt300@35
|
417 showSeqNum(newStep.whichInSequence);
|
rt300@43
|
418 displayInstructions("PREVIEW FINISHED");
|
rt300@39
|
419 // set candidate and sliders to neutral
|
rt300@39
|
420 candidateSynth.setAllParams(expPresetManager.getNeutralPreset()->getValues());
|
rt300@36
|
421 controlPanel->setColor(ofColor::darkMagenta);
|
rt300@27
|
422 }
|
rt300@31
|
423
|
rt300@31
|
424 //-----------------------------------------------------------------------------
|
rt300@35
|
425 void TrainingMessageOrganiser::matchingMove(AnimStep newStep, Preset * currentTargetPreset){
|
rt300@42
|
426
|
rt300@31
|
427
|
rt300@28
|
428 middlePanel->hide();
|
rt300@42
|
429
|
rt300@27
|
430 vector<int> newTargetValues = currentTargetPreset->getValues();
|
rt300@33
|
431 eventLogger.logEvent(NEW_TARGET, newTargetValues);
|
rt300@35
|
432 targetSynth.setAllParamsWithoutSend(newTargetValues);
|
rt300@42
|
433
|
rt300@31
|
434 // if showing guides show the hint hand
|
rt300@35
|
435 doGuides(newStep.showsGuides, currentTargetPreset);
|
rt300@27
|
436
|
rt300@35
|
437 doIcons(newStep.showsIcons, currentTargetPreset);
|
rt300@27
|
438
|
rt300@35
|
439 doHand(true);
|
rt300@35
|
440
|
rt300@42
|
441 if (newStep.showsGuides){
|
rt300@42
|
442 displayInstructions("MATCH THE GUIDES");
|
rt300@43
|
443 // trigger "guide sound"?
|
rt300@43
|
444 triggerCandidateSound();
|
rt300@42
|
445 }else{
|
rt300@42
|
446 displayInstructions("MATCH WITHOUT GUIDES");
|
rt300@42
|
447 }
|
rt300@35
|
448 showSeqNum(newStep.whichInSequence);
|
rt300@31
|
449 // trigger where we're at at the moment
|
rt300@29
|
450 triggerCandidateSound();
|
rt300@42
|
451
|
rt300@49
|
452
|
rt300@41
|
453 if (!newStep.showsGuides || !newStep.showsIcons){
|
rt300@41
|
454 controlPanel->setColor(ofColor::red);
|
rt300@41
|
455 // set sliders to default texture
|
rt300@41
|
456 controlPanel->setIndicatorTexture(NULL);
|
rt300@39
|
457 forgotButton->show();
|
rt300@41
|
458 }else{
|
rt300@42
|
459
|
rt300@41
|
460 controlPanel->setColor(ofColor::darkMagenta);
|
rt300@42
|
461
|
rt300@42
|
462
|
rt300@36
|
463 }
|
rt300@27
|
464 }
|
rt300@27
|
465 //-----------------------------------------------------------------------------
|
rt300@35
|
466 void TrainingMessageOrganiser::matchingLast(AnimStep newStep, Preset * currentTargetPreset){
|
rt300@35
|
467 // why is this different from match it?
|
rt300@35
|
468
|
rt300@27
|
469 vector<int> newTargetValues = currentTargetPreset->getValues();
|
rt300@33
|
470 eventLogger.logEvent(NEW_TARGET, newTargetValues);
|
rt300@35
|
471 targetSynth.setAllParamsWithoutSend(newTargetValues);
|
rt300@27
|
472
|
rt300@35
|
473 doGuides(newStep.showsGuides, currentTargetPreset);
|
rt300@27
|
474
|
rt300@35
|
475 doIcons(newStep.showsIcons, currentTargetPreset);
|
rt300@32
|
476
|
rt300@35
|
477 doHand(true);
|
rt300@35
|
478
|
rt300@37
|
479 //displayInstructions("MATCHING FINISHED");
|
rt300@35
|
480 showSeqNum(newStep.whichInSequence);
|
rt300@42
|
481
|
rt300@33
|
482 triggerCandidateSound();
|
rt300@49
|
483
|
rt300@41
|
484 if (!newStep.showsGuides || !newStep.showsIcons){
|
rt300@41
|
485 controlPanel->setColor(ofColor::red);
|
rt300@41
|
486 // set sliders to default texture
|
rt300@41
|
487 controlPanel->setIndicatorTexture(NULL);
|
rt300@41
|
488 forgotButton->show();
|
rt300@36
|
489 }else{
|
rt300@41
|
490
|
rt300@41
|
491 controlPanel->setColor(ofColor::darkMagenta);
|
rt300@41
|
492
|
rt300@41
|
493
|
rt300@36
|
494 }
|
rt300@31
|
495 }
|
rt300@31
|
496 //-----------------------------------------------------------------------------
|
rt300@31
|
497
|
rt300@35
|
498 TrainingTestResult TrainingMessageOrganiser::doResults(AnimStep step,
|
rt300@31
|
499 Preset * targetPreset,
|
rt300@31
|
500 vector<int> startingPosition,
|
rt300@31
|
501 vector<int> currentPosition){
|
rt300@34
|
502 // targetParams, startPosition, answer, timeAllowed
|
rt300@28
|
503 TrainingTestResult result =
|
rt300@34
|
504
|
rt300@34
|
505 trainingScoreManager.getScoreForAnswer(targetPreset->getValues(),
|
rt300@31
|
506 startingPosition,
|
rt300@34
|
507 currentPosition,
|
rt300@36
|
508 step.getTimeAllowed(),
|
rt300@36
|
509 step.difficulty,
|
rt300@36
|
510 step.whichInSequence,
|
rt300@36
|
511 step.presetIndex,
|
rt300@36
|
512 step.tempoLevel,
|
rt300@43
|
513 step.totalLengthOfSeq);
|
rt300@28
|
514
|
rt300@49
|
515 sequenceController->saveResultForCurrentStep(result);
|
rt300@31
|
516 instructionPanel->setColor(result.colorBand);
|
rt300@42
|
517
|
rt300@42
|
518
|
rt300@31
|
519 displayInstructions(result.displayText);
|
rt300@28
|
520
|
rt300@32
|
521 showScoreNum(trainingScoreManager.getScore());
|
rt300@32
|
522
|
rt300@31
|
523 return result;
|
rt300@27
|
524 }
|
rt300@27
|
525
|
rt300@31
|
526 void TrainingMessageOrganiser::flashResult(TrainingTestResult r){
|
rt300@31
|
527
|
rt300@31
|
528 // stick a colored number over target position
|
rt300@39
|
529 controlPanel->flashResultLight(r.colorBand, r.timeAllowed*ofGetFrameRate()/6000.);
|
rt300@42
|
530
|
rt300@31
|
531
|
rt300@31
|
532 }
|
rt300@35
|
533
|
rt300@35
|
534
|
rt300@35
|
535 //------------------------------------------------------------------------------------
|
rt300@35
|
536 void TrainingMessageOrganiser::doIcons(bool showIcons, Preset * currentTargetPreset){
|
rt300@35
|
537
|
rt300@35
|
538 if (showIcons){
|
rt300@35
|
539 presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
|
rt300@35
|
540 presetIconPanel->show();
|
rt300@35
|
541 }else{
|
rt300@35
|
542 presetIconPanel->hide();
|
rt300@35
|
543 }
|
rt300@35
|
544 }
|
rt300@35
|
545 //------------------------------------------------------------------------------------
|
rt300@35
|
546 void TrainingMessageOrganiser::doGuides(bool showGuides, Preset * currentTargetPreset){
|
rt300@35
|
547
|
rt300@35
|
548 // show icon and guides
|
rt300@35
|
549 if (showGuides){ // always show neutral one
|
rt300@35
|
550
|
rt300@35
|
551 // show where we're going
|
rt300@35
|
552 controlPanel->setAndShowHint(currentTargetPreset->getValues(), currentTargetPreset->getImage());
|
rt300@38
|
553 if (panelType == LEAP6DOF) distanceSlider->show();
|
rt300@35
|
554
|
rt300@35
|
555 }else{
|
rt300@35
|
556 controlPanel->showHint(false);
|
rt300@38
|
557 distanceSlider->hide();
|
rt300@35
|
558 }
|
rt300@41
|
559 // special case - always show guide for neutral position
|
rt300@39
|
560 if(currentTargetPreset->name == "Neutral"){
|
rt300@39
|
561 controlPanel->setAndShowHint(currentTargetPreset->getValues(), currentTargetPreset->getImage());
|
rt300@39
|
562 }
|
rt300@35
|
563
|
rt300@35
|
564 }
|
rt300@35
|
565 //-----------------------------------------------------------------------------
|
rt300@35
|
566 void TrainingMessageOrganiser::doHand(bool showControllableHand, bool showAnimatedHand, float animTime, vector<int> newTargetValues)
|
rt300@35
|
567 {
|
rt300@35
|
568 // show how to get there
|
rt300@35
|
569 if (showAnimatedHand){
|
rt300@44
|
570 //if (panelType == LEAP6DOF){
|
rt300@35
|
571 controlPanel->animateToNewValues(newTargetValues, animTime);
|
rt300@35
|
572 controlPanel->showValueIndicators(true); // for animation
|
rt300@35
|
573 controlPanel->setActive(false);
|
rt300@44
|
574 //}
|
rt300@35
|
575
|
rt300@35
|
576 }else if(showControllableHand){
|
rt300@35
|
577 controlPanel->showValueIndicators(true); // for animation
|
rt300@35
|
578 controlPanel->setActive(true); // allow user control
|
rt300@37
|
579 if (panelType == LEAP6DOF){
|
rt300@37
|
580 okToGetMidi = true; // allow midi input to thing
|
rt300@37
|
581 }else{
|
rt300@37
|
582 okToGetMidi = false;
|
rt300@38
|
583 setSlidersToCandidate(); // cos hand won't be controlling them
|
rt300@37
|
584 }
|
rt300@35
|
585
|
rt300@35
|
586 }else{
|
rt300@35
|
587 controlPanel->showValueIndicators(false); // hand/ slider bars invisible
|
rt300@35
|
588 controlPanel->setActive(false); // cant control it
|
rt300@35
|
589 }
|
rt300@35
|
590
|
rt300@35
|
591 }
|
rt300@48
|
592 //-----------------------------------------------------------------------------
|
rt300@48
|
593
|
rt300@43
|
594 void TrainingMessageOrganiser::forgotByMidi(){
|
rt300@43
|
595 forgotButton->turnOn();
|
rt300@43
|
596 buttonPressCallback(FORGOT_SEQ_ID, 1);
|
rt300@48
|
597 }
|
rt300@48
|
598 //-----------------------------------------------------------------------------
|
rt300@48
|
599
|
rt300@48
|
600 void TrainingMessageOrganiser::reset(){
|
rt300@50
|
601 // DONT CALL THIS!
|
rt300@48
|
602 // tell testapp to start again?
|
rt300@48
|
603 candidateSynth.stopMetronome();
|
rt300@48
|
604 controlPanel->hide();
|
rt300@48
|
605 controlPanel->setColor(ofColor::black);
|
rt300@49
|
606 sequenceController->clearAll();
|
rt300@49
|
607 trainingScoreManager.reset();
|
rt300@48
|
608 seqNumPanel->hide();
|
rt300@50
|
609 //eventLogger.saveSessionToFile(); //?
|
rt300@48
|
610
|
rt300@48
|
611 }
|
rt300@48
|
612 //-----------------------------------------------------------------------------
|