changeset 41:ba426cc4e6e1

better sequence gen , same for easy (1) and hard (many ) seq fixed judder on sliders
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Fri, 05 Dec 2014 18:36:05 +0000
parents accc83229d76
children 2bd658b44c2d
files MessageOrganiser.mm PDSynthWrapper.h SequenceController.h SequenceController.mm TrainingMessageOrganiser.mm UI code/6Dbox.mm UI code/ButtronSlider.h UI code/ButtronSlider.mm UI code/UIElement.h UI code/UIElement.mm
diffstat 10 files changed, 194 insertions(+), 175 deletions(-) [+]
line wrap: on
line diff
--- a/MessageOrganiser.mm	Thu Dec 04 19:21:41 2014 +0000
+++ b/MessageOrganiser.mm	Fri Dec 05 18:36:05 2014 +0000
@@ -115,6 +115,10 @@
 }
 //----------------------------------------------------------------------------------
 void MessageOrganiser::paramChangeCallback(int mappingID, int value){
+    static long int howManyLogged;
+    static vector<int> lastLoggedVals = zeros<int>(TOTAL_NUM_PARAMS);
+    static vector<int> newVals = zeros<int>(TOTAL_NUM_PARAMS);
+    static long long lastLogTime;
     
     if(onlyChangeCandidateOnTrigger){
         candidateSynth.paramChangeCallback(mappingID, value, false);
@@ -122,11 +126,22 @@
         candidateSynth.paramChangeCallback(mappingID, value, true);
     }
     
-    vector<int> evtData;
-    evtData.push_back(mappingID); // or just index?
-    evtData.push_back(value);
+    int ctl_num = candidateSynth.getIndexForMappingID(mappingID);
     
-    eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
+    // wait for a certain distance travelled AND time then record?
+    newVals[ctl_num] = value;
+    long long newLogTime = ofGetSystemTime();
+    
+    if (euclideanDistance(newVals, lastLoggedVals) > MIN_LOG_DIST && newLogTime - lastLogTime > 20){
+        eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED_ALL, newVals);
+        
+        lastLoggedVals = newVals;
+        howManyLogged++;
+    }else{
+        cout << "skipped! so far logged " << howManyLogged << endl;
+    }
+    
+    //eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
 };
 //----------------------------------------------------------------------------------
 void MessageOrganiser::sendSynthValuesAgain(){
--- a/PDSynthWrapper.h	Thu Dec 04 19:21:41 2014 +0000
+++ b/PDSynthWrapper.h	Fri Dec 05 18:36:05 2014 +0000
@@ -181,7 +181,16 @@
         }
         return pl;
     }
-    
+    int getIndexForMappingID(int mappingID){
+        std::vector<SynthParam>::iterator psp;
+        int i = 0;
+        for(psp = timbreParams.begin(); psp < timbreParams.end(); psp++){
+            if ( psp->getID() == mappingID){
+                return i;
+            }
+            i++;
+        }
+    }
     void paramChangeCallback(int mappingID, int value, bool send = true){
 
         // look for id in params
--- a/SequenceController.h	Thu Dec 04 19:21:41 2014 +0000
+++ b/SequenceController.h	Fri Dec 05 18:36:05 2014 +0000
@@ -14,7 +14,7 @@
 #include "presetManager.h"
 #include "TrainingScoreManager.h"
 
-#define MIN_TARGETS_IN_SEQUENCE 1
+#define MIN_TARGETS_IN_SEQUENCE 3
 #define NUM_REPETITIONS_AT_LEVEL 2
 #define MAX_TARGETS_IN_SEQUENCE 3
 #define MIN_TEMPO   70
@@ -23,6 +23,7 @@
 #define MAX_TIME 2800
 #define MIN_TIME 200
 #define NUM_TEMPO_STEPS 20
+#define END_NEUTRAL_MATCH 0
 
 #define NUM_PRESETS 8
 #define SPACER_BARS false
@@ -142,12 +143,16 @@
 private:
     void generateSteps();
     void generateCountIn(int countInLength);
-    void generateARun(int run, int numInSequence);
+    void generateRun(int run, int numInSequence);
+    void generateARun(int run, int numInSequence); // use this
     void generateAnEasyRun(int run, int numInSequence = 1);
     void generateASoundOnlyRun(int run, int numInSequence);
     vector<int> randomSequence(int numInSequence);
     vector<int> nonRandomSequence(int numInSequence);
     int getRandomButNot(int max, vector<int> notThese);
+    void makeGuidedSequence(vector<int> stepPresetIndices, int run, AnimStep& nextStep);
+    void makeMatchingSequence(vector<int> stepPresetIndices, int run, AnimStep& nextStep);
+    void makePreview(vector<int> stepPresetIndices, int run, AnimStep& nextStep);
 protected:
     vector<AnimStep> steps;
     vector<AnimStep>::iterator currentStep;
--- a/SequenceController.mm	Thu Dec 04 19:21:41 2014 +0000
+++ b/SequenceController.mm	Fri Dec 05 18:36:05 2014 +0000
@@ -208,10 +208,8 @@
         
         if (soundOnlyMode){
             generateASoundOnlyRun(run, numInSequence);
-        }else if(numInSequence == 1){
-            generateAnEasyRun(run);
-        }else{
-            generateARun(run, numInSequence);
+        }else {
+            generateRun(run, numInSequence);
         }
         steps.back().isLastOfRun = true;
         run++;
@@ -264,7 +262,7 @@
 }
 //-------------------------------------------------------------------
 
