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@0
|
133 OutputDescriptor d;
|
Chris@1
|
134
|
Chris@3
|
135 // 0 -> instants
|
Chris@1
|
136 d.identifier = "instants";
|
Chris@1
|
137 d.name = "Instants";
|
Chris@2
|
138 d.description = "Single time points without values";
|
Chris@1
|
139 d.unit = "";
|
Chris@1
|
140 d.hasFixedBinCount = true;
|
Chris@1
|
141 d.binCount = 0;
|
Chris@1
|
142 d.hasKnownExtents = false;
|
Chris@1
|
143 d.isQuantized = false;
|
Chris@1
|
144 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@1
|
145 d.hasDuration = false;
|
Chris@1
|
146 list.push_back(d);
|
Chris@1
|
147
|
Chris@3
|
148 // 1 -> curve-oss
|
Chris@1
|
149 d.identifier = "curve-oss";
|
Chris@1
|
150 d.name = "Curve: OneSamplePerStep";
|
Chris@2
|
151 d.description = "A time series with one value per process block";
|
Chris@0
|
152 d.unit = "";
|
Chris@0
|
153 d.hasFixedBinCount = true;
|
Chris@0
|
154 d.binCount = 1;
|
Chris@0
|
155 d.hasKnownExtents = false;
|
Chris@0
|
156 d.isQuantized = false;
|
Chris@0
|
157 d.sampleType = OutputDescriptor::OneSamplePerStep;
|
Chris@0
|
158 d.hasDuration = false;
|
Chris@0
|
159 list.push_back(d);
|
Chris@0
|
160
|
Chris@3
|
161 // 2 -> curve-fsr
|
Chris@1
|
162 d.identifier = "curve-fsr";
|
Chris@1
|
163 d.name = "Curve: FixedSampleRate";
|
Chris@2
|
164 d.description = "A time series with equally-spaced values (independent of process step size)";
|
Chris@1
|
165 d.unit = "";
|
Chris@1
|
166 d.hasFixedBinCount = true;
|
Chris@1
|
167 d.binCount = 1;
|
Chris@1
|
168 d.hasKnownExtents = false;
|
Chris@1
|
169 d.isQuantized = false;
|
Chris@1
|
170 d.sampleType = OutputDescriptor::FixedSampleRate;
|
Chris@3
|
171 d.sampleRate = 2;
|
Chris@1
|
172 d.hasDuration = false;
|
Chris@1
|
173 list.push_back(d);
|
Chris@1
|
174
|
Chris@3
|
175 // 3 -> curve-vsr
|
Chris@1
|
176 d.identifier = "curve-vsr";
|
Chris@1
|
177 d.name = "Curve: VariableSampleRate";
|
Chris@2
|
178 d.description = "A variably-spaced series of values";
|
Chris@1
|
179 d.unit = "";
|
Chris@1
|
180 d.hasFixedBinCount = true;
|
Chris@1
|
181 d.binCount = 1;
|
Chris@1
|
182 d.hasKnownExtents = false;
|
Chris@1
|
183 d.isQuantized = false;
|
Chris@1
|
184 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@2
|
185 d.sampleRate = 0;
|
Chris@1
|
186 d.hasDuration = false;
|
Chris@1
|
187 list.push_back(d);
|
Chris@1
|
188
|
Chris@3
|
189 // 4 -> grid-oss
|
Chris@2
|
190 d.identifier = "grid-oss";
|
Chris@2
|
191 d.name = "Grid: OneSamplePerStep";
|
Chris@2
|
192 d.description = "A fixed-height grid of values with one column per process block";
|
Chris@2
|
193 d.unit = "";
|
Chris@2
|
194 d.hasFixedBinCount = true;
|
Chris@4
|
195 d.binCount = 10;
|
Chris@2
|
196 d.hasKnownExtents = false;
|
Chris@2
|
197 d.isQuantized = false;
|
Chris@4
|
198 d.sampleType = OutputDescriptor::OneSamplePerStep;
|
Chris@2
|
199 d.sampleRate = 0;
|
Chris@2
|
200 d.hasDuration = false;
|
Chris@2
|
201 list.push_back(d);
|
Chris@2
|
202
|
Chris@3
|
203 // 5 -> grid-fsr
|
Chris@2
|
204 d.identifier = "grid-fsr";
|
Chris@2
|
205 d.name = "Grid: FixedSampleRate";
|
Chris@2
|
206 d.description = "A fixed-height grid of values with equally-spaced columns (independent of process step size)";
|
Chris@2
|
207 d.unit = "";
|
Chris@2
|
208 d.hasFixedBinCount = true;
|
Chris@4
|
209 d.binCount = 10;
|
Chris@2
|
210 d.hasKnownExtents = false;
|
Chris@2
|
211 d.isQuantized = false;
|
Chris@4
|
212 d.sampleType = OutputDescriptor::FixedSampleRate;
|
Chris@4
|
213 d.sampleRate = 2;
|
Chris@2
|
214 d.hasDuration = false;
|
Chris@2
|
215 list.push_back(d);
|
Chris@2
|
216
|
Chris@5
|
217 // 6 -> notes
|
Chris@5
|
218 d.identifier = "notes-regions";
|
Chris@5
|
219 d.name = "Notes or Regions";
|
Chris@5
|
220 d.description = "Variably-spaced features with one value and duration";
|
Chris@5
|
221 d.unit = "";
|
Chris@5
|
222 d.hasFixedBinCount = true;
|
Chris@5
|
223 d.binCount = 1;
|
Chris@5
|
224 d.hasKnownExtents = false;
|
Chris@5
|
225 d.isQuantized = false;
|
Chris@5
|
226 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@5
|
227 d.sampleRate = 0;
|
Chris@5
|
228 d.hasDuration = true;
|
Chris@5
|
229 list.push_back(d);
|
Chris@2
|
230
|
Chris@0
|
231 return list;
|
Chris@0
|
232 }
|
Chris@0
|
233
|
Chris@0
|
234 bool
|
Chris@0
|
235 VampTestPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize)
|
Chris@0
|
236 {
|
Chris@0
|
237 if (channels < getMinChannelCount() ||
|
Chris@0
|
238 channels > getMaxChannelCount()) return false;
|
Chris@0
|
239
|
Chris@3
|
240 m_stepSize = stepSize;
|
Chris@3
|
241 m_blockSize = blockSize;
|
Chris@0
|
242
|
Chris@0
|
243 return true;
|
Chris@0
|
244 }
|
Chris@0
|
245
|
Chris@0
|
246 void
|
Chris@0
|
247 VampTestPlugin::reset()
|
Chris@0
|
248 {
|
Chris@3
|
249 m_n = 0;
|
Chris@3
|
250 }
|
Chris@3
|
251
|
Chris@3
|
252 static Vamp::Plugin::Feature
|
Chris@3
|
253 instant(RealTime r, int i, int n)
|
Chris@3
|
254 {
|
Chris@3
|
255 std::stringstream s;
|
Chris@3
|
256 Vamp::Plugin::Feature f;
|
Chris@3
|
257 f.hasTimestamp = true;
|
Chris@3
|
258 f.timestamp = r;
|
Chris@3
|
259 f.hasDuration = false;
|
Chris@3
|
260 s << i+1 << " of " << n << " at " << r.toText();
|
Chris@3
|
261 f.label = s.str();
|
Chris@3
|
262 return f;
|
Chris@3
|
263 }
|
Chris@3
|
264
|
Chris@3
|
265 static Vamp::Plugin::Feature
|
Chris@3
|
266 untimedCurveValue(RealTime r, int i, int n)
|
Chris@3
|
267 {
|
Chris@3
|
268 std::stringstream s;
|
Chris@3
|
269 Vamp::Plugin::Feature f;
|
Chris@3
|
270 f.hasTimestamp = false;
|
Chris@3
|
271 f.hasDuration = false;
|
Chris@3
|
272 float v = float(i) / float(n);
|
Chris@3
|
273 f.values.push_back(v);
|
Chris@3
|
274 s << i+1 << " of " << n << ": " << v << " at " << r.toText();
|
Chris@3
|
275 f.label = s.str();
|
Chris@3
|
276 return f;
|
Chris@0
|
277 }
|
Chris@0
|
278
|
Chris@4
|
279 static Vamp::Plugin::Feature
|
Chris@4
|
280 timedCurveValue(RealTime r, int i, int n)
|
Chris@4
|
281 {
|
Chris@4
|
282 std::stringstream s;
|
Chris@4
|
283 Vamp::Plugin::Feature f;
|
Chris@4
|
284 f.hasTimestamp = true;
|
Chris@4
|
285 f.timestamp = r;
|
Chris@4
|
286 f.hasDuration = false;
|
Chris@4
|
287 float v = float(i) / float(n);
|
Chris@4
|
288 f.values.push_back(v);
|
Chris@4
|
289 s << i+1 << " of " << n << ": " << v << " at " << r.toText();
|
Chris@4
|
290 f.label = s.str();
|
Chris@4
|
291 return f;
|
Chris@4
|
292 }
|
Chris@4
|
293
|
Chris@4
|
294 static Vamp::Plugin::Feature
|
Chris@4
|
295 gridColumn(RealTime r, int i, int n)
|
Chris@4
|
296 {
|
Chris@4
|
297 std::stringstream s;
|
Chris@4
|
298 Vamp::Plugin::Feature f;
|
Chris@4
|
299 f.hasTimestamp = false;
|
Chris@4
|
300 f.hasDuration = false;
|
Chris@4
|
301 for (int j = 0; j < 10; ++j) {
|
Chris@4
|
302 float v = float(j + i + 2) / float(n + 10);
|
Chris@4
|
303 f.values.push_back(v);
|
Chris@4
|
304 }
|
Chris@4
|
305 s << i+1 << " of " << n << " at " << r.toText();
|
Chris@4
|
306 f.label = s.str();
|
Chris@4
|
307 return f;
|
Chris@4
|
308 }
|
Chris@4
|
309
|
Chris@5
|
310 static Vamp::Plugin::Feature
|
Chris@5
|
311 noteOrRegion(RealTime r, RealTime d, int i, int n)
|
Chris@5
|
312 {
|
Chris@5
|
313 std::stringstream s;
|
Chris@5
|
314 Vamp::Plugin::Feature f;
|
Chris@5
|
315 f.hasTimestamp = true;
|
Chris@5
|
316 f.timestamp = r;
|
Chris@5
|
317 f.hasDuration = true;
|
Chris@5
|
318 f.duration = d;
|
Chris@5
|
319 float v = float(i) / float(n);
|
Chris@5
|
320 f.values.push_back(v);
|
Chris@5
|
321 s << i+1 << " of " << n << ": " << v << " at " << r.toText() << " dur. " << d.toText();
|
Chris@5
|
322 f.label = s.str();
|
Chris@5
|
323 return f;
|
Chris@5
|
324 }
|
Chris@5
|
325
|
Chris@5
|
326 Vamp::Plugin::FeatureSet
|
Chris@5
|
327 VampTestPlugin::featuresFrom(RealTime timestamp, bool final)
|
Chris@0
|
328 {
|
Chris@3
|
329 FeatureSet fs;
|
Chris@3
|
330
|
Chris@3
|
331 RealTime endTime = timestamp + RealTime::frame2RealTime
|
Chris@3
|
332 (m_stepSize, m_inputSampleRate);
|
Chris@3
|
333
|
Chris@3
|
334 for (int i = 0; i < (int)m_instants.size(); ++i) {
|
Chris@5
|
335
|
Chris@5
|
336 if (m_instants[i] >= timestamp && (final || m_instants[i] < endTime)) {
|
Chris@3
|
337 // instants output
|
Chris@3
|
338 fs[0].push_back(instant(m_instants[i], i, m_instants.size()));
|
Chris@3
|
339 }
|
Chris@4
|
340
|
Chris@4
|
341 RealTime variCurveTime = m_instants[i] / 2;
|
Chris@5
|
342 if (variCurveTime >= timestamp && (final || variCurveTime < endTime)) {
|
Chris@4
|
343 // curve-vsr output
|
Chris@4
|
344 fs[3].push_back(timedCurveValue(variCurveTime, i, m_instants.size()));
|
Chris@4
|
345 }
|
Chris@5
|
346
|
Chris@5
|
347 RealTime noteTime = (m_instants[i] + m_instants[i]) / 3;
|
Chris@5
|
348 RealTime noteDuration = RealTime::fromSeconds((i % 2 == 0) ? 1.75 : 0.5);
|
Chris@5
|
349
|
Chris@5
|
350 if (noteTime >= timestamp && (final || noteTime < endTime)) {
|
Chris@5
|
351 // notes-regions output
|
Chris@5
|
352 fs[6].push_back(noteOrRegion(noteTime, noteDuration, i, m_instants.size()));
|
Chris@5
|
353 }
|
Chris@3
|
354 }
|
Chris@3
|
355
|
Chris@5
|
356 if (!final) {
|
Chris@3
|
357
|
Chris@5
|
358 if (m_n < 20) {
|
Chris@5
|
359 // curve-oss output
|
Chris@5
|
360 fs[1].push_back(untimedCurveValue(timestamp, m_n, 20));
|
Chris@5
|
361 }
|
Chris@3
|
362
|
Chris@5
|
363 if (m_n < 5) {
|
Chris@5
|
364 // curve-fsr output
|
Chris@5
|
365 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(m_n / 2.0), m_n, 10));
|
Chris@5
|
366 }
|
Chris@5
|
367
|
Chris@5
|
368 if (m_n < 20) {
|
Chris@5
|
369 // grid-oss output
|
Chris@5
|
370 fs[4].push_back(gridColumn(timestamp, m_n, 20));
|
Chris@5
|
371 }
|
Chris@5
|
372
|
Chris@5
|
373 } else {
|
Chris@5
|
374
|
Chris@5
|
375 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
|
Chris@5
|
376 // curve-fsr output
|
Chris@5
|
377 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(i / 2.0), i, 10));
|
Chris@5
|
378 }
|
Chris@5
|
379
|
Chris@5
|
380 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
|
Chris@5
|
381 // grid-fsr output
|
Chris@5
|
382 fs[5].push_back(gridColumn(RealTime::fromSeconds(i / 2.0), i, 10));
|
Chris@5
|
383 }
|
Chris@4
|
384 }
|
Chris@4
|
385
|
Chris@3
|
386 m_lastTime = endTime;
|
Chris@3
|
387 m_n = m_n + 1;
|
Chris@3
|
388 return fs;
|
Chris@5
|
389 }
|
Chris@5
|
390
|
Chris@5
|
391 VampTestPlugin::FeatureSet
|
Chris@5
|
392 VampTestPlugin::process(const float *const *inputBuffers, RealTime timestamp)
|
Chris@5
|
393 {
|
Chris@5
|
394 FeatureSet fs = featuresFrom(timestamp, false);
|
Chris@5
|
395 return fs;
|
Chris@0
|
396 }
|
Chris@0
|
397
|
Chris@0
|
398 VampTestPlugin::FeatureSet
|
Chris@0
|
399 VampTestPlugin::getRemainingFeatures()
|
Chris@0
|
400 {
|
Chris@5
|
401 FeatureSet fs = featuresFrom(m_lastTime, true);
|
Chris@3
|
402 return fs;
|
Chris@0
|
403 }
|
Chris@0
|
404
|