andrew@0: #include "testApp.h" andrew@0: #include "stdio.h" andrew@0: //#include "aubio.h" andrew@0: #include andrew@0: #include andrew@0: #include andrew@0: #include andrew@0: andrew@0: andrew@53: /* andrew@53: L: load marker file andrew@53: S: save markers andrew@53: andrew@53: */ andrew@53: andrew@0: const double samplingFrequency = 44100.0; andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::setup(){ andrew@0: andrew@0: // 2 output channels, andrew@0: // 0 input channels andrew@0: // 22050 samples per second andrew@0: // 256 samples per buffer andrew@0: // 4 num buffers (latency) andrew@0: andrew@0: //nb THIS CODE WOULD BE USEFUL IF WE EVER WANTED REAL-TIME INPUT - VIA ofSoundSteam andrew@0: andrew@0: receiver.setup( PORT ); andrew@0: andrew@0: sampleRate = 44100; andrew@0: ofSoundStreamSetup(2,0,this, sampleRate,256, 4); andrew@0: andrew@20: ofSetFrameRate(20); andrew@0: andrew@16: eventMatcher.loadAudioFiles(); andrew@1: andrew@7: eventMatcher.setWindowDimensions(); andrew@52: andrew@52: outputWriter.openFile("../../../data/output.txt"); andrew@52: andrew@55: writeKickEvents = false; andrew@55: andrew@1: //audioFilePlayer.loadAudioFile(infilename); andrew@1: } andrew@1: andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::update(){ andrew@9: eventMatcher.updatePosition(); andrew@39: andrew@0: checkForOSCmessages(); andrew@0: andrew@40: outputWriter.writeOutput(eventMatcher.synchroniser.recordedPositionTimeSent, eventMatcher.synchroniser.recordedPositionMillis, eventMatcher.synchroniser.playingPositionMillis); andrew@40: andrew@0: } andrew@0: andrew@0: void testApp::checkForOSCmessages(){ andrew@0: // check for waiting messages andrew@0: while( receiver.hasWaitingMessages() ) andrew@0: { andrew@0: // get the next message andrew@0: ofxOscMessage m; andrew@0: receiver.getNextMessage( &m ); andrew@0: andrew@0: // check for mouse moved message andrew@1: if ( m.getAddress() == "/aubioPitch" ){ andrew@6: int testChannel = m.getArgAsInt32(0); andrew@6: float pitchIn = m.getArgAsFloat(1); andrew@6: int timeIn = m.getArgAsInt32(2); andrew@3: printf("\nAUBIO PITCH RECEIVED %f at time %i\n", pitchIn, timeIn); andrew@6: eventMatcher.newPitchEvent(testChannel, pitchIn, timeIn); andrew@0: } andrew@2: andrew@2: if ( m.getAddress() == "/kick" ){ andrew@6: // float pitchIn = m.getArgAsFloat(0); andrew@6: int testChannel = m.getArgAsInt32(0); andrew@6: double timeIn = m.getArgAsInt32(1); andrew@7: printf("\nKICK RECEIVED at time %f\n", timeIn); andrew@10: andrew@6: eventMatcher.newKickEvent(testChannel, timeIn); andrew@10: andrew@55: if (writeKickEvents){ andrew@55: writeKickEvents = false; andrew@55: eventMatcher.writeAllDistributions(); andrew@55: } andrew@55: andrew@2: } andrew@2: andrew@2: if ( m.getAddress() == "/snare" ){ andrew@7: int testChannel = m.getArgAsInt32(0); andrew@7: double timeIn = m.getArgAsInt32(1); andrew@7: printf("\nSNARE RECEIVED at time %f\n", timeIn); andrew@10: andrew@7: eventMatcher.newSnareEvent(testChannel, timeIn); andrew@2: } andrew@3: andrew@31: // check for mouse moved message andrew@31: if ( m.getAddress() == "/elec" ){ andrew@32: int testChannel = m.getArgAsInt32(0); andrew@32: double timeIn = m.getArgAsFloat(1); andrew@32: float chromaIn[12]; andrew@37: andrew@32: printf("CHROMA received at time %f\n", timeIn); andrew@31: for (int i = 0;i < 12;i++){ andrew@32: chromaIn[i] = m.getArgAsFloat(i+2); andrew@37: // printf("chroma[%i]: %f\n", i, chromaIn[i]); andrew@31: } andrew@32: eventMatcher.newChromaEvent(testChannel, chromaIn, timeIn); andrew@31: } andrew@31: andrew@31: andrew@42: if (m.getAddress() == "/startWindow"){ andrew@42: eventMatcher.bayesianStruct.startingWindowWidth = m.getArgAsFloat(0); andrew@42: } andrew@42: andrew@42: andrew@3: if ( m.getAddress() == "/start" ){ andrew@3: printf("start!\n"); andrew@10: printf("STRART TIME IN %i\n", ofGetElapsedTimeMillis()); andrew@45: outputWriter.openFile(); andrew@3: eventMatcher.startPlaying(); andrew@10: printf("TIME OUT %i\n", ofGetElapsedTimeMillis()); andrew@3: } andrew@15: andrew@15: if ( m.getAddress() == "/stop" ){ andrew@15: printf("stop!\n"); andrew@15: eventMatcher.stopPlaying(); andrew@40: outputWriter.closeFile(); andrew@15: } andrew@15: andrew@50: if (m.getAddress() == "/marker"){ andrew@50: eventMatcher.goToMarker(m.getArgAsInt32(0)); andrew@50: } andrew@50: andrew@16: if ( m.getAddress() == "/accompanimentRatio" ){ andrew@16: double time = m.getArgAsFloat(0); andrew@16: double ratio = m.getArgAsFloat(1); andrew@16: eventMatcher.synchroniser.setPlayingRatio(ratio, time); andrew@16: } andrew@16: andrew@22: if ( m.getAddress() == "/rescue" ){ andrew@22: printf("rescue!\n"); andrew@22: eventMatcher.rescue(); andrew@22: } andrew@36: andrew@0: } andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::draw(){ andrew@0: andrew@0: eventMatcher.draw(); andrew@0: andrew@0: // audioFilePlayer.draw(); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::keyPressed (int key){ andrew@0: if (key == '-'){ andrew@0: volume -= 0.05; andrew@0: volume = MAX(volume, 0); andrew@0: } else if (key == '+'){ andrew@0: volume += 0.05; andrew@0: volume = MIN(volume, 1); andrew@0: } andrew@0: andrew@0: if (key == OF_KEY_RIGHT){ andrew@0: // audioFilePlayer.loadedAudio.setPosition(min(1.0, audioFilePlayer.loadedAudio.getPosition() + (audioFilePlayer.fileLoader.audioHolder.audioScaleSamples/(4.0*audioFilePlayer.fileLoader.audioHolder.audioVector.size()))) ); andrew@0: andrew@0: } andrew@0: andrew@0: if (key == OF_KEY_LEFT){ andrew@0: // audioFilePlayer.loadedAudio.setPosition(max(0.0, audioFilePlayer.loadedAudio.getPosition() - (audioFilePlayer.fileLoader.audioHolder.audioScaleSamples/(4.0*audioFilePlayer.fileLoader.audioHolder.audioVector.size())))); andrew@0: andrew@0: } andrew@0: andrew@55: if (key == OF_KEY_RETURN){ andrew@55: eventMatcher.recordedTracks.stop(); andrew@55: } andrew@55: andrew@55: if (key == OF_KEY_UP){ andrew@55: eventMatcher.recordedTracks.zoomOut(); andrew@55: andrew@55: } andrew@55: andrew@55: if (key == OF_KEY_DOWN){ andrew@55: eventMatcher.recordedTracks.zoomIn(); andrew@55: } andrew@55: andrew@50: if (key == 'c'){ andrew@35: eventMatcher.useChromaDotProduct = !eventMatcher.useChromaDotProduct; andrew@35: printf("Use dot product is %i\n", eventMatcher.useChromaDotProduct); andrew@35: } andrew@0: andrew@0: if (key == ' '){ andrew@50: if (!eventMatcher.startedPlaying){ andrew@50: eventMatcher.recordedTracks.togglePlay(); andrew@50: } andrew@50: } andrew@50: //Marker commands andrew@50: if (key == 'm'){ andrew@50: eventMatcher.addMarkerNow(); andrew@50: } andrew@50: andrew@52: if (key == 'f'){ andrew@50: eventMatcher.deleteMarkers(); andrew@50: } andrew@50: if (key == 'd'){ andrew@50: eventMatcher.deleteNearestMarker(); andrew@50: } andrew@55: andrew@55: andrew@55: // andrew@55: andrew@51: andrew@51: if (key == 's') andrew@51: eventMatcher.markedPoints.saveFile(); andrew@50: andrew@51: if (key == 'l') andrew@51: eventMatcher.markedPoints.loadFile(); andrew@50: andrew@50: andrew@50: if (key == '.'){ andrew@50: eventMatcher.moveToNextMarker(); andrew@50: } andrew@50: if (key == ','){ andrew@50: eventMatcher.moveToPreviousMarker(); andrew@0: } andrew@36: andrew@36: if (key == 'j'){ andrew@36: printf("dynamic vector scalar is %f\n", eventMatcher.bayesianStruct.posterior.scalar); andrew@36: } andrew@52: andrew@52: if (key == 'g'){ andrew@52: eventMatcher.writeAllDistributions(); andrew@52: } andrew@55: andrew@55: if (key == 'h') andrew@55: eventMatcher.drawLikelihoods = !eventMatcher.drawLikelihoods; andrew@55: andrew@55: if (key == 'k') andrew@55: writeKickEvents = true; andrew@55: andrew@55: if (key == 'o'){ andrew@55: openNewAudioFileWithdialogBox(); andrew@55: andrew@55: } andrew@55: andrew@55: if (key == 'p'){ andrew@55: eventMatcher.bayesianStruct.posterior.printArray(); andrew@55: } andrew@55: andrew@55: if (key == 'q'){ andrew@55: eventMatcher.recordedTracks.switchScreens(); andrew@55: } andrew@55: andrew@55: //eventMatcher.markedPoints.saveMarkers(); andrew@50: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::keyReleased (int key){ andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mouseMoved(int x, int y ){ andrew@0: andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mouseDragged(int x, int y, int button){ andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mousePressed(int x, int y, int button){ andrew@50: eventMatcher.mousePressed(x); andrew@0: } andrew@0: andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mouseReleased(int x, int y, int button){ andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::windowResized(int w, int h){ andrew@1: andrew@1: eventMatcher.windowResized(w, h); andrew@0: andrew@0: andrew@0: } andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::audioRequested (float * output, int bufferSize, int nChannels){ andrew@0: //pan = 0.5f; andrew@0: float leftScale = 1 - pan; andrew@0: float rightScale = pan; andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::openNewAudioFileWithdialogBox(){ andrew@0: std::string filename; andrew@0: getFilenameFromDialogBox(&filename); andrew@0: loadNewAudio(filename); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: void testApp::loadNewAudio(string soundFileName){ andrew@0: andrew@1: eventMatcher.recordedTracks.loadedAudioFiles[0].loadAudioFile(soundFileName); andrew@0: andrew@0: // for (int i = 0;i < numberOfAudioTracks;i++) andrew@0: // loadedAudioFiles[i].loadAudioFile(soundFileName); andrew@0: andrew@0: // audioFilePlayer.loadAudioFile(soundFileName); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: bool testApp::getFilenameFromDialogBox(std::string* fileNameToSave){ andrew@0: //this uses a pointer structure within the loader and returns true if the dialogue box was used successfully andrew@0: // first, create a string that will hold the URL andrew@0: string URL; andrew@0: andrew@0: // openFile(string& URL) returns 1 if a file was picked andrew@0: // returns 0 when something went wrong or the user pressed 'cancel' andrew@0: int response = ofxFileDialogOSX::openFile(URL); andrew@0: if(response){ andrew@0: // now you can use the URL andrew@0: *fileNameToSave = URL; andrew@0: //printf("\n filename is %s \n", soundFileName.c_str()); andrew@0: return true; andrew@0: } andrew@0: else { andrew@0: // soundFileName = "OPEN canceled. "; andrew@0: printf("\n open file cancelled \n"); andrew@0: return false; andrew@0: } andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: andrew@0: