changeset 27:27cdf475aa4b

more fiddling
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 29 Oct 2014 15:38:38 +0000
parents 8d7ae43b2edd
children 953db6518738
files ExpMessageOrganiser.h ExpMessageOrganiser.mm ExplorePresetManager.h IntroViewController.h IntroViewController.mm IntroViewController.xib MessageOrganiser.h MessageOrganiser.mm QuestionnaireViewController.mm SearchMessageOrganiser.h SequenceController.h SequenceController.mm TrainingMessageOrganiser.h TrainingMessageOrganiser.mm UI code/6Dbox.h UI code/6Dbox.mm UI code/ButtronSlider.h UI code/ButtronSlider.mm UI code/UIElement.h UI code/sliderPanel.h UI code/sliderPanel.mm algorithms.h globalVariables.h presetManager.h presetManager.mm testApp.h testApp.mm
diffstat 27 files changed, 818 insertions(+), 421 deletions(-) [+]
line wrap: on
line diff
--- a/ExpMessageOrganiser.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/ExpMessageOrganiser.h	Wed Oct 29 15:38:38 2014 +0000
@@ -20,8 +20,8 @@
     
 public:
     void init( PDSynthWrapper& cs, PDSynthWrapper& ts);
-    void setup();
-    void setupDefaultMapping();
+    void setup(controlPanelType whichInterfaceAreWeUsing);
+    
     vector<int> getMappingIDsFromSynths();
     void showCurrentSlot();
     void loadPreset(string pname);
@@ -30,7 +30,7 @@
 private:
     void loadDefaultSound();
     int numParamsToUse;
-    
+    Preset neutralPreset;
 };
 
 
--- a/ExpMessageOrganiser.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/ExpMessageOrganiser.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -12,35 +12,20 @@
     numParamsToUse = TOTAL_NUM_PARAMS;
     MessageOrganiser::init(cs,ts);
     
+}
+void ExpMessageOrganiser::setup(controlPanelType whichInterfaceAreWeUsing){
+
     
-}
-void ExpMessageOrganiser::setup(){
-    // do stuff like load first slot
-    setupDefaultMapping();
+    setupDefaultMapping(whichInterfaceAreWeUsing);
     expPresetManager.goToFirstEmptySlot();
     showCurrentSlot();
     instructionPanel->setLabel("Find a sound\n that expresses:");
     instructionPanel->show();
+    bottomPanel->show();
     okToGetMidi = true;
 }
 
 
-void ExpMessageOrganiser::setupDefaultMapping(){
-    vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
-    
-    controlPanelType cpt = REVISITABLE;
-    vector<controllerType> elemList;
-    for(int i = 0; i < numParamsToUse; i++){
-        elemList.push_back(SLIDER);
-    }
-    
-    vector<UIElement*> UIElemHandles = panel->generateControls(elemList, cpt);
-    
-    mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
-    
-    bottomPanel->show();
-}
-
 vector<int> ExpMessageOrganiser::getMappingIDsFromSynths(){
     vector<int> index;
     for(int i = 0; i < numParamsToUse; i++){
--- a/ExplorePresetManager.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/ExplorePresetManager.h	Wed Oct 29 15:38:38 2014 +0000
@@ -107,6 +107,8 @@
     
     vector<string> categories;
     vector<string> names;
+    
+    
 };
 
 #endif /* defined(__riftathon__ExplorePresetManager__) */
--- a/IntroViewController.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/IntroViewController.h	Wed Oct 29 15:38:38 2014 +0000
@@ -12,6 +12,7 @@
 
 @property (nonatomic, assign)       id theOFAppRef;
 @property (retain, nonatomic) IBOutlet UILabel *text;
+@property (nonatomic)               NSInteger interfaceSelection;
 
 -(IBAction)hide:(id)sender;
 -(IBAction)show:(id)sender;
--- a/IntroViewController.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/IntroViewController.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -10,6 +10,8 @@
 #import "testApp.h"
 @interface IntroViewController ()
 
+
+
 @end
 
 @implementation IntroViewController
@@ -19,6 +21,7 @@
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     if (self) {
         // Custom initialization
+        self.interfaceSelection = 0;
     }
     return self;
 }
@@ -28,6 +31,12 @@
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
 }
+- (IBAction)oninterfaceSelect:(id)sender {
+    UISegmentedControl *seg = (UISegmentedControl *)sender;
+    self.interfaceSelection = seg.selectedSegmentIndex;
+
+
+}
 
 - (void)didReceiveMemoryWarning
 {
@@ -40,6 +49,7 @@
     
 }
 - (IBAction)enterExpMode:(id)sender {
+    ((testApp *)self.theOFAppRef)->interfaceSelected(self.interfaceSelection);
     ((testApp *)self.theOFAppRef)->introHidden(1);
 }
 - (IBAction)enterTrainMode:(id)sender {
--- a/IntroViewController.xib	Tue Oct 28 19:15:28 2014 +0000
+++ b/IntroViewController.xib	Wed Oct 29 15:38:38 2014 +0000
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="5056" systemVersion="14A389" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
     <dependencies>
-        <deployment defaultVersion="1280" identifier="iOS"/>
+        <deployment defaultVersion="1552" identifier="iOS"/>
         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
     </dependencies>
     <objects>
@@ -66,6 +66,17 @@
                     <color key="textColor" red="0.33826699840000002" green="0.9053322399" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
+                <segmentedControl appearanceType="aqua" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="kLk-IB-COx">
+                    <rect key="frame" x="410" y="370" width="217" height="29"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                    <segments>
+                        <segment title="SLIDERS"/>
+                        <segment title="LEAP"/>
+                    </segments>
+                    <connections>
+                        <action selector="oninterfaceSelect:" destination="-1" eventType="valueChanged" id="CA1-3J-YuB"/>
+                    </connections>
+                </segmentedControl>
             </subviews>
             <color key="backgroundColor" cocoaTouchSystemColor="darkTextColor"/>
             <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
--- a/MessageOrganiser.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/MessageOrganiser.h	Wed Oct 29 15:38:38 2014 +0000
@@ -63,12 +63,11 @@
 public:
     void init(PDSynthWrapper& cs, PDSynthWrapper& ts);    // could template for ui element type??
     void mapButtonToAction(UIElement* control, int mappingID);
-    
+    void setupDefaultMapping(controlPanelType whichInterfaceAreWeUsing);
     void setControlPanel(SliderPanel* p);
     void setBottomPanel(ButtonPanel * ntb);
     void setIconPanel(IconPanel * ip);
     void setInstructionPanel(TextPanel * ip);
-    void setBox(Leap6DBox * box);
     //-----------------------------------------------------------------------------
     void hideMyPanels();
     void showMyPanels();
@@ -77,15 +76,14 @@
     PDSynthWrapper candidateSynth;
     PDSynthWrapper targetSynth;
     ButtonPanel* bottomPanel; // shows during test : play buttons and submit
-    SliderPanel* panel;
+    SliderPanel* controlPanel;
     
     IconPanel* presetIconPanel;
     TextPanel* instructionPanel;
-    Leap6DBox* box6D;
     
     map<int,UIElement*> currentMapping; // could get more sophisticated if not 1-1 ?
     
-
+    vector<int> getMappingIDsFromSynths();
     void triggerCandidateSound();
     void paramChangeCallback(int mappingID, int value);
     void sendSynthValuesAgain();
--- a/MessageOrganiser.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/MessageOrganiser.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -7,6 +7,38 @@
     
     onlyChangeCandidateOnTrigger = true;
 }
