annotate testApp.mm @ 14:f83635861187

rewrote sequence controller. ticks show relevant UI modes. images show for preset textures (but greenish?)
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Tue, 21 Oct 2014 16:39:39 +0100
parents af71bf84660f
children e439bf85b665
rev   line source
rt300@0 1 #include "testApp.h"
rt300@0 2 #include "ofAppiOSWindow.h"
rt300@6 3 #include "ExplorePresetManager.h"
rt300@0 4 extern EventLogger eventLogger;
rt300@6 5 extern ExplorePresetManager expPresetManager;
rt300@0 6 // static members inited here. not my choice.
rt300@0 7 int SynthParam::mappingUID = 88000;
rt300@0 8 //--------------------------------------------------------------
rt300@0 9 void testApp::setup(){
rt300@0 10
rt300@0 11
rt300@0 12
rt300@0 13 ofxiPhoneSetOrientation( OF_ORIENTATION_90_LEFT );
rt300@0 14 //ofxiPhoneExternalDisplay::mirrorOn();
rt300@0 15 [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
rt300@14 16
rt300@0 17 initialiseVariables();
rt300@8 18
rt300@6 19
rt300@6 20 expPresetManager.onAppLoad();
rt300@6 21
rt300@6 22 //presetManager.startLoadAll();
rt300@6 23
rt300@8 24 targetSynth.init(&core,"targetSynth");
rt300@8 25 candidateSynth.init(&core,"candidateSynth");
rt300@0 26
rt300@8 27 searchMessageOrganiser.init(targetSynth, candidateSynth);
rt300@9 28 trainingMessageOrganiser.init(targetSynth,candidateSynth);
rt300@0 29 timeController.init();
rt300@0 30 initialiseGUIs();
rt300@0 31 initialiseMIDI();
rt300@0 32 setupUIElements();
rt300@0 33
rt300@14 34
rt300@0 35
rt300@14 36 //
rt300@14 37 // light.setSpotlight(45. , 1.);
rt300@14 38 // light.enable();
rt300@14 39 // ofEnableSeparateSpecularLight();
rt300@0 40 ofEnableDepthTest();
rt300@0 41 ofEnableAlphaBlending();
rt300@0 42 // in setup:
rt300@0 43
rt300@0 44 //--------------------------------------
rt300@0 45
rt300@0 46 eventLogger.startLoadAll();
rt300@0 47 //--------------------------------------
rt300@0 48
rt300@0 49 // now do things that will affect the start up state of the app
rt300@0 50
rt300@0 51 // initialise PD
rt300@0 52
rt300@0 53 int ticksPerBuffer = 8; // 8 * 64 = buffer len of 512
rt300@0 54 core.setup(2, 2, 44100, ticksPerBuffer);
rt300@0 55
rt300@0 56 // setup OF sound stream
rt300@0 57 bufSize = ofxPd::blockSize()*ticksPerBuffer;
rt300@0 58 wavetableNew = (float *) malloc(bufSize * sizeof(float));
rt300@0 59
rt300@0 60 ofSoundStreamSetup(2, 2, this, 44100, ofxPd::blockSize()*ticksPerBuffer, 3);
rt300@0 61
rt300@0 62 if(true){ // force start
rt300@9 63 startTheTrainingTests();
rt300@0 64 }else{
rt300@0 65
rt300@0 66 if(eventLogger.questionnaireCompleted){ // then show play again dialog, and log the test number
rt300@0 67
rt300@0 68 }else{
rt300@0 69 // then we're in timed session mode
rt300@0 70 showIntro();
rt300@0 71 }
rt300@0 72 }
rt300@0 73 paused = false;
rt300@0 74
rt300@0 75
rt300@0 76 eventLogger.logEvent(APP_LOADED);
rt300@0 77
rt300@0 78 ofSoundStreamStart();
rt300@0 79
rt300@0 80 }
rt300@0 81
rt300@0 82 //-----------------------------------------------------------------------------
rt300@0 83
rt300@0 84 //DeviceID3523537000
rt300@0 85 void testApp::initialiseVariables(){
rt300@0 86 paused = true;
rt300@0 87 ofBackground( 0, 0, 0 );
rt300@0 88 //ofEnableAlphaBlending();
rt300@0 89 //ofEnableSmoothing();
rt300@0 90
rt300@0 91 // open an outgoing connection to HOST:PORT for OSC
rt300@0 92 // sender.setup( OSC_HOST, OSC_PORT );
rt300@0 93 ofSetFrameRate(60);
rt300@14 94 props = new UIProps();
rt300@0 95
rt300@0 96 }
rt300@0 97 //---------------------------------------------------------
rt300@0 98 void testApp::initialiseGUIs(){
rt300@0 99
rt300@0 100 // set up iOS gui stuff
rt300@0 101
rt300@0 102 helpViewController = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];
rt300@0 103 [ofxiPhoneGetGLParentView() addSubview:helpViewController.view];
rt300@0 104 [helpViewController setAppRef:(__bridge id)this];
rt300@0 105 helpViewController.view.hidden = YES;
rt300@0 106
rt300@0 107
rt300@0 108 usernameAlertViewController = [[UsernameAlertViewController alloc] init];
rt300@0 109 [usernameAlertViewController setAppRef:(__bridge id)this];
rt300@0 110
rt300@0 111 }
rt300@0 112
rt300@0 113 //--------------------------------------------------------------
rt300@6 114 // GUI for finding and saving presets to express concepts
rt300@6 115 void testApp::setupExpressViewPanels(){
rt300@0 116
rt300@6 117 }
rt300@6 118 //--------------------------------------------------------------
rt300@6 119 // gui for the main training stage
rt300@6 120 void testApp::setupTrainingViewPanels(){
rt300@14 121
rt300@14 122 ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+props->sliderPanelHeight,ofGetWidth(),250,*props);
rt300@6 123
rt300@9 124 // play and submit are now same thing
rt300@14 125 Buttron * playCandidateButton = new Buttron(props->buttonWidth*1.4,680, *props);
rt300@9 126 playCandidateButton->setLabel("PLAY");
rt300@9 127 trainingMessageOrganiser.mapButtonToAction(playCandidateButton, TRIGGER_CANDIDATE_ID);
rt300@9 128 bottomButtonPanel->addButton(playCandidateButton);
rt300@9 129
rt300@9 130 trainingMessageOrganiser.setBottomPanel(bottomButtonPanel);
rt300@9 131 UIElements.push_back(bottomButtonPanel);
rt300@9 132 bottomButtonPanel->hide();
rt300@12 133
rt300@14 134 IconPanel* iconPanel = new IconPanel(420, 10, 150, 150, *props);
rt300@12 135 trainingMessageOrganiser.setIconPanel(iconPanel);
rt300@12 136 UIElements.push_back(iconPanel);
rt300@12 137 iconPanel->show();
rt300@12 138
rt300@14 139 TextPanel * instructionPanel = new TextPanel("Instrcution panel", 10, 50, 300,150,(*props));
rt300@14 140 instructionPanel->setFontSize(LARGEFONT);
rt300@14 141 UIElements.push_back(instructionPanel);
rt300@14 142 trainingMessageOrganiser.setInstructionPanel(instructionPanel);
rt300@14 143 instructionPanel->show();
rt300@14 144
rt300@6 145 }
rt300@6 146 //--------------------------------------------------------------
rt300@6 147 // gui for the old style tweakathlon stage
rt300@6 148 void testApp::setupSearchViewPanels(){
rt300@14 149
rt300@14 150 ButtonPanel* bottomButtonPanel = new ButtonPanel(1,160+(*props).sliderPanelHeight,ofGetWidth(),250,(*props));
rt300@6 151
rt300@14 152 Buttron* playTargetButton = new Buttron((*props).buttonWidth*0.2,680, (*props));
rt300@0 153 playTargetButton->setLabel("Target");
rt300@8 154 searchMessageOrganiser.mapButtonToAction(playTargetButton, TRIGGER_TARGET_ID);
rt300@0 155 bottomButtonPanel->addButton(playTargetButton);
rt300@8 156 searchMessageOrganiser.setTargetButton(playTargetButton);
rt300@6 157
rt300@14 158 Buttron * playCandidateButton = new Buttron((*props).buttonWidth*1.4,680, (*props));
rt300@0 159 playCandidateButton->setLabel("Current");
rt300@8 160 searchMessageOrganiser.mapButtonToAction(playCandidateButton, TRIGGER_CANDIDATE_ID);
rt300@0 161 bottomButtonPanel->addButton(playCandidateButton);
rt300@0 162
rt300@0 163
rt300@0 164 // submit button - only one for now
rt300@14 165 Buttron * submitButton = new Buttron(ofGetWidth()*0.5 - (*props).buttonWidth*0.5,680, (*props));
rt300@0 166 submitButton->setLabel("Submit");
rt300@8 167 searchMessageOrganiser.mapButtonToAction(submitButton, SUBMIT_CANDIDATE);
rt300@0 168 bottomButtonPanel->addButton(submitButton);
rt300@0 169
rt300@0 170 // button - just for spacing pruposes
rt300@14 171 Buttron * saveButton = new Buttron(ofGetWidth()*0.5 - (*props).buttonWidth*0.5,680, (*props));
rt300@4 172 saveButton->setLabel("SAVE");
rt300@8 173 searchMessageOrganiser.mapButtonToAction(saveButton, SAVE_PRESET_HIT);
rt300@4 174 bottomButtonPanel->addButton(saveButton);
rt300@6 175 saveButton->hide();
rt300@0 176
rt300@14 177 Buttron * recallButton = new Buttron(ofGetWidth()*0.5 - (*props).buttonWidth*0.5,680, (*props));
rt300@4 178 recallButton->setLabel("RECALL");
rt300@8 179 searchMessageOrganiser.mapButtonToAction(recallButton, RECALL_PRESET_HIT);
rt300@4 180 bottomButtonPanel->addButton(recallButton);
rt300@6 181 recallButton->hide();
rt300@0 182
rt300@8 183 searchMessageOrganiser.setBottomPanel(bottomButtonPanel);
rt300@0 184 UIElements.push_back(bottomButtonPanel);
rt300@0 185 bottomButtonPanel->showBorder(false);
rt300@9 186 bottomButtonPanel->hide();
rt300@7 187 // - - - - - -- - - OTHER BITS
rt300@0 188
rt300@14 189 CountdownText * countDownBox = new CountdownText("5" , 500, 380, 455, 455, (*props));
rt300@0 190 UIElements.push_back(countDownBox);
rt300@8 191 searchMessageOrganiser.setCountdownPanel(countDownBox);
rt300@0 192 countDownBox->hide();
rt300@0 193
rt300@14 194 TextPanel * scoreFeedback = new TextPanel("Feedback panel", ofGetWidth()*0.5 - (*props).buttonWidth*0.5, 666, 400,100,(*props));
rt300@0 195 scoreFeedback->setFontSize(SMALLFONT);
rt300@0 196 UIElements.push_back(scoreFeedback);
rt300@8 197 searchMessageOrganiser.setScorePanel(scoreFeedback);
rt300@0 198 scoreFeedback->hide();
rt300@0 199
rt300@14 200 TextPanel * finishPanel = new TextPanel("Finish txt panel", 250, 250, 1000,400,(*props));
rt300@0 201 finishPanel->setFontSize(LARGEFONT);
rt300@0 202 finishPanel->setText("Experiment completed");
rt300@8 203 searchMessageOrganiser.setFinishPanel(finishPanel);
rt300@0 204
rt300@0 205 UIElements.push_back(finishPanel);
rt300@0 206 finishPanel->hide();
rt300@7 207
rt300@0 208
rt300@14 209 Buttron * newTestButton = new Buttron(ofGetWidth()-300,690, (*props));
rt300@0 210 newTestButton->setLabel("Next Test");
rt300@0 211 UIElements.push_back(newTestButton);
rt300@8 212 searchMessageOrganiser.mapButtonToAction(newTestButton, NEW_TEST_ID);
rt300@0 213 newTestButton->hide();
rt300@8 214 searchMessageOrganiser.setNewTestButton(newTestButton);
rt300@0 215
rt300@14 216 TargetSymbol* targetSymbol = new TargetSymbol(ofGetWidth()*0.5,160,30,(*props));
rt300@8 217 searchMessageOrganiser.setTargetSymbol(targetSymbol);
rt300@0 218 UIElements.push_back(targetSymbol);
rt300@0 219
rt300@7 220 }
rt300@7 221 //--------------------------------------------------------------
rt300@7 222 void testApp::setupSliderPanel(){
rt300@7 223 UIProps p;
rt300@7 224 vector<controllerType> sl2;
rt300@7 225 sl2.push_back(SLIDER);
rt300@7 226
rt300@7 227 SliderPanel * controlPanel = new SliderPanel(1,
rt300@7 228 160,
rt300@7 229 ofGetWidth(),
rt300@14 230 (*props).sliderPanelHeight,
rt300@14 231 (*props),
rt300@7 232 sl2);
rt300@7 233
rt300@7 234 UIElements.push_back(controlPanel);
rt300@8 235 searchMessageOrganiser.setControlPanel(controlPanel);
rt300@9 236 trainingMessageOrganiser.setControlPanel(controlPanel);
rt300@7 237 controlPanel->showBorder(true);
rt300@7 238 }
rt300@7 239 //--------------------------------------------------------------
rt300@7 240 void testApp::setupUIElements(){
rt300@7 241
rt300@14 242 ofBackground((*props).generalBackground);
rt300@7 243
rt300@7 244 setupSearchViewPanels();
rt300@7 245
rt300@7 246 setupSliderPanel();
rt300@0 247
rt300@9 248 setupTrainingViewPanels();
rt300@0 249 }
rt300@0 250 //--------------------------------------------------------------------------
rt300@0 251 void testApp::initialiseMIDI(){
rt300@0 252
rt300@0 253 /////////////////////////
rt300@0 254 // MIDI
rt300@0 255
rt300@0 256 midiChannel = 8;
rt300@0 257 midiOffset = 0;
rt300@0 258
rt300@0 259 // enables the network midi session between iOS and Mac OSX on a
rt300@0 260 // local wifi network
rt300@0 261 //
rt300@0 262 // in ofxMidi: open the input/outport network ports named "Session 1"
rt300@0 263 //
rt300@0 264 // on OSX: use the Audio MIDI Setup Utility to connect to the iOS device
rt300@0 265 //
rt300@0 266 ofxMidi::enableNetworking();
rt300@0 267
rt300@0 268 // list the number of available input & output ports
rt300@0 269 ofxMidiIn::listPorts();
rt300@0 270 ofxMidiOut::listPorts();
rt300@0 271
rt300@0 272 // create and open input ports
rt300@0 273 for(int i = 0; i < ofxMidiIn::getNumPorts(); ++i) {
rt300@0 274
rt300@0 275 // new object
rt300@0 276 inputs.push_back(new ofxMidiIn);
rt300@0 277
rt300@0 278 // set this class to receive incoming midi events
rt300@0 279 inputs[i]->addListener(this);
rt300@0 280
rt300@0 281 // open input port via port number
rt300@0 282 inputs[i]->openPort(i);
rt300@0 283 }
rt300@0 284
rt300@0 285 // create and open output ports
rt300@0 286 for(int i = 0; i < ofxMidiOut::getNumPorts(); ++i) {
rt300@0 287
rt300@0 288 // new object
rt300@0 289 outputs.push_back(new ofxMidiOut);
rt300@0 290
rt300@0 291 // open input port via port number
rt300@0 292 outputs[i]->openPort(i);
rt300@0 293 }
rt300@0 294
rt300@0 295 // set this class to receieve midi device (dis)connection events
rt300@0 296 ofxMidi::setConnectionListener(this);
rt300@0 297
rt300@0 298 // END MIDI
rt300@0 299
rt300@0 300 }
rt300@0 301 //--------------------------------------------------------------
rt300@0 302
rt300@0 303 template <class T>
rt300@0 304 void deleteVectorOfPointers( T * inVectorOfPointers )
rt300@0 305 {
rt300@0 306 typename T::iterator i;
rt300@0 307 for ( i = inVectorOfPointers->begin() ; i < inVectorOfPointers->end(); i++ )
rt300@0 308 {
rt300@0 309 delete * i;
rt300@0 310 }
rt300@0 311 //delete inVectorOfPointers;
rt300@0 312 }
rt300@0 313
rt300@0 314
rt300@0 315 //--------------------------------------------------------------
rt300@0 316 void testApp::exit(){
rt300@0 317 eventLogger.logEvent(APP_EXITED);
rt300@0 318 eventLogger.exitAndSave();
rt300@0 319
rt300@0 320 core.exit();
rt300@0 321
rt300@0 322 // are these handled automatically?
rt300@0 323 //[introViewController release];
rt300@0 324 //[topButtonViewController release];
rt300@0 325 //[bottomTabViewController release];
rt300@0 326
rt300@0 327 // clean up MIDI
rt300@0 328 for(int i = 0; i < inputs.size(); ++i) {
rt300@0 329 inputs[i]->closePort();
rt300@0 330 inputs[i]->removeListener(this);
rt300@0 331 delete inputs[i];
rt300@0 332 }
rt300@0 333
rt300@0 334 for(int i = 0; i < outputs.size(); ++i) {
rt300@0 335 outputs[i]->closePort();
rt300@0 336 delete outputs[i];
rt300@0 337 }
rt300@0 338 deleteVectorOfPointers(&UIElements); // TODO this crashes??
rt300@8 339
rt300@0 340
rt300@0 341 cout << "exit done \n";
rt300@0 342 }
rt300@0 343
rt300@0 344 #pragma mark GUI
rt300@0 345 ////////////////////////////
rt300@0 346 // These functions called from iOS toolbars
rt300@0 347 //--------------------------------------------------------------
rt300@0 348
rt300@0 349 //--------------------------------------------------------------
rt300@0 350 void testApp::showQuestionnaire(){
rt300@0 351
rt300@0 352
rt300@0 353 questionnaireViewController = [[QuestionnaireViewController alloc] initWithNibName:@"QuestionnaireViewController" bundle:nil];
rt300@0 354 [ofxiPhoneGetGLParentView() addSubview:questionnaireViewController.view];
rt300@0 355
rt300@0 356 [questionnaireViewController setAppRef:(__bridge id)this];
rt300@0 357 [questionnaireViewController show:(__bridge id)this];
rt300@0 358
rt300@0 359 whichInterfaceShowing = QUESTIONNAIRE;
rt300@0 360
rt300@0 361
rt300@0 362 }
rt300@0 363 //--------------------------------------------------------------
rt300@0 364 void testApp::questionnaireHidden(vector<int> answers, const char* userComments){
rt300@0 365 // send answers to server as json
rt300@0 366 eventLogger.questionnaireAnswersObtained(answers, userComments);
rt300@0 367
rt300@0 368 }
rt300@0 369
rt300@0 370 //--------------------------------------------------------------
rt300@0 371 void testApp::showIntro(){
rt300@0 372
rt300@0 373 cout << "SHOW INTRO\n";
rt300@0 374
rt300@0 375 introViewController = [[IntroViewController alloc] initWithNibName:@"IntroViewController" bundle:nil];
rt300@0 376 [ofxiPhoneGetGLParentView() addSubview:introViewController.view];
rt300@0 377
rt300@0 378 [introViewController setAppRef:(__bridge id)this];
rt300@0 379 [introViewController show:(__bridge id)this];
rt300@0 380
rt300@0 381 whichInterfaceShowing = INTRO;
rt300@0 382
rt300@0 383 }
rt300@0 384 //--------------------------------------------------------------
rt300@0 385 void testApp::introHidden(){
rt300@0 386 eventLogger.consentGiven = true;
rt300@0 387 eventLogger.logEvent(INTRO_CONSENTED);
rt300@0 388 [usernameAlertViewController showUserNamePrompt];
rt300@2 389 // after prompt goes it calls usernameEntered()
rt300@0 390 }
rt300@0 391
rt300@2 392 void testApp::usernameEntered(){
rt300@2 393 // display a thing that gives us an option as to which stage to start
rt300@2 394 // EXPLORE, PERFORMANCE TRAINING, SEARCH
rt300@9 395
rt300@9 396
rt300@2 397 }
rt300@0 398 //--------------------------------------------------------------
rt300@9 399 void testApp::startTheSearchTests(){
rt300@9 400 eventLogger.logEvent(START_THE_SEARCH_TESTS);
rt300@0 401 whichInterfaceShowing = COUNT_DOWN;
rt300@0 402 // do countdown etc
rt300@8 403 searchMessageOrganiser.countdownToNewTest();
rt300@0 404 // TODO how is testApp going to kknow whichInterfaceShowing ???
rt300@0 405
rt300@0 406 }
rt300@9 407 void testApp::startTheTrainingTests(){
rt300@9 408 eventLogger.logEvent(START_THE_TRAINING_TESTS);
rt300@9 409
rt300@9 410 trainingMessageOrganiser.setupDefaultMapping();
rt300@9 411
rt300@9 412 }
rt300@0 413 //--------------------------------------------------------------
rt300@0 414 //--------------------------------------------------------------
rt300@0 415 void testApp::showHelp(){
rt300@0 416 // stop clock etc
rt300@0 417 previousInterface = whichInterfaceShowing;
rt300@0 418 whichInterfaceShowing = HELP;
rt300@0 419 helpViewController.view.hidden = NO;
rt300@0 420 eventLogger.logEvent(HELP_PRESSED);
rt300@0 421
rt300@0 422 }
rt300@0 423 void testApp::helpHidden(){
rt300@0 424 whichInterfaceShowing = previousInterface;
rt300@0 425
rt300@0 426 }
rt300@0 427 //--------------------------------------------------------------
rt300@0 428 //--------------------------------------------------------------
rt300@0 429 //--------------------------------------------------------------
rt300@0 430 #pragma mark sending to pd and midi
rt300@0 431 void testApp::sendParametersToPD(){
rt300@0 432
rt300@0 433
rt300@0 434 }
rt300@0 435 //--------------------------------------------------------------
rt300@0 436 void testApp::sendMidiParam(int which){
rt300@0 437 int midiChannel = 8;
rt300@0 438 int offset = 0;
rt300@0 439
rt300@0 440 for(int i = 0; i < outputs.size(); ++i) {
rt300@0 441 outputs[i]->sendControlChange(midiChannel, offset+which, 66);
rt300@0 442 }
rt300@0 443
rt300@0 444
rt300@0 445 }
rt300@0 446
rt300@0 447 //--------------------------------------------------------------
rt300@0 448 //void testApp::sendOSCParams(){
rt300@0 449 //
rt300@0 450 // ofxOscMessage m;
rt300@0 451 // m.setAddress( "Template" );
rt300@0 452 //
rt300@0 453 // m.addFloatArg(9.9999);
rt300@0 454 //
rt300@0 455 // sender.sendMessage( m );
rt300@0 456 //}
rt300@0 457 //--------------------------------------------------------------
rt300@0 458
rt300@0 459 void testApp::setupNewUser(){
rt300@0 460 // this function is for supervised trials with my ipad
rt300@0 461 eventLogger.newUser();
rt300@0 462 }
rt300@0 463 //--------------------------------------------------------------
rt300@0 464 #pragma mark STANDARD OF FUNCTIONS
rt300@0 465 //--------------------------------------------------------------
rt300@0 466 void testApp::update(){
rt300@0 467
rt300@0 468 if(paused) return;
rt300@0 469
rt300@0 470 // run timer check here
rt300@0 471 // look at time, work out difference
rt300@0 472 timeController.tick();
rt300@0 473
rt300@0 474 // test mutex crash thing
rt300@0 475 //eventLogger.logEvent(CANDIDATE_PLAYED);
rt300@0 476 }
rt300@0 477 //--------------------------------------------------------------
rt300@0 478
rt300@0 479 void testApp::appModeChange(interfaceType mode){
rt300@0 480 whichInterfaceShowing = mode;
rt300@0 481 }
rt300@0 482
rt300@0 483
rt300@0 484 //------------------------------------------------------------------------
rt300@0 485
rt300@0 486 void testApp::draw(){
rt300@0 487
rt300@0 488 switch (whichInterfaceShowing){
rt300@0 489 case QUESTIONNAIRE:
rt300@0 490 break;
rt300@0 491 case INTRO:
rt300@0 492 break;
rt300@0 493 case TEST_IN_PROGRESS:
rt300@0 494 break;
rt300@0 495 case SCORE_AND_HINT:
rt300@0 496 break;
rt300@0 497 case COUNT_DOWN:
rt300@0 498 break;
rt300@0 499 case READY_FOR_NEXT:
rt300@0 500 break;
rt300@0 501 default:
rt300@0 502 break;
rt300@0 503 }
rt300@0 504
rt300@0 505
rt300@0 506
rt300@0 507 drawUIElements();
rt300@0 508
rt300@0 509 //ofSetColor(234, 234, 234);
rt300@0 510 //ofLine(0,150,1024,150);
rt300@0 511
rt300@0 512 //drawWaveform();
rt300@9 513 if (currentStage == SEARCH)
rt300@9 514 searchMessageOrganiser.drawScore();
rt300@0 515
rt300@14 516 //image.draw(10,10,200,200);
rt300@0 517
rt300@0 518 }
rt300@0 519 //------------------------------------------------------------------------
rt300@0 520 void testApp::drawUIElements(){
rt300@0 521
rt300@0 522 vector<UIElement *>::iterator UIitr;
rt300@0 523 for(UIitr = UIElements.begin(); UIitr < UIElements.end(); UIitr++){
rt300@0 524 (*UIitr)->draw();
rt300@0 525 }
rt300@0 526 }
rt300@8 527
rt300@0 528 //------------------------------------------------------------------------
rt300@0 529
rt300@0 530 //--------------------------------------------------------------
rt300@0 531 // passes touch to UI elements
rt300@0 532 //--------------------------------------------------------------
rt300@0 533
rt300@0 534 void testApp::touchToUIElements(int x, int y, touchType ttype, int tid){
rt300@0 535 vector<UIElement *>::iterator UIitr;
rt300@0 536 for(UIitr = UIElements.begin(); UIitr < UIElements.end(); UIitr++){
rt300@0 537 (*UIitr)->touch(x,y,ttype, tid);
rt300@0 538 }
rt300@0 539 }
rt300@0 540
rt300@0 541 //--------------------------------------------------------------
rt300@0 542 void testApp::touchDown(ofTouchEventArgs &touch){
rt300@0 543 //touch = transformTouchCoords(touch);
rt300@0 544 touchToUIElements(touch.x, touch.y, TOUCH_DOWN, touch.id);
rt300@0 545
rt300@0 546 }
rt300@0 547
rt300@0 548 //--------------------------------------------------------------
rt300@0 549 void testApp::touchMoved(ofTouchEventArgs &touch){
rt300@0 550
rt300@0 551 touchToUIElements(touch.x, touch.y, TOUCH_MOVED, touch.id);
rt300@0 552
rt300@0 553 }
rt300@0 554
rt300@0 555 //--------------------------------------------------------------
rt300@0 556 void testApp::touchUp(ofTouchEventArgs &touch){
rt300@0 557
rt300@0 558 touchToUIElements(touch.x, touch.y, TOUCH_UP, touch.id);
rt300@0 559 }
rt300@0 560
rt300@0 561
rt300@0 562 //--------------------------------------------------------------
rt300@0 563 void testApp::touchDoubleTap(ofTouchEventArgs &touch){
rt300@0 564
rt300@0 565 }
rt300@0 566
rt300@0 567 //--------------------------------------------------------------
rt300@0 568 void testApp::lostFocus(){
rt300@0 569 //exit();
rt300@0 570 }
rt300@0 571
rt300@0 572 //--------------------------------------------------------------
rt300@0 573 void testApp::gotFocus(){
rt300@0 574
rt300@0 575 }
rt300@0 576
rt300@0 577 //--------------------------------------------------------------
rt300@0 578 void testApp::gotMemoryWarning(){
rt300@0 579
rt300@0 580 }
rt300@0 581
rt300@0 582 //--------------------------------------------------------------
rt300@0 583
rt300@0 584 void testApp::deviceOrientationChanged(int newOrientation){
rt300@0 585
rt300@0 586 cout << "orientation: " << newOrientation;
rt300@0 587
rt300@0 588 // do something here?
rt300@0 589
rt300@0 590 }
rt300@0 591
rt300@0 592
rt300@0 593
rt300@0 594 //--------------------------------------------------------------
rt300@0 595 void testApp::touchCancelled(ofTouchEventArgs& args){
rt300@0 596
rt300@0 597 }
rt300@0 598 //---------------------------------------------------------------
rt300@0 599 // AUDIO STUFF
rt300@0 600 //---------------------------------------------------------------
rt300@0 601
rt300@0 602 #pragma mark AUDIO STREAMS
rt300@0 603 //--------------------------------------------------------------
rt300@0 604 void testApp::audioReceived(float * input, int bufferSize, int nChannels) {
rt300@0 605 //core.audioReceived(input, bufferSize, nChannels);
rt300@0 606 }
rt300@0 607
rt300@0 608 void testApp::audioRequested(float * output, int bufferSize, int nChannels) {
rt300@0 609
rt300@0 610 core.audioRequested(output, bufferSize, nChannels);
rt300@0 611 // for(int i=0;i<bufferSize/2;i++){
rt300@0 612 // output[i] = 0.2;
rt300@0 613 // }
rt300@0 614 // // pass buffer to drawable thing
rt300@0 615 // for(int i=0;i<bufferSize;i++){
rt300@0 616 // wavetableNew[i] = output[i];
rt300@0 617 // }
rt300@0 618
rt300@0 619 }
rt300@0 620
rt300@0 621 void testApp::drawWaveform(){
rt300@0 622 // draw the actual waveform in the corner
rt300@0 623
rt300@0 624 int width = 768;
rt300@0 625 int height = 128;
rt300@0 626 double sampval = 0.0;
rt300@0 627 int leftsampnum = 0;
rt300@0 628 int rightsampnum = 0;
rt300@0 629 float sampscale = 0.0, prevsampscale = 0.0, interp = 0.0;
rt300@0 630
rt300@0 631 ofSetColor(256, 0, 0);
rt300@0 632 double step = double(bufSize)/width; // how much we are stepping thru wave per pixel
rt300@0 633 for(int i = 0; i < width; i++){
rt300@0 634
rt300@0 635 leftsampnum = floor(i * step); // basic nearest neighbour interpolation
rt300@0 636 rightsampnum = ceil(i*step);
rt300@0 637 interp = (i*step)-leftsampnum;
rt300@0 638 if(rightsampnum < bufSize){
rt300@0 639 sampval = (1 - interp)*wavetableNew[leftsampnum] + interp*wavetableNew[rightsampnum];
rt300@0 640 }
rt300@0 641 sampscale = (sampval * 700) + height/2.0; // centre and scale
rt300@0 642 ofSetLineWidth(2);
rt300@0 643 ofLine(sampscale, i, prevsampscale, i-1); // draw a line from pixel to pixel (?)
rt300@0 644 prevsampscale = sampscale;
rt300@0 645 }
rt300@0 646
rt300@0 647 }
rt300@0 648 //---------------------------------------------------------------
rt300@0 649 #pragma mark UTILITIES
rt300@0 650 //-------------------------------------------------------------------------
rt300@0 651 //--------------------------------------------------------------
rt300@0 652
rt300@0 653 #pragma mark MIDI
rt300@0 654 void testApp::addMessage(string msg) {
rt300@0 655 cout << msg << endl;
rt300@0 656 messages.push_back(msg);
rt300@0 657 while(messages.size() > maxMessages)
rt300@0 658 messages.pop_front();
rt300@0 659 }
rt300@0 660
rt300@0 661 //--------------------------------------------------------------
rt300@0 662 void testApp::newMidiMessage(ofxMidiMessage& msg) {
rt300@0 663
rt300@2 664 // looks out for: 30 31 32... on channel 8
rt300@0 665 if(msg.channel == midiChannel && msg.status == MIDI_CONTROL_CHANGE){
rt300@0 666 int ctl_num = msg.control - 30;
rt300@0 667 int ctl_val = msg.value;
rt300@0 668 // TODO route control change message here
rt300@0 669 //cout << " ctrl : " << ctl_num << " : " << ctl_val << endl;
rt300@9 670 if (currentStage == SEARCH)
rt300@9 671 searchMessageOrganiser.midiFromLeap(ctl_num, ctl_val);
rt300@9 672
rt300@9 673
rt300@0 674 }
rt300@0 675
rt300@0 676 }
rt300@0 677
rt300@0 678 //--------------------------------------------------------------
rt300@0 679 void testApp::midiInputAdded(string name, bool isNetwork) {
rt300@0 680 stringstream msg;
rt300@0 681 msg << "ofxMidi: input added: " << name << " network: " << isNetwork;
rt300@0 682 cout << msg.str();
rt300@0 683 addMessage(msg.str());
rt300@0 684
rt300@0 685 // create and open a new input port
rt300@0 686 ofxMidiIn * newInput = new ofxMidiIn;
rt300@0 687 newInput->openPort(name);
rt300@0 688 newInput->addListener(this);
rt300@0 689 inputs.push_back(newInput);
rt300@0 690 }
rt300@0 691
rt300@0 692 //--------------------------------------------------------------
rt300@0 693 void testApp::midiInputRemoved(string name, bool isNetwork) {
rt300@0 694 stringstream msg;
rt300@0 695 msg << "ofxMidi: input removed: " << name << " network: " << isNetwork << endl;
rt300@0 696 cout << msg.str();
rt300@0 697 addMessage(msg.str());
rt300@0 698
rt300@0 699 // close and remove input port
rt300@0 700 vector<ofxMidiIn*>::iterator iter;
rt300@0 701 for(iter = inputs.begin(); iter != inputs.end(); ++iter) {
rt300@0 702 ofxMidiIn * input = (*iter);
rt300@0 703 if(input->getName() == name) {
rt300@0 704 input->closePort();
rt300@0 705 input->removeListener(this);
rt300@0 706 delete input;
rt300@0 707 inputs.erase(iter);
rt300@0 708 break;
rt300@0 709 }
rt300@0 710 }
rt300@0 711 }
rt300@0 712
rt300@0 713 //--------------------------------------------------------------
rt300@0 714 void testApp::midiOutputAdded(string name, bool isNetwork) {
rt300@0 715 stringstream msg;
rt300@0 716 msg << "ofxMidi: output added: " << name << " network: " << isNetwork << endl;
rt300@0 717 cout << msg.str();
rt300@0 718 addMessage(msg.str());
rt300@0 719
rt300@0 720 // create and open new output port
rt300@0 721 ofxMidiOut * newOutput = new ofxMidiOut;
rt300@0 722 newOutput->openPort(name);
rt300@0 723 outputs.push_back(newOutput);
rt300@0 724 }
rt300@0 725
rt300@0 726 //--------------------------------------------------------------
rt300@0 727 void testApp::midiOutputRemoved(string name, bool isNetwork) {
rt300@0 728 stringstream msg;
rt300@0 729 msg << "ofxMidi: output removed: " << name << " network: " << isNetwork << endl;
rt300@0 730 cout << msg.str();
rt300@0 731 addMessage(msg.str());
rt300@0 732
rt300@0 733 // close and remove output port
rt300@0 734 vector<ofxMidiOut*>::iterator iter;
rt300@0 735 for(iter = outputs.begin(); iter != outputs.end(); ++iter) {
rt300@0 736 ofxMidiOut * output = (*iter);
rt300@0 737 if(output->getName() == name) {
rt300@0 738 output->closePort();
rt300@0 739 delete output;
rt300@0 740 outputs.erase(iter);
rt300@0 741 break;
rt300@0 742 }
rt300@0 743 }
rt300@0 744 }