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@27: 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@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@18: rt300@18: rt300@18: void MessageOrganiser::setControlPanel(SliderPanel* p){ // a bit specific?? rt300@27: controlPanel = p; rt300@18: rt300@18: }; rt300@18: void MessageOrganiser::setBottomPanel(ButtonPanel * ntb){ rt300@18: bottomPanel = ntb; rt300@18: }; rt300@18: rt300@18: rt300@18: void MessageOrganiser::setIconPanel(IconPanel * ip){ rt300@18: presetIconPanel = ip; rt300@18: } rt300@27: rt300@18: void MessageOrganiser::setInstructionPanel(TextPanel * ip){ rt300@18: instructionPanel = ip; rt300@18: instructionPanel->show(); rt300@18: } rt300@18: rt300@18: rt300@18: //----------------------------------------------------------------------------- rt300@18: void MessageOrganiser::hideMyPanels(){ rt300@18: presetIconPanel->hide(); rt300@18: instructionPanel->hide(); rt300@18: bottomPanel->hide(); rt300@27: controlPanel->hide(); rt300@18: } rt300@18: void MessageOrganiser::showMyPanels(){ rt300@18: presetIconPanel->show(); rt300@18: instructionPanel->show(); rt300@18: bottomPanel->show(); rt300@27: controlPanel->show(); rt300@18: } rt300@18: rt300@18: void MessageOrganiser::triggerCandidateSound(){ rt300@18: // log event rt300@18: sendSynthValuesAgain(); rt300@18: candidateSynth.trigger(); rt300@18: eventLogger.logEvent(CANDIDATE_PLAYED); rt300@18: // flash panel? rt300@27: controlPanel->flash(); rt300@18: } rt300@18: rt300@18: void MessageOrganiser::paramChangeCallback(int mappingID, int value){ 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@18: vector evtData; rt300@18: evtData.push_back(mappingID); // or just index? rt300@18: evtData.push_back(value); rt300@18: rt300@18: eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData); rt300@18: }; rt300@18: rt300@18: void MessageOrganiser::sendSynthValuesAgain(){ rt300@18: candidateSynth.sendAllParams(); rt300@18: targetSynth.sendAllParams(); rt300@18: }; rt300@18: rt300@18: rt300@18: void MessageOrganiser::setAllSlidersToValues(vector values){ rt300@28: controlPanel->setValues(values); rt300@18: } 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@18: 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@18: 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@18: 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@18: rt300@18: void MessageOrganiser::buttonPressCallback(int mappingID, int value){ rt300@18: rt300@18: }; rt300@18: rt300@18: 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@18: vector vals = targetSynth.getAllParamValues(); rt300@18: for(int i=1; i < vals.size(); i++){ rt300@18: setUIToParam(i, vals[i]); rt300@18: } rt300@18: } 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@22: for(int i=1; i < candidateSynth.getNumParams(); i++){ rt300@18: setUIToParam(i, 0); rt300@22: rt300@18: } rt300@22: } 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@18: }