+
+
+void MessageOrganiser::setupDefaultMapping(controlPanelType whichInterfaceAreWeUsing){
+    vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
+    vector<controllerType> elemList;
+    
+    if (whichInterfaceAreWeUsing == ALL_SLIDERS){
+        
+        for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
+            elemList.push_back(SLIDER);
+            
+        }
+    }else if (whichInterfaceAreWeUsing == LEAP6DOF){
+        elemList.push_back(LEAP6D);
+    }
+    vector<UIElement*> UIElemHandles = controlPanel->generateControls(elemList, whichInterfaceAreWeUsing);
+    
+    mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
+    
+}
+
+
+//----------------------------------------------------------------------------------------
+vector<int> MessageOrganiser::getMappingIDsFromSynths(){
+    vector<int> index;
+    for(int i = 0; i < TOTAL_NUM_PARAMS; i++){
+        index.push_back(i);
+    }
+    vector<int> mids = candidateSynth.getMappingIDForIndices(index);
+    
+    return mids;
+}
 // could template for ui element type??
 void MessageOrganiser::mapButtonToAction(UIElement* control, int mappingID){
     UICallbackFunction callbackF;
@@ -17,7 +49,7 @@
 
 
 void MessageOrganiser::setControlPanel(SliderPanel* p){ // a bit specific??
-    panel = p;
+    controlPanel = p;
     
 };
 void MessageOrganiser::setBottomPanel(ButtonPanel * ntb){
@@ -28,9 +60,7 @@
 void MessageOrganiser::setIconPanel(IconPanel * ip){
     presetIconPanel = ip;
 }
-void MessageOrganiser::setBox(Leap6DBox * box){
-    box6D = box;
-}
+
 void MessageOrganiser::setInstructionPanel(TextPanel * ip){
     instructionPanel = ip;
     instructionPanel->show();
@@ -42,13 +72,13 @@
     presetIconPanel->hide();
     instructionPanel->hide();
     bottomPanel->hide();
-    panel->hide();
+    controlPanel->hide();
 }
 void MessageOrganiser::showMyPanels(){
     presetIconPanel->show();
     instructionPanel->show();
     bottomPanel->show();
-    panel->show();
+    controlPanel->show();
 }
 
 void MessageOrganiser::triggerCandidateSound(){
@@ -57,7 +87,7 @@
     candidateSynth.trigger();
     eventLogger.logEvent(CANDIDATE_PLAYED);
     // flash panel?
-    panel->flash();
+    controlPanel->flash();
 }
 
 void MessageOrganiser::paramChangeCallback(int mappingID, int value){
@@ -91,22 +121,20 @@
     // theXY->setValueAndScale(candidateSynth.getParamValueForID(mids[i]), candidateSynth.getParamValueForID(mids[i+1]));
     UIElement* elem;
     // get the element
-    if(panel->subElements.size() <= index){
+    if(controlPanel->subElements.size() <= index){
         cout << "ERROR: index out of range for num sliders" << endl;
         return;
     }
-    elem = panel->subElements[index];
+    elem = controlPanel->subElements[index];
     if ( elem->getType() == SLIDER){
         ButtronSlider* theSlider = (ButtronSlider*)elem;
         theSlider->setValueAndScale(value);
         
-    }else{
-        cout << "ERROR ERROR: ui type not handled by setUIToParam!" << endl;
+    }else if ( elem->getType() == LEAP6D){
+        Leap6DBox* theBox = (Leap6DBox*)elem;
+        theBox->setValueAndScale(index, value);
     }
-    if (box6D->isShowing()){
-        box6D->setValueAndScale(index, value);
-    }
-    
+
 };
 
 
--- a/QuestionnaireViewController.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/QuestionnaireViewController.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -18,7 +18,7 @@
 @property (strong, nonatomic)       NSArray * questionArray;
 @property (nonatomic)               NSInteger currentQuestionIndex;
 @property (nonatomic, assign)       id theOFAppRef;
-
+@property (nonatomic)               NSInteger interfaceSelection;
 /*
 
 
@@ -42,6 +42,7 @@
         
         [self populateQuestionArray ];
         
+        self.interfaceSelection = 0;
     }
     return self;
 }
--- a/SearchMessageOrganiser.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/SearchMessageOrganiser.h	Wed Oct 29 15:38:38 2014 +0000
@@ -96,8 +96,8 @@
     };
     void countdownToNewTest(){
         
-        panel->hide();
-        panel->setActive(false);
+        controlPanel->hide();
+        controlPanel->setActive(false);
         scorePanel->hide();
         bottomPanel->hide();
         newTestButton->hide();
@@ -176,7 +176,7 @@
             candidateSynth.trigger();
             eventLogger.logEvent(CANDIDATE_PLAYED);
             // flash panel?
-            panel->flash();
+            controlPanel->flash();
             return;
         }
         if (mappingID == SUBMIT_CANDIDATE){
@@ -201,21 +201,21 @@
             if(showing){
                 cout << " showing"<<endl;
                 
-                panel->show();
+                controlPanel->show();
                 
             }else{
                 cout << " hiding"<<endl;
-                panel->hide();
+                controlPanel->hide();
             }
             showing = !showing;
         }
         if(mappingID == SHOW_HIDE_HINT){
             static bool showingHint;
             if(showingHint){
-                panel->showHint(false);
+                controlPanel->showHint(false);
                 showingHint = false;
             }else{
-                panel->showHint(true);
+                controlPanel->showHint(true);
                 showingHint = true;
             }
         }
@@ -260,7 +260,7 @@
     
 // protected methods
     void testsFinished(){
-        panel->hide();
+        controlPanel->hide();
         bottomPanel->hide();
         newTestButton->hide();
         
@@ -300,7 +300,7 @@
         
         vector<int> mappingIDsForChangeableParams = setSynthsUpForNewTest(newTest);
         
-        vector<UIElement*> UIElemHandles = panel->generateControls(testController->getCurrentListOfControls(), testController->getCurrentPanelType());
+        vector<UIElement*> UIElemHandles = controlPanel->generateControls(testController->getCurrentListOfControls(), testController->getCurrentPanelType());
         
         mapUIToNewTestParams(UIElemHandles, mappingIDsForChangeableParams);
         
@@ -312,10 +312,10 @@
         Test t = testController->getCurrentTest();
         
         countdownPanel->hide();
-        panel->show();
-        panel->setActive(true);
+        controlPanel->show();
+        controlPanel->setActive(true);
         if(t.isWithHint()){
-            panel->showHint(true);
+            controlPanel->showHint(true);
         }
         
         bottomPanel->show();
@@ -443,7 +443,7 @@
         }else{
             sendSynthValuesAgain(); // and again and again
             candidateSynth.trigger();
-            panel->flash();
+            controlPanel->flash();
             nextTime = alternationSpeed;
         }
         alt = !alt;
@@ -501,8 +501,8 @@
         
         
         // gui stuff - different controller?
-        panel->setActive(false);
-        panel->showHint(true); // add some encouraging feedback to hint
+        controlPanel->setActive(false);
+        controlPanel->showHint(true); // add some encouraging feedback to hint
         bottomPanel->hide();
         
         showScoreForTest(result);
@@ -539,7 +539,7 @@
             c = ofColor(150,235,200,255);
         }
         scorePanel->setColor(c);
-        panel->setHintColor(c);
+        controlPanel->setHintColor(c);
     };
  
     
--- a/SequenceController.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/SequenceController.h	Wed Oct 29 15:38:38 2014 +0000
@@ -18,7 +18,40 @@
 #define MAX_TEMPO   120
 #define NUM_TEMPO_STEPS 16
 #define NUM_PRESETS 8
+#define NO_GUIDES_LEVEL false
+class AnimStep{
 
+    
+public:
+    
+    AnimStep();
+    typedef enum {PREVIEW_NEUTRAL_COUNT,
+                MATCHING_NEUTRAL_COUNT,
+                PREVIEW_MOVE,
+                PREVIEW_HIT,
+                MATCHING_MOVE,
+                MATCHING_HIT}
+                stepType;
+    
+    stepType type;
+    
+    float getTimeBetweenTicks(){
+        return 1000. * (60.0/tempo);
+    }
+    int presetIndex;
+    int whichInSequence;
+    bool isLastOfAll;
+
+    int tempo;
+    int seqNumber;
+    int runNumber;
+    bool isLastOfSeq;
+    bool isLastOfRun;
+    
+    bool showsGuides; // depends on 'level'
+    
+    vector<int> thisSequence; // so that we can show the whole sequence at the top?
+};
 
 class Step{
 public:
@@ -67,7 +100,7 @@
 class SequenceController{
 public:
     SequenceController();
-    Step getNextStep();
+    AnimStep getNextStep();
     void setToStart();
     void stepForward();
     float getStartTickTime();
@@ -75,12 +108,12 @@
     void generateSteps();
     void generateCountIn(int countInLength);
     void generateARun(int run, int numInSequence);
-    
+    vector<int> randomSequence(int numInSequence);
     
     int getRandomButNot(int max, vector<int> notThese);
 protected:
-    vector<Step> steps;
-    vector<Step>::iterator currentStep;
+    vector<AnimStep> steps;
+    vector<AnimStep>::iterator currentStep;
     float tempoInc;
 };
 
--- a/SequenceController.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/SequenceController.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -7,7 +7,21 @@
 //
 
 #include "SequenceController.h"
-
+AnimStep::AnimStep(){
+    type = PREVIEW_NEUTRAL_COUNT;
+    presetIndex = -1;
+    seqNumber = -1;
+    runNumber = -1;
+    whichInSequence = -1;
+    
+    tempo = MIN_TEMPO;
+    
+    isLastOfSeq = false;
+    isLastOfRun = false;
+    isLastOfAll = false;
+    
+    showsGuides = false;
+}
 Step::Step(){
     type = COUNT_IN;
     
@@ -52,7 +66,8 @@
     type = PREVIEW_PREPARER;
     showsTargetIcon = true;
     showsControlSettings = false;
-    showsControlGuides = false;
+    showsControlGuides = true;
+    
     showsMatchResults = false;
     hidesSliders = true;
     isPreview = true;
@@ -137,7 +152,7 @@
     generateSteps();
     setToStart();
 };
-Step SequenceController::getNextStep(){
+AnimStep SequenceController::getNextStep(){
     
     currentStep++;
     if ((*currentStep).isLastOfRun){
@@ -149,16 +164,19 @@
     return (*currentStep);
     
 };
+//-------------------------------------------------------------------
 void SequenceController::setToStart(){
     currentStep = steps.begin();
 }
+//-------------------------------------------------------------------
 void SequenceController::stepForward(){
     currentStep++;
 };
+//-------------------------------------------------------------------
 float SequenceController::getStartTickTime(){
     return 1000. * (60.0/MIN_TEMPO);
 }
-
+//-------------------------------------------------------------------
 void SequenceController::generateSteps(){
     srand (time(NULL));
     
@@ -176,18 +194,41 @@
     }
     steps.back().isLastOfAll = true;
 };
+
+//-------------------------------------------------------------------
+
+
 void SequenceController::generateCountIn(int countInLength){
-    Step countStep;
+    AnimStep countStep;
     for (int i = 0; i < countInLength; i++){
-        countStep.numInSequence = countInLength - i + 1;
+        countStep.whichInSequence = countInLength - i + 1;
+        countStep.type = AnimStep::PREVIEW_NEUTRAL_COUNT;
         steps.push_back(countStep);
         
     }
 };
+
+//-------------------------------------------------------------------
+
+
+vector<int> SequenceController::randomSequence(int numInSequence){
+    vector<int> stepPresetIndices;
+    // get some random ints
+    for(int n=0; n < numInSequence; n++){
+        int nextPreset = getRandomButNot(NUM_PRESETS,stepPresetIndices);
+        stepPresetIndices.push_back(nextPreset);
+        cout << nextPreset << ",";
+    }
+    
+    return stepPresetIndices;
+}
+
+//-------------------------------------------------------------------
+
 void SequenceController::generateARun(int run, int numInSequence){
     float curTempo = MIN_TEMPO;
     int seqNo = 0;
-    Step nextStep;
+    AnimStep nextStep;
     for(int tempoLevel = 0; tempoLevel < NUM_TEMPO_STEPS; tempoLevel++){
         
         
@@ -196,19 +237,15 @@
         nextStep.presetIndex = -1; // minus one means "blank"
         nextStep.runNumber = run;
         nextStep.seqNumber = seqNo;
-        nextStep.numInSequence = 0;
+        nextStep.whichInSequence = 0;
         nextStep.tempo = curTempo;
-        nextStep.setAsBlankCounter();
+        nextStep.showsGuides = true;
+        nextStep.type = AnimStep::PREVIEW_NEUTRAL_COUNT;
+        steps.push_back(nextStep);
         
-        // generate a sequence
-        vector<int> stepPresetIndices;
-        
-        // get some random ints
-        for(int n=0; n < numInSequence; n++){
-            int nextPreset = getRandomButNot(NUM_PRESETS,stepPresetIndices);
-            stepPresetIndices.push_back(nextPreset);
-            cout << nextPreset << ",";
-        }
+        // generate a sequence of random preset indices
+        vector<int> stepPresetIndices = randomSequence(numInSequence);
+        nextStep.thisSequence = stepPresetIndices;
 
         // make preview sequence
         int n = 1;
@@ -218,21 +255,19 @@
             nextStep.presetIndex = *si;
             nextStep.runNumber = run;
             nextStep.seqNumber = seqNo;
-            nextStep.numInSequence = n;
+            nextStep.whichInSequence = n;
             nextStep.tempo = curTempo;
-            nextStep.setAsPreviewPreparer();
+            nextStep.showsGuides = true;
+            nextStep.type = AnimStep::PREVIEW_MOVE;
             steps.push_back(nextStep);
             
-            // put player
-            //
-            nextStep.setAsPreviewPlayer();
+            nextStep.type = AnimStep::PREVIEW_HIT;
             steps.push_back(nextStep);
             n++;
         }
-
-        // now we waqnt a matching preparation count in
-//        nextStep.setAsBlankCounter();
-//        steps.push_back(nextStep);
+        
+        nextStep.type = AnimStep::MATCHING_NEUTRAL_COUNT;
+        steps.push_back(nextStep);
         
         // put in matching sequence
         n = 0;
@@ -240,18 +275,20 @@
             // put loader
             
             nextStep.presetIndex = *si;
-            nextStep.numInSequence = n;
-
-            nextStep.setAsMatchingPreparer();
-            steps.push_back(nextStep);
-            
-            nextStep.setAsMatchingInteraction();
+            nextStep.whichInSequence = n;
+            if (NO_GUIDES_LEVEL){
+                nextStep.showsGuides = false;
+            }else{
+                nextStep.showsGuides = true;
+            }
+            nextStep.type = AnimStep::MATCHING_MOVE;
             steps.push_back(nextStep);
             n++;
             
-            nextStep.setAsMatchingFeedback();
+            nextStep.type = AnimStep::MATCHING_HIT;
             steps.push_back(nextStep);
             n++;
+
         }
         
         steps.back().isLastOfSeq = true;
@@ -260,10 +297,12 @@
         cout << endl;
         
     }
-    nextStep.setAsBlankCounter();
+    // ANIM nextStep.setAsBlankCounter();
+    nextStep.type = AnimStep::MATCHING_NEUTRAL_COUNT;
     steps.push_back(nextStep);
     
 }
+//-----------------------------------------------------------------------
 
 
 int SequenceController::getRandomButNot(int max, vector<int> notThese){
--- a/TrainingMessageOrganiser.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/TrainingMessageOrganiser.h	Wed Oct 29 15:38:38 2014 +0000
@@ -24,10 +24,11 @@
     int numParamsToUse;
     void init( PDSynthWrapper& cs, PDSynthWrapper& ts);
     void setMiddlePanel(TextPanel* tp);
-    void setupDefaultMapping();
+    void setup(controlPanelType whichInterfaceAreWeUsing);
     vector<int> getMappingIDsFromSynths();
-    void displayInstructions(Step s);
+    void displayInstructions(string text);
     void onNextTick(int tickNumber);
+    void onNextTickAnim(int tickNumber);
     
     void showMyPanels();
     void midiFromLeap(int ctl_num, int ctl_val);
@@ -43,7 +44,7 @@
         }
         cout << endl;
     }
-    
+    void updateCountdown(int n);
     void lastOfAll();
     void lastOfRun();
     void showCountdown();
@@ -51,6 +52,14 @@
     void showsTarget();
     
     
+    void previewNeutralCount(AnimStep newStep);
+    void previewMove(AnimStep newStep);
+    void previewHit(AnimStep newStep);
+    void matchingNeutralCount(AnimStep newStep);
+    void matchingMove(AnimStep newStep);
+    void matchingHit(AnimStep newStep);
+
+    
     ofColor interactableColor;
     ofColor nonInteractableColor;
     int downCounter;
@@ -59,5 +68,7 @@
     SequenceController sequenceController;
     TrainingScoreManager trainingScoreManager;
     
+    controlPanelType panelType;
+    
 };
 #endif /* defined(__riftathon__TrainingMessageOrganiser__) */
--- a/TrainingMessageOrganiser.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/TrainingMessageOrganiser.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -13,227 +13,39 @@
     MessageOrganiser::init(cs,ts);
     
     TickListenerFunction callback;
-    callback = boost::bind(&TrainingMessageOrganiser::onNextTick, this, _1);
+    callback = boost::bind(&TrainingMessageOrganiser::onNextTickAnim, this, _1);
     candidateSynth.registerForTicks(callback);
     
     numParamsToUse = TOTAL_NUM_PARAMS;
     
 }
 
+void TrainingMessageOrganiser::setup(controlPanelType whichInterfaceAreWeUsing){
+    
+    setupDefaultMapping(whichInterfaceAreWeUsing);
+    
+    
+}
+//----------------------------------------------------------------------------------------
 void TrainingMessageOrganiser::setMiddlePanel(TextPanel* tp){
     middlePanel = tp;
 }
 
-void TrainingMessageOrganiser::setupDefaultMapping(){
-    vector<int> mappingIDsForChangeableParams = getMappingIDsFromSynths();
-    
-    controlPanelType cpt = REVISITABLE;
-    vector<controllerType> elemList;
-    for(int i = 0; i < numParamsToUse; i++){
-        elemList.push_back(SLIDER);
-    }
-    
-    vector<UIElement*> UIElemHandles = panel->generateControls(elemList, cpt);
-    
-    mapSlidersToParams(UIElemHandles, mappingIDsForChangeableParams);
-    
-    bottomPanel->show();
-    
-    ofColor c = ofColor::yellow;
-    panel->setHintColor(c);
-}
-
-vector<int> TrainingMessageOrganiser::getMappingIDsFromSynths(){
-    vector<int> index;
-    for(int i = 0; i < numParamsToUse; i++){
-        index.push_back(i);
-    }
-    vector<int> mids = candidateSynth.getMappingIDForIndices(index);
-    
-    return mids;
-}
-
+//----------------------------------------------------------------------------------------
 void TrainingMessageOrganiser::showMyPanels(){
     presetIconPanel->show();
     instructionPanel->show();
     bottomPanel->show();
-    panel->hide();
+    controlPanel->show();
     middlePanel->show();
 }
 
 //-----------------------------------------------------------------------
-void TrainingMessageOrganiser::displayInstructions(Step s){
-    
-    
-    if (s.type == Step::COUNT_IN){
-        instructionPanel->setText("COUNT_IN" + ofToString(downCounter));
-        middlePanel->setText(ofToString(downCounter));
-    }
-    if (s.type == Step::PREVIEW_PREPARER){
-        instructionPanel->setText("PREVIEW_PREPARER");
-        panel->setColor(ofColor(0,0,0));
-    }
-    
-    if (s.type == Step::PREVIEW_DISPLAYER){
-        instructionPanel->setText("PREVIEW_DISPLAYER");
-        panel->setColor(ofColor(0,0,0));
-    }
-    if (s.type == Step::MATCHING_PREPARER){
-        instructionPanel->setText("MATCHING_PREPARER");
-        middlePanel->setText(ofToString(downCounter));
-        panel->setColor(ofColor(250,0,0));
-    }
-    if (s.type == Step::MATCHING_INTERACTION){
-        instructionPanel->setText("MATCHING_INTERACTION!!!!");
-        panel->setColor(ofColor(250,0,0));
-    }
-    if (s.type == Step::MATCHING_RESULT){
-        instructionPanel->setText("RESULT");
-        panel->setColor(ofColor(0,0,0));
-    }
-}
-//-----------------------------------------------------------------------
-void TrainingMessageOrganiser::onNextTick(int tickNumber){
-    static int showingCountdown = false;
-    cout << "TICK " << tickNumber << endl;
-    downCounter = 4 - tickNumber % 4;
-    
-    if (showingCountdown){
-        middlePanel->setColor(ofColor::white);
-        middlePanel->setText(ofToString(downCounter));
-    }
-    
-    // only first beat in bar is active one
-    if ( tickNumber % 4  != 0){
-        
-        return;
-    }
-    // load next target preset
-    
-    Step newStep = sequenceController.getNextStep();
-    displayInstructions(newStep);
-    
-    if(newStep.isLastOfAll){
-        // do finished run stuff, show summary
-        candidateSynth.stopMetronome();
-        cout << "FINISHED BLOCK" << endl;
-        panel->hide();
-        middlePanel->setColor(ofColor::white);
-        middlePanel->setText("FINISHED BLOCK");
-        return;
-    }
-    if(newStep.isLastOfRun){
-        // do finished run stuff, show summary
-        candidateSynth.stopMetronome();
-        cout << "FINISHED RUN" << endl;
-        panel->hide();
-        middlePanel->setColor(ofColor::white);
-        middlePanel->setText("FINISHED RUN");
-        middlePanel->show();
-        return;
-    }
+void TrainingMessageOrganiser::displayInstructions(string text){
 
-    candidateSynth.setMetroTime(newStep.getTimeBetweenTicks());
-    
-    if(newStep.showsCountDown){
-        // count in
-        showingCountdown = true;
-        middlePanel->show();
-    }else{
-        showingCountdown = false;
-    }
-    
-    Preset * currentTargetPreset;
-    
-    if(newStep.presetIndex >= 0 && newStep.presetIndex <= 8){
-        currentTargetPreset =  expPresetManager.getPresetAtIndex(newStep.presetIndex);
-    }else{
-        assert(newStep.type == Step::COUNT_IN);
-        // nothing happens here
-        return;
-    }
+    instructionPanel->setText("COUNT_IN" + ofToString(downCounter));
+    instructionPanel->show();
 
-    vector<int> newTargetValues = currentTargetPreset->getValues();
-    debugVals(newTargetValues);
-    
-    if(newStep.hidesSliders){
-        panel->hide();
-        middlePanel->setBackground(ofColor(255,0,0));
-        middlePanel->show();
-    }else{
-        panel->show();
-        middlePanel->hide();
-    }
-    
-    if(newStep.showsTargetIcon){
-        bool showTick = true;
-        presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), showTick);
-        presetIconPanel->show();
-        box6D->setHintTexture(currentTargetPreset->getImage());
-    }else{
-        presetIconPanel->hide();
-    }
-    
-    if(newStep.allowsCandidateControl){
-        setCandidateAndSlidersToRandom();
-        panel->setActive(true);
-        okToGetMidi = true;
-    }else{
-        panel->setActive(false);
-        okToGetMidi = false;
-    }
-    
-    if(newStep.showsControlSettings){
-        // actually alters the slider values
-        targetSynth.setAllParams(newTargetValues);
-        setAllSlidersToValues(newTargetValues);
-        box6D->setValues(newTargetValues);
-    }else{
-        
-        
-    }
-    
-    panel->setHintValues(newTargetValues);
-    box6D->setHintValues(newTargetValues);
-    
-    if(newStep.showsControlGuides){
-        // shows visual target lines on sliders (or target hand in VR)
-        
-        panel->showHint(true);
-        box6D->showHint(true);
-    }else{
-        panel->showHint(false);
-        box6D->showHint(false);
-    }
-    
-    
-    if(newStep.showsMatchResults){
-        // do something
-        //newStep->calculateResults();
-        TrainingTestResult result =
-            trainingScoreManager.getScoreForAnswer(candidateSynth.getAllParamValues(),
-                                                   newTargetValues,
-                                                   newStep.getTimeBetweenTicks());
-        
-        
-        //middlePanel->setLabel(result.displayText);
-        middlePanel->setColor(result.colorBand);
-        middlePanel->setText(result.displayText);
-        panel->setHintColor(result.colorBand);
-        panel->showHint(true);
-        middlePanel->show();
-    }else{
-        middlePanel->setText("");
-    }
-    
-    if(newStep.playsTarget){
-        targetSynth.setAllParams(newTargetValues);
-        targetSynth.trigger();
-    }
-    if(newStep.playsCandidate){
-        triggerCandidateSound();
-    }
-    
 }
 
 //-----------------------------------------------------------------------
@@ -286,3 +98,344 @@
     
 }
 //-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------
