comparison src/AudioEventMatcher.cpp @ 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
comparison
equal deleted inserted replaced
8:572564b7cb85 9:bc62266af280
18 18
19 usingRealTime = false; 19 usingRealTime = false;
20 bayesianStruct.realTimeMode = &usingRealTime; 20 bayesianStruct.realTimeMode = &usingRealTime;
21 recentPitch = 0; 21 recentPitch = 0;
22 currentAlignmentPosition = 0; 22 currentAlignmentPosition = 0;
23
24 followingLiveInput = true;
23 } 25 }
24 26
25 void AudioEventMatcher::setWindowDimensions(){ 27 void AudioEventMatcher::setWindowDimensions(){
26 double startHeight = recordedTracks.numberOfAudioTracks * recordedTracks.trackScreenHeight; 28 double startHeight = recordedTracks.numberOfAudioTracks * recordedTracks.trackScreenHeight;
27 double heightAvailable = 1 - startHeight; 29 double heightAvailable = 1 - startHeight;
43 bayesianStruct.resetSize(matchWindowWidth); 45 bayesianStruct.resetSize(matchWindowWidth);
44 bayesianStruct.setPositionDistributionScalar(1); 46 bayesianStruct.setPositionDistributionScalar(1);
45 47
46 } 48 }
47 49
48 void AudioEventMatcher::startPlaying(){ 50 void AudioEventMatcher::startPlaying(){
49 bayesianStruct.setStartPlaying(); 51 bayesianStruct.setStartPlaying();
50 currentAlignmentPosition = 0; 52 currentAlignmentPosition = 0;
51 startTime = ofGetElapsedTimeMillis(); 53 startTime = ofGetElapsedTimeMillis();
52 //bayesianStruct.posterior.printArray(); 54 //bayesianStruct.posterior.printArray();
53 } 55 }
54 56
57
58 void AudioEventMatcher::updatePosition(){
59 if (!followingLiveInput)
60 recordedTracks.updatePosition();
61 else
62 recordedTracks.updatePositionToMillis(currentAlignmentPosition);
63
64 updateBestAlignmentPosition();
65 }
66
55 void AudioEventMatcher::updateBestAlignmentPosition(){ 67 void AudioEventMatcher::updateBestAlignmentPosition(){
56 currentAlignmentPosition = bayesianStruct.posterior.offset + bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate); 68 currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);
57 currentAlignmentPosition += (ofGetElapsedTimeMillis() - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); 69 currentAlignmentPosition += (ofGetElapsedTimeMillis() - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate);
58 } 70 }
59 71
60 void AudioEventMatcher::draw(){ 72 void AudioEventMatcher::draw(){
61 //draw some outlines in blue 73 //draw some outlines in blue
68 80
69 81
70 82
71 ofSetColor(255); 83 ofSetColor(255);
72 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow); 84 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow);
73 85
86 setScreenDisplayTimes();
74 drawBayesianDistributions(); 87 drawBayesianDistributions();
75 88
76 // bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); 89 // bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow);
77 90
78 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); 91 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow);
79 92
80 // bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow); 93 // bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow);
81 94
82 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20); 95 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20);
83 } 96
84 97 ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600);
98 }
99
100 void AudioEventMatcher::setScreenDisplayTimes(){
101 screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber);
102 // if (!followingLiveInput){
103
104 screenStartTimeMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.drawParams.windowStartFrame);
105 screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis;
106
107 //need PRECISION in this alignment
108
109
110 /*}else{
111
112 screenStartTimeMillis = (int)(currentAlignmentPosition/screenWidthMillis) * screenWidthMillis;
113 screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis;
114 }*/
115 }
116
85 void AudioEventMatcher::drawBayesianDistributions(){ 117 void AudioEventMatcher::drawBayesianDistributions(){
86 118
87 119
88 double screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber);
89
90
91 double screenStartTimeMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.drawParams.windowStartFrame);
92 double screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis;
93 int startIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenStartTimeMillis); 120 int startIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenStartTimeMillis);
94 int endIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenEndTimeMillis); 121 int endIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenEndTimeMillis);
95 122
96 bayesianStruct.posterior.drawConstrainedVector(startIndex, endIndex, 0, ofGetWidth(), bayesPositionWindow); 123 bayesianStruct.posterior.drawConstrainedVector(startIndex, endIndex, 0, ofGetWidth(), bayesPositionWindow);
97 124
109 tmpStr = "best est "+ofToString(bayesianStruct.bestEstimate); 136 tmpStr = "best est "+ofToString(bayesianStruct.bestEstimate);
110 ofDrawBitmapString(tmpStr, 20, 180); 137 ofDrawBitmapString(tmpStr, 20, 180);
111 138
112 ofDrawBitmapString("screenwidth "+ofToString(screenWidthMillis), 20, 800); 139 ofDrawBitmapString("screenwidth "+ofToString(screenWidthMillis), 20, 800);
113 140
141 //green line at current best estimate
114 ofSetColor(0,255,0); 142 ofSetColor(0,255,0);
115 double currentEstimateIndex = (currentAlignmentPosition - screenStartTimeMillis)*ofGetWidth()/screenWidthMillis; 143 double currentEstimateIndex = (currentAlignmentPosition - screenStartTimeMillis)*ofGetWidth()/screenWidthMillis;
116 ofLine(currentEstimateIndex, bayesPositionWindow.y, currentEstimateIndex, bayesPositionWindow.y + bayesPositionWindow.height); 144 ofLine(currentEstimateIndex, bayesPositionWindow.y, currentEstimateIndex, bayesPositionWindow.y + bayesPositionWindow.height);
117 145
118 //draw track by track likelihoods 146 //draw track by track likelihoods
183 211
184 212
185 bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets 213 bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets
186 214
187 //start at beginning but OPTIMISE later 215 //start at beginning but OPTIMISE later
188 double onsetLikelihoodToNoise = 0.5; 216 double onsetLikelihoodToNoise = 0.3;
189 217
190 double likelihoodWidth = 40; 218 double likelihoodWidth = 40;
191 219
192 bayesianStruct.likelihood.offset = bayesianStruct.prior.offset; 220 bayesianStruct.likelihood.offset = bayesianStruct.prior.offset;
193 bayesianStruct.likelihood.zero();//set to zero 221 bayesianStruct.likelihood.zero();//set to zero
230 258
231 bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets 259 bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets
232 260
233 //set the lielihoods by matching the pitched note 261 //set the lielihoods by matching the pitched note
234 262
235 double pitchLikelihoodToNoise = 0.5;//more noise 263 double pitchLikelihoodToNoise = 0.7;//more noise
236 int numberOfMatches = 0; 264 int numberOfMatches = 0;
237 bayesianStruct.likelihood.zero();//set to zero 265 bayesianStruct.likelihood.zero();//set to zero
238 266
239 double quantity = 0; 267 double quantity = 0;
240 if (channel <= recordedTracks.numberOfAudioTracks){ 268 if (channel <= recordedTracks.numberOfAudioTracks){