-void SequenceController::generateAnEasyRun(int run, int numInSequence){
+void SequenceController::generateRun(int run, int numInSequence){
     float curTempo = MIN_TEMPO;
     int seqNo = 0;
     AnimStep nextStep;
@@ -284,132 +282,35 @@
         nextStep.difficulty = 0;
         nextStep.type = AnimStep::PREVIEW_NEUTRAL_COUNT;
         nextStep.showsResultsAtEnd = false;
+        
+        //nextStep = makeFirstCountIn();
         steps.push_back(nextStep);
-        
+        if(numInSequence > 1){
+            // xtra count for tricky one
+            steps.push_back(nextStep);
+        }
         
         
         // generate a sequence of random preset indices
         vector<int> stepPresetIndices = randomSequence(numInSequence);
         nextStep.thisSequence = stepPresetIndices;
         
-        // MAKE PREVIEW
-        int n = 1;
-        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
-            // put loader
-            
-            nextStep.presetIndex = *si;
-            nextStep.runNumber = run;
-            nextStep.seqNumber = seqNo;
-            nextStep.whichInSequence = n;
-            nextStep.showsGuides = true;
-            nextStep.showsIcons = true;
-            nextStep.showsResultsAtEnd = false;
-            nextStep.type = AnimStep::PREVIEW_MOVE;
-            steps.push_back(nextStep);
-
-            n++;
-        }
+        makePreview(stepPresetIndices, run, nextStep);
         
-        // move back to neutral
-        nextStep.presetIndex = -1;
-        nextStep.type = AnimStep::PREVIEW_LAST;
-        nextStep.whichInSequence = 0;
-        nextStep.difficulty = 0;
-        nextStep.showsResultsAtEnd = false;
-        steps.push_back(nextStep);
+        // make GUIDED sequence (1 and 2)
+        makeGuidedSequence(stepPresetIndices, run, nextStep);
+        makeGuidedSequence(stepPresetIndices, run, nextStep);
         
-        // make GUIDED sequence (1)
-        n = 1;
-        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
-            // put loader
-            nextStep.difficulty = 1;
-            nextStep.presetIndex = *si;
-            nextStep.runNumber = run;
-            nextStep.seqNumber = seqNo;
-            nextStep.whichInSequence = n;
-            nextStep.tempo = curTempo;
-            nextStep.setTimeFromTempo();
-            nextStep.showsGuides = true;
-            nextStep.showsIcons = true;
-            nextStep.showsResultsAtEnd = true;
-            nextStep.type = AnimStep::MATCHING_MOVE;
-            steps.push_back(nextStep);
-            
-            if (SPACER_BARS){
-                nextStep.type = AnimStep::MATCHING_LAST;
-                steps.push_back(nextStep);
-            }
-            n++;
-        }
-        // move back to neutral
-        nextStep.presetIndex = -1;
-        nextStep.type = AnimStep::MATCHING_LAST;
-        nextStep.whichInSequence = 0;
-        nextStep.difficulty = 0;
-        nextStep.showsResultsAtEnd = false;
-        steps.push_back(nextStep);
-        
-        // make GUIDED sequence (2)
-        n = 1;
-        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
-            // put loader
-            nextStep.difficulty = 1;
-            nextStep.presetIndex = *si;
-            nextStep.runNumber = run;
-            nextStep.seqNumber = seqNo;
-            nextStep.whichInSequence = n;
-
-            nextStep.showsGuides = true;
-            nextStep.showsIcons = true;
-            nextStep.showsResultsAtEnd = true;
-            nextStep.type = AnimStep::MATCHING_MOVE;
-            steps.push_back(nextStep);
-            
-            if (SPACER_BARS){
-                nextStep.type = AnimStep::MATCHING_LAST;
-                steps.push_back(nextStep);
-            }
-            n++;
-        }
-        // move back to neutral
-        nextStep.presetIndex = -1;
-        nextStep.type = AnimStep::MATCHING_LAST;
-        nextStep.whichInSequence = 0;
-        nextStep.difficulty = 0;
-        nextStep.showsResultsAtEnd = false;
-        steps.push_back(nextStep);
-        
-        // make matching sequence with icon seq help
-        n = 1;
-        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
-            // put loader
-            nextStep.difficulty = 2;
-            nextStep.presetIndex = *si;
-            nextStep.whichInSequence = n;
-            
-            nextStep.showsGuides = false;
-            nextStep.showsIcons = true;
-            nextStep.type = AnimStep::MATCHING_MOVE;
-            nextStep.showsResultsAtEnd = true;
-            steps.push_back(nextStep);
-            
-            if (SPACER_BARS){
-                nextStep.type = AnimStep::MATCHING_LAST;
-                steps.push_back(nextStep);
-                
-            }
-            n++;
-            
-        }
-        
-        nextStep.type = AnimStep::MATCHING_LAST;
-        nextStep.whichInSequence = 0;
-        nextStep.difficulty = 0;
-        nextStep.showsResultsAtEnd = false;
-        steps.push_back(nextStep);
+        // make matching sequence without icon seq help
+        makeMatchingSequence(stepPresetIndices, run, nextStep);
+        makeMatchingSequence(stepPresetIndices, run, nextStep);
         
         steps.back().isLastOfSeq = true;
