annotate MessageOrganiser.mm @ 52:89944ab3e129 tip

fix oF linker errors ios8
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Tue, 03 Feb 2015 13:18:23 +0000
parents 2396eb9dcddd
children
rev   line source
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 //----------------------------------------------------------------------------------