rt300@0: #include "testApp.h" rt300@0: #include "ofAppiOSWindow.h" rt300@6: #include "ExplorePresetManager.h" rt300@0: extern EventLogger eventLogger; rt300@6: extern ExplorePresetManager expPresetManager; rt300@0: // static members inited here. not my choice. rt300@0: int SynthParam::mappingUID = 88000; rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::setup(){ rt300@0: rt300@0: rt300@0: rt300@32: ofxiPhoneSetOrientation( OF_ORIENTATION_90_RIGHT ); rt300@0: //ofxiPhoneExternalDisplay::mirrorOn(); rt300@0: [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; rt300@14: rt300@0: initialiseVariables(); rt300@8: rt300@6: rt300@18: rt300@6: rt300@6: //presetManager.startLoadAll(); rt300@6: rt300@8: targetSynth.init(&core,"targetSynth"); rt300@8: candidateSynth.init(&core,"candidateSynth"); rt300@0: rt300@32: // searchMessageOrganiser.init(targetSynth, candidateSynth); rt300@32: // trainingMessageOrganiser.init(targetSynth,candidateSynth); rt300@32: // expMessageOrganiser.init(targetSynth,candidateSynth); rt300@16: rt300@0: timeController.init(); rt300@0: initialiseGUIs(); rt300@0: initialiseMIDI(); rt300@0: setupUIElements(); rt300@0: rt300@24: light.setSpotlight(45. , 1.); rt300@24: light.enable(); rt300@24: ofEnableSeparateSpecularLight(); rt300@24: rt300@0: ofEnableDepthTest(); rt300@25: glEnable(GL_DEPTH_TEST); rt300@25: // ofEnableAlphaBlending(); rt300@18: rt300@0: rt300@0: //-------------------------------------- rt300@0: rt300@0: int ticksPerBuffer = 8; // 8 * 64 = buffer len of 512 rt300@0: core.setup(2, 2, 44100, ticksPerBuffer); rt300@0: rt300@0: // setup OF sound stream rt300@0: bufSize = ofxPd::blockSize()*ticksPerBuffer; rt300@0: wavetableNew = (float *) malloc(bufSize * sizeof(float)); rt300@0: rt300@0: ofSoundStreamSetup(2, 2, this, 44100, ofxPd::blockSize()*ticksPerBuffer, 3); rt300@0: rt300@26: if(false){ // force start rt300@26: startTheTrainingTests(); rt300@0: }else{ rt300@0: rt300@0: if(eventLogger.questionnaireCompleted){ // then show play again dialog, and log the test number rt300@0: rt300@0: }else{ rt300@0: // then we're in timed session mode rt300@20: [usernameAlertViewController showUserNamePrompt]; rt300@0: } rt300@0: } rt300@0: paused = false; rt300@0: rt300@0: eventLogger.logEvent(APP_LOADED); rt300@0: rt300@0: ofSoundStreamStart(); rt300@0: rt300@0: } rt300@0: rt300@0: //----------------------------------------------------------------------------- rt300@0: rt300@0: //DeviceID3523537000 rt300@0: void testApp::initialiseVariables(){ rt300@0: paused = true; rt300@0: ofBackground( 0, 0, 0 ); rt300@0: //ofEnableAlphaBlending(); rt300@0: //ofEnableSmoothing(); rt300@0: rt300@0: // open an outgoing connection to HOST:PORT for OSC rt300@0: // sender.setup( OSC_HOST, OSC_PORT ); rt300@34: ofSetFrameRate(40); rt300@14: props = new UIProps(); rt300@45: screenWidth = ofGetHeight(); rt300@45: screenHeight = ofGetWidth(); rt300@0: rt300@0: } rt300@0: //--------------------------------------------------------- rt300@0: void testApp::initialiseGUIs(){ rt300@0: rt300@0: // set up iOS gui stuff rt300@0: rt300@0: helpViewController = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil]; rt300@0: [ofxiPhoneGetGLParentView() addSubview:helpViewController.view]; rt300@0: [helpViewController setAppRef:(__bridge id)this]; rt300@0: helpViewController.view.hidden = YES; rt300@0: rt300@0: rt300@0: usernameAlertViewController = [[UsernameAlertViewController alloc] init]; rt300@0: [usernameAlertViewController setAppRef:(__bridge id)this]; rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@6: // GUI for finding and saving presets to express concepts rt300@6: void testApp::setupExpressViewPanels(){ rt300@45: ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+props->sliderPanelHeight,screenWidth,250,*props); rt300@0: rt300@16: Buttron * playCandidateButton = new Buttron(props->buttonWidth*1.4,680, *props); rt300@16: playCandidateButton->setLabel("PLAY"); rt300@16: expMessageOrganiser.mapButtonToAction(playCandidateButton, TRIGGER_CANDIDATE_ID); rt300@16: bottomButtonPanel->addButton(playCandidateButton); rt300@16: rt300@16: Buttron * savePresetButton = new Buttron(props->buttonWidth*1.4,680, *props); rt300@44: savePresetButton->setLabel("SAVE"); rt300@16: expMessageOrganiser.mapButtonToAction(savePresetButton, SAVE_PRESET_HIT); rt300@16: bottomButtonPanel->addButton(savePresetButton); rt300@16: rt300@44: Buttron * nextPresetButton = new Buttron(props->buttonWidth*1.4,680, *props); rt300@44: nextPresetButton->setLabel("NEXT"); rt300@44: expMessageOrganiser.mapButtonToAction(nextPresetButton, NEXT_PRESET_HIT); rt300@44: bottomButtonPanel->addButton(nextPresetButton); rt300@50: expMessageOrganiser.setNextButton(nextPresetButton); rt300@50: nextPresetButton->hide(); rt300@42: rt300@42: Buttron * menuButton = new Buttron(props->buttonWidth*1.4,680, *props); rt300@42: menuButton->setLabel("MENU"); rt300@42: mapButtonToAction(menuButton, TO_MENU_ID); rt300@42: //trainingMessageOrganiser.mapButtonToAction(menuButton, TO_MENU_ID); rt300@42: bottomButtonPanel->addButton(menuButton); rt300@42: rt300@16: expMessageOrganiser.setBottomPanel(bottomButtonPanel); rt300@16: UIElements.push_back(bottomButtonPanel); rt300@16: bottomButtonPanel->hide(); rt300@16: rt300@32: TextPanel * instructionPanel = new TextPanel("Instruction panel", 10, 50, 300,150,(*props)); rt300@28: instructionPanel->setFontSize(MEDIUMFONT); rt300@16: UIElements.push_back(instructionPanel); rt300@16: expMessageOrganiser.setInstructionPanel(instructionPanel); rt300@16: instructionPanel->show(); rt300@6: } rt300@6: //-------------------------------------------------------------- rt300@6: // gui for the main training stage rt300@6: void testApp::setupTrainingViewPanels(){ rt300@14: rt300@45: cout << ofGetWidth() << "," << ofGetHeight() << endl; rt300@45: rt300@45: ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+props->sliderPanelHeight,screenWidth,250,*props); rt300@6: rt300@9: // play and submit are now same thing rt300@38: rt300@38: rt300@38: Buttron * forgotButton = new Buttron(props->buttonWidth*1.4,680, *props); rt300@43: forgotButton->setLabel("FORGOT!"); rt300@38: trainingMessageOrganiser.mapButtonToAction(forgotButton, FORGOT_SEQ_ID); rt300@38: trainingMessageOrganiser.setForgotButton(forgotButton); rt300@38: UIElements.push_back(forgotButton); rt300@38: forgotButton->setMode(Buttron::TOGGLE); rt300@38: forgotButton->setXPosition(40); rt300@42: forgotButton->hide(); rt300@38: rt300@50: Buttron * playCandidateButton = new Buttron(props->buttonWidth*1.4,680, props->buttonWidth*1.4,props->buttonHeight ,*props); rt300@50: playCandidateButton->setLabel("START NEXT RUN"); rt300@29: trainingMessageOrganiser.mapButtonToAction(playCandidateButton, START_TRAINING_SEQUENCE_ID); rt300@9: bottomButtonPanel->addButton(playCandidateButton); rt300@37: rt300@50: // Buttron * menuButton = new Buttron(props->buttonWidth*1.4,680, *props); rt300@50: // menuButton->setLabel("TO MENU"); rt300@50: // mapButtonToAction(menuButton, TO_MENU_ID); rt300@50: // //trainingMessageOrganiser.mapButtonToAction(menuButton, TO_MENU_ID); rt300@50: // bottomButtonPanel->addButton(menuButton); rt300@37: rt300@50: Buttron * skipButton = new Buttron(props->buttonWidth*0.5,680, props->buttonHeight*1.4,props->buttonHeight , *props); rt300@50: skipButton->setLabel(">> 2"); rt300@43: trainingMessageOrganiser.mapButtonToAction(skipButton, SKIP_RUN_ID); rt300@43: trainingMessageOrganiser.setSkipButton(skipButton); rt300@43: //trainingMessageOrganiser.mapButtonToAction(menuButton, TO_MENU_ID); rt300@43: bottomButtonPanel->addButton(skipButton); rt300@43: rt300@26: bottomButtonPanel->hide(); rt300@44: rt300@36: rt300@9: trainingMessageOrganiser.setBottomPanel(bottomButtonPanel); rt300@9: UIElements.push_back(bottomButtonPanel); rt300@9: bottomButtonPanel->hide(); rt300@28: rt300@16: rt300@14: TextPanel * instructionPanel = new TextPanel("Instrcution panel", 10, 50, 300,150,(*props)); rt300@37: instructionPanel->setFontSize(LARGEFONT); rt300@14: UIElements.push_back(instructionPanel); rt300@14: trainingMessageOrganiser.setInstructionPanel(instructionPanel); rt300@21: instructionPanel->hide(); rt300@14: rt300@24: rt300@6: } rt300@6: //-------------------------------------------------------------- rt300@6: // gui for the old style tweakathlon stage rt300@6: void testApp::setupSearchViewPanels(){ rt300@14: rt300@45: ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+(*props).sliderPanelHeight,screenWidth,250,(*props)); rt300@6: rt300@14: Buttron* playTargetButton = new Buttron((*props).buttonWidth*0.2,680, (*props)); rt300@0: playTargetButton->setLabel("Target"); rt300@8: searchMessageOrganiser.mapButtonToAction(playTargetButton, TRIGGER_TARGET_ID); rt300@0: bottomButtonPanel->addButton(playTargetButton); rt300@8: searchMessageOrganiser.setTargetButton(playTargetButton); rt300@6: rt300@14: Buttron * playCandidateButton = new Buttron((*props).buttonWidth*1.4,680, (*props)); rt300@0: playCandidateButton->setLabel("Current"); rt300@8: searchMessageOrganiser.mapButtonToAction(playCandidateButton, TRIGGER_CANDIDATE_ID); rt300@0: bottomButtonPanel->addButton(playCandidateButton); rt300@0: rt300@0: rt300@0: // submit button - only one for now rt300@45: Buttron * submitButton = new Buttron(screenWidth*0.5 - (*props).buttonWidth*0.5,680, (*props)); rt300@0: submitButton->setLabel("Submit"); rt300@8: searchMessageOrganiser.mapButtonToAction(submitButton, SUBMIT_CANDIDATE); rt300@0: bottomButtonPanel->addButton(submitButton); rt300@0: rt300@0: // button - just for spacing pruposes rt300@45: Buttron * saveButton = new Buttron(screenWidth*0.5 - (*props).buttonWidth*0.5,680, (*props)); rt300@4: saveButton->setLabel("SAVE"); rt300@8: searchMessageOrganiser.mapButtonToAction(saveButton, SAVE_PRESET_HIT); rt300@4: bottomButtonPanel->addButton(saveButton); rt300@6: saveButton->hide(); rt300@0: rt300@45: Buttron * recallButton = new Buttron(screenWidth*0.5 - (*props).buttonWidth*0.5,680, (*props)); rt300@4: recallButton->setLabel("RECALL"); rt300@8: searchMessageOrganiser.mapButtonToAction(recallButton, RECALL_PRESET_HIT); rt300@4: bottomButtonPanel->addButton(recallButton); rt300@6: recallButton->hide(); rt300@0: rt300@8: searchMessageOrganiser.setBottomPanel(bottomButtonPanel); rt300@0: UIElements.push_back(bottomButtonPanel); rt300@0: bottomButtonPanel->showBorder(false); rt300@9: bottomButtonPanel->hide(); rt300@7: // - - - - - -- - - OTHER BITS rt300@0: rt300@14: CountdownText * countDownBox = new CountdownText("5" , 500, 380, 455, 455, (*props)); rt300@0: UIElements.push_back(countDownBox); rt300@8: searchMessageOrganiser.setCountdownPanel(countDownBox); rt300@0: countDownBox->hide(); rt300@0: rt300@45: TextPanel * scoreFeedback = new TextPanel("Feedback panel", screenWidth*0.5 - (*props).buttonWidth*0.5, 666, 400,100,(*props)); rt300@0: scoreFeedback->setFontSize(SMALLFONT); rt300@0: UIElements.push_back(scoreFeedback); rt300@8: searchMessageOrganiser.setScorePanel(scoreFeedback); rt300@0: scoreFeedback->hide(); rt300@0: rt300@14: TextPanel * finishPanel = new TextPanel("Finish txt panel", 250, 250, 1000,400,(*props)); rt300@0: finishPanel->setFontSize(LARGEFONT); rt300@0: finishPanel->setText("Experiment completed"); rt300@8: searchMessageOrganiser.setFinishPanel(finishPanel); rt300@0: rt300@0: UIElements.push_back(finishPanel); rt300@0: finishPanel->hide(); rt300@7: rt300@0: rt300@45: Buttron * newTestButton = new Buttron(screenWidth-300,690, (*props)); rt300@0: newTestButton->setLabel("Next Test"); rt300@0: UIElements.push_back(newTestButton); rt300@8: searchMessageOrganiser.mapButtonToAction(newTestButton, NEW_TEST_ID); rt300@0: newTestButton->hide(); rt300@8: searchMessageOrganiser.setNewTestButton(newTestButton); rt300@0: rt300@28: TextPanel * instructionPanel = new TextPanel("Instrcution panel", 10, 50, 300,150,(*props)); rt300@28: instructionPanel->setFontSize(MEDIUMFONT); rt300@28: UIElements.push_back(instructionPanel); rt300@28: searchMessageOrganiser.setInstructionPanel(instructionPanel); rt300@28: instructionPanel->hide(); rt300@28: rt300@21: // TargetSymbol* targetSymbol = new TargetSymbol(ofGetWidth()*0.5,160,30,(*props)); rt300@21: // searchMessageOrganiser.setTargetSymbol(targetSymbol); rt300@21: // UIElements.push_back(targetSymbol); rt300@21: // rt300@7: } rt300@7: //-------------------------------------------------------------- rt300@7: void testApp::setupSliderPanel(){ rt300@28: // setupMutualPanels rt300@7: vector sl2; rt300@7: sl2.push_back(SLIDER); rt300@7: rt300@7: SliderPanel * controlPanel = new SliderPanel(1, rt300@7: 160, rt300@45: screenWidth, rt300@14: (*props).sliderPanelHeight, rt300@14: (*props), rt300@7: sl2); rt300@7: rt300@7: UIElements.push_back(controlPanel); rt300@28: AnimatedUIElements.push_back(controlPanel); rt300@8: searchMessageOrganiser.setControlPanel(controlPanel); rt300@9: trainingMessageOrganiser.setControlPanel(controlPanel); rt300@16: expMessageOrganiser.setControlPanel(controlPanel); rt300@7: controlPanel->showBorder(true); rt300@25: controlPanel->hide(); rt300@25: rt300@28: rt300@28: IconPanel* iconPanel = new IconPanel(420, 10, 150, 150, *props); rt300@28: trainingMessageOrganiser.setIconPanel(iconPanel); rt300@28: expMessageOrganiser.setIconPanel(iconPanel); rt300@28: searchMessageOrganiser.setIconPanel(iconPanel); rt300@28: UIElements.push_back(iconPanel); rt300@28: iconPanel->hide(); rt300@28: rt300@44: TextPanel* seqNumPanel = new TextPanel(" ",470, 185, 150, 150, *props); rt300@32: trainingMessageOrganiser.setSeqNumPanel(seqNumPanel); rt300@32: expMessageOrganiser.setSeqNumPanel(seqNumPanel); rt300@32: searchMessageOrganiser.setSeqNumPanel(seqNumPanel); rt300@32: seqNumPanel->setFontSize(LARGEFONT); rt300@32: UIElements.push_back(seqNumPanel); rt300@36: seqNumPanel->show(); rt300@32: rt300@32: TextPanel* scoreNumPanel = new TextPanel("SCORE: ",700, 60, 150, 150, *props); rt300@32: trainingMessageOrganiser.setScoreNumPanel(scoreNumPanel); rt300@32: expMessageOrganiser.setScoreNumPanel(scoreNumPanel); rt300@32: searchMessageOrganiser.setScoreNumPanel(scoreNumPanel); rt300@32: scoreNumPanel->setFontSize(LARGEFONT); rt300@32: UIElements.push_back(scoreNumPanel); rt300@32: scoreNumPanel->show(); rt300@28: rt300@50: TextPanel * middlePanel = new TextPanel("Middle panel", 250, 400, 400,400,(*props)); rt300@44: rt300@43: middlePanel->setFontSize(LARGEFONT); rt300@43: UIElements.push_back(middlePanel); rt300@43: expMessageOrganiser.setMiddlePanel(middlePanel); rt300@43: trainingMessageOrganiser.setMiddlePanel(middlePanel); rt300@43: searchMessageOrganiser.setMiddlePanel(middlePanel); rt300@43: middlePanel->hide(); rt300@43: rt300@44: rt300@45: ButtronSlider* distanceSlider = new ButtronSlider(screenWidth-80, 200, 60, screenHeight-400, FILL, *props); rt300@44: trainingMessageOrganiser.setDistanceSlider(distanceSlider); rt300@44: expMessageOrganiser.setDistanceSlider(distanceSlider); rt300@44: distanceSlider->hide(); rt300@44: UIElements.push_back(distanceSlider); rt300@44: rt300@27: // Leap6DBox * box = new Leap6DBox(400 , 210 , (*props).XYsize*0.75,(*props).XYsize*0.75,150,50, *props); rt300@27: // searchMessageOrganiser.setBox(box); rt300@27: // trainingMessageOrganiser.setBox(box); rt300@27: // expMessageOrganiser.setBox(box); rt300@27: // UIElements.push_back(box); rt300@27: // box->show(); rt300@7: } rt300@7: //-------------------------------------------------------------- rt300@7: void testApp::setupUIElements(){ rt300@7: rt300@28: ofBackground(0,0,0); rt300@7: rt300@7: setupSearchViewPanels(); rt300@7: rt300@7: setupSliderPanel(); rt300@0: rt300@9: setupTrainingViewPanels(); rt300@16: rt300@16: setupExpressViewPanels(); rt300@0: } rt300@0: //-------------------------------------------------------------------------- rt300@0: void testApp::initialiseMIDI(){ rt300@0: rt300@0: ///////////////////////// rt300@0: // MIDI rt300@0: rt300@0: midiChannel = 8; rt300@0: midiOffset = 0; rt300@0: rt300@0: // enables the network midi session between iOS and Mac OSX on a rt300@0: // local wifi network rt300@0: // rt300@0: // in ofxMidi: open the input/outport network ports named "Session 1" rt300@0: // rt300@0: // on OSX: use the Audio MIDI Setup Utility to connect to the iOS device rt300@0: // rt300@0: ofxMidi::enableNetworking(); rt300@0: rt300@0: // list the number of available input & output ports rt300@0: ofxMidiIn::listPorts(); rt300@0: ofxMidiOut::listPorts(); rt300@0: rt300@0: // create and open input ports rt300@0: for(int i = 0; i < ofxMidiIn::getNumPorts(); ++i) { rt300@0: rt300@0: // new object rt300@0: inputs.push_back(new ofxMidiIn); rt300@0: rt300@0: // set this class to receive incoming midi events rt300@0: inputs[i]->addListener(this); rt300@0: rt300@0: // open input port via port number rt300@0: inputs[i]->openPort(i); rt300@0: } rt300@0: rt300@0: // create and open output ports rt300@0: for(int i = 0; i < ofxMidiOut::getNumPorts(); ++i) { rt300@0: rt300@0: // new object rt300@0: outputs.push_back(new ofxMidiOut); rt300@0: rt300@0: // open input port via port number rt300@0: outputs[i]->openPort(i); rt300@0: } rt300@0: rt300@0: // set this class to receieve midi device (dis)connection events rt300@0: ofxMidi::setConnectionListener(this); rt300@0: rt300@0: // END MIDI rt300@0: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: rt300@0: template rt300@0: void deleteVectorOfPointers( T * inVectorOfPointers ) rt300@0: { rt300@0: typename T::iterator i; rt300@0: for ( i = inVectorOfPointers->begin() ; i < inVectorOfPointers->end(); i++ ) rt300@0: { rt300@0: delete * i; rt300@0: } rt300@0: //delete inVectorOfPointers; rt300@0: } rt300@0: rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::exit(){ rt300@0: eventLogger.logEvent(APP_EXITED); rt300@0: eventLogger.exitAndSave(); rt300@0: rt300@0: core.exit(); rt300@0: rt300@0: // are these handled automatically? rt300@0: //[introViewController release]; rt300@0: //[topButtonViewController release]; rt300@0: //[bottomTabViewController release]; rt300@0: rt300@0: // clean up MIDI rt300@0: for(int i = 0; i < inputs.size(); ++i) { rt300@0: inputs[i]->closePort(); rt300@0: inputs[i]->removeListener(this); rt300@0: delete inputs[i]; rt300@0: } rt300@0: rt300@0: for(int i = 0; i < outputs.size(); ++i) { rt300@0: outputs[i]->closePort(); rt300@0: delete outputs[i]; rt300@0: } rt300@0: deleteVectorOfPointers(&UIElements); // TODO this crashes?? rt300@8: rt300@0: rt300@0: cout << "exit done \n"; rt300@0: } rt300@0: rt300@0: #pragma mark GUI rt300@0: //////////////////////////// rt300@0: // These functions called from iOS toolbars rt300@0: //-------------------------------------------------------------- rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::showQuestionnaire(){ rt300@0: rt300@0: rt300@0: questionnaireViewController = [[QuestionnaireViewController alloc] initWithNibName:@"QuestionnaireViewController" bundle:nil]; rt300@0: [ofxiPhoneGetGLParentView() addSubview:questionnaireViewController.view]; rt300@0: rt300@0: [questionnaireViewController setAppRef:(__bridge id)this]; rt300@0: [questionnaireViewController show:(__bridge id)this]; rt300@0: rt300@0: whichInterfaceShowing = QUESTIONNAIRE; rt300@0: rt300@0: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::questionnaireHidden(vector answers, const char* userComments){ rt300@0: // send answers to server as json rt300@0: eventLogger.questionnaireAnswersObtained(answers, userComments); rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::showIntro(){ rt300@20: // display a thing that gives us an option as to which stage to start rt300@20: // EXPLORE, PERFORMANCE TRAINING, SEARCH rt300@0: cout << "SHOW INTRO\n"; rt300@0: rt300@0: introViewController = [[IntroViewController alloc] initWithNibName:@"IntroViewController" bundle:nil]; rt300@0: [ofxiPhoneGetGLParentView() addSubview:introViewController.view]; rt300@0: rt300@0: [introViewController setAppRef:(__bridge id)this]; rt300@0: [introViewController show:(__bridge id)this]; rt300@0: rt300@0: whichInterfaceShowing = INTRO; rt300@0: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@20: //void testApp::introHidden(){ rt300@20: // eventLogger.consentGiven = true; rt300@20: // eventLogger.logEvent(INTRO_CONSENTED); rt300@20: // [usernameAlertViewController showUserNamePrompt]; rt300@20: // // after prompt goes it calls usernameEntered() rt300@20: //} rt300@20: //-------------------------------------------------------------- rt300@20: void testApp::introHidden(int mode){ rt300@0: eventLogger.consentGiven = true; rt300@0: eventLogger.logEvent(INTRO_CONSENTED); rt300@20: rt300@20: if(mode == 1){ rt300@20: startTheExpTests(); rt300@20: }else if(mode == 2){ rt300@20: startTheTrainingTests(); rt300@20: }else if(mode == 3){ rt300@20: startTheSearchTests(); rt300@32: }else if(mode == 4){ rt300@32: startThePerformanceTests(); rt300@32: rt300@45: }else if(mode == 5){ rt300@45: startTheTrainingDemo(); rt300@45: rt300@20: } rt300@20: rt300@0: } rt300@38: void testApp::backToMainMenu(){ rt300@50: //expMessageOrganiser.reset(); rt300@38: expMessageOrganiser.hideMyPanels(); rt300@50: //trainingMessageOrganiser.reset(); rt300@38: trainingMessageOrganiser.hideMyPanels(); rt300@50: //searchMessageOrganiser.reset(); rt300@38: searchMessageOrganiser.hideMyPanels(); rt300@38: [introViewController show:(__bridge id)this]; rt300@43: eventLogger.logEvent(RUN_SKIPPED); rt300@50: eventLogger.saveSessionToFile(); rt300@38: } rt300@27: //------------------------------- rt300@27: void testApp::interfaceSelected(int interfaceSelection){ rt300@27: if (interfaceSelection == 0){ rt300@27: whichInterfaceAreWeUsing = ALL_SLIDERS; rt300@27: }else{ rt300@27: whichInterfaceAreWeUsing = LEAP6DOF; rt300@27: } rt300@27: } rt300@20: //-------------------------------------------------------------- rt300@20: void testApp::usernameEntered(){ rt300@32: rt300@18: eventLogger.onUsernameEntered(); rt300@18: expPresetManager.onAppLoad(); rt300@9: rt300@20: showIntro(); rt300@9: rt300@2: } rt300@0: //-------------------------------------------------------------- rt300@16: void testApp::startTheExpTests(){ rt300@16: eventLogger.logEvent(START_THE_EXP_TESTS); rt300@32: rt300@32: expMessageOrganiser.init(targetSynth,candidateSynth); rt300@32: rt300@16: whichInterfaceShowing = COUNT_DOWN; rt300@16: // do countdown etc rt300@16: rt300@16: trainingMessageOrganiser.hideMyPanels(); rt300@28: searchMessageOrganiser.hideMyPanels(); rt300@27: expMessageOrganiser.setup(whichInterfaceAreWeUsing); rt300@16: rt300@27: expMessageOrganiser.showMyPanels(); rt300@27: rt300@23: currentStage = EXPRESS; rt300@23: rt300@16: } rt300@16: //-------------------------------------------------------------- rt300@9: void testApp::startTheSearchTests(){ rt300@38: searchMessageOrganiser.init(targetSynth,candidateSynth); rt300@9: eventLogger.logEvent(START_THE_SEARCH_TESTS); rt300@0: whichInterfaceShowing = COUNT_DOWN; rt300@0: // do countdown etc rt300@16: rt300@16: trainingMessageOrganiser.hideMyPanels(); rt300@8: searchMessageOrganiser.countdownToNewTest(); rt300@0: // TODO how is testApp going to kknow whichInterfaceShowing ??? rt300@23: currentStage = SEARCH; rt300@0: } rt300@33: //-------------------------------------------------------------- rt300@9: void testApp::startTheTrainingTests(){ rt300@9: eventLogger.logEvent(START_THE_TRAINING_TESTS); rt300@38: expMessageOrganiser.hideMyPanels(); rt300@45: trainingMessageOrganiser.init(targetSynth,candidateSynth, false,whichInterfaceAreWeUsing, false); rt300@43: rt300@32: trainingMessageOrganiser.showMyPanels(); rt300@32: currentStage = TRAINING; rt300@32: } rt300@33: //-------------------------------------------------------------- rt300@45: void testApp::startTheTrainingDemo(){ rt300@45: eventLogger.logEvent(START_THE_TRAINING_DEMO); rt300@45: expMessageOrganiser.hideMyPanels(); rt300@45: trainingMessageOrganiser.init(targetSynth,candidateSynth, false,whichInterfaceAreWeUsing, true); rt300@45: rt300@45: trainingMessageOrganiser.showMyPanels(); rt300@45: currentStage = DEMO; rt300@45: } rt300@45: //-------------------------------------------------------------- rt300@32: void testApp::startThePerformanceTests(){ rt300@32: eventLogger.logEvent(START_THE_PERFORMANCE_TESTS); rt300@32: rt300@45: trainingMessageOrganiser.init(targetSynth,candidateSynth, true,whichInterfaceAreWeUsing, false); rt300@43: rt300@16: trainingMessageOrganiser.showMyPanels(); rt300@23: currentStage = TRAINING; rt300@9: } rt300@0: //-------------------------------------------------------------- rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::showHelp(){ rt300@0: // stop clock etc rt300@0: previousInterface = whichInterfaceShowing; rt300@0: whichInterfaceShowing = HELP; rt300@0: helpViewController.view.hidden = NO; rt300@0: eventLogger.logEvent(HELP_PRESSED); rt300@0: rt300@0: } rt300@0: void testApp::helpHidden(){ rt300@0: whichInterfaceShowing = previousInterface; rt300@0: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: //-------------------------------------------------------------- rt300@0: //-------------------------------------------------------------- rt300@0: #pragma mark sending to pd and midi rt300@0: void testApp::sendParametersToPD(){ rt300@0: rt300@0: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::sendMidiParam(int which){ rt300@0: int midiChannel = 8; rt300@0: int offset = 0; rt300@0: rt300@0: for(int i = 0; i < outputs.size(); ++i) { rt300@0: outputs[i]->sendControlChange(midiChannel, offset+which, 66); rt300@0: } rt300@0: rt300@0: rt300@0: } rt300@0: rt300@0: void testApp::setupNewUser(){ rt300@0: // this function is for supervised trials with my ipad rt300@0: eventLogger.newUser(); rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: #pragma mark STANDARD OF FUNCTIONS rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::update(){ rt300@0: rt300@0: if(paused) return; rt300@0: rt300@0: // run timer check here rt300@0: // look at time, work out difference rt300@0: timeController.tick(); rt300@0: rt300@28: vector::iterator UIitr; rt300@28: for(UIitr = AnimatedUIElements.begin(); UIitr < AnimatedUIElements.end(); UIitr++){ rt300@28: (*UIitr)->update(); rt300@28: } rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: rt300@0: void testApp::appModeChange(interfaceType mode){ rt300@0: whichInterfaceShowing = mode; rt300@0: } rt300@0: rt300@0: rt300@0: //------------------------------------------------------------------------ rt300@0: rt300@0: void testApp::draw(){ rt300@0: rt300@0: switch (whichInterfaceShowing){ rt300@0: case QUESTIONNAIRE: rt300@0: break; rt300@0: case INTRO: rt300@0: break; rt300@0: case TEST_IN_PROGRESS: rt300@0: break; rt300@0: case SCORE_AND_HINT: rt300@0: break; rt300@0: case COUNT_DOWN: rt300@0: break; rt300@0: case READY_FOR_NEXT: rt300@0: break; rt300@0: default: rt300@0: break; rt300@0: } rt300@0: rt300@0: rt300@0: rt300@0: drawUIElements(); rt300@50: rt300@0: rt300@0: //ofSetColor(234, 234, 234); rt300@0: //ofLine(0,150,1024,150); rt300@0: rt300@0: //drawWaveform(); rt300@9: if (currentStage == SEARCH) rt300@9: searchMessageOrganiser.drawScore(); rt300@0: rt300@14: //image.draw(10,10,200,200); rt300@50: rt300@50: stringstream s; rt300@50: s << " MIDI " << endl; rt300@50: for (int i = 0; i < outputs.size(); i++){ rt300@50: s << inputs[i]->getName() << endl;; rt300@50: } rt300@50: props->smallFont.drawString(s.str(), 10, 10); rt300@0: rt300@0: } rt300@0: //------------------------------------------------------------------------ rt300@0: void testApp::drawUIElements(){ rt300@0: rt300@0: vector::iterator UIitr; rt300@0: for(UIitr = UIElements.begin(); UIitr < UIElements.end(); UIitr++){ rt300@0: (*UIitr)->draw(); rt300@0: } rt300@0: } rt300@8: rt300@0: //------------------------------------------------------------------------ rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: // passes touch to UI elements rt300@0: //-------------------------------------------------------------- rt300@0: rt300@0: void testApp::touchToUIElements(int x, int y, touchType ttype, int tid){ rt300@0: vector::iterator UIitr; rt300@0: for(UIitr = UIElements.begin(); UIitr < UIElements.end(); UIitr++){ rt300@0: (*UIitr)->touch(x,y,ttype, tid); rt300@0: } rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchDown(ofTouchEventArgs &touch){ rt300@0: //touch = transformTouchCoords(touch); rt300@0: touchToUIElements(touch.x, touch.y, TOUCH_DOWN, touch.id); rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchMoved(ofTouchEventArgs &touch){ rt300@0: rt300@0: touchToUIElements(touch.x, touch.y, TOUCH_MOVED, touch.id); rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchUp(ofTouchEventArgs &touch){ rt300@0: rt300@0: touchToUIElements(touch.x, touch.y, TOUCH_UP, touch.id); rt300@0: } rt300@0: rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchDoubleTap(ofTouchEventArgs &touch){ rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::lostFocus(){ rt300@0: //exit(); rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::gotFocus(){ rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::gotMemoryWarning(){ rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: rt300@0: void testApp::deviceOrientationChanged(int newOrientation){ rt300@0: rt300@37: //cout << "orientation: " << newOrientation; rt300@0: rt300@0: // do something here? rt300@0: rt300@0: } rt300@0: rt300@0: rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchCancelled(ofTouchEventArgs& args){ rt300@0: rt300@0: } rt300@0: //--------------------------------------------------------------- rt300@0: // AUDIO STUFF rt300@0: //--------------------------------------------------------------- rt300@0: rt300@0: #pragma mark AUDIO STREAMS rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::audioReceived(float * input, int bufferSize, int nChannels) { rt300@0: //core.audioReceived(input, bufferSize, nChannels); rt300@0: } rt300@0: rt300@0: void testApp::audioRequested(float * output, int bufferSize, int nChannels) { rt300@0: rt300@0: core.audioRequested(output, bufferSize, nChannels); rt300@0: // for(int i=0;i maxMessages) rt300@0: messages.pop_front(); rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::newMidiMessage(ofxMidiMessage& msg) { rt300@50: static int n = 0; rt300@50: n++; rt300@50: stringstream s; rt300@50: s << n; rt300@50: midiPorts = s.str(); rt300@2: // looks out for: 30 31 32... on channel 8 rt300@0: if(msg.channel == midiChannel && msg.status == MIDI_CONTROL_CHANGE){ rt300@0: int ctl_num = msg.control - 30; rt300@32: rt300@0: int ctl_val = msg.value; rt300@0: // TODO route control change message here rt300@0: //cout << " ctrl : " << ctl_num << " : " << ctl_val << endl; rt300@9: if (currentStage == SEARCH) rt300@9: searchMessageOrganiser.midiFromLeap(ctl_num, ctl_val); rt300@23: if (currentStage == EXPRESS) rt300@23: expMessageOrganiser.midiFromLeap(ctl_num, ctl_val); rt300@50: if (currentStage == TRAINING || currentStage == DEMO) rt300@23: trainingMessageOrganiser.midiFromLeap(ctl_num, ctl_val); rt300@9: rt300@0: } rt300@43: rt300@43: if(msg.channel == midiChannel && msg.status == MIDI_NOTE_ON){ rt300@43: // if(msg.value; rt300@43: // turn on forget button rt300@43: if (currentStage == TRAINING) rt300@43: trainingMessageOrganiser.forgotByMidi(); rt300@43: } rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::midiInputAdded(string name, bool isNetwork) { rt300@0: stringstream msg; rt300@0: msg << "ofxMidi: input added: " << name << " network: " << isNetwork; rt300@0: cout << msg.str(); rt300@0: addMessage(msg.str()); rt300@50: midiPorts = msg.str(); rt300@0: // create and open a new input port rt300@0: ofxMidiIn * newInput = new ofxMidiIn; rt300@0: newInput->openPort(name); rt300@0: newInput->addListener(this); rt300@0: inputs.push_back(newInput); rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::midiInputRemoved(string name, bool isNetwork) { rt300@0: stringstream msg; rt300@0: msg << "ofxMidi: input removed: " << name << " network: " << isNetwork << endl; rt300@0: cout << msg.str(); rt300@0: addMessage(msg.str()); rt300@0: rt300@0: // close and remove input port rt300@0: vector::iterator iter; rt300@0: for(iter = inputs.begin(); iter != inputs.end(); ++iter) { rt300@0: ofxMidiIn * input = (*iter); rt300@0: if(input->getName() == name) { rt300@0: input->closePort(); rt300@0: input->removeListener(this); rt300@0: delete input; rt300@0: inputs.erase(iter); rt300@0: break; rt300@0: } rt300@0: } rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::midiOutputAdded(string name, bool isNetwork) { rt300@50: static int howmany = 0; rt300@50: howmany++; rt300@0: stringstream msg; rt300@50: msg << "Midi out add: " << howmany << " \n" << name << " network: " << isNetwork << endl; rt300@0: cout << msg.str(); rt300@50: rt300@0: addMessage(msg.str()); rt300@0: rt300@0: // create and open new output port rt300@0: ofxMidiOut * newOutput = new ofxMidiOut; rt300@0: newOutput->openPort(name); rt300@0: outputs.push_back(newOutput); rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::midiOutputRemoved(string name, bool isNetwork) { rt300@0: stringstream msg; rt300@0: msg << "ofxMidi: output removed: " << name << " network: " << isNetwork << endl; rt300@0: cout << msg.str(); rt300@0: addMessage(msg.str()); rt300@0: rt300@0: // close and remove output port rt300@0: vector::iterator iter; rt300@0: for(iter = outputs.begin(); iter != outputs.end(); ++iter) { rt300@0: ofxMidiOut * output = (*iter); rt300@0: if(output->getName() == name) { rt300@0: output->closePort(); rt300@0: delete output; rt300@0: outputs.erase(iter); rt300@0: break; rt300@0: } rt300@0: } rt300@0: } rt300@38: //----------------------------------------------------------- rt300@38: void testApp::mapButtonToAction(UIElement* control, int mappingID){ rt300@38: UICallbackFunction callbackF; rt300@38: callbackF = boost::bind(&testApp::buttonPressCallback, this, _1,_2); rt300@38: control->addHandler(callbackF, mappingID); rt300@38: } rt300@38: void testApp::buttonPressCallback(int mappingID, int value){ rt300@38: if (mappingID == TO_MENU_ID){ rt300@38: backToMainMenu(); rt300@38: } rt300@38: }