-        curTempo += tempoInc*0.8; // easier!!!
+        if(numInSequence == 1){
+            curTempo += tempoInc*0.8; // easier!!!??? will mess up time points
+        }else{
+            curTempo += tempoInc;
+        }
         seqNo++;
         cout << endl;
         
@@ -419,6 +320,95 @@
     steps.push_back(nextStep);
     
 }
+void SequenceController::makePreview(vector<int> stepPresetIndices, int run, AnimStep& nextStep){
+    
+    // MAKE PREVIEW
+    int n = 1;
+    for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+        // put loader
+        
+        nextStep.presetIndex = *si;
+        nextStep.runNumber = run;
+        nextStep.whichInSequence = n;
+        nextStep.showsGuides = true;
+        nextStep.showsIcons = true;
+        nextStep.showsResultsAtEnd = false;
+        nextStep.type = AnimStep::PREVIEW_MOVE;
+        steps.push_back(nextStep);
+        
+        n++;
+    }
+    
+    // move back to neutral
+    nextStep.presetIndex = -1;
+    nextStep.type = AnimStep::PREVIEW_LAST;
+    nextStep.whichInSequence = 0;
+    nextStep.difficulty = 0;
+    nextStep.showsResultsAtEnd = true;
+    steps.push_back(nextStep);
+}
+void SequenceController::makeGuidedSequence(vector<int> stepPresetIndices, int run, AnimStep& nextStep){
+    int n = 1;
+    for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+        // put loader
+        nextStep.difficulty = 1;
+        nextStep.presetIndex = *si;
+        nextStep.runNumber = run;
+        nextStep.whichInSequence = n;
+        nextStep.setTimeFromTempo();
+        nextStep.showsGuides = true;
+        nextStep.showsIcons = true;
+        nextStep.showsResultsAtEnd = true;
+        nextStep.type = AnimStep::MATCHING_MOVE;
+        steps.push_back(nextStep);
+        
+        if (SPACER_BARS){
+            nextStep.type = AnimStep::MATCHING_LAST;
+            steps.push_back(nextStep);
+        }
+        n++;
+    }
+    // move back to neutral
+    nextStep.presetIndex = -1;
+    nextStep.type = AnimStep::MATCHING_LAST;
+    nextStep.showsGuides = true;
+    nextStep.showsIcons = true;
+    nextStep.whichInSequence = END_NEUTRAL_MATCH;
+    nextStep.difficulty = 0;
+    nextStep.showsResultsAtEnd = true;
+    steps.push_back(nextStep);
+}
+void SequenceController::makeMatchingSequence(vector<int> stepPresetIndices, int run, AnimStep& nextStep){
+    int n = 1;
+    for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+        // put loader
+        nextStep.difficulty = 2;
+        nextStep.presetIndex = *si;
+        nextStep.runNumber = run;
+        nextStep.whichInSequence = n;
+        nextStep.setTimeFromTempo();
+        nextStep.showsGuides = false;
+        nextStep.showsIcons = false;
+        nextStep.showsResultsAtEnd = true;
+        nextStep.type = AnimStep::MATCHING_MOVE;
+        steps.push_back(nextStep);
+        
+        if (SPACER_BARS){
+            nextStep.type = AnimStep::MATCHING_LAST;
+            steps.push_back(nextStep);
+        }
+        n++;
+    }
+    // move back to neutral
+    nextStep.presetIndex = -1;
+    nextStep.type = AnimStep::MATCHING_LAST;
+    nextStep.whichInSequence = END_NEUTRAL_MATCH;
+    nextStep.difficulty = 0;
+    nextStep.showsGuides = false; // fact that preset is -1 indicates end of each seq
+    nextStep.showsIcons = false;
+    nextStep.showsResultsAtEnd = true; // to record neutral hit
+    steps.push_back(nextStep);
+}
 //-------------------------------------------------------------------
 void SequenceController::generateASoundOnlyRun(int run, int numInSequence){
     
@@ -475,29 +465,7 @@
         steps.push_back(nextStep);
         
         // make matching sequence WITHOUT icon seq help
-        n = 1;
-        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
-            // put loader
-            nextStep.difficulty = 3;
-            nextStep.presetIndex = *si;
-            nextStep.whichInSequence = n;
-            
-            nextStep.showsGuides = false;
-            
-            nextStep.type = AnimStep::MATCHING_MOVE;
-            nextStep.showsResultsAtEnd = true;
-            nextStep.showsIcons = false;
-            steps.push_back(nextStep);
-
-            n++;
-            
-        }
-        
-        nextStep.type = AnimStep::MATCHING_LAST;
-        nextStep.whichInSequence = 0;
-        nextStep.difficulty = 0;
-        nextStep.showsResultsAtEnd = false;
-        steps.push_back(nextStep);
+        makeMatchingSequence(stepPresetIndices, run, nextStep);
         
         steps.back().isLastOfSeq = true;
         curTempo += tempoInc;
