SampleType » History » Version 43
Chris Cannam, 2014-02-10 05:03 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 | 30 | Chris Cannam | h2. Who should read this document |
6 | 29 | Chris Cannam | |
7 | 30 | Chris Cannam | This is a detailed document about the "sample type" and "sample rate" properties of a Vamp plugin's output descriptor. |
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 | 31 | Chris Cannam | * If you are writing a plugin, read the "Rules of Thumb" section (below) after the Programmer's Guide. 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 | 34 | Chris Cannam | * If your output returns things that are always regularly-spaced in time, and there is one such thing returned for every @process@ block, and the calculation is causal so that results are available immediately, and there is no latency added beyond the length of the processing block, then you probably want to use @OneSamplePerStep@ sample type and omit the feature timestamps. |
20 | 29 | Chris Cannam | |
21 | 35 | Chris Cannam | * If your output returns things that are regularly-spaced in time but the other limitations above are not true, 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 | 32 | 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 | 33 | Chris Cannam | * The host _must_ ignore any timestamps or durations that the plugin may set on these features; |
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 | 43 | Chris Cannam | * The plugin _must_ set @duration@ property of features returned through this output and _must_ set their the @hasDuration@ property to @true@; |
82 | 43 | Chris Cannam | * The host _must_ use the feature's @duration@ property as the feature duration. |
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 | 1 | Chris Cannam | * The host _must_ ignore the @hasDuration@ and @duration@ properties of the output's features, and treat them as having "minimal" duration (see below). |
88 | 1 | Chris Cannam | |
89 | 43 | Chris Cannam | > Duration of the output feature. This is mandatory if the output has VariableSampleRate or FixedSampleRate and hasDuration is true, and unused otherwise. |
90 | 43 | Chris Cannam | |
91 | 28 | Chris Cannam | h3. Sample rate and "minimal" duration |
92 | 28 | Chris Cannam | |
93 | 28 | Chris Cannam | The plugin may optionally set a @sampleRate@ property for each @VariableSampleRate@ output. A @sampleRate@ of zero indicates no value. |
94 | 28 | Chris Cannam | |
95 | 28 | Chris Cannam | If a @sampleRate@ is set, |
96 | 28 | Chris Cannam | |
97 | 28 | Chris Cannam | * The host _must_ use 1/@sampleRate@ seconds as the "minimal" duration assigned to features that have no duration supplied. |
98 | 1 | Chris Cannam | |
99 | 37 | Chris Cannam | If no @sampleRate@ is set, i.e. if the @sampleRate@ property is zero, |
100 | 28 | Chris Cannam | |
101 | 37 | Chris Cannam | * The host _must_ use zero as the "minimal" duration used for features with no duration supplied. |
102 | 1 | Chris Cannam | |
103 | 1 | Chris Cannam | h2. FixedSampleRate |
104 | 1 | Chris Cannam | |
105 | 39 | Chris Cannam | This is a more complex case than @OneSamplePerStep@ or @VariableSampleRate@. A @OneSamplePerStep@ output never uses individual feature timestamps; a @VariableSampleRate@ output always uses them; a @FixedSampleRate@ output sometimes does. |
106 | 37 | Chris Cannam | |
107 | 1 | Chris Cannam | h3. Timestamps |
108 | 1 | Chris Cannam | |
109 | 39 | Chris Cannam | An output with @FixedSampleRate@ type _must_ also have a non-zero @sampleRate@ property. |
110 | 1 | Chris Cannam | |
111 | 43 | Chris Cannam | Conceptually the @sampleRate@ property defines a set of discrete sample times, spaced at @sampleRate@ points per second, starting at time zero. Every returned feature must start at one of these times, whether the time is calculated and assigned by the plugin (through the timestamp of the feature) or by the host (for features without timestamps). |
112 | 1 | Chris Cannam | |
113 | 39 | Chris Cannam | For any features returned through an output declared with @FixedSampleRate@ type, |
114 | 39 | Chris Cannam | |
115 | 40 | Chris Cannam | * The plugin _may_ set timestamps on these features, and it _must_ set the feature's corresponding @hasTimestamp@ property to @true@ or @false@ depending on whether it has set a timestamp; |
116 | 39 | Chris Cannam | * Where a feature has a timestamp, the host _must_ take that timestamp, round it to the nearest 1/@sampleRate@ seconds, and use that as the time of the feature; |
117 | 42 | Chris Cannam | * Where a feature has no timestamp, the host _must_ take the time of the previous feature, add 1/@sampleRate@ seconds to it, and use that as the time of the new feature; |
118 | 1 | Chris Cannam | * Where the very first feature has no timestamp, the host _must_ take its time as zero. |
119 | 1 | Chris Cannam | |
120 | 1 | Chris Cannam | The "Programmer's Guide":http://vamp-plugins.org/guide.pdf leaves this behaviour incompletely defined, saying "The host may round the timestamp according to the sample rate given in the output descriptor's sampleRate field". Here we are declaring that the host _must_ round the timestamp in this way. Note that the "Vamp Test Plugin":/projects/vamp-test-plugin/wiki assumes this behaviour. |
121 | 43 | Chris Cannam | |
122 | 43 | Chris Cannam | h3. Durations |
123 | 43 | Chris Cannam | |
124 | 43 | Chris Cannam | Features returned through @FixedSampleRate@ outputs may optionally have durations. |
125 | 43 | Chris Cannam | |
126 | 43 | Chris Cannam | If the output's @hasDuration@ property is @true@, then |
127 | 43 | Chris Cannam | |
128 | 43 | Chris Cannam | * The plugin _may_ set the @hasDuration@ property of features returned through this output to @true@ and, if it does so, _must_ also set their @duration@ property; |
129 | 43 | 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). |
130 | 43 | Chris Cannam | |
131 | 43 | Chris Cannam | If the output's @hasDuration@ property is @false@, then |
132 | 43 | Chris Cannam | |
133 | 43 | Chris Cannam | * The plugin _should not_ set the @duration@ property of that output's features; |
134 | 43 | Chris Cannam | * The host _must_ ignore the @hasDuration@ and @duration@ properties of the output's features, and treat them as having "minimal" duration (see below). |
135 | 22 | Chris Cannam | |
136 | 27 | Chris Cannam | h3. Examples |