+void TrainingMessageOrganiser::onNextTick(int tickNumber){
+    static int showingCountdown = false;
+    cout << "TICK " << tickNumber << endl;
+    downCounter = 4 - tickNumber % 4;
+    
+    if (showingCountdown){
+        middlePanel->setColor(ofColor::white);
+        middlePanel->setText(ofToString(downCounter));
+    }
+    
+    // only first beat in bar is active one
+    if ( tickNumber % 4  != 0){
+        
+        return;
+    }
+    // load next target preset
+    
+    //Step newStep = sequenceController.getNextStep();
+    
+    /*
+     displayInstructions(newStep);
+     
+     if(newStep.isLastOfAll){
+     // do finished run stuff, show summary
+     candidateSynth.stopMetronome();
+     cout << "FINISHED BLOCK" << endl;
+     controlPanel->hide();
+     middlePanel->setColor(ofColor::white);
+     middlePanel->setText("FINISHED BLOCK");
+     return;
+     }
+     if(newStep.isLastOfRun){
+     // do finished run stuff, show summary
+     candidateSynth.stopMetronome();
+     cout << "FINISHED RUN" << endl;
+     controlPanel->hide();
+     middlePanel->setColor(ofColor::white);
+     middlePanel->setText("FINISHED RUN");
+     middlePanel->show();
+     return;
+     }
+     
+     candidateSynth.setMetroTime(newStep.getTimeBetweenTicks());
+     
+     if(newStep.showsCountDown){
+     // count in
+     showingCountdown = true;
+     middlePanel->show();
+     }else{
+     showingCountdown = false;
+     }
+     
+     Preset * currentTargetPreset;
+     
+     if(newStep.presetIndex >= 0 && newStep.presetIndex <= 8){
+     currentTargetPreset =  expPresetManager.getPresetAtIndex(newStep.presetIndex);
+     }else{
+     assert(newStep.type == Step::COUNT_IN);
+     // nothing happens here
+     return;
+     }
+     
+     vector<int> newTargetValues = currentTargetPreset->getValues();
+     debugVals(newTargetValues);
+     
+     if(newStep.hidesSliders){
+     controlPanel->hide();
+     middlePanel->setBackground(ofColor(255,0,0));
+     middlePanel->show();
+     }else{
+     controlPanel->show();
+     middlePanel->hide();
+     }
+     
+     if(newStep.showsTargetIcon){
+     bool showTick = true;
+     presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), showTick);
+     presetIconPanel->show();
+     box6D->setHintTexture(currentTargetPreset->getImage());
+     }else{
+     presetIconPanel->hide();
+     }
+     
+     if(newStep.allowsCandidateControl){
+     setCandidateAndSlidersToRandom();
+     controlPanel->setActive(true);
+     okToGetMidi = true;
+     }else{
+     controlPanel->setActive(false);
+     okToGetMidi = false;
+     }
+     
+     if(newStep.showsControlSettings){
+     // actually alters the slider values
+     targetSynth.setAllParams(newTargetValues);
+     setAllSlidersToValues(newTargetValues);
+     box6D->setValues(newTargetValues);
+     }else{
+     
+     
+     }
+     
+     controlPanel->setHintValues(newTargetValues);
+     box6D->setHintValues(newTargetValues);
+     
+     if(newStep.showsControlGuides){
+     // shows visual target lines on sliders (or target hand in VR)
+     
+     controlPanel->showHint(true);
+     box6D->showHint(true);
+     }else{
+     controlPanel->showHint(false);
+     box6D->showHint(false);
+     }
+     
+     
+     if(newStep.showsMatchResults){
+     // do something
+     //newStep->calculateResults();
+     TrainingTestResult result =
+     trainingScoreManager.getScoreForAnswer(candidateSynth.getAllParamValues(),
+     newTargetValues,
+     newStep.getTimeBetweenTicks());
+     
+     
+     //middlePanel->setLabel(result.displayText);
+     middlePanel->setColor(result.colorBand);
+     middlePanel->setText(result.displayText);
+     controlPanel->setHintColor(result.colorBand);
+     controlPanel->showHint(true);
+     middlePanel->show();
+     }else{
+     middlePanel->setText("");
+     }
+     
+     if(newStep.playsTarget){
+     targetSynth.setAllParams(newTargetValues);
+     targetSynth.trigger();
+     }
+     if(newStep.playsCandidate){
+     triggerCandidateSound();
+     }
+     */
+    
+}
+void TrainingMessageOrganiser::lastOfRun(){
+    candidateSynth.stopMetronome();
+    cout << "FINISHED RUN" << endl;
+    controlPanel->hide();
+    middlePanel->setColor(ofColor::white);
+    middlePanel->setText("FINISHED RUN");
+    middlePanel->show();
+}
+void TrainingMessageOrganiser::lastOfAll(){
+    candidateSynth.stopMetronome();
+    cout << "FINISHED RUN" << endl;
+    controlPanel->hide();
+    middlePanel->setColor(ofColor::white);
+    middlePanel->setText("FINISHED RUN");
+    middlePanel->show();
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::onNextTickAnim(int tickNumber){
+    
+    cout << "TICK " << tickNumber << endl;
+    downCounter = 4 - tickNumber % 4;
+    
+    updateCountdown(downCounter);
+    // only first beat in bar is active one (at the moment)
+    if ( tickNumber % 4  != 0) return;
+    
+    
+    AnimStep newStep = sequenceController.getNextStep();
+    
+    if(newStep.isLastOfAll){
+        lastOfAll();
+        return;
+    }
+    if(newStep.isLastOfRun){
+        lastOfRun();
+        return;
+    }
+    
+    candidateSynth.setMetroTime(newStep.getTimeBetweenTicks());
+    
+    switch (newStep.type){
+        case AnimStep::PREVIEW_NEUTRAL_COUNT :
+            previewNeutralCount(newStep);
+            break;
+        case AnimStep::PREVIEW_MOVE :
+            previewMove(newStep);
+            break;
+        case AnimStep::PREVIEW_HIT :
+            previewHit( newStep);
+            break;
+        case AnimStep::MATCHING_NEUTRAL_COUNT :
+            matchingNeutralCount( newStep);
+            break;
+        case AnimStep::MATCHING_MOVE :
+            matchingMove( newStep);
+            break;
+        case AnimStep::MATCHING_HIT :
+            matchingHit( newStep);
+            break;
+    }
+    
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::updateCountdown(int n){
+    
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::previewNeutralCount(AnimStep newStep){
+    Preset * currentTargetPreset;
+    
+    // show eveything at start?
+    showMyPanels();
+    // your 'hand' is hidden
+    controlPanel->showValueIndicators(false);
+    
+    
+    // guide is set to neutral values
+    currentTargetPreset = expPresetManager.getNeutralPreset();
+    vector<int> newTargetValues = currentTargetPreset->getValues();
+    presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
+    presetIconPanel->show();
+    
+    controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
+
+    
+    targetSynth.setAllParams(newTargetValues);
+    candidateSynth.setAllParams(newTargetValues);
+    
+    displayInstructions("previewNeutralCount");
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::previewMove(AnimStep newStep){
+    Preset * currentTargetPreset;
+    currentTargetPreset =  expPresetManager.getPresetAtIndex(newStep.presetIndex);
+    vector<int> newTargetValues = currentTargetPreset->getValues();
+    
+    targetSynth.setAllParams(newTargetValues);
+    
+    presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
+    presetIconPanel->show();
+    controlPanel->show();
+    // your hand is hidden
+    controlPanel->showValueIndicators(false);
+    // guide animates to next target
+
+    controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
+
+    displayInstructions("previewMove");
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::previewHit(AnimStep newStep){
+    Preset * currentTargetPreset;
+    currentTargetPreset =  expPresetManager.getPresetAtIndex(newStep.presetIndex);
+    vector<int> newTargetValues = currentTargetPreset->getValues();
+    
+    targetSynth.setAllParams(newTargetValues);
+    
+    // your hand hidden
+    controlPanel->showValueIndicators(false);
+    //
+    presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
+    presetIconPanel->show();
+    
+    controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
+
+    
+    targetSynth.trigger();
+    
+    displayInstructions("Preview HIT");
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::matchingNeutralCount(AnimStep newStep){
+    Preset * currentTargetPreset = expPresetManager.getNeutralPreset();
+    vector<int> newTargetValues = currentTargetPreset->getValues();
+    // if showing guides show all the targets as transparent ghosts
+    if (newStep.showsGuides){
+        controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
+
+    }else{
+        controlPanel->showHint(false);
+    }
+    
+    // show your hand and allow movement
+    controlPanel->showValueIndicators(true);
+    okToGetMidi = true;
+    
+        displayInstructions("Match Count");
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::matchingMove(AnimStep newStep){
+    Preset * currentTargetPreset;
+    currentTargetPreset =  expPresetManager.getPresetAtIndex(newStep.presetIndex);
+    vector<int> newTargetValues = currentTargetPreset->getValues();
+    
+    targetSynth.setAllParams(newTargetValues);
+    
+    // if showing guides show all the targets as transparent ghosts
+    if (newStep.showsGuides){
+        presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
+        presetIconPanel->show();
+        
+        controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
+    }
+    
+    // show your hand and allow movement
+    //controlPanel->showIndicator(true);
+    okToGetMidi = true;
+    
+    displayInstructions("Match MOVE");
+}
+//-----------------------------------------------------------------------------
+void TrainingMessageOrganiser::matchingHit(AnimStep newStep){
+    Preset * currentTargetPreset;
+    currentTargetPreset =  expPresetManager.getPresetAtIndex(newStep.presetIndex);
+    vector<int> newTargetValues = currentTargetPreset->getValues();
+    
+    if (newStep.showsGuides){
+        presetIconPanel->setTextAndImage(currentTargetPreset->name, currentTargetPreset->getImage(), false);
+        presetIconPanel->show();
+       
+        controlPanel->setAndShowHint(newTargetValues, currentTargetPreset->getImage());
+    }
+    
+    // show your hand and allow movement (so you can set off to next target??)
+    //box6D->showIndicator(true);
+    okToGetMidi = true;
+    
+    targetSynth.setAllParams(newTargetValues);
+    candidateSynth.trigger();
+    
+    displayInstructions("Match HIT");
+}
+
+//-----------------------------------------------------------------------------
\ No newline at end of file
--- a/UI code/6Dbox.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/6Dbox.h	Wed Oct 29 15:38:38 2014 +0000
@@ -38,7 +38,9 @@
     void setValues(vector<int> vals);
     
     void draw();
-    
+    void showValueIndicator(bool showing){
+        indicatorShowing = showing;
+    };
   
 private:
 
@@ -62,6 +64,7 @@
     float hw, hh, hl, scale;
     float hintRoll, hintPitch, hintYaw;
     float minAngVal, maxAngVal;
+    bool indicatorShowing;
 };
 
 
--- a/UI code/6Dbox.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/6Dbox.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -221,6 +221,8 @@
 }
 
 void Leap6DBox::draw(){
+    
+    ofEnableDepthTest();
     if(hidden)return;
     if(on){
         ofSetColor(foregroundHi);
@@ -251,6 +253,8 @@
     drawIndicator();
     ofPopMatrix();
     
+    ofDisableDepthTest();
+    
     drawLabels();
 };
 
@@ -263,10 +267,9 @@
     }
     
     // draw indicator
-    draw3DCrossHairs(xVal,yVal,zVal, indicatorColor);
-    // put light in indicateor
-    //
-    
+    if(indicatorShowing){
+        draw3DCrossHairs(xVal,yVal,zVal, indicatorColor);
+    }
     
     if (hintShowing && hintZ <= zVal){
         hintColor = calculateHintColor();
--- a/UI code/ButtronSlider.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/ButtronSlider.h	Wed Oct 29 15:38:38 2014 +0000
@@ -37,8 +37,10 @@
     void init();
     void draw(){
         Buttron::draw();
+        ofDisableDepthTest();
         drawIndicator(value);
         if(hintShowing) drawHintIndicator();
+        ofEnableDepthTest();
     }
     
     void setHintValue(double hval){
@@ -63,7 +65,9 @@
         // scale appropriately to 0-1   (maxVal - minVal)*prop + minVal
         value =  (avalue - minVal)/(maxVal - minVal);
     };
-
+    void showValueIndicator(bool show){
+        indicatorShowing = show;
+    }
     virtual bool handleMyTouch(int x, int y, touchType ttype, int touchID);
     
     void setRange(float lo, float hi){
@@ -80,6 +84,7 @@
     float value; // [0. 1.]
     float hintValue;
     bool hintShowing;
+    bool indicatorShowing;
     ofColor hintColor;
 };
 
--- a/UI code/ButtronSlider.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/ButtronSlider.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -49,6 +49,7 @@
 // 
 //---------------------------------------------------------------------
 void ButtronSlider::drawIndicator(double proportion){
+    if(!indicatorShowing) return;
     if(on){
         ofSetColor(foregroundHi);
     }else{
--- a/UI code/UIElement.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/UIElement.h	Wed Oct 29 15:38:38 2014 +0000
@@ -116,25 +116,6 @@
         setZLayer(e->getZLayer() + 1);
     }
 protected:
-    
-    float x;
-    float y;
-    float width;
-    float height;
-    bool on;
-    int myParamID;
-    list<int> myTouchIDs;
-    
-    ofColor background;
-    
-    string labelName;
-    ofTrueTypeFont verdana16;
-    ofTrueTypeFont bigFont;
-    ofTrueTypeFont smallFont;
-    controllerType myType;
-    
-    bool hidden; // don't draw dont touch
-    bool inactive;  // dont touch, draw dimmed
 
     void init();
     
@@ -171,5 +152,27 @@
     
     int zLayer;
     
+// protected members:
+    
+    float x;
+    float y;
+    float width;
+    float height;
+    bool on;
+    int myParamID;
+    list<int> myTouchIDs;
+    
+    ofColor background;
+    
+    string labelName;
+    ofTrueTypeFont verdana16;
+    ofTrueTypeFont bigFont;
+    ofTrueTypeFont smallFont;
+    controllerType myType;
+    
+    bool hidden; // don't draw dont touch
+    bool inactive;  // dont touch, draw dimmed
+
+    
 };
 #endif /* defined(__emptyExample__UIElement__) */
--- a/UI code/sliderPanel.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/sliderPanel.h	Wed Oct 29 15:38:38 2014 +0000
@@ -22,8 +22,11 @@
 #include "ButtronXY.h"
 #include "3Dbox.h"
 #include "3DboxGL.h"
+#include "6Dbox.h"
 #include "ButtronSlider.h"
 // panel with sliders and xy pads
+
+// AND 6DOF BOXES !!!!!
 class SliderPanel : public UIElementContainer{
     
 public:
@@ -33,80 +36,25 @@
                 float aheight,
                 const UIProps& aprops,
                 vector<controllerType> elemList);
-    //------------------------
-    void showHint(bool value){
-        vector<UIElement *>::iterator UIitr;
-        for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-            
-            ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
-            thisSlider->showHint(value);
-        }
-    }
+ 
+    void setAndShowHint(vector<int> values, ofImage* texture);
+    
+    void showHint(bool value);
     //
-    void setHintValues(vector<int> vals){
-        int i = 0;
-        for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-            ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
-            thisSlider->setHintValue(vals[i]);
-            i++;
-        }
-    }
-    void setHintColor(ofColor c){
-        vector<UIElement *>::iterator UIitr;
-        for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-            (*UIitr)->setHintColor(c);
-        }
-    }
-    void setSliderColors(ofColor c){
-        for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-            ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
-            thisSlider->setColor(c);
-        }
-    }
-    //------------------------
-    void flash(){
-        // turn hilight on and off
-        if (!flashing){
-            vector<UIElement *>::iterator UIitr;
-            for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-                (*UIitr)->setHighlight(true);
-            }
-            // set up timer
-            TimerCallbackFunction tcb;
-            tcb = boost::bind(&SliderPanel::flash, this);
-            timeController.scheduleEvent(tcb, 250);
-            flashing = true;
-        }else{
-            vector<UIElement *>::iterator UIitr;
-            for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-                (*UIitr)->setHighlight(false);
-            }
-            flashing = false;
-        }
-        
-    }
-    //------------------------
-    void setBgColor(ofColor c){
-        vector<UIElement *>::iterator UIitr;
-        for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
-            (*UIitr)->setColor(c);
-        }
-    }
-    //------------------------
+    void setHintValues(vector<int> vals);
+    void setHintColor(ofColor c);
+    void setSliderColors(ofColor c);
+    void flash();
+    void setBgColor(ofColor c);
     vector<UIElement*> generateControls(vector<controllerType> elemList, controlPanelType panelType);