--- a/TrainingMessageOrganiser.mm	Thu Dec 04 19:21:41 2014 +0000
+++ b/TrainingMessageOrganiser.mm	Fri Dec 05 18:36:05 2014 +0000
@@ -389,20 +389,17 @@
 
 
     oldTargetValues = newTargetValues;
-    if (newStep.showsGuides){
-        controlPanel->setColor(ofColor::seaGreen);
-    }else{
-        if (newStep.showsIcons){
-            controlPanel->setColor(ofColor::darkMagenta);
-        }else{
-            controlPanel->setColor(ofColor::red);
-            // set sliders to default texture
-            controlPanel->setIndicatorTexture(NULL);
-        }
-        
-        //bottomPanel->show();
+    if (!newStep.showsGuides || !newStep.showsIcons){
+        controlPanel->setColor(ofColor::red);
+        // set sliders to default texture
+        controlPanel->setIndicatorTexture(NULL);
         forgotButton->show();
         forgotButton->turnOff(); // please
+    }else{
+
+        controlPanel->setColor(ofColor::darkMagenta);
+
+
     }
 }
 //-----------------------------------------------------------------------------
@@ -424,14 +421,17 @@
 
     triggerCandidateSound();
     oldTargetValues = newTargetValues;
-    if (newStep.showsGuides){
-        controlPanel->setColor(ofColor::seaGreen);
+    if (!newStep.showsGuides || !newStep.showsIcons){
+        controlPanel->setColor(ofColor::red);
+        // set sliders to default texture
+        controlPanel->setIndicatorTexture(NULL);
+        forgotButton->show();
+        forgotButton->turnOff(); // please
     }else{
-        if (newStep.showsIcons){
-            controlPanel->setColor(ofColor::darkMagenta);
-        }else{
-            controlPanel->setColor(ofColor::red);
-        }
+        
+        controlPanel->setColor(ofColor::darkMagenta);
+        
+        
     }
 }
 //-----------------------------------------------------------------------------
