SampleType » History » Version 29

Chris Cannam, 2014-02-10 03:12 PM

1 1 Chris Cannam
h1. Output Sample Type and Sample Rate
2 1 Chris Cannam
3 15 Chris Cannam
{{>toc}}
4 15 Chris Cannam
5 29 Chris Cannam
h2. What this document is for
6 29 Chris Cannam
7 29 Chris Cannam
The Vamp plugin API uses a "sample type" property to determine some aspects of how the features returned from a plugin should be interpreted by the host. There are some subtleties to the way this property is used. This document aims to describe this part of the API in a formal manner.
8 29 Chris Cannam
9 29 Chris Cannam
 * If you are new to the Vamp plugin API, read the "Programmer's Guide":http://vamp-plugins.org/guide.pdf first. The section "Sample Types and Timestamps" starting on page 9 introduces this subject.
10 29 Chris Cannam
11 29 Chris Cannam
 * If you are writing a plugin, read the Guide first and the "Rules of Thumb" below next. You probably won't need to read the rest of this document. You should use the "Vamp Plugin Tester":/projects/vamp-plugin-tester to test your plugin.
12 29 Chris Cannam
13 29 Chris Cannam
 * If you are writing a host, you should probably read the whole of this as well as the Guide. You should also use the "Vamp Test Plugin":/projects/vamp-test-plugin to test your host's interpretation of the feature structures.
14 29 Chris Cannam
15 29 Chris Cannam
h2. Rules of Thumb for Plugin Developers
16 29 Chris Cannam
17 29 Chris Cannam
The tl;dr summary:
18 29 Chris Cannam
19 29 Chris Cannam
 * If your output returns things that are always regularly-spaced in time, and there is one such thing for every @process@ block, and the calculation is causal so that results are available immediately, use @OneSamplePerStep@ sample type and omit the feature timestamps.
20 29 Chris Cannam
21 29 Chris Cannam
 * If your output returns things that are regularly-spaced in time but the other limitations above are not met, use @FixedSampleRate@ sample type, set the output sample rate to the (perhaps fractional) number of returned features per second, and use a timestamp for each feature.
22 29 Chris Cannam
23 29 Chris Cannam
 * If your output returns anything else, use @VariableSampleRate@ sample type, set the output sample rate to zero unless you know better, and use a timestamp for each feature.
24 29 Chris Cannam
25 29 Chris Cannam
h2. Introduction
26 29 Chris Cannam
27 12 Chris Cannam
A Vamp plugin receives audio and produces a series of descriptive feature structures.
28 1 Chris Cannam
29 12 Chris Cannam
The audio input is provided as a series of fixed-length sample blocks, equally spaced in time, provided to successive calls to the plugin's @process@ function. The plugin may return any number of features from each @process@ call, and may also return any number of features from @getRemainingFeatures@ after all the audio has been received.
30 11 Chris Cannam
31 11 Chris Cannam
Features are each associated with a particular output of the plugin. The plugin declares that each output has certain properties, which constrain the sort of feature data the host can expect to see. (See diagram.)
32 10 Chris Cannam
33 7 Chris Cannam
!/attachments/download/980/feature-structures-20pc.png!
34 9 Chris Cannam
35 22 Chris Cannam
A feature may or may not have a timestamp (as well as, optionally, a duration). Whether a timestamp is needed -- and, if it is provided, what it means -- are determined by the @sampleType@ and @sampleRate@ properties of the output on which the feature is returned.
36 7 Chris Cannam
37 27 Chris Cannam
An output's @sampleType@ property may be either @OneSamplePerStep@, @FixedSampleRate@, or @VariableSampleRate@. Here's what they mean.
38 1 Chris Cannam
39 27 Chris Cannam
h2. OneSamplePerStep
40 1 Chris Cannam
41 23 Chris Cannam
This is the simplest option.
42 1 Chris Cannam
43 23 Chris Cannam
If an output is declared as having a @sampleType@ of @OneSamplePerStep@, then any features returned from a @process@ call are assumed to match up with the audio block provided to that @process@ call.
44 23 Chris Cannam
45 14 Chris Cannam
The @sampleRate@ and @hasDuration@ output properties are ignored for outputs of this type.
46 1 Chris Cannam
47 14 Chris Cannam
For any features returned through an output declared with @OneSamplePerStep@ type,
48 14 Chris Cannam
49 24 Chris Cannam
 * The plugin _should not_ set timestamps on these features and _should_ set their @hasTimestamp@ property to @false@;
50 1 Chris Cannam
 * The plugin _should not_ set durations on these features and _should_ set their @hasDuration@ property to @false@;
51 24 Chris Cannam
 * If the plugin does set either timestamps or durations, the host _must_ ignore them;
