rt300@18
|
1
|
rt300@18
|
2 #include "MessageOrganiser.h"
|
rt300@18
|
3
|
rt300@18
|
4 void MessageOrganiser::init(PDSynthWrapper& cs, PDSynthWrapper& ts){
|
rt300@18
|
5 candidateSynth = cs;
|
rt300@18
|
6 targetSynth = ts;
|
rt300@18
|
7
|
rt300@18
|
8 onlyChangeCandidateOnTrigger = true;
|
rt300@18
|
9 }
|
rt300@27
|
10
|
rt300@27
|
11
|
rt300@27
|
12 void MessageOrganiser::setupDefaultMapping(controlPanelType whichInterfaceAreWeUsing){
|
rt300@27
|
13 vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
|
rt300@27
|
14 vector<controllerType> elemList;
|
rt300@27
|
15
|
rt300@27
|
16 if (whichInterfaceAreWeUsing == ALL_SLIDERS){
|
rt300@27
|
17
|
rt300@27
|
18 for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
|
rt300@27
|
19 elemList.push_back(SLIDER);
|
rt300@27
|
20
|
rt300@27
|
21 }
|
rt300@27
|
22 }else if (whichInterfaceAreWeUsing == LEAP6DOF){
|
rt300@27
|
23 elemList.push_back(LEAP6D);
|
rt300@27
|
24 }
|
rt300@27
|
25 vector<UIElement*> UIElemHandles = controlPanel->generateControls(elemList, whichInterfaceAreWeUsing);
|
rt300@27
|
26
|
rt300@27
|
27 mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
|
rt300@37
|
28 panelType =whichInterfaceAreWeUsing;
|
rt300@27
|
29 }
|
rt300@27
|
30
|
rt300@27
|
31
|
rt300@27
|
32 //----------------------------------------------------------------------------------------
|
rt300@27
|
33 vector<int> MessageOrganiser::getMappingIDsFromSynths(){
|
rt300@27
|
34 vector<int> index;
|
rt300@27
|
35 for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
|
rt300@27
|
36 index.push_back(i);
|
rt300@27
|
37 }
|
rt300@27
|
38 vector<int> mids = candidateSynth.getMappingIDForIndices(index);
|
rt300@27
|
39
|
rt300@27
|
40 return mids;
|
rt300@27
|
41 }
|
rt300@34
|
42 //----------------------------------------------------------------------------------
|
rt300@18
|
43 // could template for ui element type??
|
rt300@18
|
44 void MessageOrganiser::mapButtonToAction(UIElement* control, int mappingID){
|
rt300@18
|
45 UICallbackFunction callbackF;
|
rt300@18
|
46 callbackF = boost::bind(&MessageOrganiser::buttonPressCallback, this, _1,_2);
|
rt300@18
|
47 control->addHandler(callbackF, mappingID);
|
rt300@18
|
48 currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
|
rt300@18
|
49 }
|
rt300@37
|
50 void MessageOrganiser::setPanelType(controlPanelType p){
|
rt300@37
|
51 panelType = p;
|
rt300@37
|
52 }
|
rt300@34
|
53 //----------------------------------------------------------------------------------
|
rt300@18
|
54 void MessageOrganiser::setControlPanel(SliderPanel* p){ // a bit specific??
|
rt300@27
|
55 controlPanel = p;
|
rt300@18
|
56
|
rt300@18
|
57 };
|
rt300@34
|
58 //----------------------------------------------------------------------------------
|
rt300@18
|
59 void MessageOrganiser::setBottomPanel(ButtonPanel * ntb){
|
rt300@18
|
60 bottomPanel = ntb;
|
rt300@18
|
61 };
|
rt300@34
|
62 //----------------------------------------------------------------------------------
|
rt300@43
|
63 void MessageOrganiser::setSkipButton(Buttron* b){
|
rt300@43
|
64 skipButton = b;
|
rt300@43
|
65 }
|
rt300@18
|
66 void MessageOrganiser::setIconPanel(IconPanel * ip){
|
rt300@18
|
67 presetIconPanel = ip;
|
rt300@18
|
68 }
|
rt300@43
|
69 //----------------------------------------------------------------------------------------
|
rt300@43
|
70 void MessageOrganiser::setMiddlePanel(TextPanel* tp){
|
rt300@43
|
71 middlePanel = tp;
|
rt300@43
|
72 }
|
rt300@34
|
73 //----------------------------------------------------------------------------------
|
rt300@18
|
74 void MessageOrganiser::setInstructionPanel(TextPanel * ip){
|
rt300@18
|
75 instructionPanel = ip;
|
rt300@18
|
76 instructionPanel->show();
|
rt300@18
|
77 }
|
rt300@38
|
78 void MessageOrganiser::setDistanceSlider(ButtronSlider * s){
|
rt300@38
|
79 distanceSlider = s;
|
rt300@38
|
80 }
|
rt300@34
|
81 //----------------------------------------------------------------------------------
|
rt300@32
|
82 void MessageOrganiser::setSeqNumPanel(TextPanel * snp){
|
rt300@32
|
83 seqNumPanel = snp;
|
rt300@32
|
84 }
|
rt300@32
|
85 void MessageOrganiser::showSeqNum(int num){
|
rt300@32
|
86 stringstream s;
|
rt300@44
|
87 if (num == 0){
|
rt300@44
|
88 s << "-> N";
|
rt300@44
|
89 }else if(num == 1){
|
rt300@44
|
90 s << "-> A";
|
rt300@44
|
91 }else if(num == 2){
|
rt300@44
|
92 s << "-> B";
|
rt300@44
|
93 }else if(num == 3){
|
rt300@44
|
94 s << "-> C";
|
rt300@48
|
95 }else if(num == -1){
|
rt300@48
|
96 s << "";
|
rt300@44
|
97 }
|
rt300@32
|
98 seqNumPanel->setText(s.str());
|
rt300@32
|
99 seqNumPanel->show();
|
rt300@32
|
100 }
|
rt300@32
|
101 void MessageOrganiser::setScoreNumPanel(TextPanel * snp){
|
rt300@32
|
102 scoreNumPanel = snp;
|
rt300@32
|
103 }
|
rt300@32
|
104 void MessageOrganiser::showScoreNum(int num){
|
rt300@32
|
105 stringstream s;
|
rt300@32
|
106 s << "SCORE: " << num;
|
rt300@32
|
107 scoreNumPanel->setText(s.str());
|
rt300@32
|
108 scoreNumPanel->show();
|
rt300@32
|
109 }
|
rt300@18
|
110 //-----------------------------------------------------------------------------
|
rt300@18
|
111 void MessageOrganiser::hideMyPanels(){
|
rt300@18
|
112 presetIconPanel->hide();
|
rt300@18
|
113 instructionPanel->hide();
|
rt300@18
|
114 bottomPanel->hide();
|
rt300@27
|
115 controlPanel->hide();
|
rt300@43
|
116 middlePanel->hide();
|
rt300@43
|
117 okToGetMidi = false;
|
rt300@18
|
118 }
|
rt300@34
|
119 //----------------------------------------------------------------------------------
|
rt300@18
|
120 void MessageOrganiser::showMyPanels(){
|
rt300@18
|
121 presetIconPanel->show();
|
rt300@18
|
122 instructionPanel->show();
|
rt300@18
|
123 bottomPanel->show();
|
rt300@27
|
124 controlPanel->show();
|
rt300@18
|
125 }
|
rt300@34
|
126 //----------------------------------------------------------------------------------
|
rt300@18
|
127 void MessageOrganiser::triggerCandidateSound(){
|
rt300@18
|
128 // log event
|
rt300@33
|
129 sendSynthValuesAgain(); // TODO AAAARG too slow???
|
rt300@18
|
130 candidateSynth.trigger();
|
rt300@18
|
131 eventLogger.logEvent(CANDIDATE_PLAYED);
|
rt300@33
|
132
|
rt300@18
|
133 }
|
rt300@34
|
134 //----------------------------------------------------------------------------------
|
rt300@18
|
135 void MessageOrganiser::paramChangeCallback(int mappingID, int value){
|
rt300@41
|
136 static long int howManyLogged;
|
rt300@41
|
137 static vector<int> lastLoggedVals = zeros<int>(TOTAL_NUM_PARAMS);
|
rt300@41
|
138 static vector<int> newVals = zeros<int>(TOTAL_NUM_PARAMS);
|
rt300@41
|
139 static long long lastLogTime;
|
rt300@18
|
140
|
rt300@18
|
141 if(onlyChangeCandidateOnTrigger){
|
rt300@18
|
142 candidateSynth.paramChangeCallback(mappingID, value, false);
|
rt300@18
|
143 }else{
|
rt300@18
|
144 candidateSynth.paramChangeCallback(mappingID, value, true);
|
rt300@18
|
145 }
|
rt300@18
|
146
|
rt300@41
|
147 int ctl_num = candidateSynth.getIndexForMappingID(mappingID);
|
rt300@18
|
148
|
rt300@41
|
149 // wait for a certain distance travelled AND time then record?
|
rt300@41
|
150 newVals[ctl_num] = value;
|
rt300@41
|
151 long long newLogTime = ofGetSystemTime();
|
rt300@41
|
152
|
rt300@41
|
153 if (euclideanDistance(newVals, lastLoggedVals) > MIN_LOG_DIST && newLogTime - lastLogTime > 20){
|
rt300@41
|
154 eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED_ALL, newVals);
|
rt300@41
|
155
|
rt300@41
|
156 lastLoggedVals = newVals;
|
rt300@41
|
157 howManyLogged++;
|
rt300@41
|
158 }else{
|
rt300@42
|
159 //cout << "skipped! so far logged " << howManyLogged << endl;
|
rt300@41
|
160 }
|
rt300@41
|
161
|
rt300@41
|
162 //eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
|
rt300@18
|
163 };
|
rt300@34
|
164 //----------------------------------------------------------------------------------
|
rt300@18
|
165 void MessageOrganiser::sendSynthValuesAgain(){
|
rt300@18
|
166 candidateSynth.sendAllParams();
|
rt300@18
|
167 targetSynth.sendAllParams();
|
rt300@18
|
168 };
|
rt300@34
|
169 //----------------------------------------------------------------------------------
|
rt300@18
|
170
|
rt300@18
|
171 void MessageOrganiser::setAllSlidersToValues(vector<int> values){
|
rt300@28
|
172 controlPanel->setValues(values);
|
rt300@18
|
173 }
|
rt300@34
|
174
|
rt300@34
|
175 //----------------------------------------------------------------------------------
|
rt300@18
|
176 // we want to set UI object
|
rt300@28
|
177 void MessageOrganiser::setUIToParam(int index, int value){
|
rt300@28
|
178
|
rt300@28
|
179 if(controlPanel->getPanelType() == ALL_SLIDERS){
|
rt300@28
|
180
|
rt300@28
|
181 UIElement* elem;
|
rt300@28
|
182 // get the element
|
rt300@28
|
183 if(controlPanel->subElements.size() <= index){
|
rt300@28
|
184 cout << "ERROR: index out of range for num sliders" << endl;
|
rt300@28
|
185 return;
|
rt300@28
|
186 }
|
rt300@28
|
187 elem = controlPanel->subElements[index];
|
rt300@28
|
188 if ( elem->getType() == SLIDER){
|
rt300@28
|
189 ButtronSlider* theSlider = (ButtronSlider*)elem;
|
rt300@28
|
190 theSlider->setValueAndScale(value);
|
rt300@28
|
191
|
rt300@28
|
192 }
|
rt300@28
|
193 }else if (controlPanel->getPanelType() == LEAP6DOF){
|
rt300@28
|
194 Leap6DBox* box = (Leap6DBox*)controlPanel->subElements[0];
|
rt300@28
|
195 box->setValueAndScale(index,value);
|
rt300@28
|
196
|
rt300@18
|
197 }
|
rt300@28
|
198
|
rt300@18
|
199 };
|
rt300@34
|
200 //----------------------------------------------------------------------------------
|
rt300@18
|
201
|
rt300@18
|
202 void MessageOrganiser::mapControlToParam(UIElement* control, int mappingID){
|
rt300@18
|
203
|
rt300@18
|
204 UICallbackFunction callbackF;
|
rt300@18
|
205 callbackF = boost::bind(&MessageOrganiser::paramChangeCallback, this, _1,_2);
|
rt300@18
|
206 control->addHandler(callbackF, mappingID);
|
rt300@18
|
207 // put in our map so we can send param values to gui
|
rt300@18
|
208 currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
|
rt300@18
|
209 cout << " Mapped control to ID: " << mappingID << "Name: " << candidateSynth.getNameForMappingID(mappingID) << endl;
|
rt300@18
|
210 control->setLabel(candidateSynth.getNameForMappingID(mappingID));
|
rt300@18
|
211 };
|
rt300@18
|
212
|
rt300@18
|
213 //-----------------------------------------------------------------------------
|
rt300@18
|
214
|
rt300@18
|
215 void MessageOrganiser::mapSlidersToParams(vector<UIElement*> elems, vector<int> mids){
|
rt300@18
|
216
|
rt300@18
|
217 vector<UIElement*>::iterator elit;
|
rt300@18
|
218 vector<int> typeListLog;
|
rt300@18
|
219 int i = 0;
|
rt300@18
|
220 for(elit=elems.begin(); elit<elems.end();elit++){
|
rt300@18
|
221 if ( (*elit)->getType() == SLIDER){
|
rt300@18
|
222 if(i >= mids.size()){
|
rt300@18
|
223
|
rt300@18
|
224 cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl;
|
rt300@18
|
225 }
|
rt300@18
|
226
|
rt300@18
|
227 ButtronSlider* theSlider = (ButtronSlider*)(*elit);
|
rt300@18
|
228 mapControlToParam((*elit), mids[i]);
|
rt300@18
|
229 theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i]));
|
rt300@18
|
230 cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl;
|
rt300@18
|
231 theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])));
|
rt300@18
|
232 i++;
|
rt300@18
|
233 typeListLog.push_back(int(SLIDER));
|
rt300@18
|
234
|
rt300@18
|
235 }else{
|
rt300@31
|
236
|
rt300@31
|
237 // TODO 6D box
|
rt300@18
|
238 cout << "ERROR ERROR: ui type not handled my mapping function !" << endl;
|
rt300@18
|
239 }
|
rt300@18
|
240 }
|
rt300@18
|
241
|
rt300@18
|
242 eventLogger.logEvent(CONTROL_LIST,typeListLog);
|
rt300@18
|
243 };
|
rt300@34
|
244 //----------------------------------------------------------------------------------
|
rt300@18
|
245 void MessageOrganiser::mapXYToParams(ButtronXY* control, int mappingIDX, int mappingIDY){
|
rt300@18
|
246 UICallbackFunction callback;
|
rt300@18
|
247
|
rt300@18
|
248 callback = boost::bind(&MessageOrganiser::paramChangeCallback, this, _1,_2);
|
rt300@18
|
249
|
rt300@18
|
250 control->addHandler(callback, mappingIDX, mappingIDY);
|
rt300@18
|
251
|
rt300@18
|
252 // put in our map so we can send param values to gui
|
rt300@18
|
253 //currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
|
rt300@18
|
254
|
rt300@18
|
255
|
rt300@18
|
256 cout << " Mapped control to XID: " << mappingIDX << "Name: " << candidateSynth.getNameForMappingID(mappingIDX) << endl;
|
rt300@18
|
257 cout << " Mapped control to YID: " << mappingIDY << "Name: " << candidateSynth.getNameForMappingID(mappingIDY) << endl;
|
rt300@18
|
258 control->setLabel(candidateSynth.getNameForMappingID(mappingIDX), candidateSynth.getNameForMappingID(mappingIDY));
|
rt300@18
|
259
|
rt300@18
|
260 };
|
rt300@34
|
261 //----------------------------------------------------------------------------------
|
rt300@18
|
262
|
rt300@18
|
263 void MessageOrganiser::mapControlToParam(UIElement* control, string paramName){
|
rt300@18
|
264 // get mapping ID from synth
|
rt300@18
|
265 int mappingID = candidateSynth.getMappingIDForName(paramName);
|
rt300@18
|
266 mapControlToParam(control, mappingID);
|
rt300@18
|
267 control->setLabel(paramName);
|
rt300@18
|
268 };
|
rt300@34
|
269 //----------------------------------------------------------------------------------
|
rt300@18
|
270 void MessageOrganiser::buttonPressCallback(int mappingID, int value){
|
rt300@18
|
271
|
rt300@18
|
272 };
|
rt300@18
|
273
|
rt300@34
|
274 //----------------------------------------------------------------------------------
|
rt300@18
|
275 void MessageOrganiser::setSlidersToTarget(){
|
rt300@18
|
276 // this will actually show sliders with target vals - for "memorisation" purposes mwa heh heh
|
rt300@18
|
277 // get target values
|
rt300@18
|
278 // set ui
|
rt300@32
|
279 cout << "set slid to targ" << endl;
|
rt300@18
|
280 vector<int> vals = targetSynth.getAllParamValues();
|
rt300@32
|
281 for(int i=0; i < vals.size(); i++){
|
rt300@18
|
282 setUIToParam(i, vals[i]);
|
rt300@18
|
283 }
|
rt300@18
|
284 }
|
rt300@38
|
285 void MessageOrganiser::setSlidersToCandidate(){
|
rt300@38
|
286
|
rt300@38
|
287 vector<int> vals = candidateSynth.getAllParamValues();
|
rt300@38
|
288 for(int i=0; i < vals.size(); i++){
|
rt300@38
|
289 setUIToParam(i, vals[i]);
|
rt300@38
|
290 }
|
rt300@38
|
291 }
|
rt300@21
|
292 void MessageOrganiser::showTargetAsHints(){
|
rt300@21
|
293 // int i = 0;
|
rt300@21
|
294 // vector<int> vals = targetSynth.getAllParamValues();
|
rt300@21
|
295 // for(auto elit=elems.begin(); elit<elems.end();elit++){
|
rt300@21
|
296 // ButtronSlider* theSlider = (ButtronSlider*)(*elit);
|
rt300@21
|
297 // theSlider->setHintValue(vals[i]);
|
rt300@21
|
298 // i++;
|
rt300@21
|
299 // }
|
rt300@21
|
300 }
|
rt300@18
|
301 void MessageOrganiser::setSlidersToDefault(){
|
rt300@32
|
302 for(int i=0; i < candidateSynth.getNumParams(); i++){
|
rt300@18
|
303 setUIToParam(i, 0);
|
rt300@22
|
304
|
rt300@18
|
305 }
|
rt300@22
|
306 }
|
rt300@34
|
307 //----------------------------------------------------------------------------------
|
rt300@22
|
308 void MessageOrganiser::setCandidateAndSlidersToRandom(){
|
rt300@22
|
309 vector<int> rands;
|
rt300@22
|
310 for(int i = 0; i < candidateSynth.getNumParams(); i++){
|
rt300@22
|
311
|
rt300@22
|
312 rands.push_back(rand() % 127);
|
rt300@22
|
313 }
|
rt300@22
|
314
|
rt300@22
|
315 setAllSlidersToValues(rands);
|
rt300@22
|
316 candidateSynth.setAllParams(rands);
|
rt300@22
|
317
|
rt300@32
|
318 }
|
rt300@43
|
319
|
rt300@34
|
320 //----------------------------------------------------------------------------------
|
rt300@32
|
321
|
rt300@32
|
322
|
rt300@32
|
323 void MessageOrganiser::midiFromLeap(int ctl_num, int ctl_val){
|
rt300@34
|
324 static long int howManyLogged;
|
rt300@35
|
325 static vector<int> lastLoggedVals = zeros<int>(TOTAL_NUM_PARAMS);
|
rt300@35
|
326 static vector<int> newVals = zeros<int>(TOTAL_NUM_PARAMS);
|
rt300@34
|
327 static long long lastLogTime;
|
rt300@32
|
328
|
rt300@32
|
329 if (!okToGetMidi){
|
rt300@32
|
330 return;
|
rt300@32
|
331 }
|
rt300@32
|
332 vector<int> mids = candidateSynth.getAllMappingIDs();
|
rt300@32
|
333 if (ctl_num >= mids.size() || ctl_num < 0) return;
|
rt300@32
|
334
|
rt300@32
|
335 if(onlyChangeCandidateOnTrigger){
|
rt300@32
|
336
|
rt300@32
|
337 candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val, false);
|
rt300@32
|
338 }else{
|
rt300@32
|
339 candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val, true);
|
rt300@32
|
340 }
|
rt300@32
|
341
|
rt300@32
|
342 setUIToParam(ctl_num, ctl_val);
|
rt300@32
|
343
|
rt300@34
|
344 // wait for a certain distance travelled AND time then record?
|
rt300@34
|
345 newVals[ctl_num] = ctl_val;
|
rt300@34
|
346 long long newLogTime = ofGetSystemTime();
|
rt300@32
|
347
|
rt300@34
|
348 if (euclideanDistance(newVals, lastLoggedVals) > MIN_LOG_DIST && newLogTime - lastLogTime > 20){
|
rt300@34
|
349 eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED_ALL, newVals);
|
rt300@34
|
350
|
rt300@34
|
351 lastLoggedVals = newVals;
|
rt300@34
|
352 howManyLogged++;
|
rt300@34
|
353 }else{
|
rt300@35
|
354 //cout << "skipped! so far logged " << howManyLogged << endl;
|
rt300@34
|
355 }
|
rt300@40
|
356 if(distanceSlider != NULL){
|
rt300@38
|
357 if(distanceSlider->isShowing()){
|
rt300@38
|
358 // get euc dist between cand and target
|
rt300@38
|
359 float d = euclideanDistance(newVals, targetSynth.getAllParamValues());
|
rt300@38
|
360
|
rt300@38
|
361 distanceSlider->setValueAndScale(d);
|
rt300@38
|
362 }
|
rt300@40
|
363 }
|
rt300@34
|
364 }
|
rt300@34
|
365
|
rt300@34
|
366
|
rt300@34
|
367 //----------------------------------------------------------------------------------
|
rt300@34
|
368 //----------------------------------------------------------------------------------
|
rt300@34
|
369 //----------------------------------------------------------------------------------
|
rt300@34
|
370 //---------------------------------------------------------------------------------- |