-    //------------------------
-    UIElement* getSlider(int index){
-        if (index < subElements.size()){
-            return subElements[index];
-        }else{
-            cout << "ERROR: index too big for sldiers" << endl;
-            return NULL;
-        }
-    };
-    // TODO override touch thing to make revisitable
+
+    UIElement* getSlider(int index);
+    void setHintTexture(ofImage* texture);
+
+    void showValueIndicators(bool show);
 private:
     bool flashing;
-    controlPanelType panelType;
+    controlPanelType thisPanelType;
 };
 
 #endif /* defined(__tweakathlon__sliderPanel__) */
--- a/UI code/sliderPanel.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/UI code/sliderPanel.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -21,8 +21,115 @@
 
     // generateControls(elemList);// called from messageorganiser
 }
+//--------------------------------------------------------------------------------
 
-// NOT GENERIC
+void SliderPanel::showHint(bool value){
+    if (thisPanelType == ALL_SLIDERS){
+        vector<UIElement *>::iterator UIitr;
+        for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+            
+            
+            ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
+            thisSlider->showHint(value);
+        }
+    }else if(thisPanelType == LEAP6DOF){
+        if (subElements[0]->getType() == LEAP6D){
+            Leap6DBox * box = (Leap6DBox*)subElements[0];
+            
+            box->showHint(value);
+        }
+    }
+}
+//------------------------
+void SliderPanel::setHintColor(ofColor c){
+    vector<UIElement *>::iterator UIitr;
+    for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+        (*UIitr)->setHintColor(c);
+    }
+}
+//------------------------
+void SliderPanel::setSliderColors(ofColor c){
+    for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+        ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
+        thisSlider->setColor(c);
+    }
+}
+//------------------------
+void SliderPanel::flash(){
+    // turn hilight on and off
+    if (!flashing){
+        vector<UIElement *>::iterator UIitr;
+        for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+            (*UIitr)->setHighlight(true);
+        }
+        // set up timer
+        TimerCallbackFunction tcb;
+        tcb = boost::bind(&SliderPanel::flash, this);
+        timeController.scheduleEvent(tcb, 250);
+        flashing = true;
+    }else{
+        vector<UIElement *>::iterator UIitr;
+        for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+            (*UIitr)->setHighlight(false);
+        }
+        flashing = false;
+    }
+    
+}
+//------------------------
+void SliderPanel::setBgColor(ofColor c){
+    vector<UIElement *>::iterator UIitr;
+    for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+        (*UIitr)->setColor(c);
+    }
+}
+//------------------------
+//------------------------
+UIElement* SliderPanel::getSlider(int index){
+    if (index < subElements.size()){
+        return subElements[index];
+    }else{
+        cout << "ERROR: index too big for sldiers" << endl;
+        return NULL;
+    }
+};
+//------------------------
+void SliderPanel::showValueIndicators(bool show){
+    
+    
+    if (thisPanelType == LEAP6DOF){ // yeuch
+        if (subElements[0]->getType() == LEAP6D){
+            Leap6DBox * box = (Leap6DBox*)subElements[0];
+            
+            box->showValueIndicator(show);
+        }
+        
+    }else if(thisPanelType == ALL_SLIDERS){
+        for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+            ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
+            thisSlider->showValueIndicator(show);
+        }
+    }
+}
+//------------------------
+void SliderPanel::setHintValues(vector<int> vals){
+    if (thisPanelType == LEAP6DOF){ // yeuch
+        if (subElements[0]->getType() == LEAP6D){
+            Leap6DBox * box = (Leap6DBox*)subElements[0];
+            
+            box->setHintValues(vals);
+        }
+    }else if(thisPanelType == ALL_SLIDERS){
+    int i = 0;
+    for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
+        ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
+        thisSlider->setHintValue(vals[i]);
+        i++;
+    }
+    }
+}
+
+
 //-----------------------------------------------------------------------------
 vector<UIElement*> SliderPanel::generateControls(vector<controllerType> elemList, controlPanelType panelType){
     removeAllSubelements();
@@ -82,6 +189,16 @@
             
             subElements.push_back(l3d);
             n++;
+        }else if(*i == LEAP6D){
+            // add a threed box
+            float c = x+width*0.5;
+            float left = c - myProps.XYsize;
+
+            Leap6DBox * l6d = new Leap6DBox(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps);
+
+            
+            subElements.push_back(l6d);
+            n++;
         
         }else{
             cout << "ERROR: slider panel only handles xy pads and sliders" << endl;
@@ -89,11 +206,29 @@
         
 
     }
