annotate MessageOrganiser.mm @ 34:3af380769779

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