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