Mercurial > hg > tweakathon2ios
view 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 |
line wrap: on
line source
#include "MessageOrganiser.h" void MessageOrganiser::init(PDSynthWrapper& cs, PDSynthWrapper& ts){ candidateSynth = cs; targetSynth = ts; onlyChangeCandidateOnTrigger = true; } void MessageOrganiser::setupDefaultMapping(controlPanelType whichInterfaceAreWeUsing){ vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths(); vector<controllerType> elemList; if (whichInterfaceAreWeUsing == ALL_SLIDERS){ for(int i = 0; i < TOTAL_NUM_PARAMS; i++){ elemList.push_back(SLIDER); } }else if (whichInterfaceAreWeUsing == LEAP6DOF){ elemList.push_back(LEAP6D); } vector<UIElement*> UIElemHandles = controlPanel->generateControls(elemList, whichInterfaceAreWeUsing); mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams); panelType =whichInterfaceAreWeUsing; } //---------------------------------------------------------------------------------------- vector<int> MessageOrganiser::getMappingIDsFromSynths(){ vector<int> index; for(int i = 0; i < TOTAL_NUM_PARAMS; i++){ index.push_back(i); } vector<int> mids = candidateSynth.getMappingIDForIndices(index); return mids; } //---------------------------------------------------------------------------------- // could template for ui element type?? void MessageOrganiser::mapButtonToAction(UIElement* control, int mappingID){ UICallbackFunction callbackF; callbackF = boost::bind(&MessageOrganiser::buttonPressCallback, this, _1,_2); control->addHandler(callbackF, mappingID); currentMapping.insert(std::pair<int,UIElement*>(mappingID,control)); } void MessageOrganiser::setPanelType(controlPanelType p){ panelType = p; } //---------------------------------------------------------------------------------- void MessageOrganiser::setControlPanel(SliderPanel* p){ // a bit specific?? controlPanel = p; }; //---------------------------------------------------------------------------------- void MessageOrganiser::setBottomPanel(ButtonPanel * ntb){ bottomPanel = ntb; }; //---------------------------------------------------------------------------------- void MessageOrganiser::setSkipButton(Buttron* b){ skipButton = b; } void MessageOrganiser::setIconPanel(IconPanel * ip){ presetIconPanel = ip; } //---------------------------------------------------------------------------------------- void MessageOrganiser::setMiddlePanel(TextPanel* tp){ middlePanel = tp; } //---------------------------------------------------------------------------------- void MessageOrganiser::setInstructionPanel(TextPanel * ip){ instructionPanel = ip; instructionPanel->show(); } void MessageOrganiser::setDistanceSlider(ButtronSlider * s){ distanceSlider = s; } //---------------------------------------------------------------------------------- void MessageOrganiser::setSeqNumPanel(TextPanel * snp){ seqNumPanel = snp; } void MessageOrganiser::showSeqNum(int num){ stringstream s; if (num == 0){ s << "-> N"; }else if(num == 1){ s << "-> A"; }else if(num == 2){ s << "-> B"; }else if(num == 3){ s << "-> C"; }else if(num == -1){ s << ""; } seqNumPanel->setText(s.str()); seqNumPanel->show(); } void MessageOrganiser::setScoreNumPanel(TextPanel * snp){ scoreNumPanel = snp; } void MessageOrganiser::showScoreNum(int num){ stringstream s; s << "SCORE: " << num; scoreNumPanel->setText(s.str()); scoreNumPanel->show(); } //----------------------------------------------------------------------------- void MessageOrganiser::hideMyPanels(){ presetIconPanel->hide(); instructionPanel->hide(); bottomPanel->hide(); controlPanel->hide(); middlePanel->hide(); okToGetMidi = false; } //---------------------------------------------------------------------------------- void MessageOrganiser::showMyPanels(){ presetIconPanel->show(); instructionPanel->show(); bottomPanel->show(); controlPanel->show(); } //---------------------------------------------------------------------------------- void MessageOrganiser::triggerCandidateSound(){ // log event sendSynthValuesAgain(); // TODO AAAARG too slow??? candidateSynth.trigger(); eventLogger.logEvent(CANDIDATE_PLAYED); } //---------------------------------------------------------------------------------- void MessageOrganiser::paramChangeCallback(int mappingID, int value){ static long int howManyLogged; static vector<int> lastLoggedVals = zeros<int>(TOTAL_NUM_PARAMS); static vector<int> newVals = zeros<int>(TOTAL_NUM_PARAMS); static long long lastLogTime; if(onlyChangeCandidateOnTrigger){ candidateSynth.paramChangeCallback(mappingID, value, false); }else{ candidateSynth.paramChangeCallback(mappingID, value, true); } int ctl_num = candidateSynth.getIndexForMappingID(mappingID); // wait for a certain distance travelled AND time then record? newVals[ctl_num] = value; long long newLogTime = ofGetSystemTime(); if (euclideanDistance(newVals, lastLoggedVals) > MIN_LOG_DIST && newLogTime - lastLogTime > 20){ eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED_ALL, newVals); lastLoggedVals = newVals; howManyLogged++; }else{ //cout << "skipped! so far logged " << howManyLogged << endl; } //eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData); }; //---------------------------------------------------------------------------------- void MessageOrganiser::sendSynthValuesAgain(){ candidateSynth.sendAllParams(); targetSynth.sendAllParams(); }; //---------------------------------------------------------------------------------- void MessageOrganiser::setAllSlidersToValues(vector<int> values){ controlPanel->setValues(values); } //---------------------------------------------------------------------------------- // we want to set UI object void MessageOrganiser::setUIToParam(int index, int value){ if(controlPanel->getPanelType() == ALL_SLIDERS){ UIElement* elem; // get the element if(controlPanel->subElements.size() <= index){ cout << "ERROR: index out of range for num sliders" << endl; return; } elem = controlPanel->subElements[index]; if ( elem->getType() == SLIDER){ ButtronSlider* theSlider = (ButtronSlider*)elem; theSlider->setValueAndScale(value); } }else if (controlPanel->getPanelType() == LEAP6DOF){ Leap6DBox* box = (Leap6DBox*)controlPanel->subElements[0]; box->setValueAndScale(index,value); } }; //---------------------------------------------------------------------------------- void MessageOrganiser::mapControlToParam(UIElement* control, int mappingID){ UICallbackFunction callbackF; callbackF = boost::bind(&MessageOrganiser::paramChangeCallback, this, _1,_2); control->addHandler(callbackF, mappingID); // put in our map so we can send param values to gui currentMapping.insert(std::pair<int,UIElement*>(mappingID,control)); cout << " Mapped control to ID: " << mappingID << "Name: " << candidateSynth.getNameForMappingID(mappingID) << endl; control->setLabel(candidateSynth.getNameForMappingID(mappingID)); }; //----------------------------------------------------------------------------- void MessageOrganiser::mapSlidersToParams(vector<UIElement*> elems, vector<int> mids){ vector<UIElement*>::iterator elit; vector<int> typeListLog; int i = 0; for(elit=elems.begin(); elit<elems.end();elit++){ if ( (*elit)->getType() == SLIDER){ if(i >= mids.size()){ cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl; } ButtronSlider* theSlider = (ButtronSlider*)(*elit); mapControlToParam((*elit), mids[i]); theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i])); cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl; theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i]))); i++; typeListLog.push_back(int(SLIDER)); }else{ // TODO 6D box cout << "ERROR ERROR: ui type not handled my mapping function !" << endl; } } eventLogger.logEvent(CONTROL_LIST,typeListLog); }; //---------------------------------------------------------------------------------- void MessageOrganiser::mapXYToParams(ButtronXY* control, int mappingIDX, int mappingIDY){ UICallbackFunction callback; callback = boost::bind(&MessageOrganiser::paramChangeCallback, this, _1,_2); control->addHandler(callback, mappingIDX, mappingIDY); // put in our map so we can send param values to gui //currentMapping.insert(std::pair<int,UIElement*>(mappingID,control)); cout << " Mapped control to XID: " << mappingIDX << "Name: " << candidateSynth.getNameForMappingID(mappingIDX) << endl; cout << " Mapped control to YID: " << mappingIDY << "Name: " << candidateSynth.getNameForMappingID(mappingIDY) << endl; control->setLabel(candidateSynth.getNameForMappingID(mappingIDX), candidateSynth.getNameForMappingID(mappingIDY)); }; //---------------------------------------------------------------------------------- void MessageOrganiser::mapControlToParam(UIElement* control, string paramName){ // get mapping ID from synth int mappingID = candidateSynth.getMappingIDForName(paramName); mapControlToParam(control, mappingID); control->setLabel(paramName); }; //---------------------------------------------------------------------------------- void MessageOrganiser::buttonPressCallback(int mappingID, int value){ }; //---------------------------------------------------------------------------------- void MessageOrganiser::setSlidersToTarget(){ // this will actually show sliders with target vals - for "memorisation" purposes mwa heh heh // get target values // set ui cout << "set slid to targ" << endl; vector<int> vals = targetSynth.getAllParamValues(); for(int i=0; i < vals.size(); i++){ setUIToParam(i, vals[i]); } } void MessageOrganiser::setSlidersToCandidate(){ vector<int> vals = candidateSynth.getAllParamValues(); for(int i=0; i < vals.size(); i++){ setUIToParam(i, vals[i]); } } void MessageOrganiser::showTargetAsHints(){ // int i = 0; // vector<int> vals = targetSynth.getAllParamValues(); // for(auto elit=elems.begin(); elit<elems.end();elit++){ // ButtronSlider* theSlider = (ButtronSlider*)(*elit); // theSlider->setHintValue(vals[i]); // i++; // } } void MessageOrganiser::setSlidersToDefault(){ for(int i=0; i < candidateSynth.getNumParams(); i++){ setUIToParam(i, 0); } } //---------------------------------------------------------------------------------- void MessageOrganiser::setCandidateAndSlidersToRandom(){ vector<int> rands; for(int i = 0; i < candidateSynth.getNumParams(); i++){ rands.push_back(rand() % 127); } setAllSlidersToValues(rands); candidateSynth.setAllParams(rands); } //---------------------------------------------------------------------------------- void MessageOrganiser::midiFromLeap(int ctl_num, int ctl_val){ static long int howManyLogged; static vector<int> lastLoggedVals = zeros<int>(TOTAL_NUM_PARAMS); static vector<int> newVals = zeros<int>(TOTAL_NUM_PARAMS); static long long lastLogTime; if (!okToGetMidi){ return; } vector<int> mids = candidateSynth.getAllMappingIDs(); if (ctl_num >= mids.size() || ctl_num < 0) return; if(onlyChangeCandidateOnTrigger){ candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val, false); }else{ candidateSynth.paramChangeCallback(mids[ctl_num], ctl_val, true); } setUIToParam(ctl_num, ctl_val); // wait for a certain distance travelled AND time then record? newVals[ctl_num] = ctl_val; long long newLogTime = ofGetSystemTime(); if (euclideanDistance(newVals, lastLoggedVals) > MIN_LOG_DIST && newLogTime - lastLogTime > 20){ eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED_ALL, newVals); lastLoggedVals = newVals; howManyLogged++; }else{ //cout << "skipped! so far logged " << howManyLogged << endl; } if(distanceSlider != NULL){ if(distanceSlider->isShowing()){ // get euc dist between cand and target float d = euclideanDistance(newVals, targetSynth.getAllParamValues()); distanceSlider->setValueAndScale(d); } } } //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------