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@9
|
22 void init( PDSynthWrapper& cs, PDSynthWrapper& ts){
|
rt300@9
|
23
|
rt300@9
|
24 MessageOrganiser::init(cs,ts);
|
rt300@11
|
25
|
rt300@11
|
26 TickListenerFunction callback;
|
rt300@11
|
27 callback = boost::bind(&TrainingMessageOrganiser::onNextTick, this, _1);
|
rt300@11
|
28 candidateSynth.registerForTicks(callback);
|
rt300@12
|
29
|
rt300@12
|
30 sequencePreview = true;
|
rt300@11
|
31 }
|
rt300@8
|
32
|
rt300@9
|
33 void setupDefaultMapping(){
|
rt300@9
|
34 vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
|
rt300@9
|
35
|
rt300@9
|
36 controlPanelType cpt = REVISITABLE;
|
rt300@9
|
37 vector<controllerType> elemList;
|
rt300@12
|
38 for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
|
rt300@9
|
39 elemList.push_back(SLIDER);
|
rt300@9
|
40 }
|
rt300@9
|
41
|
rt300@9
|
42 vector<UIElement*> UIElemHandles = panel->generateControls(elemList, cpt);
|
rt300@9
|
43
|
rt300@9
|
44 mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
|
rt300@9
|
45
|
rt300@9
|
46 bottomPanel->show();
|
rt300@9
|
47 }
|
rt300@9
|
48
|
rt300@9
|
49 vector<int> getMappingIDsFromSynths(){
|
rt300@9
|
50 vector<int> index;
|
rt300@12
|
51 for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
|
rt300@9
|
52 index.push_back(i);
|
rt300@9
|
53 }
|
rt300@9
|
54 vector<int> mids = candidateSynth.getMappingIDForIndices(index);
|
rt300@9
|
55
|
rt300@9
|
56 return mids;
|
rt300@9
|
57 }
|
rt300@9
|
58
|
rt300@9
|
59 void setupNewTest(){
|
rt300@9
|
60
|
rt300@9
|
61
|
rt300@9
|
62 };
|
rt300@10
|
63
|
rt300@12
|
64 void setIconPanel(IconPanel * ip){
|
rt300@12
|
65 presetIconPanel = ip;
|
rt300@12
|
66 }
|
rt300@10
|
67 void onNextTick(int tickNumber){
|
rt300@11
|
68 cout << "TICK " << tickNumber << endl;
|
rt300@11
|
69
|
rt300@13
|
70 if ( !(tickNumber % 2)){
|
rt300@10
|
71 // load next target preset
|
rt300@13
|
72
|
rt300@13
|
73 int i = sequenceController.getCurrentPresetIndex();
|
rt300@10
|
74
|
rt300@10
|
75 currentTargetPreset = expPresetManager.getPreset(i);
|
rt300@10
|
76
|
rt300@10
|
77 if (sequencePreview){
|
rt300@10
|
78 // show next target preset
|
rt300@13
|
79 // presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage());
|
rt300@10
|
80
|
rt300@10
|
81 // show image
|
rt300@10
|
82 // show name
|
rt300@10
|
83 // show controllersettings
|
rt300@10
|
84
|
rt300@10
|
85
|
rt300@10
|
86 }else{ // the user is matching it
|
rt300@10
|
87 // show image
|
rt300@10
|
88 // show name
|
rt300@10
|
89
|
rt300@10
|
90 // if guided
|
rt300@10
|
91 // show controller guide
|
rt300@10
|
92 }
|
rt300@10
|
93
|
rt300@10
|
94
|
rt300@10
|
95 }else{ // we're plying the sound
|
rt300@10
|
96
|
rt300@10
|
97 //
|
rt300@10
|
98 if (sequencePreview){
|
rt300@10
|
99 // send target values again
|
rt300@10
|
100 targetSynth.setAllParams(currentTargetPreset->getValues());
|
rt300@13
|
101 setSlidersToTarget();
|
rt300@10
|
102 targetSynth.trigger();
|
rt300@10
|
103
|
rt300@10
|
104 // flash the interface?
|
rt300@10
|
105 }else{
|
rt300@12
|
106 // has this been done? yes. candidateSynth.setAllParams(ui stuff);
|
rt300@12
|
107 candidateSynth.trigger();
|
rt300@12
|
108 showUserHowTheyDid();
|
rt300@10
|
109
|
rt300@10
|
110 }
|
rt300@10
|
111 }
|
rt300@13
|
112
|
rt300@13
|
113 int run = sequenceController.stepForward();
|
rt300@13
|
114 if (run == -2){
|
rt300@13
|
115 // do finished run stuff, show summary
|
rt300@13
|
116 candidateSynth.stopMetronome();
|
rt300@13
|
117 cout << "FINISHED RUN" << endl;
|
rt300@13
|
118 }
|
rt300@13
|
119 if (run == -1){
|
rt300@13
|
120 // finished whole block
|
rt300@13
|
121 candidateSynth.stopMetronome();
|
rt300@13
|
122 cout << "FINISHED BLOCK" << endl;
|
rt300@13
|
123 }
|
rt300@10
|
124 }
|
rt300@10
|
125
|
rt300@9
|
126
|
rt300@9
|
127 protected:
|
rt300@12
|
128 void showUserHowTheyDid(){
|
rt300@12
|
129 // colour flash
|
rt300@12
|
130 // distance ?
|
rt300@12
|
131 // score
|
rt300@12
|
132
|
rt300@12
|
133 }
|
rt300@10
|
134 void loadPreset(string pname){
|
rt300@10
|
135
|
rt300@10
|
136 vector<int> values = expPresetManager.recallPreset(pname);
|
rt300@10
|
137 if (values.size()){
|
rt300@10
|
138 candidateSynth.setAllParams(values);
|
rt300@10
|
139 setAllSlidersToValues(values);
|
rt300@10
|
140 }else{
|
rt300@10
|
141 cout << "ERROR, no preset found" << endl;
|
rt300@10
|
142 }
|
rt300@10
|
143 }
|
rt300@10
|
144
|
rt300@10
|
145
|
rt300@10
|
146 void showATargetPresetWithGuide(Preset * p){ // this is when demoing the sequence to the user
|
rt300@10
|
147 // p.show icon
|
rt300@10
|
148 vector<int> values = p->getValues();
|
rt300@10
|
149 if (values.size()){
|
rt300@10
|
150 candidateSynth.setAllParams(values);
|
rt300@10
|
151 setAllSlidersToValues(values);
|
rt300@10
|
152 }else{
|
rt300@10
|
153 cout << "WARNING, preset to show had no values" << endl;
|
rt300@10
|
154 }
|
rt300@10
|
155 }
|
rt300@10
|
156
|
rt300@9
|
157 void mapSlidersToParams(vector<UIElement*> elems, vector<int> mids){
|
rt300@9
|
158
|
rt300@9
|
159 vector<UIElement*>::iterator elit;
|
rt300@9
|
160 vector<int> typeListLog;
|
rt300@9
|
161 int i = 0;
|
rt300@9
|
162 for(elit=elems.begin(); elit<elems.end();elit++){
|
rt300@9
|
163 if ( (*elit)->getType() == SLIDER){
|
rt300@9
|
164 if(i >= mids.size()){
|
rt300@9
|
165
|
rt300@9
|
166 cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl;
|
rt300@9
|
167 }
|
rt300@9
|
168
|
rt300@9
|
169 ButtronSlider* theSlider = (ButtronSlider*)(*elit);
|
rt300@9
|
170 mapControlToParam((*elit), mids[i]);
|
rt300@9
|
171 theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i]));
|
rt300@9
|
172 cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl;
|
rt300@9
|
173 theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])));
|
rt300@9
|
174 i++;
|
rt300@9
|
175 typeListLog.push_back(int(SLIDER));
|
rt300@9
|
176
|
rt300@9
|
177 }else{
|
rt300@9
|
178 cout << "ERROR ERROR: ui type not handled my mapping function !" << endl;
|
rt300@9
|
179 }
|
rt300@9
|
180 }
|
rt300@9
|
181
|
rt300@9
|
182 eventLogger.logEvent(CONTROL_LIST,typeListLog);
|
rt300@9
|
183 };
|
rt300@9
|
184
|
rt300@9
|
185 void buttonPressCallback(int mappingID, int value){
|
rt300@9
|
186 if(mappingID == VOLUME_CHANGE_ID){
|
rt300@9
|
187 targetSynth.sendVolume(value);
|
rt300@9
|
188 candidateSynth.sendVolume(value);
|
rt300@10
|
189 return;
|
rt300@9
|
190 }
|
rt300@9
|
191
|
rt300@9
|
192 if (mappingID == TRIGGER_CANDIDATE_ID){
|
rt300@9
|
193 triggerCandidateSound();
|
rt300@10
|
194 // compare to target
|
rt300@11
|
195 candidateSynth.startMetronome();
|
rt300@10
|
196 return;
|
rt300@10
|
197 }
|
rt300@10
|
198 if(mappingID == SAVE_PRESET_HIT){
|
rt300@10
|
199 expPresetManager.savePreset("blah", candidateSynth.getAllParamValues());
|
rt300@10
|
200 return;
|
rt300@10
|
201 }
|
rt300@10
|
202 if(mappingID == RECALL_PRESET_HIT){
|
rt300@10
|
203
|
rt300@10
|
204 loadPreset("blah");
|
rt300@9
|
205 return;
|
rt300@9
|
206 }
|
rt300@9
|
207 }
|
rt300@10
|
208 SequenceController sequenceController;
|
rt300@10
|
209 bool sequencePreview;
|
rt300@10
|
210 Preset * currentTargetPreset;
|
rt300@12
|
211 IconPanel* presetIconPanel;
|
rt300@8
|
212 };
|
rt300@8
|
213 #endif /* defined(__riftathon__TrainingMessageOrganiser__) */
|