annotate TrainingMessageOrganiser.h @ 12:af71bf84660f

icon stuff. not working/tested.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Mon, 20 Oct 2014 14:12:23 +0100
parents 91c3fba6e5b9
children ab3e0e980c82
rev   line source
rt300@8 1 //
rt300@8 2 // TrainingMessageOrganiser.h
rt300@8 3 // riftathon
rt300@8 4 //
rt300@8 5 // Created by Robert Tubb on 17/10/2014.
rt300@8 6 //
rt300@8 7 //
rt300@8 8
rt300@8 9 #ifndef __riftathon__TrainingMessageOrganiser__
rt300@8 10 #define __riftathon__TrainingMessageOrganiser__
rt300@8 11
rt300@8 12 #include <iostream>
rt300@9 13 #include "trainingTestController.h"
rt300@9 14 #include "MessageOrganiser.h"
rt300@10 15 #include "SequenceController.h"
rt300@11 16 #include "globalVariables.h"
rt300@12 17 #include "IconPanel.h"
rt300@12 18
rt300@10 19 extern ExplorePresetManager expPresetManager;
rt300@10 20
rt300@9 21 class TrainingMessageOrganiser : public MessageOrganiser {
rt300@9 22 public:
rt300@9 23 void init( PDSynthWrapper& cs, PDSynthWrapper& ts){
rt300@9 24
rt300@9 25 trainingTestController = new TrainingTestController;
rt300@9 26
rt300@9 27 MessageOrganiser::init(cs,ts);
rt300@11 28
rt300@11 29 TickListenerFunction callback;
rt300@11 30 callback = boost::bind(&TrainingMessageOrganiser::onNextTick, this, _1);
rt300@11 31 candidateSynth.registerForTicks(callback);
rt300@12 32
rt300@12 33 sequencePreview = true;
rt300@11 34 }
rt300@8 35
rt300@9 36 void setupDefaultMapping(){
rt300@9 37 vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
rt300@9 38
rt300@9 39 controlPanelType cpt = REVISITABLE;
rt300@9 40 vector<controllerType> elemList;
rt300@12 41 for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
rt300@9 42 elemList.push_back(SLIDER);
rt300@9 43 }
rt300@9 44
rt300@9 45 vector<UIElement*> UIElemHandles = panel->generateControls(elemList, cpt);
rt300@9 46
rt300@9 47 mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
rt300@9 48
rt300@9 49 bottomPanel->show();
rt300@9 50 }
rt300@9 51
rt300@9 52 vector<int> getMappingIDsFromSynths(){
rt300@9 53 vector<int> index;
rt300@12 54 for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
rt300@9 55 index.push_back(i);
rt300@9 56 }
rt300@9 57 vector<int> mids = candidateSynth.getMappingIDForIndices(index);
rt300@9 58
rt300@9 59 return mids;
rt300@9 60 }
rt300@9 61
rt300@9 62 void setupNewTest(){
rt300@9 63
rt300@9 64
rt300@9 65 };
rt300@10 66
rt300@12 67 void setIconPanel(IconPanel * ip){
rt300@12 68 presetIconPanel = ip;
rt300@12 69 }
rt300@10 70 void onNextTick(int tickNumber){
rt300@11 71 cout << "TICK " << tickNumber << endl;
rt300@11 72
rt300@10 73 if ( tickNumber % 2){
rt300@10 74 // load next target preset
rt300@10 75 int i = sequenceController.getNextPresetIndex();
rt300@10 76
rt300@10 77 currentTargetPreset = expPresetManager.getPreset(i);
rt300@10 78
rt300@10 79 if (sequencePreview){
rt300@10 80 // show next target preset
rt300@12 81 presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage());
rt300@10 82
rt300@10 83 // show image
rt300@10 84 // show name
rt300@10 85 // show controllersettings
rt300@10 86
rt300@10 87
rt300@10 88 }else{ // the user is matching it
rt300@10 89 // show image
rt300@10 90 // show name
rt300@10 91
rt300@10 92 // if guided
rt300@10 93 // show controller guide
rt300@10 94 }
rt300@10 95
rt300@10 96
rt300@10 97 }else{ // we're plying the sound
rt300@10 98
rt300@10 99 //
rt300@10 100 if (sequencePreview){
rt300@10 101 // send target values again
rt300@10 102 targetSynth.setAllParams(currentTargetPreset->getValues());
rt300@10 103 targetSynth.trigger();
rt300@10 104
rt300@10 105 // flash the interface?
rt300@10 106 }else{
rt300@12 107 // has this been done? yes. candidateSynth.setAllParams(ui stuff);
rt300@12 108 candidateSynth.trigger();
rt300@12 109 showUserHowTheyDid();
rt300@10 110
rt300@10 111 }
rt300@10 112 }
rt300@10 113 }
rt300@10 114
rt300@9 115
rt300@9 116 protected:
rt300@12 117 void showUserHowTheyDid(){
rt300@12 118 // colour flash
rt300@12 119 // distance ?
rt300@12 120 // score
rt300@12 121
rt300@12 122 }
rt300@10 123 void loadPreset(string pname){
rt300@10 124
rt300@10 125 vector<int> values = expPresetManager.recallPreset(pname);
rt300@10 126 if (values.size()){
rt300@10 127 candidateSynth.setAllParams(values);
rt300@10 128 setAllSlidersToValues(values);
rt300@10 129 }else{
rt300@10 130 cout << "ERROR, no preset found" << endl;
rt300@10 131 }
rt300@10 132 }
rt300@10 133
rt300@10 134
rt300@10 135 void showATargetPresetWithGuide(Preset * p){ // this is when demoing the sequence to the user
rt300@10 136 // p.show icon
rt300@10 137 vector<int> values = p->getValues();
rt300@10 138 if (values.size()){
rt300@10 139 candidateSynth.setAllParams(values);
rt300@10 140 setAllSlidersToValues(values);
rt300@10 141 }else{
rt300@10 142 cout << "WARNING, preset to show had no values" << endl;
rt300@10 143 }
rt300@10 144 }
rt300@10 145
rt300@9 146 void mapSlidersToParams(vector<UIElement*> elems, vector<int> mids){
rt300@9 147
rt300@9 148 vector<UIElement*>::iterator elit;
rt300@9 149 vector<int> typeListLog;
rt300@9 150 int i = 0;
rt300@9 151 for(elit=elems.begin(); elit<elems.end();elit++){
rt300@9 152 if ( (*elit)->getType() == SLIDER){
rt300@9 153 if(i >= mids.size()){
rt300@9 154
rt300@9 155 cout << "ERROR ERROR: too many controls for mapping IDs: " << mids.size() << endl;
rt300@9 156 }
rt300@9 157
rt300@9 158 ButtronSlider* theSlider = (ButtronSlider*)(*elit);
rt300@9 159 mapControlToParam((*elit), mids[i]);
rt300@9 160 theSlider->setValueAndScale(candidateSynth.getParamValueForID(mids[i]));
rt300@9 161 cout << "Hint Value " << targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])) << endl;
rt300@9 162 theSlider->setHintValue(targetSynth.getParamValueFromName(candidateSynth.getNameForMappingID(mids[i])));
rt300@9 163 i++;
rt300@9 164 typeListLog.push_back(int(SLIDER));
rt300@9 165
rt300@9 166 }else{
rt300@9 167 cout << "ERROR ERROR: ui type not handled my mapping function !" << endl;
rt300@9 168 }
rt300@9 169 }
rt300@9 170
rt300@9 171 eventLogger.logEvent(CONTROL_LIST,typeListLog);
rt300@9 172 };
rt300@9 173
rt300@9 174 void buttonPressCallback(int mappingID, int value){
rt300@9 175 if(mappingID == VOLUME_CHANGE_ID){
rt300@9 176 targetSynth.sendVolume(value);
rt300@9 177 candidateSynth.sendVolume(value);
rt300@10 178 return;
rt300@9 179 }
rt300@9 180
rt300@9 181 if (mappingID == TRIGGER_CANDIDATE_ID){
rt300@9 182 triggerCandidateSound();
rt300@10 183 // compare to target
rt300@11 184 candidateSynth.startMetronome();
rt300@10 185 return;
rt300@10 186 }
rt300@10 187 if(mappingID == SAVE_PRESET_HIT){
rt300@10 188 expPresetManager.savePreset("blah", candidateSynth.getAllParamValues());
rt300@10 189 return;
rt300@10 190 }
rt300@10 191 if(mappingID == RECALL_PRESET_HIT){
rt300@10 192
rt300@10 193 loadPreset("blah");
rt300@9 194 return;
rt300@9 195 }
rt300@9 196 }
rt300@10 197 SequenceController sequenceController;
rt300@9 198 TrainingTestController* trainingTestController;
rt300@10 199 bool sequencePreview;
rt300@10 200 Preset * currentTargetPreset;
rt300@12 201 IconPanel* presetIconPanel;
rt300@8 202 };
rt300@8 203 #endif /* defined(__riftathon__TrainingMessageOrganiser__) */