annotate SequenceController.h @ 15:e439bf85b665

PDSynthWrapper reorganisation
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Tue, 21 Oct 2014 16:52:56 +0100
parents f83635861187
children 5cf2b80909fc
rev   line source
rt300@8 1 //
rt300@14 2 // SequenceGenerator.h
rt300@8 3 // riftathon
rt300@8 4 //
rt300@14 5 // Created by Robert Tubb on 21/10/2014.
rt300@8 6 //
rt300@8 7 //
rt300@8 8
rt300@14 9 #ifndef __riftathon__SequenceGenerator__
rt300@14 10 #define __riftathon__SequenceGenerator__
rt300@8 11
rt300@8 12 #include <iostream>
rt300@14 13 #include "ofMain.h"
rt300@8 14
rt300@14 15 #define MIN_TARGETS_IN_SEQUENCE 3
rt300@14 16 #define MAX_TARGETS_IN_SEQUENCE 5
rt300@10 17 #define MIN_TEMPO 80
rt300@14 18 #define MAX_TEMPO 150
rt300@14 19 #define NUM_TEMPO_STEPS 16
rt300@14 20 #define NUM_PRESETS 8
rt300@10 21
rt300@14 22 class Step{
rt300@13 23 public:
rt300@14 24 typedef enum {COUNT_IN, PREVIEW_DISPLAY, PREVIEW_PLAY, MATCHING_INTERACTION, MATCHING_RESULT} stepTypes;
rt300@14 25 // gui display
rt300@14 26 bool showsTargetIcon;
rt300@14 27 bool showsControlSettings;
rt300@14 28 bool showsControlGuides;
rt300@14 29 bool showsMatchResults;
rt300@14 30 // gui input
rt300@14 31 bool allowsCandidateControl;
rt300@14 32 // sound
rt300@14 33 bool playsTarget;
rt300@14 34 bool playsCandidate;
rt300@14 35 // control flow
rt300@14 36 stepTypes type;
rt300@14 37 bool isPreview;
rt300@14 38
rt300@14 39 int seqNumber;
rt300@14 40 int runNumber;
rt300@14 41 bool isLastOfSeq;
rt300@14 42 bool isLastOfRun;
rt300@14 43 bool playsMetroClick;
rt300@14 44 int tempo;
rt300@14 45 // preset info
rt300@14 46 int presetIndex;
rt300@14 47 int numInSequence;
rt300@14 48 bool isLastOfAll;
rt300@14 49
rt300@14 50 Step(){
rt300@14 51 type = COUNT_IN;
rt300@13 52
rt300@14 53 showsTargetIcon = false;
rt300@14 54 showsControlSettings = false;
rt300@14 55 showsControlGuides = false;
rt300@14 56 showsMatchResults = false;
rt300@14 57 isPreview = false;
rt300@14 58
rt300@14 59 allowsCandidateControl = false;
rt300@14 60 playsTarget = false;
rt300@14 61 playsCandidate = false;
rt300@14 62
rt300@14 63 playsMetroClick = true;
rt300@14 64
rt300@14 65 isLastOfSeq = false;
rt300@14 66 isLastOfRun = false;
rt300@14 67 isLastOfAll = false;
rt300@14 68 presetIndex = -1;
rt300@14 69 seqNumber = -1;
rt300@14 70 runNumber = -1;
rt300@14 71
rt300@14 72 tempo = MIN_TEMPO;
rt300@13 73 }
rt300@14 74 void setAsPreviewShower(){
rt300@14 75 type = PREVIEW_DISPLAY;
rt300@14 76 showsTargetIcon = true;
rt300@14 77 showsControlSettings = true;
rt300@14 78 showsMatchResults = false;
rt300@14 79 isPreview = true;
rt300@13 80
rt300@14 81 allowsCandidateControl = false;
rt300@14 82 playsTarget = true;
rt300@14 83 playsCandidate = false;
rt300@14 84 playsMetroClick = false;
rt300@14 85 }
rt300@14 86 void setAsPreviewPlayer(){
rt300@14 87 type = PREVIEW_PLAY;
rt300@14 88 showsTargetIcon = true;
rt300@14 89 showsControlSettings = false;
rt300@14 90 showsMatchResults = false;
rt300@14 91 isPreview = true;
rt300@13 92
rt300@14 93 allowsCandidateControl = false;
rt300@14 94 playsTarget = true;
rt300@14 95 playsCandidate = false;
rt300@13 96
rt300@14 97 playsMetroClick = false;
rt300@14 98 }
rt300@14 99 void setAsMatchingPreparer(){
rt300@14 100 type = MATCHING_INTERACTION;
rt300@14 101 showsTargetIcon = true;
rt300@14 102 showsControlSettings = false;
rt300@14 103 showsControlGuides = true;
rt300@14 104 showsMatchResults = false;
rt300@14 105 isPreview = false;
rt300@14 106
rt300@14 107 allowsCandidateControl = true;
rt300@14 108 playsTarget = false;
rt300@14 109 playsCandidate = false;
rt300@14 110
rt300@14 111 playsMetroClick = false;
rt300@14 112 }
rt300@14 113 void setAsMatchingReckoner(){
rt300@14 114 type = MATCHING_RESULT;
rt300@14 115 showsTargetIcon = true;
rt300@14 116 showsControlSettings = false;
rt300@14 117 showsControlGuides = true;
rt300@14 118 showsMatchResults = true; // shows how far off you were?
rt300@14 119 isPreview = false;
rt300@14 120
rt300@14 121 allowsCandidateControl = false;
rt300@14 122 playsTarget = false;
rt300@14 123 playsCandidate = true;
rt300@14 124
rt300@14 125 playsMetroClick = false;
rt300@13 126 }
rt300@13 127
rt300@14 128 float getTimeBetweenTicks(){
rt300@14 129 return 1000. * (60.0/tempo);
rt300@14 130 }
rt300@13 131 };
rt300@13 132
rt300@10 133 class SequenceController{
rt300@10 134 public:
rt300@10 135 SequenceController(){
rt300@13 136 tempoInc = float(MAX_TEMPO - MIN_TEMPO) / float(NUM_TEMPO_STEPS);
rt300@14 137 generateSteps();
rt300@14 138 setToStart();
rt300@10 139 };
rt300@14 140 Step getNextStep(){
rt300@13 141
rt300@14 142 currentStep++;
rt300@14 143 if ((*currentStep).isLastOfRun){
rt300@14 144 // uh
rt300@13 145 }
rt300@14 146 if ((*currentStep).isLastOfSeq){
rt300@13 147
rt300@14 148 }
rt300@14 149 return (*currentStep);
rt300@14 150
rt300@14 151 };
rt300@14 152 void setToStart(){
rt300@14 153 currentStep = steps.begin();
rt300@14 154 }
rt300@14 155 void stepForward(){
rt300@14 156 currentStep++;
rt300@14 157 };
rt300@14 158 float getStartTickTime(){
rt300@14 159 return 1000. * (60.0/MIN_TEMPO);
rt300@14 160 }
rt300@14 161 private:
rt300@14 162 void generateSteps(){
rt300@14 163 srand (time(NULL));
rt300@14 164
rt300@14 165 int run = 0;
rt300@14 166
rt300@14 167
rt300@14 168
rt300@14 169 for(int numInSequence = MIN_TARGETS_IN_SEQUENCE; numInSequence <= MAX_TARGETS_IN_SEQUENCE; numInSequence++){
rt300@14 170 generateCountIn(2);
rt300@14 171 generateARun(run, numInSequence);
rt300@14 172
rt300@14 173 steps.back().isLastOfRun = true;
rt300@14 174 run++;
rt300@14 175 cout << "-generate run finished-" << endl;
rt300@14 176 }
rt300@14 177 steps.back().isLastOfAll = true;
rt300@14 178 };
rt300@14 179 void generateCountIn(int countInLength){
rt300@14 180 Step countStep;
rt300@14 181 for (int i = 0; i < countInLength; i++){
rt300@14 182 countStep.numInSequence = countInLength - i + 1;
rt300@14 183 steps.push_back(countStep);
rt300@14 184
rt300@14 185 }
rt300@14 186 };
rt300@14 187 void generateARun(int run, int numInSequence){
rt300@14 188 float curTempo = MIN_TEMPO;
rt300@14 189 int seqNo = 0;
rt300@14 190
rt300@14 191 for(int tempoLevel = 0; tempoLevel < NUM_TEMPO_STEPS; tempoLevel++){
rt300@14 192
rt300@14 193 vector<int> stepPreset;
rt300@14 194
rt300@14 195 // get some random ints
rt300@14 196 for(int n=0; n < numInSequence; n++){
rt300@14 197 int nextPreset = getRandomButNot(NUM_PRESETS,stepPreset);
rt300@14 198 stepPreset.push_back(nextPreset);
rt300@14 199 cout << nextPreset << ",";
rt300@14 200 }
rt300@14 201 // put preview
rt300@14 202 Step nextStep;
rt300@14 203
rt300@14 204 int n = 0;
rt300@14 205 for(auto si = stepPreset.begin(); si < stepPreset.end(); si++){
rt300@14 206 // put loader
rt300@13 207
rt300@14 208 nextStep.presetIndex = *si;
rt300@14 209 nextStep.runNumber = run;
rt300@14 210 nextStep.seqNumber = seqNo;
rt300@14 211 nextStep.numInSequence = n;
rt300@14 212 nextStep.tempo = curTempo;
rt300@14 213 nextStep.setAsPreviewShower();
rt300@14 214 steps.push_back(nextStep);
rt300@14 215
rt300@14 216 // put player
rt300@14 217 //
rt300@14 218 // nextStep.setAsPreviewPlayer();
rt300@14 219 // steps.push_back(nextStep);
rt300@14 220 n++;
rt300@13 221 }
rt300@14 222 // last one in sequence allows control ?
rt300@14 223 steps.back().allowsCandidateControl = true;
rt300@14 224 // put in matching sequence
rt300@14 225 n = 0;
rt300@14 226 for(auto si = stepPreset.begin(); si < stepPreset.end(); si++){
rt300@14 227 // put loader
rt300@14 228
rt300@14 229 nextStep.presetIndex = *si;
rt300@14 230 nextStep.numInSequence = n;
rt300@14 231 nextStep.setAsMatchingPreparer();
rt300@14 232 steps.push_back(nextStep);
rt300@14 233
rt300@14 234 // put player
rt300@14 235
rt300@14 236 nextStep.setAsMatchingReckoner();
rt300@14 237 steps.push_back(nextStep);
rt300@14 238 n++;
rt300@14 239 }
rt300@14 240
rt300@14 241 steps.back().isLastOfSeq = true;
rt300@14 242 curTempo += tempoInc;
rt300@14 243 seqNo++;
rt300@14 244 cout << endl;
rt300@14 245
rt300@13 246 }
rt300@10 247
rt300@13 248 }
rt300@14 249
rt300@14 250
rt300@10 251 int getRandomButNot(int max, vector<int> notThese){
rt300@10 252
rt300@10 253 bool there = true;
rt300@13 254 int randomInt = rand() % max;
rt300@10 255
rt300@10 256 if (notThese.size()){
rt300@14 257 while(there){
rt300@14 258 randomInt = rand() % max;
rt300@14 259 vector<int>::iterator result = std::find(notThese.begin(), notThese.end(), randomInt);
rt300@14 260 there = (result != notThese.end());
rt300@14 261 }
rt300@10 262 }
rt300@10 263 return randomInt;
rt300@10 264
rt300@10 265 };
rt300@8 266
rt300@14 267 vector<Step> steps;
rt300@14 268 vector<Step>::iterator currentStep;
rt300@13 269 float tempoInc;
rt300@8 270 };
rt300@8 271
rt300@14 272 #endif /* defined(__riftathon__SequenceGenerator__) */