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__) */
|