Mercurial > hg > vamp-test-plugin
comparison VampTestPlugin.cpp @ 7:1bff4a80852c
Map output names to numbers; add timed FixedSampleRate output
author | Chris Cannam |
---|---|
date | Wed, 27 Mar 2013 11:07:09 +0000 |
parents | 9b4ce965db35 |
children | 8c3a61d37984 |
comparison
equal
deleted
inserted
replaced
6:9b4ce965db35 | 7:1bff4a80852c |
---|---|
128 VampTestPlugin::OutputList | 128 VampTestPlugin::OutputList |
129 VampTestPlugin::getOutputDescriptors() const | 129 VampTestPlugin::getOutputDescriptors() const |
130 { | 130 { |
131 OutputList list; | 131 OutputList list; |
132 | 132 |
133 int n = 0; | |
134 | |
133 OutputDescriptor d; | 135 OutputDescriptor d; |
134 | 136 |
135 // 0 -> instants | |
136 d.identifier = "instants"; | 137 d.identifier = "instants"; |
137 d.name = "Instants"; | 138 d.name = "Instants"; |
138 d.description = "Single time points without values"; | 139 d.description = "Single time points without values"; |
139 d.unit = ""; | 140 d.unit = ""; |
140 d.hasFixedBinCount = true; | 141 d.hasFixedBinCount = true; |
141 d.binCount = 0; | 142 d.binCount = 0; |
142 d.hasKnownExtents = false; | 143 d.hasKnownExtents = false; |
143 d.isQuantized = false; | 144 d.isQuantized = false; |
144 d.sampleType = OutputDescriptor::VariableSampleRate; | 145 d.sampleType = OutputDescriptor::VariableSampleRate; |
145 d.hasDuration = false; | 146 d.hasDuration = false; |
146 list.push_back(d); | 147 m_outputNumbers[d.identifier] = n++; |
147 | 148 list.push_back(d); |
148 // 1 -> curve-oss | 149 |
149 d.identifier = "curve-oss"; | 150 d.identifier = "curve-oss"; |
150 d.name = "Curve: OneSamplePerStep"; | 151 d.name = "Curve: OneSamplePerStep"; |
151 d.description = "A time series with one value per process block"; | 152 d.description = "A time series with one value per process block"; |
152 d.unit = ""; | 153 d.unit = ""; |
153 d.hasFixedBinCount = true; | 154 d.hasFixedBinCount = true; |
154 d.binCount = 1; | 155 d.binCount = 1; |
155 d.hasKnownExtents = false; | 156 d.hasKnownExtents = false; |
156 d.isQuantized = false; | 157 d.isQuantized = false; |
157 d.sampleType = OutputDescriptor::OneSamplePerStep; | 158 d.sampleType = OutputDescriptor::OneSamplePerStep; |
158 d.hasDuration = false; | 159 d.hasDuration = false; |
159 list.push_back(d); | 160 m_outputNumbers[d.identifier] = n++; |
160 | 161 list.push_back(d); |
161 // 2 -> curve-fsr | 162 |
162 d.identifier = "curve-fsr"; | 163 d.identifier = "curve-fsr"; |
163 d.name = "Curve: FixedSampleRate"; | 164 d.name = "Curve: FixedSampleRate"; |
164 d.description = "A time series with equally-spaced values (independent of process step size)"; | 165 d.description = "A time series with equally-spaced values (independent of process step size)"; |
165 d.unit = ""; | 166 d.unit = ""; |
166 d.hasFixedBinCount = true; | 167 d.hasFixedBinCount = true; |
168 d.hasKnownExtents = false; | 169 d.hasKnownExtents = false; |
169 d.isQuantized = false; | 170 d.isQuantized = false; |
170 d.sampleType = OutputDescriptor::FixedSampleRate; | 171 d.sampleType = OutputDescriptor::FixedSampleRate; |
171 d.sampleRate = 2; | 172 d.sampleRate = 2; |
172 d.hasDuration = false; | 173 d.hasDuration = false; |
173 list.push_back(d); | 174 m_outputNumbers[d.identifier] = n++; |
174 | 175 list.push_back(d); |
175 // 3 -> curve-vsr | 176 |
177 d.identifier = "curve-fsr-timed"; | |
178 d.name = "Curve: FixedSampleRate/Timed"; | |
179 d.description = "A time series with a fixed sample rate (independent of process step size) but with timestamps on features"; | |
180 d.unit = ""; | |
181 d.hasFixedBinCount = true; | |
182 d.binCount = 1; | |
183 d.hasKnownExtents = false; | |
184 d.isQuantized = false; | |
185 d.sampleType = OutputDescriptor::FixedSampleRate; | |
186 d.sampleRate = 2; | |
187 d.hasDuration = false; | |
188 m_outputNumbers[d.identifier] = n++; | |
189 list.push_back(d); | |
190 | |
176 d.identifier = "curve-vsr"; | 191 d.identifier = "curve-vsr"; |
177 d.name = "Curve: VariableSampleRate"; | 192 d.name = "Curve: VariableSampleRate"; |
178 d.description = "A variably-spaced series of values"; | 193 d.description = "A variably-spaced series of values"; |
179 d.unit = ""; | 194 d.unit = ""; |
180 d.hasFixedBinCount = true; | 195 d.hasFixedBinCount = true; |
182 d.hasKnownExtents = false; | 197 d.hasKnownExtents = false; |
183 d.isQuantized = false; | 198 d.isQuantized = false; |
184 d.sampleType = OutputDescriptor::VariableSampleRate; | 199 d.sampleType = OutputDescriptor::VariableSampleRate; |
185 d.sampleRate = 0; | 200 d.sampleRate = 0; |
186 d.hasDuration = false; | 201 d.hasDuration = false; |
187 list.push_back(d); | 202 m_outputNumbers[d.identifier] = n++; |
188 | 203 list.push_back(d); |
189 // 4 -> grid-oss | 204 |
190 d.identifier = "grid-oss"; | 205 d.identifier = "grid-oss"; |
191 d.name = "Grid: OneSamplePerStep"; | 206 d.name = "Grid: OneSamplePerStep"; |
192 d.description = "A fixed-height grid of values with one column per process block"; | 207 d.description = "A fixed-height grid of values with one column per process block"; |
193 d.unit = ""; | 208 d.unit = ""; |
194 d.hasFixedBinCount = true; | 209 d.hasFixedBinCount = true; |
196 d.hasKnownExtents = false; | 211 d.hasKnownExtents = false; |
197 d.isQuantized = false; | 212 d.isQuantized = false; |
198 d.sampleType = OutputDescriptor::OneSamplePerStep; | 213 d.sampleType = OutputDescriptor::OneSamplePerStep; |
199 d.sampleRate = 0; | 214 d.sampleRate = 0; |
200 d.hasDuration = false; | 215 d.hasDuration = false; |
201 list.push_back(d); | 216 m_outputNumbers[d.identifier] = n++; |
202 | 217 list.push_back(d); |
203 // 5 -> grid-fsr | 218 |
204 d.identifier = "grid-fsr"; | 219 d.identifier = "grid-fsr"; |
205 d.name = "Grid: FixedSampleRate"; | 220 d.name = "Grid: FixedSampleRate"; |
206 d.description = "A fixed-height grid of values with equally-spaced columns (independent of process step size)"; | 221 d.description = "A fixed-height grid of values with equally-spaced columns (independent of process step size)"; |
207 d.unit = ""; | 222 d.unit = ""; |
208 d.hasFixedBinCount = true; | 223 d.hasFixedBinCount = true; |
210 d.hasKnownExtents = false; | 225 d.hasKnownExtents = false; |
211 d.isQuantized = false; | 226 d.isQuantized = false; |
212 d.sampleType = OutputDescriptor::FixedSampleRate; | 227 d.sampleType = OutputDescriptor::FixedSampleRate; |
213 d.sampleRate = 2; | 228 d.sampleRate = 2; |
214 d.hasDuration = false; | 229 d.hasDuration = false; |
215 list.push_back(d); | 230 m_outputNumbers[d.identifier] = n++; |
216 | 231 list.push_back(d); |
217 // 6 -> notes | 232 |
218 d.identifier = "notes-regions"; | 233 d.identifier = "notes-regions"; |
219 d.name = "Notes or Regions"; | 234 d.name = "Notes or Regions"; |
220 d.description = "Variably-spaced features with one value and duration"; | 235 d.description = "Variably-spaced features with one value and duration"; |
221 d.unit = ""; | 236 d.unit = ""; |
222 d.hasFixedBinCount = true; | 237 d.hasFixedBinCount = true; |
224 d.hasKnownExtents = false; | 239 d.hasKnownExtents = false; |
225 d.isQuantized = false; | 240 d.isQuantized = false; |
226 d.sampleType = OutputDescriptor::VariableSampleRate; | 241 d.sampleType = OutputDescriptor::VariableSampleRate; |
227 d.sampleRate = 0; | 242 d.sampleRate = 0; |
228 d.hasDuration = true; | 243 d.hasDuration = true; |
244 m_outputNumbers[d.identifier] = n++; | |
229 list.push_back(d); | 245 list.push_back(d); |
230 | 246 |
231 return list; | 247 return list; |
232 } | 248 } |
233 | 249 |
285 f.timestamp = r; | 301 f.timestamp = r; |
286 f.hasDuration = false; | 302 f.hasDuration = false; |
287 float v = float(i) / float(n); | 303 float v = float(i) / float(n); |
288 f.values.push_back(v); | 304 f.values.push_back(v); |
289 s << i+1 << " of " << n << ": " << v << " at " << r.toText(); | 305 s << i+1 << " of " << n << ": " << v << " at " << r.toText(); |
306 f.label = s.str(); | |
307 return f; | |
308 } | |
309 | |
310 static Vamp::Plugin::Feature | |
311 snappedCurveValue(RealTime r, RealTime sn, int i, int n) | |
312 { | |
313 std::stringstream s; | |
314 Vamp::Plugin::Feature f; | |
315 f.hasTimestamp = true; | |
316 f.timestamp = r; | |
317 f.hasDuration = false; | |
318 float v = float(i) / float(n); | |
319 f.values.push_back(v); | |
320 s << i+1 << " of " << n << ": " << v << " at " << r.toText() << " snap to " << sn.toText(); | |
290 f.label = s.str(); | 321 f.label = s.str(); |
291 return f; | 322 return f; |
292 } | 323 } |
293 | 324 |
294 static Vamp::Plugin::Feature | 325 static Vamp::Plugin::Feature |
321 s << i+1 << " of " << n << ": " << v << " at " << r.toText() << " dur. " << d.toText(); | 352 s << i+1 << " of " << n << ": " << v << " at " << r.toText() << " dur. " << d.toText(); |
322 f.label = s.str(); | 353 f.label = s.str(); |
323 return f; | 354 return f; |
324 } | 355 } |
325 | 356 |
357 static | |
358 float snap(float x, float r) | |
359 { | |
360 int n = int(x / r + 0.5); | |
361 return n * r; | |
362 } | |
363 | |
326 Vamp::Plugin::FeatureSet | 364 Vamp::Plugin::FeatureSet |
327 VampTestPlugin::featuresFrom(RealTime timestamp, bool final) | 365 VampTestPlugin::featuresFrom(RealTime timestamp, bool final) |
328 { | 366 { |
329 FeatureSet fs; | 367 FeatureSet fs; |
330 | 368 |
332 (m_stepSize, m_inputSampleRate); | 370 (m_stepSize, m_inputSampleRate); |
333 | 371 |
334 for (int i = 0; i < (int)m_instants.size(); ++i) { | 372 for (int i = 0; i < (int)m_instants.size(); ++i) { |
335 | 373 |
336 if (m_instants[i] >= timestamp && (final || m_instants[i] < endTime)) { | 374 if (m_instants[i] >= timestamp && (final || m_instants[i] < endTime)) { |
337 // instants output | 375 fs[m_outputNumbers["instants"]] |
338 fs[0].push_back(instant(m_instants[i], i, m_instants.size())); | 376 .push_back(instant(m_instants[i], i, m_instants.size())); |
339 } | 377 } |
340 | 378 |
341 RealTime variCurveTime = m_instants[i] / 2; | 379 RealTime variCurveTime = m_instants[i] / 2; |
342 if (variCurveTime >= timestamp && (final || variCurveTime < endTime)) { | 380 if (variCurveTime >= timestamp && (final || variCurveTime < endTime)) { |
343 // curve-vsr output | 381 fs[m_outputNumbers["curve-vsr"]] |
344 fs[3].push_back(timedCurveValue(variCurveTime, i, m_instants.size())); | 382 .push_back(timedCurveValue(variCurveTime, i, m_instants.size())); |
345 } | 383 } |
346 | 384 |
347 RealTime noteTime = (m_instants[i] + m_instants[i]) / 3; | 385 RealTime noteTime = (m_instants[i] + m_instants[i]) / 3; |
348 RealTime noteDuration = RealTime::fromSeconds((i % 2 == 0) ? 1.75 : 0.5); | 386 RealTime noteDuration = RealTime::fromSeconds((i % 2 == 0) ? 1.75 : 0.5); |
349 | 387 |
350 if (noteTime >= timestamp && (final || noteTime < endTime)) { | 388 if (noteTime >= timestamp && (final || noteTime < endTime)) { |
351 // notes-regions output | 389 fs[m_outputNumbers["notes-regions"]] |
352 fs[6].push_back(noteOrRegion(noteTime, noteDuration, i, m_instants.size())); | 390 .push_back(noteOrRegion(noteTime, noteDuration, i, m_instants.size())); |
353 } | 391 } |
354 } | 392 } |
355 | 393 |
356 if (!final) { | 394 if (!final) { |
357 | 395 |
358 if (m_n < 20) { | 396 if (m_n < 20) { |
359 // curve-oss output | 397 fs[m_outputNumbers["curve-oss"]] |
360 fs[1].push_back(untimedCurveValue(timestamp, m_n, 20)); | 398 .push_back(untimedCurveValue(timestamp, m_n, 20)); |
361 } | 399 } |
362 | 400 |
363 if (m_n < 5) { | 401 if (m_n < 5) { |
364 // curve-fsr output | 402 fs[m_outputNumbers["curve-fsr"]] |
365 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(m_n / 2.0), m_n, 10)); | 403 .push_back(untimedCurveValue(RealTime::fromSeconds(m_n / 2.0), m_n, 10)); |
366 | 404 |
367 //!!! we should also have a FixedSampleRate output for | 405 float s = (m_n / 4) * 2; |
368 //!!! features *with* timestamps, because the host is | 406 if ((m_n % 4) > 0) { |
369 //!!! supposed to read them but round them | 407 s += float((m_n % 4) - 1) / 6.0; |
408 } | |
409 fs[m_outputNumbers["curve-fsr-timed"]] | |
410 .push_back(snappedCurveValue(RealTime::fromSeconds(s), | |
411 RealTime::fromSeconds(snap(s, 0.5)), | |
412 m_n, 10)); | |
370 } | 413 } |
371 | 414 |
372 if (m_n < 20) { | 415 if (m_n < 20) { |
373 // grid-oss output | 416 fs[m_outputNumbers["grid-oss"]] |
374 fs[4].push_back(gridColumn(timestamp, m_n, 20)); | 417 .push_back(gridColumn(timestamp, m_n, 20)); |
375 } | 418 } |
376 | 419 |
377 } else { | 420 } else { |
378 | 421 |
379 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) { | 422 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) { |
380 // curve-fsr output | 423 fs[m_outputNumbers["curve-fsr"]] |
381 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(i / 2.0), i, 10)); | 424 .push_back(untimedCurveValue(RealTime::fromSeconds(i / 2.0), i, 10)); |
425 | |
426 float s = (i / 4) * 2; | |
427 if ((i % 4) > 0) { | |
428 s += float((i % 4) - 1) / 6.0; | |
429 } | |
430 fs[m_outputNumbers["curve-fsr-timed"]] | |
431 .push_back(snappedCurveValue(RealTime::fromSeconds(s), | |
432 RealTime::fromSeconds(snap(s, 0.5)), | |
433 i, 10)); | |
382 } | 434 } |
383 | 435 |
384 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) { | 436 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) { |
385 // grid-fsr output | 437 fs[m_outputNumbers["grid-fsr"]] |
386 fs[5].push_back(gridColumn(RealTime::fromSeconds(i / 2.0), i, 10)); | 438 .push_back(gridColumn(RealTime::fromSeconds(i / 2.0), i, 10)); |
387 } | 439 } |
388 } | 440 } |
389 | 441 |
390 m_lastTime = endTime; | 442 m_lastTime = endTime; |
391 m_n = m_n + 1; | 443 m_n = m_n + 1; |