andrew@0
|
1 /*
|
andrew@0
|
2 * AudioEventMatcher.cpp
|
andrew@0
|
3 * MultipleAudioMathcher
|
andrew@0
|
4 *
|
andrew@0
|
5 * Created by Andrew on 31/01/2012.
|
andrew@0
|
6 * Copyright 2012 QMUL. All rights reserved.
|
andrew@0
|
7 *
|
andrew@0
|
8 */
|
andrew@0
|
9
|
andrew@0
|
10 #include "AudioEventMatcher.h"
|
andrew@0
|
11
|
andrew@0
|
12
|
andrew@2
|
13 const int matchWindowWidth = 6000;
|
andrew@0
|
14
|
andrew@0
|
15 AudioEventMatcher::AudioEventMatcher(){
|
andrew@0
|
16
|
andrew@0
|
17 bayesTempoWindow.setToRelativeSize(0, 0.6, 1, 0.2);
|
andrew@0
|
18 bayesPositionWindow.setToRelativeSize(0, 0.8, 1, 0.2);
|
andrew@0
|
19
|
andrew@0
|
20 setArraySizes();
|
andrew@0
|
21 }
|
andrew@0
|
22
|
andrew@0
|
23
|
andrew@0
|
24 void AudioEventMatcher::setArraySizes(){
|
andrew@0
|
25 bayesianStruct.resetSpeedSize(200);
|
andrew@0
|
26 bayesianStruct.setRelativeSpeedScalar(0.01);
|
andrew@0
|
27 bayesianStruct.setSpeedPrior(1.0);
|
andrew@0
|
28 bayesianStruct.relativeSpeedPrior.getMaximum();
|
andrew@0
|
29
|
andrew@0
|
30 bayesianStruct.resetSize(matchWindowWidth);
|
andrew@0
|
31 bayesianStruct.setPositionDistributionScalar(1);
|
andrew@0
|
32
|
andrew@0
|
33 }
|
andrew@0
|
34
|
andrew@0
|
35 void AudioEventMatcher::draw(){
|
andrew@0
|
36 //ofRect(20, 20, 300, 200);
|
andrew@0
|
37
|
andrew@1
|
38 recordedTracks.drawTracks();
|
andrew@2
|
39
|
andrew@2
|
40 ofSetColor(255);
|
andrew@2
|
41 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow);
|
andrew@2
|
42
|
andrew@2
|
43 double screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber);
|
andrew@2
|
44
|
andrew@2
|
45
|
andrew@2
|
46 bayesianStruct.likelihood.drawVector(0, screenWidthMillis, bayesTempoWindow);
|
andrew@0
|
47
|
andrew@1
|
48 }
|
andrew@1
|
49
|
andrew@1
|
50
|
andrew@1
|
51 void AudioEventMatcher::newPitchEvent(const double& pitchIn, const double& timeIn){
|
andrew@1
|
52 liveInput.addPitchEvent(pitchIn, timeIn);
|
andrew@2
|
53 recordedTracks.matchNewPitchEvent(0, pitchIn, timeIn);
|
andrew@2
|
54 }
|
andrew@2
|
55
|
andrew@2
|
56 void AudioEventMatcher::newKickEvent(const double& timeIn){
|
andrew@2
|
57 matchNewOnsetEvent(0, timeIn);
|
andrew@2
|
58 }
|
andrew@2
|
59
|
andrew@2
|
60
|
andrew@2
|
61 void AudioEventMatcher::newSnareEvent(const double& timeIn){
|
andrew@2
|
62 matchNewOnsetEvent(0, timeIn);
|
andrew@2
|
63 }
|
andrew@2
|
64
|
andrew@2
|
65 //Needs just to set bounds for the matching process, not have TimeIn
|
andrew@2
|
66 void AudioEventMatcher::matchNewOnsetEvent(const int& channel, const double& timeIn){
|
andrew@2
|
67 //start at beginning but OPTIMISE later
|
andrew@2
|
68 double likelihoodToNoise = 0.5;
|
andrew@2
|
69
|
andrew@2
|
70 double likelihoodWidth = 40;
|
andrew@2
|
71
|
andrew@2
|
72 bayesianStruct.likelihood.offset = bayesianStruct.prior.offset;
|
andrew@2
|
73 bayesianStruct.likelihood.zero();//set to zero
|
andrew@2
|
74
|
andrew@2
|
75 double quantity = 1;//likelihoodToNoiseRatio / numberOfMatches;
|
andrew@2
|
76 int numberOfMatchesFound = 0;
|
andrew@2
|
77
|
andrew@2
|
78
|
andrew@2
|
79 double startTime = bayesianStruct.likelihood.offset;
|
andrew@2
|
80 double endTime = bayesianStruct.likelihood.offset + matchWindowWidth;
|
andrew@2
|
81
|
andrew@2
|
82 if (channel <= recordedTracks.numberOfAudioTracks){
|
andrew@2
|
83 for (int i = 0;i < recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets.size();i++){
|
andrew@2
|
84 double millisTime = recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].millisTime;
|
andrew@2
|
85 if (millisTime >= startTime && millisTime <= endTime){
|
andrew@2
|
86 bayesianStruct.likelihood.addGaussianShapeFromRealTime(millisTime, likelihoodWidth, quantity);
|
andrew@2
|
87 numberOfMatchesFound++;
|
andrew@2
|
88 printf("Adding Gaussian for onset at time %f offset %f\n", millisTime, bayesianStruct.likelihood.offset);
|
andrew@2
|
89
|
andrew@2
|
90 }
|
andrew@2
|
91 }
|
andrew@2
|
92 }
|
andrew@2
|
93
|
andrew@2
|
94 bayesianStruct.likelihood.renormalise();
|
andrew@2
|
95
|
andrew@2
|
96 //bayesStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesStruct.likelihood.length);
|
andrew@2
|
97
|
andrew@2
|
98
|
andrew@1
|
99 }
|
andrew@1
|
100
|
andrew@1
|
101
|
andrew@1
|
102 void AudioEventMatcher::windowResized(const int& w, const int& h){
|
andrew@1
|
103 recordedTracks.windowResized(w,h);
|
andrew@0
|
104 } |