Mercurial > hg > multitrack-audio-matcher
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){ |