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