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@0: ofxiPhoneSetOrientation( OF_ORIENTATION_90_LEFT ); rt300@0: //ofxiPhoneExternalDisplay::mirrorOn(); rt300@0: [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; rt300@0: // initilaise rt300@0: rt300@0: rt300@0: initialiseVariables(); rt300@8: rt300@6: rt300@6: expPresetManager.onAppLoad(); rt300@6: rt300@6: //presetManager.startLoadAll(); rt300@6: rt300@8: targetSynth.init(&core,"targetSynth"); rt300@8: candidateSynth.init(&core,"candidateSynth"); rt300@0: rt300@8: searchMessageOrganiser.init(targetSynth, candidateSynth); rt300@0: timeController.init(); rt300@0: initialiseGUIs(); rt300@0: initialiseMIDI(); rt300@0: setupUIElements(); rt300@0: rt300@0: rt300@8: rt300@0: rt300@0: light.setSpotlight(45. , 1.); rt300@0: light.enable(); rt300@0: ofEnableSeparateSpecularLight(); rt300@0: ofEnableDepthTest(); rt300@0: ofEnableAlphaBlending(); rt300@0: // in setup: rt300@0: myfont.loadFont("NewMedia Fett.ttf", 32); rt300@0: rt300@0: verdBig.loadFont("verdana.ttf", 18, true, true); rt300@0: verdBig.setLineHeight(18.0f); rt300@0: verdBig.setLetterSpacing(1.037); rt300@0: rt300@0: //-------------------------------------- rt300@0: rt300@0: eventLogger.startLoadAll(); rt300@0: //-------------------------------------- rt300@0: rt300@0: // now do things that will affect the start up state of the app rt300@0: rt300@0: // initialise PD 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@0: if(true){ // force start rt300@0: startTheTests(); 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@0: showIntro(); rt300@0: } rt300@0: } rt300@0: paused = false; rt300@0: 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@0: ofSetFrameRate(60); rt300@0: 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@0: rt300@6: } rt300@6: //-------------------------------------------------------------- rt300@6: // gui for the main training stage rt300@6: void testApp::setupTrainingViewPanels(){ rt300@6: rt300@6: } rt300@6: //-------------------------------------------------------------- rt300@6: // gui for the old style tweakathlon stage rt300@6: void testApp::setupSearchViewPanels(){ rt300@6: rt300@0: UIProps p; rt300@0: ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+p.sliderPanelHeight,ofGetWidth(),250,p); rt300@6: rt300@0: Buttron* playTargetButton = new Buttron(p.buttonWidth*0.2,680, p); 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@0: Buttron * playCandidateButton = new Buttron(p.buttonWidth*1.4,680, p); 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@0: Buttron * submitButton = new Buttron(ofGetWidth()*0.5 - p.buttonWidth*0.5,680, p); 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@4: Buttron * saveButton = new Buttron(ofGetWidth()*0.5 - p.buttonWidth*0.5,680, p); 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@4: Buttron * recallButton = new Buttron(ofGetWidth()*0.5 - p.buttonWidth*0.5,680, p); 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@0: rt300@7: // - - - - - -- - - OTHER BITS rt300@0: rt300@0: CountdownText * countDownBox = new CountdownText("5" , 500, 380, 455, 455, p); rt300@0: UIElements.push_back(countDownBox); rt300@8: searchMessageOrganiser.setCountdownPanel(countDownBox); rt300@0: countDownBox->hide(); rt300@0: rt300@0: TextPanel * scoreFeedback = new TextPanel("Feedback panel", ofGetWidth()*0.5 - p.buttonWidth*0.5, 666, 400,100,p); rt300@0: scoreFeedback->setFontSize(SMALLFONT); rt300@0: UIElements.push_back(scoreFeedback); rt300@8: searchMessageOrganiser.setScorePanel(scoreFeedback); rt300@0: scoreFeedback->hide(); rt300@0: rt300@0: TextPanel * finishPanel = new TextPanel("Finish txt panel", 250, 250, 1000,400,p); 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@0: Buttron * newTestButton = new Buttron(ofGetWidth()-300,690, p); 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@0: TargetSymbol* targetSymbol = new TargetSymbol(ofGetWidth()*0.5,160,30,p); rt300@8: searchMessageOrganiser.setTargetSymbol(targetSymbol); rt300@0: UIElements.push_back(targetSymbol); rt300@0: rt300@7: } rt300@7: //-------------------------------------------------------------- rt300@7: void testApp::setupSliderPanel(){ rt300@7: UIProps p; rt300@7: vector sl2; rt300@7: sl2.push_back(SLIDER); rt300@7: rt300@7: SliderPanel * controlPanel = new SliderPanel(1, rt300@7: 160, rt300@7: ofGetWidth(), rt300@7: p.sliderPanelHeight, rt300@7: p, rt300@7: sl2); rt300@7: rt300@7: UIElements.push_back(controlPanel); rt300@8: searchMessageOrganiser.setControlPanel(controlPanel); rt300@7: controlPanel->showBorder(true); rt300@7: } rt300@7: //-------------------------------------------------------------- rt300@7: void testApp::setupUIElements(){ rt300@7: rt300@7: UIProps p; rt300@7: ofBackground(p.generalBackground); rt300@7: rt300@7: setupSearchViewPanels(); rt300@7: rt300@7: setupSliderPanel(); rt300@0: rt300@0: 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@0: 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@0: void testApp::introHidden(){ rt300@0: eventLogger.consentGiven = true; rt300@0: eventLogger.logEvent(INTRO_CONSENTED); rt300@0: [usernameAlertViewController showUserNamePrompt]; rt300@2: // after prompt goes it calls usernameEntered() rt300@0: } rt300@0: rt300@2: void testApp::usernameEntered(){ rt300@2: // display a thing that gives us an option as to which stage to start rt300@2: // EXPLORE, PERFORMANCE TRAINING, SEARCH rt300@2: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::startTheTests(){ rt300@0: eventLogger.logEvent(START_THE_TESTS); rt300@0: whichInterfaceShowing = COUNT_DOWN; rt300@0: // do countdown etc rt300@8: searchMessageOrganiser.countdownToNewTest(); rt300@0: // TODO how is testApp going to kknow whichInterfaceShowing ??? rt300@0: rt300@0: } 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: //-------------------------------------------------------------- rt300@0: //void testApp::sendOSCParams(){ rt300@0: // rt300@0: // ofxOscMessage m; rt300@0: // m.setAddress( "Template" ); rt300@0: // rt300@0: // m.addFloatArg(9.9999); rt300@0: // rt300@0: // sender.sendMessage( m ); 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@0: // test mutex crash thing rt300@0: //eventLogger.logEvent(CANDIDATE_PLAYED); 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@0: rt300@0: //ofSetColor(234, 234, 234); rt300@0: //ofLine(0,150,1024,150); rt300@0: rt300@0: //drawWaveform(); rt300@8: searchMessageOrganiser.drawScore(); rt300@0: rt300@0: 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@0: 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@0: 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@0: int ctl_val = msg.value; rt300@0: // TODO route control change message here rt300@0: //cout << " ctrl : " << ctl_num << " : " << ctl_val << endl; rt300@8: searchMessageOrganiser.midiFromLeap(ctl_num, ctl_val); rt300@0: } 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@0: 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@0: stringstream msg; rt300@0: msg << "ofxMidi: output added: " << name << " network: " << isNetwork << endl; rt300@0: cout << msg.str(); 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: }