@@ -497,7 +497,7 @@
         controlPanel->showHint(false);
         distanceSlider->hide();
     }
-    // special case - always show neutral position
+    // special case - always show guide for neutral position
     if(currentTargetPreset->name == "Neutral"){
         controlPanel->setAndShowHint(currentTargetPreset->getValues(), currentTargetPreset->getImage());
     }
--- a/UI code/6Dbox.mm	Thu Dec 04 19:21:41 2014 +0000
+++ b/UI code/6Dbox.mm	Fri Dec 05 18:36:05 2014 +0000
@@ -227,7 +227,11 @@
 
 
 void Leap6DBox::setHandTexture(ofImage* img){
-    handTextureRef = img;
+    if(img != NULL){
+        handTextureRef = img;
+    }else{
+        handTextureRef = &defaultImage;
+    }
     
     
 }
--- a/UI code/ButtronSlider.h	Thu Dec 04 19:21:41 2014 +0000
+++ b/UI code/ButtronSlider.h	Fri Dec 05 18:36:05 2014 +0000
@@ -80,7 +80,11 @@
     }
     
     void setHandTexture(ofImage* img){
-        handTextureRef = img;
+        if(img != NULL){
+            handTextureRef = img;
+        }else{
+            handTextureRef = &defaultImage;
+        }
         
     }
     void animateHintToNewValue(int newVal, float timeToTake);
--- a/UI code/ButtronSlider.mm	Thu Dec 04 19:21:41 2014 +0000
+++ b/UI code/ButtronSlider.mm	Fri Dec 05 18:36:05 2014 +0000
@@ -51,6 +51,8 @@
     setHandTexture(&defaultImage);
     showScoreForFrames = 0;
     hintPosAnimIncr = 0;
+    posAnimIncr = 0;
+    onlyOneTouchAllowed = true;
 }
 //
 //---------------------------------------------------------------------
--- a/UI code/UIElement.h	Thu Dec 04 19:21:41 2014 +0000
+++ b/UI code/UIElement.h	Fri Dec 05 18:36:05 2014 +0000
@@ -160,7 +160,7 @@
     virtual bool handleMyTouch(int x, int y, touchType ttype, int touchID) = 0; // subclass handles it
 
     bool isCoordInMyRegion(double x, double y); // not used
-    
+    bool atLeastOneTouchAlready();
     int zLayer;
     
 // protected members:
@@ -184,6 +184,6 @@
     bool hidden; // don't draw dont touch
     bool inactive;  // dont touch, draw dimmed
 
-    
+    bool onlyOneTouchAllowed;
 };
 #endif /* defined(__emptyExample__UIElement__) */
--- a/UI code/UIElement.mm	Thu Dec 04 19:21:41 2014 +0000
+++ b/UI code/UIElement.mm	Fri Dec 05 18:36:05 2014 +0000
@@ -57,6 +57,7 @@
     hidden = false;
     inactive = false;
     zLayer = 0;
+    onlyOneTouchAllowed = false;
 }
 //----------------------------------------------------------------------
 void UIElement::draw(){
@@ -76,6 +77,13 @@
         return false;
     }
 }
+bool UIElement::atLeastOneTouchAlready(){
+    if (myTouchIDs.size() >= 1){
+        return true;
+    }else{
+        return false;
+    }
+}
 //----------------------------------------------------------------------
 // called first from all subclasses
 bool UIElement::isMyTouch(int tx, int ty, touchType ttype, int touchID){
@@ -85,7 +93,11 @@
         if (touchIsInMyArea(tx, ty)){
             if (!isExistingTouchID(touchID)){
                 //cout << "Touchdown in area, grabbing focus " << labelName << " mytouchID: " << myTouchID << " finger ID: " << touchID << endl;
-                addTouchID(touchID);
+                if (onlyOneTouchAllowed && atLeastOneTouchAlready()){
+                    cout << "ignoring xtra touch" << endl;
+                }else{
+                    addTouchID(touchID);
+                }
                 return true;
 
             }else{