Mercurial > hg > multitrack-audio-matcher
comparison src/AudioEventMatcher.cpp @ 11:9a2b008c4706
Priors for each channel and scrolling projection for new prior is added
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Sun, 05 Feb 2012 00:00:58 +0000 |
parents | cbadb9d05d29 |
children | 66783ace7506 |
comparison
equal
deleted
inserted
replaced
10:cbadb9d05d29 | 11:9a2b008c4706 |
---|---|
49 | 49 |
50 void AudioEventMatcher::startPlaying(){ | 50 void AudioEventMatcher::startPlaying(){ |
51 bayesianStruct.setStartPlaying(); | 51 bayesianStruct.setStartPlaying(); |
52 currentAlignmentPosition = 0; | 52 currentAlignmentPosition = 0; |
53 startTime = ofGetElapsedTimeMillis(); | 53 startTime = ofGetElapsedTimeMillis(); |
54 | |
55 projectedPrior = bayesianStruct.prior; | |
54 //bayesianStruct.posterior.printArray(); | 56 //bayesianStruct.posterior.printArray(); |
55 } | 57 } |
56 | 58 |
57 | 59 |
58 void AudioEventMatcher::updatePosition(){ | 60 void AudioEventMatcher::updatePosition(){ |
70 | 72 |
71 int newTime = ofGetElapsedTimeMillis() - startTime; | 73 int newTime = ofGetElapsedTimeMillis() - startTime; |
72 // double tmp = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);; | 74 // double tmp = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);; |
73 // double timetmp = (newTime - lastAlignmentTime); | 75 // double timetmp = (newTime - lastAlignmentTime); |
74 // double speedtmp = bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); | 76 // double speedtmp = bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); |
75 | 77 // currentAlignmentTime = newTime; |
76 currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate); | 78 currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate); |
77 currentAlignmentPosition += (newTime - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); | 79 currentAlignmentPosition += (newTime - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); |
78 | 80 |
81 bayesianStruct.projectDistribution(newTime, currentAlignmentPosition, projectedPrior);//prior gets updated to where we are now | |
82 | |
79 // printf("ALIGN pos %f time diff %f (now %f , last %f)speed %f :: ALIGN BEST %f\n", tmp, timetmp, (double)ofGetElapsedTimeMillis(), lastAlignmentTime, speedtmp, currentAlignmentPosition); | 83 // printf("ALIGN pos %f time diff %f (now %f , last %f)speed %f :: ALIGN BEST %f\n", tmp, timetmp, (double)ofGetElapsedTimeMillis(), lastAlignmentTime, speedtmp, currentAlignmentPosition); |
80 } | 84 } |
81 | 85 |
82 void AudioEventMatcher::draw(){ | 86 void AudioEventMatcher::draw(){ |
83 //draw some outlines in blue | 87 //draw some outlines in blue |
86 bayesTempoWindow.drawOutline(); | 90 bayesTempoWindow.drawOutline(); |
87 | 91 |
88 //draw the scrolling audio tracks | 92 //draw the scrolling audio tracks |
89 recordedTracks.drawTracks(); | 93 recordedTracks.drawTracks(); |
90 | 94 |
91 | |
92 | |
93 ofSetColor(255); | 95 ofSetColor(255); |
94 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow); | 96 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow); |
95 | 97 |
96 setScreenDisplayTimes(); | 98 setScreenDisplayTimes(); |
97 drawBayesianDistributions(); | 99 drawBayesianDistributions(); |
98 | 100 |
99 // bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); | 101 //bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); |
100 | |
101 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); | 102 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); |
102 | 103 //bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow); |
103 // bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow); | |
104 | 104 |
105 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20); | 105 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20); |
106 | 106 |
107 ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600); | 107 ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600); |
108 } | 108 } |
155 | 155 |
156 //draw track by track likelihoods | 156 //draw track by track likelihoods |
157 for (int i = 0; i <recordedTracks.numberOfAudioTracks;i++){ | 157 for (int i = 0; i <recordedTracks.numberOfAudioTracks;i++){ |
158 ofSetColor(200,255,50); | 158 ofSetColor(200,255,50); |
159 likelihoodVisualisation[i].drawConstrainedVector(likelihoodVisualisation[i].getRealTermsAsIndex(screenStartTimeMillis), likelihoodVisualisation[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window); | 159 likelihoodVisualisation[i].drawConstrainedVector(likelihoodVisualisation[i].getRealTermsAsIndex(screenStartTimeMillis), likelihoodVisualisation[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window); |
160 | |
161 ofSetColor(0,255,150); | |
162 recentPriors[i].drawConstrainedVector(recentPriors[i].getRealTermsAsIndex(screenStartTimeMillis), recentPriors[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window); | |
163 | |
164 | |
160 ofSetColor(255); | 165 ofSetColor(255); |
161 ofDrawBitmapString("recent event "+ofToString(recentEventTime[i]), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.x + 20, recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.y + recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.height - 10); | 166 ofDrawBitmapString("recent event "+ofToString(recentEventTime[i]), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.x + 20, recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.y + recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.height - 10); |
162 } | 167 } |
163 | 168 |
164 int priorStartIndex = recentPrior.getRealTermsAsIndex(screenStartTimeMillis); | 169 int priorStartIndex = recentPrior.getRealTermsAsIndex(screenStartTimeMillis); |
165 int priorEndIndex = recentPrior.getRealTermsAsIndex(screenEndTimeMillis); | 170 int priorEndIndex = recentPrior.getRealTermsAsIndex(screenEndTimeMillis); |
166 ofSetColor(0,200,200);//recent prior | 171 ofSetColor(0,200,200);//recent prior |
167 recentPrior.drawConstrainedVector(priorStartIndex, priorEndIndex, 0, ofGetWidth(), bayesPositionWindow); | 172 recentPrior.drawConstrainedVector(priorStartIndex, priorEndIndex, 0, ofGetWidth(), bayesPositionWindow); |
168 | 173 |
169 ofSetColor(255,0,100);//purple prior | 174 ofSetColor(255,0,100);//purple prior |
170 bayesianStruct.prior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesLikelihoodWindow); | 175 bayesianStruct.prior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesPositionWindow); |
176 | |
177 ofSetColor(255,0,0); | |
178 projectedPrior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesLikelihoodWindow); | |
171 | 179 |
172 } | 180 } |
173 | 181 |
174 void AudioEventMatcher::newPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){ | 182 void AudioEventMatcher::newPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){ |
175 if (pitchIn > 0){ | 183 if (pitchIn > 0){ |
176 liveInput.addPitchEvent(pitchIn, timeIn); | 184 liveInput.addPitchEvent(pitchIn, timeIn); |
177 | 185 |
178 //printPosteriorMAPinfo(); | 186 //printPosteriorMAPinfo(); |
179 | 187 |
180 matchNewPitchEvent(channel, pitchIn, timeIn);//main pitch matching fn | 188 matchNewPitchEvent(channel, pitchIn, timeIn);//main pitch matching fn |
181 | 189 |
182 likelihoodVisualisation[1] = bayesianStruct.likelihood; | 190 likelihoodVisualisation[1] = bayesianStruct.likelihood; |
183 | 191 |
184 recentPitch = pitchIn;//for drawing | 192 recentPitch = pitchIn;//for drawing |
241 | 249 |
242 } | 250 } |
243 } | 251 } |
244 } | 252 } |
245 | 253 |
254 if (numberOfMatchesFound > 0){ | |
246 // bayesianStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesianStruct.likelihood.length); | 255 // bayesianStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesianStruct.likelihood.length); |
247 bayesianStruct.likelihood.addConstant(numberOfMatchesFound*(1-onsetLikelihoodToNoise)/(onsetLikelihoodToNoise*bayesianStruct.likelihood.length)); | 256 bayesianStruct.likelihood.addConstant(numberOfMatchesFound*(1-onsetLikelihoodToNoise)/(onsetLikelihoodToNoise*bayesianStruct.likelihood.length)); |
248 bayesianStruct.likelihood.renormalise(); | 257 bayesianStruct.likelihood.renormalise(); |
249 | 258 |
250 bayesianStruct.calculatePosterior(); | 259 bayesianStruct.calculatePosterior(); |
251 | |
252 lastAlignmentTime = timeIn;//use TIMESTAMP | 260 lastAlignmentTime = timeIn;//use TIMESTAMP |
253 recentEventTime[channel] = timeIn;//ofGetElapsedTimeMillis() - startTime; | 261 recentEventTime[channel] = timeIn;//ofGetElapsedTimeMillis() - startTime; |
262 | |
263 recentPriors[channel] = bayesianStruct.prior; | |
264 | |
265 } | |
266 | |
267 | |
254 | 268 |
255 } | 269 } |
256 | 270 |
257 | 271 |
258 | 272 |
298 //tmp set likelihood constant and calculate using that | 312 //tmp set likelihood constant and calculate using that |
299 //bayesianStruct.likelihood.zero(); | 313 //bayesianStruct.likelihood.zero(); |
300 //bayesianStruct.likelihood.addConstant(1); | 314 //bayesianStruct.likelihood.addConstant(1); |
301 | 315 |
302 bayesianStruct.calculatePosterior(); | 316 bayesianStruct.calculatePosterior(); |
303 } | 317 lastAlignmentTime = timeIn;//has to use the STAMPED time |
304 | 318 recentEventTime[channel] = timeIn; |
305 lastAlignmentTime = timeIn;//has to use the STAMPED time | 319 |
306 recentEventTime[channel] = timeIn; | 320 recentPriors[channel] = bayesianStruct.prior; |
321 } | |
322 | |
323 | |
307 } | 324 } |
308 | 325 |
309 double AudioEventMatcher::getPitchDistance(const double& pitchOne, const double& pitchTwo, const double& scale){ | 326 double AudioEventMatcher::getPitchDistance(const double& pitchOne, const double& pitchTwo, const double& scale){ |
310 | 327 |
311 double distance = abs(pitchOne - pitchTwo); | 328 double distance = abs(pitchOne - pitchTwo); |