rt300@0: #include "testApp.h" rt300@0: #include "ofAppiOSWindow.h" rt300@0: rt300@0: extern EventLogger eventLogger; rt300@0: 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@0: rt300@0: rt300@0: testController = new TestController; rt300@0: rt300@0: messageOrganiser.init(&core, testController); rt300@0: timeController.init(); rt300@0: initialiseGUIs(); rt300@0: initialiseMIDI(); rt300@0: setupUIElements(); rt300@0: rt300@0: 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@0: void testApp::setupUIElements(){ rt300@0: rt300@0: // eventually: sliderpanel, topbuttonpanel, submitbuttonpanel, countdown panel, rt300@0: rt300@0: // --------------------- BUTTONS rt300@0: UIProps p; rt300@0: ofBackground(p.generalBackground); rt300@0: rt300@0: ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+p.sliderPanelHeight,ofGetWidth(),250,p); rt300@0: rt300@0: Buttron* playTargetButton = new Buttron(p.buttonWidth*0.2,680, p); rt300@0: playTargetButton->setLabel("Target"); rt300@0: messageOrganiser.mapButtonToAction(playTargetButton, TRIGGER_TARGET_ID); rt300@0: bottomButtonPanel->addButton(playTargetButton); rt300@0: messageOrganiser.setTargetButton(playTargetButton); rt300@0: rt300@0: Buttron * playCandidateButton = new Buttron(p.buttonWidth*1.4,680, p); rt300@0: playCandidateButton->setLabel("Current"); rt300@0: messageOrganiser.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@0: messageOrganiser.mapButtonToAction(submitButton, SUBMIT_CANDIDATE); rt300@0: bottomButtonPanel->addButton(submitButton); rt300@0: rt300@0: // button - just for spacing pruposes rt300@0: Buttron * spacerButton = new Buttron(ofGetWidth()*0.5 - p.buttonWidth*0.5,680, p); rt300@0: spacerButton->setLabel("-"); rt300@0: messageOrganiser.mapButtonToAction(spacerButton, TRIGGER_CANDIDATE_ID); rt300@0: bottomButtonPanel->addButton(spacerButton); rt300@0: spacerButton->hide(); rt300@0: rt300@0: Buttron * spacerButton2 = new Buttron(ofGetWidth()*0.5 - p.buttonWidth*0.5,680, p); rt300@0: spacerButton2->setLabel("-"); rt300@0: messageOrganiser.mapButtonToAction(spacerButton2, TRIGGER_CANDIDATE_ID); rt300@0: bottomButtonPanel->addButton(spacerButton2); rt300@0: spacerButton2->hide(); rt300@0: rt300@0: messageOrganiser.setBottomPanel(bottomButtonPanel); rt300@0: UIElements.push_back(bottomButtonPanel); rt300@0: bottomButtonPanel->showBorder(false); rt300@0: rt300@0: rt300@0: rt300@0: // ------------------------------------ SLIDERS rt300@0: rt300@0: vector sl2; rt300@0: sl2.push_back(SLIDER); rt300@0: rt300@0: SliderPanel * controlPanel = new SliderPanel(1, rt300@0: 160, rt300@0: ofGetWidth(), rt300@0: p.sliderPanelHeight, rt300@0: p, rt300@0: sl2); rt300@0: rt300@0: UIElements.push_back(controlPanel); rt300@0: messageOrganiser.setControlPanel(controlPanel); rt300@0: controlPanel->showBorder(true); rt300@0: rt300@0: // - - - - - -- - - OTHER BITS rt300@0: rt300@0: CountdownText * countDownBox = new CountdownText("5" , 500, 380, 455, 455, p); rt300@0: UIElements.push_back(countDownBox); rt300@0: messageOrganiser.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@0: messageOrganiser.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@0: messageOrganiser.setFinishPanel(finishPanel); rt300@0: rt300@0: UIElements.push_back(finishPanel); rt300@0: finishPanel->hide(); rt300@0: 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@0: messageOrganiser.mapButtonToAction(newTestButton, NEW_TEST_ID); rt300@0: newTestButton->hide(); rt300@0: messageOrganiser.setNewTestButton(newTestButton); rt300@0: rt300@0: TargetSymbol* targetSymbol = new TargetSymbol(ofGetWidth()*0.5,160,30,p); rt300@0: messageOrganiser.setTargetSymbol(targetSymbol); rt300@0: UIElements.push_back(targetSymbol); rt300@0: rt300@0: // alternation speed rt300@0: rt300@0: rt300@0: // ButtronSlider * speedSlider = new ButtronSlider(ofGetWidth()-60, 210, 50, p.sliderHeight/2,FILL, p); rt300@0: // UIElements.push_back(speedSlider); rt300@0: // messageOrganiser.mapButtonToAction(speedSlider, SPEED_CHANGE_ID); rt300@0: // rt300@0: // Buttron * altButton = new Buttron(ofGetWidth()-60, 500, 50, 50,p); rt300@0: // UIElements.push_back(altButton); rt300@0: // altButton->setLabel("Alt"); rt300@0: // messageOrganiser.mapButtonToAction(altButton, START_ALTERNATE_ID); rt300@0: rt300@0: // TextPanel * speedLabel = new TextPanel("Speed", ofGetWidth()-55, 195, 50,20,p); rt300@0: // speedLabel->setText("Speed"); rt300@0: // speedLabel->setFontSize(SMALLFONT); rt300@0: // speedLabel->show(); rt300@0: // UIElements.push_back(speedLabel); rt300@0: rt300@0: // volume rt300@0: // ButtronSlider * volumeSlider = new ButtronSlider(50, 210, 30, p.sliderHeight,FILL, p); rt300@0: // UIElements.push_back(volumeSlider); rt300@0: // messageOrganiser.mapButtonToAction(volumeSlider, VOLUME_CHANGE_ID); 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@0: rt300@0: rt300@0: delete testController; 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@0: messageOrganiser.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@0: 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@0: //------------------------------------------------------------------------ rt300@0: void testApp::drawScore(){ rt300@0: ofColor txtCol = ofColor(150,235,200,255); rt300@0: rt300@0: int score = messageOrganiser.getScore(); rt300@0: stringstream msg; rt300@0: rt300@0: msg << "Test: " << testController->getCurrentTestLetter(); rt300@0: ofSetColor(txtCol); rt300@0: verdBig.drawString(msg.str(), 40, 140); rt300@0: msg.str(std::string()); rt300@0: rt300@0: msg << "Score: " << score; rt300@0: verdBig.drawString(msg.str(), 240, 140); rt300@0: msg.str(std::string()); rt300@0: rt300@0: pair time; rt300@0: time = messageOrganiser.getTime(); rt300@0: msg << "Time taken: " << time.first << ":" << time.second << endl; rt300@0: verdBig.drawString(msg.str(), 600, 140); rt300@0: rt300@0: } 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@0: messageOrganiser.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: }