Mercurial > hg > qm-dsp
comparison dsp/tempotracking/DownBeat.cpp @ 58:d72fcd34d9a7
* Fixes to problems shown up by vamp-plugin-tester.
Still not all plugins pass all tests, though
author | cannam |
---|---|
date | Mon, 23 Mar 2009 16:28:53 +0000 |
parents | d241e7701c0c |
children | 6cb2b3cd5356 |
comparison
equal
deleted
inserted
replaced
57:d241e7701c0c | 58:d72fcd34d9a7 |
---|---|
26 m_factor(decimationFactor), | 26 m_factor(decimationFactor), |
27 m_increment(dfIncrement), | 27 m_increment(dfIncrement), |
28 m_decimator1(0), | 28 m_decimator1(0), |
29 m_decimator2(0), | 29 m_decimator2(0), |
30 m_buffer(0), | 30 m_buffer(0), |
31 m_decbuf(0), | |
31 m_bufsiz(0), | 32 m_bufsiz(0), |
32 m_buffill(0), | 33 m_buffill(0), |
33 m_beatframesize(0), | 34 m_beatframesize(0), |
34 m_beatframe(0) | 35 m_beatframe(0) |
35 { | 36 { |
62 } | 63 } |
63 | 64 |
64 void | 65 void |
65 DownBeat::makeDecimators() | 66 DownBeat::makeDecimators() |
66 { | 67 { |
68 // std::cerr << "m_factor = " << m_factor << std::endl; | |
67 if (m_factor < 2) return; | 69 if (m_factor < 2) return; |
68 int highest = Decimator::getHighestSupportedFactor(); | 70 int highest = Decimator::getHighestSupportedFactor(); |
69 if (m_factor <= highest) { | 71 if (m_factor <= highest) { |
70 m_decimator1 = new Decimator(m_increment, m_factor); | 72 m_decimator1 = new Decimator(m_increment, m_factor); |
71 // std::cerr << "DownBeat: decimator 1 factor " << m_factor << ", size " << m_increment << std::endl; | 73 // std::cerr << "DownBeat: decimator 1 factor " << m_factor << ", size " << m_increment << std::endl; |
89 } else { | 91 } else { |
90 // std::cerr << "DownBeat::pushAudioBlock: realloc m_buffer to " << m_bufsiz << std::endl; | 92 // std::cerr << "DownBeat::pushAudioBlock: realloc m_buffer to " << m_bufsiz << std::endl; |
91 m_buffer = (float *)realloc(m_buffer, m_bufsiz * sizeof(float)); | 93 m_buffer = (float *)realloc(m_buffer, m_bufsiz * sizeof(float)); |
92 } | 94 } |
93 } | 95 } |
94 if (!m_decimator1) makeDecimators(); | 96 if (!m_decimator1 && m_factor > 1) makeDecimators(); |
95 float rmsin = 0, rmsout = 0; | 97 // float rmsin = 0, rmsout = 0; |
96 for (int i = 0; i < m_increment; ++i) { | 98 // for (int i = 0; i < m_increment; ++i) { |
97 rmsin += audio[i] * audio[i]; | 99 // rmsin += audio[i] * audio[i]; |
98 } | 100 // } |
99 if (m_decimator2) { | 101 if (m_decimator2) { |
100 m_decimator1->process(audio, m_decbuf); | 102 m_decimator1->process(audio, m_decbuf); |
101 m_decimator2->process(m_decbuf, m_buffer + m_buffill); | 103 m_decimator2->process(m_decbuf, m_buffer + m_buffill); |
104 } else if (m_decimator1) { | |
105 m_decimator1->process(audio, m_buffer + m_buffill); | |
102 } else { | 106 } else { |
103 m_decimator1->process(audio, m_buffer + m_buffill); | 107 // just copy across (m_factor is presumably 1) |
104 } | 108 for (int i = 0; i < m_increment; ++i) { |
105 for (int i = 0; i < m_increment / m_factor; ++i) { | 109 (m_buffer + m_buffill)[i] = audio[i]; |
106 rmsout += m_buffer[m_buffill + i] * m_buffer[m_buffill + i]; | 110 } |
107 } | 111 } |
112 // for (int i = 0; i < m_increment / m_factor; ++i) { | |
113 // rmsout += m_buffer[m_buffill + i] * m_buffer[m_buffill + i]; | |
114 // } | |
108 // std::cerr << "pushAudioBlock: rms in " << sqrt(rmsin) << ", out " << sqrt(rmsout) << std::endl; | 115 // std::cerr << "pushAudioBlock: rms in " << sqrt(rmsin) << ", out " << sqrt(rmsout) << std::endl; |
109 m_buffill += m_increment / m_factor; | 116 m_buffill += m_increment / m_factor; |
110 } | 117 } |
111 | 118 |
112 const float * | 119 const float * |
118 | 125 |
119 void | 126 void |
120 DownBeat::resetAudioBuffer() | 127 DownBeat::resetAudioBuffer() |
121 { | 128 { |
122 if (m_buffer) free(m_buffer); | 129 if (m_buffer) free(m_buffer); |
130 m_buffer = 0; | |
123 m_buffill = 0; | 131 m_buffill = 0; |
124 m_bufsiz = 0; | 132 m_bufsiz = 0; |
125 } | 133 } |
126 | 134 |
127 void | 135 void |
159 // Also apply a Hanning window to the beat frame buffer, sized | 167 // Also apply a Hanning window to the beat frame buffer, sized |
160 // to the beat extents rather than the frame size. (Because | 168 // to the beat extents rather than the frame size. (Because |
161 // the size varies, it's easier to do this by hand than use | 169 // the size varies, it's easier to do this by hand than use |
162 // our Window abstraction.) | 170 // our Window abstraction.) |
163 | 171 |
164 float rms = 0; | 172 // std::cerr << "beatlen = " << beatlen << std::endl; |
165 for (size_t j = 0; j < beatlen; ++j) { | 173 |
174 // float rms = 0; | |
175 for (size_t j = 0; j < beatlen && j < m_beatframesize; ++j) { | |
166 double mul = 0.5 * (1.0 - cos(TWO_PI * (double(j) / double(beatlen)))); | 176 double mul = 0.5 * (1.0 - cos(TWO_PI * (double(j) / double(beatlen)))); |
167 m_beatframe[j] = audio[beatstart + j] * mul; | 177 m_beatframe[j] = audio[beatstart + j] * mul; |
168 rms += m_beatframe[j] * m_beatframe[j]; | 178 // rms += m_beatframe[j] * m_beatframe[j]; |
169 } | 179 } |
170 rms = sqrt(rms); | 180 // rms = sqrt(rms); |
171 // std::cerr << "beat " << i << ": audio rms " << rms << std::endl; | 181 // std::cerr << "beat " << i << ": audio rms " << rms << std::endl; |
172 | 182 |
173 for (size_t j = beatlen; j < m_beatframesize; ++j) { | 183 for (size_t j = beatlen; j < m_beatframesize; ++j) { |
174 m_beatframe[j] = 0.0; | 184 m_beatframe[j] = 0.0; |
175 } | 185 } |