-    
+    thisPanelType = panelType;
     autoArrangeRow(); // will set positions
     
 
 
     return subElements;
 }
+//-----------------------------------------------------------------------
+void SliderPanel::setAndShowHint(vector<int> values, ofImage* texture){
+    setHintValues(values);
+    setHintTexture(texture);
+    showHint(true);
 
+}
+//------------------------------------------
+void SliderPanel::setHintTexture(ofImage* texture){
+    if (thisPanelType == LEAP6DOF){ // yeuch
+        if (subElements[0]->getType() == LEAP6D){
+            Leap6DBox * box = (Leap6DBox*)subElements[0];
+            
+            box->setHintTexture(texture);
+        }
+        
+    }
+}
+
--- a/algorithms.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/algorithms.h	Wed Oct 29 15:38:38 2014 +0000
@@ -20,10 +20,6 @@
     return vec;
 }
 
-void randomise(int& n){
-    n = ofRandom(0,127);
-    
-}
 
 //-------------------------------------------------------------
 //-------------------------------------------------------------
--- a/globalVariables.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/globalVariables.h	Wed Oct 29 15:38:38 2014 +0000
@@ -36,8 +36,8 @@
 
 typedef enum {FAMILIARISATION, EXPRESS, TRAINING, SEARCH} testStages;
 
