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@27
|
28
|
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@18
|
42 // could template for ui element type??
|
rt300@18
|
43 void MessageOrganiser::mapButtonToAction(UIElement* control, int mappingID){
|
rt300@18
|
44 UICallbackFunction callbackF;
|
rt300@18
|
45 callbackF = boost::bind(&MessageOrganiser::buttonPressCallback, this, _1,_2);
|
rt300@18
|
46 control->addHandler(callbackF, mappingID);
|
rt300@18
|
47 currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
|
rt300@18
|
48 }
|
rt300@18
|
49
|
rt300@18
|
50
|
rt300@18
|
51 void MessageOrganiser::setControlPanel(SliderPanel* p){ // a bit specific??
|
rt300@27
|
52 controlPanel = p;
|
rt300@18
|
53
|
rt300@18
|
54 };
|
rt300@18
|
55 void MessageOrganiser::setBottomPanel(ButtonPanel * ntb){
|
rt300@18
|
56 bottomPanel = ntb;
|
rt300@18
|
57 };
|
rt300@18
|
58
|
rt300@18
|
59
|
rt300@18
|
60 void MessageOrganiser::setIconPanel(IconPanel * ip){
|
rt300@18
|
61 presetIconPanel = ip;
|
rt300@18
|
62 }
|
rt300@27
|
63
|
rt300@18
|
64 void MessageOrganiser::setInstructionPanel(TextPanel * ip){
|
rt300@18
|
65 instructionPanel = ip;
|
rt300@18
|
66 instructionPanel->show();
|
rt300@18
|
67 }
|
rt300@18
|
68
|
rt300@32
|
69 void MessageOrganiser::setSeqNumPanel(TextPanel * snp){
|
rt300@32
|
70 seqNumPanel = snp;
|
rt300@32
|
71 }
|
rt300@32
|
72 void MessageOrganiser::showSeqNum(int num){
|
rt300@32
|
73 stringstream s;
|
rt300@32
|
74 s << num;
|
rt300@32
|
75 seqNumPanel->setText(s.str());
|
rt300@32
|
76 seqNumPanel->show();
|
rt300@32
|
77 }
|
rt300@32
|
78 void MessageOrganiser::setScoreNumPanel(TextPanel * snp){
|
rt300@32
|
79 scoreNumPanel = snp;
|
rt300@32
|
80 }
|
rt300@32
|
81 void MessageOrganiser::showScoreNum(int num){
|
rt300@32
|
82 stringstream s;
|
rt300@32
|
83 s << "SCORE: " << num;
|
rt300@32
|
84 scoreNumPanel->setText(s.str());
|
rt300@32
|
85 scoreNumPanel->show();
|
rt300@32
|
86 }
|
rt300@18
|
87 //-----------------------------------------------------------------------------
|
rt300@18
|
88 void MessageOrganiser::hideMyPanels(){
|
rt300@18
|
89 presetIconPanel->hide();
|
rt300@18
|
90 instructionPanel->hide();
|
rt300@18
|
91 bottomPanel->hide();
|
rt300@27
|
92 controlPanel->hide();
|
rt300@18
|
93 }
|
rt300@18
|
94 void MessageOrganiser::showMyPanels(){
|
rt300@18
|
95 presetIconPanel->show();
|
rt300@18
|
96 instructionPanel->show();
|
rt300@18
|
97 bottomPanel->show();
|
rt300@27
|
98 controlPanel->show();
|
rt300@18
|
99 }
|
rt300@18
|
100
|
rt300@18
|
101 void MessageOrganiser::triggerCandidateSound(){
|
rt300@18
|
102 // log event
|
rt300@18
|
103 sendSynthValuesAgain();
|
rt300@18
|
104 candidateSynth.trigger();
|
rt300@18
|
105 eventLogger.logEvent(CANDIDATE_PLAYED);
|
rt300@18
|
106 // flash panel?
|
rt300@27
|
107 controlPanel->flash();
|
rt300@18
|
108 }
|
rt300@18
|
109
|
rt300@18
|
110 void MessageOrganiser::paramChangeCallback(int mappingID, int value){
|
rt300@18
|
111
|
rt300@18
|
112 if(onlyChangeCandidateOnTrigger){
|
rt300@18
|
113 candidateSynth.paramChangeCallback(mappingID, value, false);
|
rt300@18
|
114 }else{
|
rt300@18
|
115 candidateSynth.paramChangeCallback(mappingID, value, true);
|
rt300@18
|
116 }
|
rt300@18
|
117
|
rt300@18
|
118 vector<int> evtData;
|
rt300@18
|
119 evtData.push_back(mappingID); // or just index?
|
rt300@18
|
120 evtData.push_back(value);
|
rt300@18
|
121
|
rt300@18
|
122 eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
|
rt300@18
|
123 };
|
rt300@18
|
124
|
rt300@18
|
125 void MessageOrganiser::sendSynthValuesAgain(){
|
rt300@18
|
126 candidateSynth.sendAllParams();
|
rt300@18
|
127 targetSynth.sendAllParams();
|
rt300@18
|
128 };
|
rt300@18
|
129
|
rt300@18
|
130
|
rt300@18
|
131 void MessageOrganiser::setAllSlidersToValues(vector<int> values){
|
rt300@28
|
132 controlPanel->setValues(values);
|
rt300@18
|
133 }
|
rt300@18
|
134 // we want to set UI object
|
rt300@28
|
135 void MessageOrganiser::setUIToParam(int index, int value){
|
rt300@28
|
136
|
rt300@28
|
137 if(controlPanel->getPanelType() == ALL_SLIDERS){
|
rt300@28
|
138
|
rt300@28
|
139 UIElement* elem;
|
rt300@28
|
140 // get the element
|
rt300@28
|
141 if(controlPanel->subElements.size() <= index){
|
rt300@28
|
142 cout << "ERROR: index out of range for num sliders" << endl;
|
rt300@28
|
143 return;
|
rt300@28
|
144 }
|
rt300@28
|
145 elem = controlPanel->subElements[index];
|
rt300@28
|
146 if ( elem->getType() == SLIDER){
|
rt300@28
|
147 ButtronSlider* theSlider = (ButtronSlider*)elem;
|
rt300@28
|
148 theSlider->setValueAndScale(value);
|
rt300@28
|
149
|
rt300@28
|
150 }
|
rt300@28
|
151 }else if (controlPanel->getPanelType() == LEAP6DOF){
|
rt300@28
|
152 Leap6DBox* box = (Leap6DBox*)controlPanel->subElements[0];
|
rt300@28
|
153 box->setValueAndScale(index,value);
|
rt300@28
|
154
|
rt300@18
|
155 }
|
rt300@28
|
156
|
rt300@18
|
157 };
|
rt300@18
|
158
|
rt300@18
|
159
|
rt300@18
|
160 void MessageOrganiser::mapControlToParam(UIElement* control, int mappingID){
|
rt300@18
|
161
|
rt300@18
|
162 UICallbackFunction callbackF;
|
rt300@18
|
163 callbackF = boost::bind(&MessageOrganiser::paramChangeCallback, this, _1,_2);
|
rt300@18
|
164 control->addHandler(callbackF, mappingID);
|
rt300@18
|
165 // put in our map so we can send param values to gui
|
rt300@18
|
166 currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
|
rt300@18
|
167 cout << " Mapped control to ID: " << mappingID << "Name: " << candidateSynth.getNameForMappingID(mappingID) << endl;
|
rt300@18
|
168 control->setLabel(candidateSynth.getNameForMappingID(mappingID));
|
rt300@18
|
169 };
|
rt300@18
|
170
|
rt300@18
|
171 //-----------------------------------------------------------------------------
|
rt300@18
|
172
|
rt300@18
|
173 void MessageOrganiser::mapSlidersToParams(vector<UIElement*> elems, vector<int> mids){
|
rt300@18
|
174
|
rt300@18
|
175 vector<UIElement*>::iterator elit;
|
rt300@18
|
176 vector<int> typeListLog;
|
rt300@18
|
177 int i = 0;
|
rt300@18
|
178 for(elit=elems.begin(); elit<elems.end();elit++){
|
rt300@18
|
179 if ( (*elit)->getType() == SLIDER){
|
rt300@18
|
180 if(i >= mids.size()){
|
rt300@18
|
181
|
rt300@18
|
182 cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl;
|
rt300@18
|
183 }
|
rt300@18
|
184
|
rt300@18
|
185 ButtronSlider* theSlider = (ButtronSlider*)(*elit);
|
rt300@18
|
186 mapControlToParam((*elit), mids[i]);
|
rt300@18
|
187 theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i]));
|
rt300@18
|
188 cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl;
|
rt300@18
|
189 theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])));
|
rt300@18
|
190 i++;
|
rt300@18
|
191 typeListLog.push_back(int(SLIDER));
|
rt300@18
|
192
|
rt300@18
|
193 }else{
|
rt300@31
|
194
|
rt300@31
|
195 // TODO 6D box
|
rt300@18
|
196 cout << "ERROR ERROR: ui type not handled my mapping function !" << endl;
|
rt300@18
|
197 }
|
rt300@18
|
198 }
|
rt300@18
|
199
|
rt300@18
|
200 eventLogger.logEvent(CONTROL_LIST,typeListLog);
|
rt300@18
|
201 };
|
rt300@18
|
202
|
rt300@18
|
203 void MessageOrganiser::mapXYToParams(ButtronXY* control, int mappingIDX, int mappingIDY){
|
rt300@18
|
204 UICallbackFunction callback;
|
rt300@18
|
205
|
rt300@18
|
206 callback = boost::bind(&MessageOrganiser::paramChangeCallback, this, _1,_2);
|
rt300@18
|
207
|
rt300@18
|
208 control->addHandler(callback, mappingIDX, mappingIDY);
|
rt300@18
|
209
|
rt300@18
|
210 // put in our map so we can send param values to gui
|
rt300@18
|
211 //currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
|
rt300@18
|
212
|
rt300@18
|
213
|
rt300@18
|
214 cout << " Mapped control to XID: " << mappingIDX << "Name: " << candidateSynth.getNameForMappingID(mappingIDX) << endl;
|
rt300@18
|
215 cout << " Mapped control to YID: " << mappingIDY << "Name: " << candidateSynth.getNameForMappingID(mappingIDY) << endl;
|
rt300@18
|
216 control->setLabel(candidateSynth.getNameForMappingID(mappingIDX), candidateSynth.getNameForMappingID(mappingIDY));
|
rt300@18
|
217
|
rt300@18
|
218 };
|
rt300@18
|
219
|
rt300@18
|
220
|
rt300@18
|
221 void MessageOrganiser::mapControlToParam(UIElement* control, string paramName){
|
rt300@18
|
222 // get mapping ID from synth
|
rt300@18
|
223 int mappingID = candidateSynth.getMappingIDForName(paramName);
|
rt300@18
|
224 mapControlToParam(control, mappingID);
|
rt300@18
|
225 control->setLabel(paramName);
|
rt300@18
|
226 };
|
rt300@18
|
227
|
rt300@18
|
228 void MessageOrganiser::buttonPressCallback(int mappingID, int value){
|
rt300@18
|
229
|
rt300@18
|
230 };
|
rt300@18
|
231
|
rt300@18
|
232
|
rt300@18
|
233 void MessageOrganiser::setSlidersToTarget(){
|
rt300@18
|
234 // this will actually show sliders with target vals - for "memorisation" purposes mwa heh heh
|
rt300@18
|
235 // get target values
|
rt300@18
|
236 // set ui
|
rt300@32
|
237 cout << "set slid to targ" << endl;
|
rt300@18
|
238 vector<int> vals = targetSynth.getAllParamValues();
|
rt300@32
|
239 for(int i=0; i < vals.size(); i++){
|
rt300@18
|
240 setUIToParam(i, vals[i]);
|
rt300@18
|
241 }
|
rt300@18
|
242 }
|
rt300@21
|
243 void MessageOrganiser::showTargetAsHints(){
|
rt300@21
|
244 // int i = 0;
|
rt300@21
|
245 // vector<int> vals = targetSynth.getAllParamValues();
|
rt300@21
|
246 // for(auto elit=elems.begin(); elit<elems.end();elit++){
|
rt300@21
|
247 // ButtronSlider* theSlider = (ButtronSlider*)(*elit);
|
rt300@21
|
248 // theSlider->setHintValue(vals[i]);
|
rt300@21
|
249 // i++;
|
rt300@21
|
250 // }
|
rt300@21
|
251 }
|
rt300@18
|
252 void MessageOrganiser::setSlidersToDefault(){
|
rt300@32
|
253 for(int i=0; i < candidateSynth.getNumParams(); i++){
|
rt300@18
|
254 setUIToParam(i, 0);
|
rt300@22
|
255
|
rt300@18
|
256 }
|
rt300@22
|
257 }
|
rt300@22
|
258 void MessageOrganiser::setCandidateAndSlidersToRandom(){
|
rt300@22
|
259 vector<int> rands;
|
rt300@22
|
260 for(int i = 0; i < candidateSynth.getNumParams(); i++){
|
rt300@22
|
261
|
rt300@22
|
262 rands.push_back(rand() % 127);
|
rt300@22
|
263 }
|
rt300@22
|
264
|
rt300@22
|
265 setAllSlidersToValues(rands);
|
rt300@22
|
266 candidateSynth.setAllParams(rands);
|
rt300@22
|
267
|
rt300@32
|
268 }
|
rt300@32
|
269
|
rt300@32
|
270
|
rt300@32
|
271 void MessageOrganiser::midiFromLeap(int ctl_num, int ctl_val){
|
rt300@32
|
272
|
rt300@32
|
273
|
rt300@32
|
274 if (!okToGetMidi){
|
rt300@32
|
275 return;
|
rt300@32
|
276 }
|
rt300@32
|
277 vector<int> mids = candidateSynth.getAllMappingIDs();
|
rt300@32
|
278 if (ctl_num >= mids.size() || ctl_num < 0) return;
|
rt300@32
|
279
|
rt300@32
|
280 if(onlyChangeCandidateOnTrigger){
|
rt300@32
|
281
|
rt300@32
|
282 candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val, false);
|
rt300@32
|
283 }else{
|
rt300@32
|
284 candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val, true);
|
rt300@32
|
285 }
|
rt300@32
|
286
|
rt300@32
|
287
|
rt300@32
|
288 setUIToParam(ctl_num, ctl_val);
|
rt300@32
|
289
|
rt300@32
|
290 vector<int> evtData;
|
rt300@32
|
291 evtData.push_back(mids[ctl_num]); // or just index?
|
rt300@32
|
292 evtData.push_back(ctl_val);
|
rt300@32
|
293
|
rt300@32
|
294 eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
|
rt300@32
|
295
|
rt300@18
|
296 } |