# HG changeset patch # User Robert Tubb # Date 1417804565 0 # Node ID ba426cc4e6e1d30d1153cf767de4f4892b996d44 # Parent accc83229d7683203440e7034965f5ad57d03790 better sequence gen , same for easy (1) and hard (many ) seq fixed judder on sliders diff -r accc83229d76 -r ba426cc4e6e1 MessageOrganiser.mm --- 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 lastLoggedVals = zeros(TOTAL_NUM_PARAMS); + static vector newVals = zeros(TOTAL_NUM_PARAMS); + static long long lastLogTime; if(onlyChangeCandidateOnTrigger){ candidateSynth.paramChangeCallback(mappingID, value, false); @@ -122,11 +126,22 @@ candidateSynth.paramChangeCallback(mappingID, value, true); } - vector 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(){ diff -r accc83229d76 -r ba426cc4e6e1 PDSynthWrapper.h --- 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::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 diff -r accc83229d76 -r ba426cc4e6e1 SequenceController.h --- 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 randomSequence(int numInSequence); vector nonRandomSequence(int numInSequence); int getRandomButNot(int max, vector notThese); + void makeGuidedSequence(vector stepPresetIndices, int run, AnimStep& nextStep); + void makeMatchingSequence(vector stepPresetIndices, int run, AnimStep& nextStep); + void makePreview(vector stepPresetIndices, int run, AnimStep& nextStep); protected: vector steps; vector::iterator currentStep; diff -r accc83229d76 -r ba426cc4e6e1 SequenceController.mm --- 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 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 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 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 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; diff -r accc83229d76 -r ba426cc4e6e1 TrainingMessageOrganiser.mm --- 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()); } diff -r accc83229d76 -r ba426cc4e6e1 UI code/6Dbox.mm --- 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; + } } diff -r accc83229d76 -r ba426cc4e6e1 UI code/ButtronSlider.h --- 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); diff -r accc83229d76 -r ba426cc4e6e1 UI code/ButtronSlider.mm --- 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; } // //--------------------------------------------------------------------- diff -r accc83229d76 -r ba426cc4e6e1 UI code/UIElement.h --- 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__) */ diff -r accc83229d76 -r ba426cc4e6e1 UI code/UIElement.mm --- 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{