-typedef enum {SLIDER, XYPAD, BUTTON, LEAP3D} controllerType;
-typedef enum {SEQUENTIAL, REVISITABLE, SIMULTANEOUS, MULTI_SIMPLE, MULTI_COMPLEX} controlPanelType;
+typedef enum {SLIDER, XYPAD, BUTTON, LEAP3D, LEAP6D} controllerType;
+typedef enum {SEQUENTIAL, REVISITABLE, SIMULTANEOUS, MULTI_SIMPLE, MULTI_COMPLEX, ALL_SLIDERS, LEAP6DOF} controlPanelType;
 
 typedef enum {FILL,LINE, BLOB} SliderType;
 
--- a/presetManager.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/presetManager.h	Wed Oct 29 15:38:38 2014 +0000
@@ -38,6 +38,8 @@
     //bool isFilled;
     PresetIconView* iconView;
     // from save button press
+    Preset(){};
+    
     Preset(vector<int> aCCValues,
            string aname,
            int aID,
@@ -141,6 +143,7 @@
     void exitAndSaveAll(); // save stuff to the json file
     void printAll();
     void clearAll();
+    Preset* getNeutralPreset();
     
     Preset* getPresetAtIndex(int index);
     int getNumberOfPresets(){return thePresets.size();};
@@ -150,13 +153,15 @@
     int timesOpened;
     bool presetAlertShowing;
     void showOverwriteDialog();
-    vector<Preset *> thePresets; 
+    vector<Preset *> thePresets;
+
 
     Json::Value  allPresetsToJson();
     void loadPresetsFromJsonFile(const string &jsonFile);
     void updatePresetFile();
     void showNameDialog();
     
+    Preset neutralPreset;
 };
 
     
