annotate TrainingMessageOrganiser.h @ 13:ab3e0e980c82

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