52 24 Chris Cannam
 * The host _must_ treat all such features returned from a given @process@ call as if they had the same timestamp as it passed to that @process@ call;
53 1 Chris Cannam
 * The host _must_ treat all such features returned from @getRemainingFeatures@ as if they were immediately following the final @process@ block (i.e. with the same time as the next equally-spaced @process@ block would have had if the input had not ended);
54 22 Chris Cannam
 * The host _must_ treat all such features has having duration equal to the spacing between process blocks.
55 1 Chris Cannam
56 27 Chris Cannam
h3. Examples
57 14 Chris Cannam
58 14 Chris Cannam
@OneSamplePerStep@ is most often used for simple measurements and visualisations, in which some internal calculation is updated on each process call and a new result returned. For example: envelope trackers; power calculations; spectrograms. These outputs are typically visualised using line graphs or colour matrix plots.
59 14 Chris Cannam
60 1 Chris Cannam
@OneSamplePerStep@ is often used for intermediate results calculated during processing of a more sophisticated feature. For example, a beat tracker might have an auxiliary output with @OneSamplePerStep@ type returning its internal onset detection function value.
61 14 Chris Cannam
62 27 Chris Cannam
h2. VariableSampleRate
63 20 Chris Cannam
64 21 Chris Cannam
If the @OneSamplePerStep@ output type essentially means that the plugin leaves all time calculations up to the host, @VariableSampleRate@ is the opposite.
65 22 Chris Cannam
66 1 Chris Cannam
If an output is declared as having a @SampleType@ of @VariableSampleRate@, the features returned through it will have timestamps set by the plugin, and they won't necessarily have any relationship to the process block timestamps provided by the host.
67 1 Chris Cannam
68 27 Chris Cannam
h3. Timestamps
69 25 Chris Cannam
70 1 Chris Cannam
For any features returned through an output declared with @VariableSampleRate@ type,
71 24 Chris Cannam
72 24 Chris Cannam
 * The plugin _must_ set timestamps on these features and _must_ set their @hasTimestamp@ property to @true@;
73 28 Chris Cannam
 * The host _must_ obtain the features' start times from their timestamps rather than calculating them itself.
74 25 Chris Cannam
75 27 Chris Cannam
h3. Durations
76 25 Chris Cannam
77 1 Chris Cannam
Features returned through @VariableSampleRate@ outputs may optionally have durations.
78 25 Chris Cannam
79 26 Chris Cannam
If the output's @hasDuration@ property is @true@, then
80 26 Chris Cannam
81 28 Chris Cannam
 * The plugin _may_ set the @hasDuration@ property of such features to @true@ and, if it does so, _must_ also set their @duration@ property;
82 28 Chris Cannam
 * If a feature's @hasDuration@ property is true, then the host _must_ use the feature's @duration@ property as the feature duration; otherwise the host _must_ treat the feature as having "minimal" duration (see "Sample Rate" below).
83 1 Chris Cannam
84 28 Chris Cannam
If the output's @hasDuration@ property is @false@, then
85 1 Chris Cannam
86 28 Chris Cannam
 * The plugin _should not_ set the @duration@ property of that output's features;
87 28 Chris Cannam
 * The host _must_ ignore the @hasDuration@ and @duration@ properties of the features and treat them as having "minimal" duration (see below).
88 28 Chris Cannam
89 28 Chris Cannam
h3. Sample rate and "minimal" duration
90 28 Chris Cannam
91 28 Chris Cannam
The plugin may optionally set a @sampleRate@ property for each @VariableSampleRate@ output. A @sampleRate@ of zero indicates no value.
92 28 Chris Cannam
93 28 Chris Cannam
If a @sampleRate@ is set,
94 28 Chris Cannam
95 28 Chris Cannam
 * The host _may_ optionally use the 1/@sampleRate@ seconds as indicating the resolution of the output feature timestamps, and _may_ round each output feature timestamp to a multiple of that resolution;
96 28 Chris Cannam
 * The host _must_ use 1/@sampleRate@ seconds as the "minimal" duration assigned to features that have no duration supplied.
97 28 Chris Cannam
98 28 Chris Cannam
If no @sampleRate@ is set,
99 28 Chris Cannam
100 28 Chris Cannam
 * The host _must_ use the feature timestamps unmodified;
101 28 Chris Cannam
 * The host must use zero as the "minimal" duration used for features with no duration supplied.
102 22 Chris Cannam
103 27 Chris Cannam
h3. Examples
104 1 Chris Cannam
105 27 Chris Cannam
h2. FixedSampleRate
106 22 Chris Cannam
107 22 Chris Cannam
If an output is declared as having a @SampleType@ of @FixedSampleRate@
108 22 Chris Cannam
109 27 Chris Cannam
h3. Examples