--- a/presetManager.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/presetManager.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -45,6 +45,22 @@
     
     cout << "ofGetTimestampString: " << ts << '\n';
 }
+//-------------------------------------------------------------------------
+Preset* PresetManager::getNeutralPreset(){
+    
+    vector<int> middleVals;
+    for(int i = 0; i < TOTAL_NUM_PARAMS ; i++){
+        middleVals.push_back(64);
+    }
+    neutralPreset = Preset(middleVals,
+                       "Neutral",
+                       999,
+                       "whocares",
+                       999,
+                       "buttron.png");
+    
+    return &neutralPreset;
+}
 //---------------------------------------------------------------------------
 Json::Value PresetManager::allPresetsToJson(){
     Json::Value root;
@@ -205,6 +221,7 @@
     
     if (index >= thePresets.size()){
         cout << "ERROR: index " << index << " exceeds number of presets " << thePresets.size() << endl;
+        cout << " YOU HAVENT DONE EXP STAGE??" << endl;
         return NULL;
     }else{
         return thePresets[index];
--- a/testApp.h	Tue Oct 28 19:15:28 2014 +0000
+++ b/testApp.h	Wed Oct 29 15:38:38 2014 +0000
@@ -126,7 +126,7 @@
     void helpHidden();
     void setupNewUser();
     void appModeChange(interfaceType mode);
-
+    void interfaceSelected(int interfaceSelection);
     void sendParametersToPD();
     
     void sendMidiParams();
@@ -175,6 +175,7 @@
     void rotateToLandscapeRight(){};
     void toggleAutoRotation(){};
 
+    controlPanelType whichInterfaceAreWeUsing;
 };
 
 // should be off split into
--- a/testApp.mm	Tue Oct 28 19:15:28 2014 +0000
+++ b/testApp.mm	Wed Oct 29 15:38:38 2014 +0000
@@ -40,6 +40,7 @@
     ofEnableDepthTest();
     glEnable(GL_DEPTH_TEST);
 //    ofEnableAlphaBlending();
+    whichInterfaceAreWeUsing = ALL_SLIDERS;
 
 
     //--------------------------------------
@@ -66,7 +67,6 @@
     }
     paused = false;
     
