annotate 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
rev   line source
Chris@0 1
Chris@0 2
Chris@0 3 #include "VampTestPlugin.h"
Chris@0 4
Chris@3 5 #include <sstream>
Chris@3 6
Chris@3 7 using std::stringstream;
Chris@3 8
Chris@3 9 using Vamp::RealTime;
Chris@0 10
Chris@0 11 VampTestPlugin::VampTestPlugin(float inputSampleRate) :
Chris@3 12 Plugin(inputSampleRate),
Chris@3 13 m_n(0),
Chris@3 14 m_stepSize(0),
Chris@3 15 m_blockSize(0)
Chris@0 16 {
Chris@3 17 for (int i = 0; i < 10; ++i) {
Chris@3 18 m_instants.push_back(RealTime::fromSeconds(1.5 * i));
Chris@3 19 }
Chris@0 20 }
Chris@0 21
Chris@0 22 VampTestPlugin::~VampTestPlugin()
Chris@0 23 {
Chris@0 24 }
Chris@0 25
Chris@0 26 string
Chris@0 27 VampTestPlugin::getIdentifier() const
Chris@0 28 {
Chris@0 29 return "vamp-test-plugin";
Chris@0 30 }
Chris@0 31
Chris@0 32 string
Chris@0 33 VampTestPlugin::getName() const
Chris@0 34 {
Chris@0 35 return "Vamp Test Plugin";
Chris@0 36 }
Chris@0 37
Chris@0 38 string
Chris@0 39 VampTestPlugin::getDescription() const
Chris@0 40 {
Chris@0 41 return "Test plugin for hosts handling various output types";
Chris@0 42 }
Chris@0 43
Chris@0 44 string
Chris@0 45 VampTestPlugin::getMaker() const
Chris@0 46 {
Chris@0 47 return "Chris Cannam";
Chris@0 48 }
Chris@0 49
Chris@0 50 int
Chris@0 51 VampTestPlugin::getPluginVersion() const
Chris@0 52 {
Chris@0 53 return 1;
Chris@0 54 }
Chris@0 55
Chris@0 56 string
Chris@0 57 VampTestPlugin::getCopyright() const
Chris@0 58 {
Chris@0 59 return "BSD";
Chris@0 60 }
Chris@0 61
Chris@0 62 VampTestPlugin::InputDomain
Chris@0 63 VampTestPlugin::getInputDomain() const
Chris@0 64 {
Chris@0 65 return TimeDomain;
Chris@0 66 }
Chris@0 67
Chris@0 68 size_t
Chris@0 69 VampTestPlugin::getPreferredBlockSize() const
Chris@0 70 {
Chris@0 71 return 0;
Chris@0 72 }
Chris@0 73
Chris@0 74 size_t
Chris@0 75 VampTestPlugin::getPreferredStepSize() const
Chris@0 76 {
Chris@0 77 return 0;
Chris@0 78 }
Chris@0 79
Chris@0 80 size_t
Chris@0 81 VampTestPlugin::getMinChannelCount() const
Chris@0 82 {
Chris@0 83 return 1;
Chris@0 84 }
Chris@0 85
Chris@0 86 size_t
Chris@0 87 VampTestPlugin::getMaxChannelCount() const
Chris@0 88 {
Chris@0 89 return 1;
Chris@0 90 }
Chris@0 91
Chris@0 92 VampTestPlugin::ParameterList
Chris@0 93 VampTestPlugin::getParameterDescriptors() const
Chris@0 94 {
Chris@0 95 ParameterList list;
Chris@0 96 return list;
Chris@0 97 }
Chris@0 98
Chris@0 99 float
Chris@0 100 VampTestPlugin::getParameter(string identifier) const
Chris@0 101 {
Chris@0 102 return 0;
Chris@0 103 }
Chris@0 104
Chris@0 105 void
Chris@0 106 VampTestPlugin::setParameter(string identifier, float value)
Chris@0 107 {
Chris@0 108 }
Chris@0 109
Chris@0 110 VampTestPlugin::ProgramList
Chris@0 111 VampTestPlugin::getPrograms() const
Chris@0 112 {
Chris@0 113 ProgramList list;
Chris@0 114 return list;
Chris@0 115 }
Chris@0 116
Chris@0 117 string
Chris@0 118 VampTestPlugin::getCurrentProgram() const
Chris@0 119 {
Chris@0 120 return ""; // no programs
Chris@0 121 }
Chris@0 122
Chris@0 123 void
Chris@0 124 VampTestPlugin::selectProgram(string name)
Chris@0 125 {
Chris@0 126 }
Chris@0 127
Chris@0 128 VampTestPlugin::OutputList
Chris@0 129 VampTestPlugin::getOutputDescriptors() const
Chris@0 130 {
Chris@0 131 OutputList list;
Chris@0 132
Chris@7 133 int n = 0;
Chris@7 134
Chris@0 135 OutputDescriptor d;
Chris@1 136
Chris@1 137 d.identifier = "instants";
Chris@1 138 d.name = "Instants";
Chris@2 139 d.description = "Single time points without values";
Chris@1 140 d.unit = "";
Chris@1 141 d.hasFixedBinCount = true;
Chris@1 142 d.binCount = 0;
Chris@1 143 d.hasKnownExtents = false;
Chris@1 144 d.isQuantized = false;
Chris@1 145 d.sampleType = OutputDescriptor::VariableSampleRate;
Chris@1 146 d.hasDuration = false;
Chris@7 147 m_outputNumbers[d.identifier] = n++;
Chris@1 148 list.push_back(d);
Chris@1 149
Chris@1 150 d.identifier = "curve-oss";
Chris@1 151 d.name = "Curve: OneSamplePerStep";
Chris@2 152 d.description = "A time series with one value per process block";
Chris@0 153 d.unit = "";
Chris@0 154 d.hasFixedBinCount = true;
Chris@0 155 d.binCount = 1;
Chris@0 156 d.hasKnownExtents = false;
Chris@0 157 d.isQuantized = false;
Chris@0 158 d.sampleType = OutputDescriptor::OneSamplePerStep;
Chris@0 159 d.hasDuration = false;
Chris@7 160 m_outputNumbers[d.identifier] = n++;
Chris@0 161 list.push_back(d);
Chris@0 162
Chris@1 163 d.identifier = "curve-fsr";
Chris@1 164 d.name = "Curve: FixedSampleRate";
Chris@2 165 d.description = "A time series with equally-spaced values (independent of process step size)";
Chris@1 166 d.unit = "";
Chris@1 167 d.hasFixedBinCount = true;
Chris@1 168 d.binCount = 1;
Chris@1 169 d.hasKnownExtents = false;
Chris@1 170 d.isQuantized = false;
Chris@1 171 d.sampleType = OutputDescriptor::FixedSampleRate;
Chris@3 172 d.sampleRate = 2;
Chris@1 173 d.hasDuration = false;
Chris@7 174 m_outputNumbers[d.identifier] = n++;
Chris@1 175 list.push_back(d);
Chris@1 176
Chris@7 177 d.identifier = "curve-fsr-timed";
Chris@7 178 d.name = "Curve: FixedSampleRate/Timed";
Chris@7 179 d.description = "A time series with a fixed sample rate (independent of process step size) but with timestamps on features";
Chris@7 180 d.unit = "";
Chris@7 181 d.hasFixedBinCount = true;
Chris@7 182 d.binCount = 1;
Chris@7 183 d.hasKnownExtents = false;
Chris@7 184 d.isQuantized = false;
Chris@7 185 d.sampleType = OutputDescriptor::FixedSampleRate;
Chris@7 186 d.sampleRate = 2;
Chris@7 187 d.hasDuration = false;
Chris@7 188 m_outputNumbers[d.identifier] = n++;
Chris@7 189 list.push_back(d);
Chris@7 190
Chris@1 191 d.identifier = "curve-vsr";
Chris@1 192 d.name = "Curve: VariableSampleRate";
Chris@2 193 d.description = "A variably-spaced series of values";
Chris@1 194 d.unit = "";
Chris@1 195 d.hasFixedBinCount = true;
Chris@1 196 d.binCount = 1;
Chris@1 197 d.hasKnownExtents = false;
Chris@1 198 d.isQuantized = false;
Chris@1 199 d.sampleType = OutputDescriptor::VariableSampleRate;
Chris@2 200 d.sampleRate = 0;
Chris@1 201 d.hasDuration = false;
Chris@7 202 m_outputNumbers[d.identifier] = n++;
Chris@1 203 list.push_back(d);
Chris@1 204
Chris@2 205 d.identifier = "grid-oss";
Chris@2 206 d.name = "Grid: OneSamplePerStep";
Chris@2 207 d.description = "A fixed-height grid of values with one column per process block";
Chris@2 208 d.unit = "";
Chris@2 209 d.hasFixedBinCount = true;
Chris@4 210 d.binCount = 10;
Chris@2 211 d.hasKnownExtents = false;
Chris@2 212 d.isQuantized = false;
Chris@4 213 d.sampleType = OutputDescriptor::OneSamplePerStep;
Chris@2 214 d.sampleRate = 0;
Chris@2 215 d.hasDuration = false;
Chris@7 216 m_outputNumbers[d.identifier] = n++;
Chris@2 217 list.push_back(d);
Chris@2 218
Chris@2 219 d.identifier = "grid-fsr";
Chris@2 220 d.name = "Grid: FixedSampleRate";
Chris@2 221 d.description = "A fixed-height grid of values with equally-spaced columns (independent of process step size)";
Chris@2 222 d.unit = "";
Chris@2 223 d.hasFixedBinCount = true;
Chris@4 224 d.binCount = 10;
Chris@2 225 d.hasKnownExtents = false;
Chris@2 226 d.isQuantized = false;
Chris@4 227 d.sampleType = OutputDescriptor::FixedSampleRate;
Chris@4 228 d.sampleRate = 2;
Chris@2 229 d.hasDuration = false;
Chris@7 230 m_outputNumbers[d.identifier] = n++;
Chris@2 231 list.push_back(d);
Chris@2 232
Chris@5 233 d.identifier = "notes-regions";
Chris@5 234 d.name = "Notes or Regions";
Chris@5 235 d.description = "Variably-spaced features with one value and duration";
Chris@5 236 d.unit = "";
Chris@5 237 d.hasFixedBinCount = true;
Chris@5 238 d.binCount = 1;
Chris@5 239 d.hasKnownExtents = false;
Chris@5 240 d.isQuantized = false;
Chris@5 241 d.sampleType = OutputDescriptor::VariableSampleRate;
Chris@5 242 d.sampleRate = 0;
Chris@5 243 d.hasDuration = true;
Chris@7 244 m_outputNumbers[d.identifier] = n++;
Chris@5 245 list.push_back(d);
Chris@2 246
Chris@0 247 return list;
Chris@0 248 }
Chris@0 249
Chris@0 250 bool
Chris@0 251 VampTestPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize)
Chris@0 252 {
Chris@0 253 if (channels < getMinChannelCount() ||
Chris@0 254 channels > getMaxChannelCount()) return false;
Chris@0 255
Chris@3 256 m_stepSize = stepSize;
Chris@3 257 m_blockSize = blockSize;
Chris@0 258
Chris@0 259 return true;
Chris@0 260 }
Chris@0 261
Chris@0 262 void
Chris@0 263 VampTestPlugin::reset()
Chris@0 264 {
Chris@3 265 m_n = 0;
Chris@3 266 }
Chris@3 267
Chris@3 268 static Vamp::Plugin::Feature
Chris@3 269 instant(RealTime r, int i, int n)
Chris@3 270 {
Chris@3 271 std::stringstream s;
Chris@3 272 Vamp::Plugin::Feature f;
Chris@3 273 f.hasTimestamp = true;
Chris@3 274 f.timestamp = r;
Chris@3 275 f.hasDuration = false;
Chris@3 276 s << i+1 << " of " << n << " at " << r.toText();
Chris@3 277 f.label = s.str();
Chris@3 278 return f;
Chris@3 279 }
Chris@3 280
Chris@3 281 static Vamp::Plugin::Feature
Chris@3 282 untimedCurveValue(RealTime r, int i, int n)
Chris@3 283 {
Chris@3 284 std::stringstream s;
Chris@3 285 Vamp::Plugin::Feature f;
Chris@3 286 f.hasTimestamp = false;
Chris@3 287 f.hasDuration = false;
Chris@3 288 float v = float(i) / float(n);
Chris@3 289 f.values.push_back(v);
Chris@3 290 s << i+1 << " of " << n << ": " << v << " at " << r.toText();
Chris@3 291 f.label = s.str();
Chris@3 292 return f;
Chris@0 293 }
Chris@0 294
Chris@4 295 static Vamp::Plugin::Feature
Chris@4 296 timedCurveValue(RealTime r, int i, int n)
Chris@4 297 {
Chris@4 298 std::stringstream s;
Chris@4 299 Vamp::Plugin::Feature f;
Chris@4 300 f.hasTimestamp = true;
Chris@4 301 f.timestamp = r;
Chris@4 302 f.hasDuration = false;
Chris@4 303 float v = float(i) / float(n);
Chris@4 304 f.values.push_back(v);
Chris@4 305 s << i+1 << " of " << n << ": " << v << " at " << r.toText();
Chris@4 306 f.label = s.str();
Chris@4 307 return f;
Chris@4 308 }
Chris@4 309
Chris@4 310 static Vamp::Plugin::Feature
Chris@7 311 snappedCurveValue(RealTime r, RealTime sn, int i, int n)
Chris@7 312 {
Chris@7 313 std::stringstream s;
Chris@7 314 Vamp::Plugin::Feature f;
Chris@7 315 f.hasTimestamp = true;
Chris@7 316 f.timestamp = r;
Chris@7 317 f.hasDuration = false;
Chris@7 318 float v = float(i) / float(n);
Chris@7 319 f.values.push_back(v);
Chris@7 320 s << i+1 << " of " << n << ": " << v << " at " << r.toText() << " snap to " << sn.toText();
Chris@7 321 f.label = s.str();
Chris@7 322 return f;
Chris@7 323 }
Chris@7 324
Chris@7 325 static Vamp::Plugin::Feature
Chris@4 326 gridColumn(RealTime r, int i, int n)
Chris@4 327 {
Chris@4 328 std::stringstream s;
Chris@4 329 Vamp::Plugin::Feature f;
Chris@4 330 f.hasTimestamp = false;
Chris@4 331 f.hasDuration = false;
Chris@4 332 for (int j = 0; j < 10; ++j) {
Chris@4 333 float v = float(j + i + 2) / float(n + 10);
Chris@4 334 f.values.push_back(v);
Chris@4 335 }
Chris@4 336 s << i+1 << " of " << n << " at " << r.toText();
Chris@4 337 f.label = s.str();
Chris@4 338 return f;
Chris@4 339 }
Chris@4 340
Chris@5 341 static Vamp::Plugin::Feature
Chris@5 342 noteOrRegion(RealTime r, RealTime d, int i, int n)
Chris@5 343 {
Chris@5 344 std::stringstream s;
Chris@5 345 Vamp::Plugin::Feature f;
Chris@5 346 f.hasTimestamp = true;
Chris@5 347 f.timestamp = r;
Chris@5 348 f.hasDuration = true;
Chris@5 349 f.duration = d;
Chris@5 350 float v = float(i) / float(n);
Chris@5 351 f.values.push_back(v);
Chris@5 352 s << i+1 << " of " << n << ": " << v << " at " << r.toText() << " dur. " << d.toText();
Chris@5 353 f.label = s.str();
Chris@5 354 return f;
Chris@5 355 }
Chris@5 356
Chris@7 357 static
Chris@7 358 float snap(float x, float r)
Chris@7 359 {
Chris@7 360 int n = int(x / r + 0.5);
Chris@7 361 return n * r;
Chris@7 362 }
Chris@7 363
Chris@5 364 Vamp::Plugin::FeatureSet
Chris@5 365 VampTestPlugin::featuresFrom(RealTime timestamp, bool final)
Chris@0 366 {
Chris@3 367 FeatureSet fs;
Chris@3 368
Chris@3 369 RealTime endTime = timestamp + RealTime::frame2RealTime
Chris@3 370 (m_stepSize, m_inputSampleRate);
Chris@3 371
Chris@3 372 for (int i = 0; i < (int)m_instants.size(); ++i) {
Chris@5 373
Chris@5 374 if (m_instants[i] >= timestamp && (final || m_instants[i] < endTime)) {
Chris@7 375 fs[m_outputNumbers["instants"]]
Chris@7 376 .push_back(instant(m_instants[i], i, m_instants.size()));
Chris@3 377 }
Chris@4 378
Chris@4 379 RealTime variCurveTime = m_instants[i] / 2;
Chris@5 380 if (variCurveTime >= timestamp && (final || variCurveTime < endTime)) {
Chris@7 381 fs[m_outputNumbers["curve-vsr"]]
Chris@7 382 .push_back(timedCurveValue(variCurveTime, i, m_instants.size()));
Chris@4 383 }
Chris@5 384
Chris@5 385 RealTime noteTime = (m_instants[i] + m_instants[i]) / 3;
Chris@5 386 RealTime noteDuration = RealTime::fromSeconds((i % 2 == 0) ? 1.75 : 0.5);
Chris@5 387
Chris@5 388 if (noteTime >= timestamp && (final || noteTime < endTime)) {
Chris@7 389 fs[m_outputNumbers["notes-regions"]]
Chris@7 390 .push_back(noteOrRegion(noteTime, noteDuration, i, m_instants.size()));
Chris@5 391 }
Chris@3 392 }
Chris@3 393
Chris@5 394 if (!final) {
Chris@3 395
Chris@5 396 if (m_n < 20) {
Chris@7 397 fs[m_outputNumbers["curve-oss"]]
Chris@7 398 .push_back(untimedCurveValue(timestamp, m_n, 20));
Chris@5 399 }
Chris@3 400
Chris@5 401 if (m_n < 5) {
Chris@7 402 fs[m_outputNumbers["curve-fsr"]]
Chris@7 403 .push_back(untimedCurveValue(RealTime::fromSeconds(m_n / 2.0), m_n, 10));
Chris@6 404
Chris@7 405 float s = (m_n / 4) * 2;
Chris@7 406 if ((m_n % 4) > 0) {
Chris@7 407 s += float((m_n % 4) - 1) / 6.0;
Chris@7 408 }
Chris@7 409 fs[m_outputNumbers["curve-fsr-timed"]]
Chris@7 410 .push_back(snappedCurveValue(RealTime::fromSeconds(s),
Chris@7 411 RealTime::fromSeconds(snap(s, 0.5)),
Chris@7 412 m_n, 10));
Chris@5 413 }
Chris@5 414
Chris@5 415 if (m_n < 20) {
Chris@7 416 fs[m_outputNumbers["grid-oss"]]
Chris@7 417 .push_back(gridColumn(timestamp, m_n, 20));
Chris@5 418 }
Chris@5 419
Chris@5 420 } else {
Chris@5 421
Chris@5 422 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
Chris@7 423 fs[m_outputNumbers["curve-fsr"]]
Chris@7 424 .push_back(untimedCurveValue(RealTime::fromSeconds(i / 2.0), i, 10));
Chris@7 425
Chris@7 426 float s = (i / 4) * 2;
Chris@7 427 if ((i % 4) > 0) {
Chris@7 428 s += float((i % 4) - 1) / 6.0;
Chris@7 429 }
Chris@7 430 fs[m_outputNumbers["curve-fsr-timed"]]
Chris@7 431 .push_back(snappedCurveValue(RealTime::fromSeconds(s),
Chris@7 432 RealTime::fromSeconds(snap(s, 0.5)),
Chris@7 433 i, 10));
Chris@5 434 }
Chris@5 435
Chris@5 436 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
Chris@7 437 fs[m_outputNumbers["grid-fsr"]]
Chris@7 438 .push_back(gridColumn(RealTime::fromSeconds(i / 2.0), i, 10));
Chris@5 439 }
Chris@4 440 }
Chris@4 441
Chris@3 442 m_lastTime = endTime;
Chris@3 443 m_n = m_n + 1;
Chris@3 444 return fs;
Chris@5 445 }
Chris@5 446
Chris@5 447 VampTestPlugin::FeatureSet
Chris@5 448 VampTestPlugin::process(const float *const *inputBuffers, RealTime timestamp)
Chris@5 449 {
Chris@5 450 FeatureSet fs = featuresFrom(timestamp, false);
Chris@5 451 return fs;
Chris@0 452 }
Chris@0 453
Chris@0 454 VampTestPlugin::FeatureSet
Chris@0 455 VampTestPlugin::getRemainingFeatures()
Chris@0 456 {
Chris@5 457 FeatureSet fs = featuresFrom(m_lastTime, true);
Chris@3 458 return fs;
Chris@0 459 }
Chris@0 460