# HG changeset patch # User Andrew N Robertson # Date 1328291594 0 # Node ID bc62266af280d33c86a724c1f9cae0ab723635b0 # Parent 572564b7cb85d0fe0b900dcc1947325e8372349e Position scrolls with live input by updating the play position of onset detection to where the current best match is diff -r 572564b7cb85 -r bc62266af280 src/AudioEventMatcher.cpp --- a/src/AudioEventMatcher.cpp Fri Feb 03 13:28:59 2012 +0000 +++ b/src/AudioEventMatcher.cpp Fri Feb 03 17:53:14 2012 +0000 @@ -20,6 +20,8 @@ bayesianStruct.realTimeMode = &usingRealTime; recentPitch = 0; currentAlignmentPosition = 0; + + followingLiveInput = true; } void AudioEventMatcher::setWindowDimensions(){ @@ -45,15 +47,25 @@ } -void AudioEventMatcher::startPlaying(){ +void AudioEventMatcher::startPlaying(){ bayesianStruct.setStartPlaying(); currentAlignmentPosition = 0; startTime = ofGetElapsedTimeMillis(); //bayesianStruct.posterior.printArray(); } + +void AudioEventMatcher::updatePosition(){ + if (!followingLiveInput) + recordedTracks.updatePosition(); + else + recordedTracks.updatePositionToMillis(currentAlignmentPosition); + + updateBestAlignmentPosition(); +} + void AudioEventMatcher::updateBestAlignmentPosition(){ - currentAlignmentPosition = bayesianStruct.posterior.offset + bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate); + currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate); currentAlignmentPosition += (ofGetElapsedTimeMillis() - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); } @@ -70,7 +82,8 @@ ofSetColor(255); // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow); - + + setScreenDisplayTimes(); drawBayesianDistributions(); // bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); @@ -80,16 +93,30 @@ // bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow); ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20); + + ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600); } +void AudioEventMatcher::setScreenDisplayTimes(){ + screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber); + // if (!followingLiveInput){ + + screenStartTimeMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.drawParams.windowStartFrame); + screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis; + + //need PRECISION in this alignment + + + /*}else{ + + screenStartTimeMillis = (int)(currentAlignmentPosition/screenWidthMillis) * screenWidthMillis; + screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis; + }*/ +} + void AudioEventMatcher::drawBayesianDistributions(){ - double screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber); - - - double screenStartTimeMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.drawParams.windowStartFrame); - double screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis; int startIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenStartTimeMillis); int endIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenEndTimeMillis); @@ -111,6 +138,7 @@ ofDrawBitmapString("screenwidth "+ofToString(screenWidthMillis), 20, 800); + //green line at current best estimate ofSetColor(0,255,0); double currentEstimateIndex = (currentAlignmentPosition - screenStartTimeMillis)*ofGetWidth()/screenWidthMillis; ofLine(currentEstimateIndex, bayesPositionWindow.y, currentEstimateIndex, bayesPositionWindow.y + bayesPositionWindow.height); @@ -185,7 +213,7 @@ bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets //start at beginning but OPTIMISE later - double onsetLikelihoodToNoise = 0.5; + double onsetLikelihoodToNoise = 0.3; double likelihoodWidth = 40; @@ -232,7 +260,7 @@ //set the lielihoods by matching the pitched note - double pitchLikelihoodToNoise = 0.5;//more noise + double pitchLikelihoodToNoise = 0.7;//more noise int numberOfMatches = 0; bayesianStruct.likelihood.zero();//set to zero diff -r 572564b7cb85 -r bc62266af280 src/AudioEventMatcher.h --- a/src/AudioEventMatcher.h Fri Feb 03 13:28:59 2012 +0000 +++ b/src/AudioEventMatcher.h Fri Feb 03 17:53:14 2012 +0000 @@ -28,6 +28,7 @@ void setArraySizes(); + void updatePosition(); void updateBestAlignmentPosition(); void draw(); @@ -70,6 +71,9 @@ double recentEventTime[3]; double startTime; - + + double screenStartTimeMillis, screenEndTimeMillis, screenWidthMillis; + bool followingLiveInput; + void setScreenDisplayTimes(); }; #endif diff -r 572564b7cb85 -r bc62266af280 src/RecordedMultitrackAudio.cpp --- a/src/RecordedMultitrackAudio.cpp Fri Feb 03 13:28:59 2012 +0000 +++ b/src/RecordedMultitrackAudio.cpp Fri Feb 03 17:53:14 2012 +0000 @@ -81,7 +81,10 @@ loadedAudioFiles[i].updateToPlayPosition(); } - +void RecordedMultitrackAudio::updatePositionToMillis(const double& millis){ + for (int i = 0;i < numberOfAudioTracks;i++) + loadedAudioFiles[i].updateToMillisPosition(millis); +} void RecordedMultitrackAudio::switchScreens(){ for (int i = 0;i < numberOfAudioTracks;i++) diff -r 572564b7cb85 -r bc62266af280 src/RecordedMultitrackAudio.h --- a/src/RecordedMultitrackAudio.h Fri Feb 03 13:28:59 2012 +0000 +++ b/src/RecordedMultitrackAudio.h Fri Feb 03 17:53:14 2012 +0000 @@ -32,6 +32,7 @@ void loadTestAudio(); void updatePosition(); + void updatePositionToMillis(const double& millis); void drawTracks(); void switchScreens(); void togglePlay(); diff -r 572564b7cb85 -r bc62266af280 src/testApp.cpp --- a/src/testApp.cpp Fri Feb 03 13:28:59 2012 +0000 +++ b/src/testApp.cpp Fri Feb 03 17:53:14 2012 +0000 @@ -38,9 +38,8 @@ //-------------------------------------------------------------- void testApp::update(){ + eventMatcher.updatePosition(); - eventMatcher.recordedTracks.updatePosition(); - eventMatcher.updateBestAlignmentPosition(); checkForOSCmessages(); }