-    
     eventLogger.logEvent(APP_LOADED);
 
     ofSoundStreamStart();
@@ -265,12 +265,12 @@
     controlPanel->showBorder(true);
     controlPanel->hide();
     
-    Leap6DBox * box = new Leap6DBox(400 , 210 , (*props).XYsize*0.75,(*props).XYsize*0.75,150,50, *props);
-    searchMessageOrganiser.setBox(box);
-    trainingMessageOrganiser.setBox(box);
-    expMessageOrganiser.setBox(box);
-    UIElements.push_back(box);
-    box->show();
+//    Leap6DBox * box = new Leap6DBox(400 , 210 , (*props).XYsize*0.75,(*props).XYsize*0.75,150,50, *props);
+//    searchMessageOrganiser.setBox(box);
+//    trainingMessageOrganiser.setBox(box);
+//    expMessageOrganiser.setBox(box);
+//    UIElements.push_back(box);
+//    box->show();
 }
 //--------------------------------------------------------------
 void testApp::setupUIElements(){
@@ -441,6 +441,14 @@
     }
     
 }
+//-------------------------------
+void testApp::interfaceSelected(int interfaceSelection){
+    if (interfaceSelection == 0){
+        whichInterfaceAreWeUsing = ALL_SLIDERS;
+    }else{
+        whichInterfaceAreWeUsing = LEAP6DOF;
+    }
+}
 //--------------------------------------------------------------
 void testApp::usernameEntered(){
 
@@ -457,11 +465,11 @@
     // do countdown etc
     
     trainingMessageOrganiser.hideMyPanels();
-    searchMessageOrganiser.hideMyPanels();
-    expMessageOrganiser.setup();
-    //expMessageOrganiser.showMyPanels();
-    // TODO how is testApp going to kknow whichInterfaceShowing ???
+    //searchMessageOrganiser.hideMyPanels();
+    expMessageOrganiser.setup(whichInterfaceAreWeUsing);
     
+    expMessageOrganiser.showMyPanels();
+
     currentStage = EXPRESS;
     
 }
@@ -479,7 +487,7 @@
 void testApp::startTheTrainingTests(){
     eventLogger.logEvent(START_THE_TRAINING_TESTS);
     
-    trainingMessageOrganiser.setupDefaultMapping();
+    trainingMessageOrganiser.setup(whichInterfaceAreWeUsing);
     trainingMessageOrganiser.showMyPanels();
     currentStage = TRAINING;
 }