changeset 9:bc62266af280

Position scrolls with live input by updating the play position of onset detection to where the current best match is
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 03 Feb 2012 17:53:14 +0000
parents 572564b7cb85
children cbadb9d05d29
files src/AudioEventMatcher.cpp src/AudioEventMatcher.h src/RecordedMultitrackAudio.cpp src/RecordedMultitrackAudio.h src/testApp.cpp
diffstat 5 files changed, 49 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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
 	
--- 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
--- 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++)
--- 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();
--- 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();
 	
 }