cannam@14
|
1
|
cannam@14
|
2 Vamp
|
cannam@14
|
3 ====
|
cannam@14
|
4
|
cannam@14
|
5 An API for audio analysis and feature extraction plugins.
|
cannam@14
|
6
|
cannam@44
|
7 http://www.vamp-plugins.org/
|
cannam@44
|
8
|
cannam@14
|
9 Vamp is an API for C and C++ plugins that process sampled audio data
|
cannam@18
|
10 to produce descriptive output (measurements or semantic observations).
|
cannam@14
|
11
|
Chris@539
|
12 This is version 2.10 of the Vamp plugin Software Development Kit.
|
cannam@256
|
13
|
cannam@78
|
14 Plugins and hosts built with this SDK are binary compatible with those
|
Chris@423
|
15 built using any version 2.0 or newer of the SDK.
|
Chris@423
|
16
|
Chris@423
|
17 Plugins and hosts built with this SDK are binary compatible with those
|
cannam@256
|
18 built using version 1.0 of the SDK, with certain restrictions. See
|
cannam@256
|
19 the file README.compat for more details.
|
cannam@256
|
20
|
cannam@256
|
21 See the file CHANGELOG for a list of the changes in this release.
|
cannam@78
|
22
|
cannam@215
|
23 A documentation guide to writing plugins using the Vamp SDK can be
|
cannam@215
|
24 found at http://www.vamp-plugins.org/guide.pdf .
|
cannam@215
|
25
|
cannam@239
|
26
|
cannam@239
|
27 Compiling and Installing the SDK and Examples
|
cannam@239
|
28 =============================================
|
cannam@239
|
29
|
cannam@239
|
30 This SDK is intended for use on Windows, OS/X, Linux, and other POSIX
|
cannam@239
|
31 and GNU platforms.
|
cannam@239
|
32
|
cannam@239
|
33 Please see the platform-specific README file (README.msvc, README.osx,
|
cannam@239
|
34 README.linux) in the build/ directory for details about how to compile
|
cannam@239
|
35 and install the SDK, how to build plugin libraries using it, and how
|
cannam@239
|
36 to install the example plugins so you can use them in a host.
|
cannam@239
|
37
|
cannam@239
|
38
|
cannam@239
|
39 What's In This SDK
|
cannam@239
|
40 ==================
|
cannam@239
|
41
|
cannam@78
|
42 This SDK contains the following:
|
cannam@14
|
43
|
cannam@239
|
44
|
cannam@239
|
45 vamp/vamp.h
|
cannam@239
|
46 -----------
|
cannam@14
|
47
|
cannam@14
|
48 The formal C language plugin API for Vamp plugins.
|
cannam@14
|
49
|
cannam@14
|
50 A Vamp plugin is a dynamic library (.so, .dll or .dylib depending on
|
cannam@14
|
51 platform) exposing one C-linkage entry point (vampGetPluginDescriptor)
|
cannam@14
|
52 which returns data defined in the rest of this C header.
|
cannam@14
|
53
|
cannam@78
|
54 Although the C API is the official API for Vamp, we don't recommend
|
cannam@239
|
55 that you program directly to it. The C++ abstractions found in the
|
cannam@239
|
56 vamp-sdk and vamp-hostsdk directories (below) are preferable for most
|
cannam@239
|
57 purposes and are more thoroughly documented.
|
cannam@14
|
58
|
cannam@239
|
59
|
cannam@239
|
60 vamp-sdk
|
cannam@239
|
61 --------
|
cannam@14
|
62
|
cannam@237
|
63 C++ classes for implementing Vamp plugins.
|
cannam@18
|
64
|
cannam@78
|
65 Plugins should subclass Vamp::Plugin and then use Vamp::PluginAdapter
|
cannam@78
|
66 to expose the correct C API for the plugin. Plugin authors should
|
cannam@239
|
67 read vamp-sdk/PluginBase.h and Plugin.h for code documentation.
|
cannam@18
|
68
|
cannam@239
|
69 See "examples" below for details of the example plugins in the SDK,
|
cannam@239
|
70 from which you are welcome to take code and inspiration.
|
cannam@239
|
71
|
cannam@239
|
72 Plugins should link with -lvamp-sdk.
|
cannam@239
|
73
|
cannam@239
|
74
|
cannam@239
|
75 vamp-hostsdk
|
cannam@239
|
76 ------------
|
cannam@14
|
77
|
cannam@237
|
78 C++ classes for implementing Vamp hosts.
|
cannam@64
|
79
|
cannam@239
|
80 Hosts will normally use a Vamp::PluginHostAdapter to convert each
|
cannam@239
|
81 plugin's exposed C API back into a useful Vamp::Plugin C++ object.
|
cannam@237
|
82
|
cannam@237
|
83 The Vamp::HostExt namespace contains several additional C++ classes to
|
cannam@239
|
84 do this work for them, and make the host's life easier:
|
cannam@64
|
85
|
cannam@239
|
86 - Vamp::HostExt::PluginLoader provides a very easy interface for a
|
cannam@239
|
87 host to discover, load, and find out category information about the
|
cannam@239
|
88 available plugins. Most Vamp hosts will probably want to use this
|
cannam@239
|
89 class.
|
cannam@64
|
90
|
cannam@239
|
91 - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for
|
cannam@239
|
92 hosts to handle plugins that want frequency-domain input, without
|
cannam@239
|
93 having to convert the input themselves.
|
cannam@64
|
94
|
cannam@239
|
95 - Vamp::HostExt::PluginChannelAdapter provides a simple means for
|
cannam@239
|
96 hosts to use plugins that do not necessarily support the same number
|
cannam@239
|
97 of audio channels as they have available, without having to apply a
|
cannam@239
|
98 channel management / mixdown policy themselves.
|
cannam@64
|
99
|
cannam@239
|
100 - Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to
|
cannam@239
|
101 avoid having to negotiate the input step and block size, instead
|
cannam@239
|
102 permitting the host to use any block size they desire (and a step
|
cannam@239
|
103 size equal to it). This is particularly useful for "streaming" hosts
|
cannam@239
|
104 that cannot seek backwards in the input audio stream and so would
|
cannam@239
|
105 otherwise need to implement an additional buffer to support step
|
cannam@239
|
106 sizes smaller than the block size.
|
cannam@125
|
107
|
cannam@239
|
108 - Vamp::HostExt::PluginSummarisingAdapter provides summarisation
|
cannam@239
|
109 methods such as mean and median averages of output features, for use
|
cannam@239
|
110 in any context where an available plugin produces individual values
|
cannam@239
|
111 but the result that is actually needed is some sort of aggregate.
|
cannam@64
|
112
|
cannam@239
|
113 The PluginLoader class can also use the input domain, channel, and
|
cannam@239
|
114 buffering adapters automatically to make these conversions transparent
|
cannam@239
|
115 to the host if required.
|
cannam@14
|
116
|
cannam@239
|
117 Host authors should also refer to the example host code in the host
|
cannam@239
|
118 directory of the SDK.
|
cannam@14
|
119
|
cannam@239
|
120 Hosts should link with -lvamp-hostsdk.
|
cannam@239
|
121
|
cannam@239
|
122
|
Chris@397
|
123 vamp-hostsdk/host-c.h
|
Chris@397
|
124 ---------------------
|
Chris@397
|
125
|
Chris@397
|
126 A C-linkage header wrapping the part of the C++ SDK code that handles
|
Chris@397
|
127 plugin discovery and library loading. Host programs written in C or in
|
Chris@397
|
128 a language with a C-linkage foreign function interface may choose to
|
Chris@397
|
129 use this header to discover and load plugin libraries, together with
|
Chris@397
|
130 the vamp/vamp.h formal API to interact with plugins themselves. See
|
Chris@397
|
131 the header for more documentation.
|
Chris@397
|
132
|
Chris@397
|
133
|
cannam@239
|
134 examples
|
cannam@239
|
135 --------
|
cannam@239
|
136
|
cannam@239
|
137 Example plugins implemented using the C++ classes.
|
cannam@239
|
138
|
cannam@239
|
139 These plugins are intended to be useful examples you can draw code
|
cannam@239
|
140 from in order to provide the basic shape and structure of a Vamp
|
cannam@239
|
141 plugin. They are also intended to be correct and useful, if simple.
|
cannam@239
|
142
|
cannam@239
|
143 - ZeroCrossing calculates the positions and density of zero-crossing
|
cannam@239
|
144 points in an audio waveform.
|
cannam@239
|
145
|
cannam@239
|
146 - SpectralCentroid calculates the centre of gravity of the frequency
|
cannam@239
|
147 domain representation of each block of audio.
|
cannam@239
|
148
|
cannam@242
|
149 - PowerSpectrum calculates a power spectrum from the input audio.
|
cannam@244
|
150 Actually, it doesn't do any work except calculating power from a
|
cannam@244
|
151 cartesian complex FFT output. The work of calculating this frequency
|
cannam@244
|
152 domain output is done for it by the host or host SDK; the plugin just
|
cannam@244
|
153 needs to declare that it wants frequency domain input. This is the
|
cannam@244
|
154 simplest of the example plugins.
|
cannam@242
|
155
|
cannam@239
|
156 - AmplitudeFollower is a simple implementation of SuperCollider's
|
cannam@239
|
157 amplitude-follower algorithm.
|
cannam@239
|
158
|
cannam@239
|
159 - PercussionOnsetDetector estimates the locations of percussive
|
cannam@239
|
160 onsets using a simple method described in "Drum Source Separation
|
cannam@239
|
161 using Percussive Feature Detection and Spectral Modulation" by Dan
|
cannam@239
|
162 Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005.
|
cannam@239
|
163
|
cannam@239
|
164 - FixedTempoEstimator calculates a single beats-per-minute value
|
cannam@239
|
165 which is an estimate of the tempo of a piece of music that is assumed
|
cannam@239
|
166 to be of fixed tempo, using autocorrelation of a frequency domain
|
cannam@239
|
167 energy rise metric. It has several outputs that return intermediate
|
cannam@239
|
168 results used in the calculation, and may be a useful example of a
|
cannam@239
|
169 plugin having several outputs with varying feature structures.
|
cannam@239
|
170
|
cannam@239
|
171
|
cannam@290
|
172 skeleton
|
cannam@290
|
173 --------
|
cannam@290
|
174
|
cannam@290
|
175 Skeleton code that could be used as a template for your new plugin
|
cannam@290
|
176 implementation.
|
cannam@290
|
177
|
cannam@290
|
178
|
cannam@239
|
179 host
|
cannam@239
|
180 ----
|
cannam@14
|
181
|
cannam@16
|
182 A simple command-line Vamp host, capable of loading a plugin and using
|
cannam@16
|
183 it to process a complete audio file, with its default parameters.
|
cannam@14
|
184
|
cannam@250
|
185 This host also contains a number of options for listing the installed
|
cannam@250
|
186 plugins and their properties in various formats. For that reason, it
|
cannam@250
|
187 isn't really as simple as one might hope. The core of the code is
|
cannam@250
|
188 still reasonably straightforward, however.
|
cannam@250
|
189
|
cannam@40
|
190
|
cannam@40
|
191 Plugin Lookup and Categorisation
|
cannam@40
|
192 ================================
|
cannam@40
|
193
|
cannam@40
|
194 The Vamp API does not officially specify how to load plugin libraries
|
cannam@40
|
195 or where to find them. However, the SDK does include a function
|
cannam@40
|
196 (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended
|
cannam@75
|
197 directory search path that hosts may use for plugin libraries, and a
|
cannam@75
|
198 class (Vamp::HostExt::PluginLoader) that implements a sensible
|
cannam@75
|
199 cross-platform lookup policy using this path. We recommend using this
|
cannam@75
|
200 class in your host unless you have a good reason not to want to. This
|
cannam@75
|
201 implementation also permits the user to set the environment variable
|
cannam@75
|
202 VAMP_PATH to override the default path if desired.
|
cannam@40
|
203
|
cannam@75
|
204 The policy used by Vamp::HostExt::PluginLoader -- and our
|
cannam@75
|
205 recommendation for any host -- is to search each directory in the path
|
cannam@75
|
206 returned by getPluginPath for .DLL (on Windows), .so (on Linux,
|
cannam@75
|
207 Solaris, BSD etc) or .dylib (on OS/X) files, then to load each one and
|
cannam@75
|
208 perform a dynamic name lookup on the vampGetPluginDescriptor function
|
cannam@75
|
209 to enumerate the plugins in the library. This operation will
|
cannam@75
|
210 necessarily be system-dependent.
|
cannam@40
|
211
|
cannam@40
|
212 Vamp also has an informal convention for sorting plugins into
|
cannam@40
|
213 functional categories. In addition to the library file itself, a
|
cannam@40
|
214 plugin library may install a category file with the same name as the
|
cannam@40
|
215 library but .cat extension. The existence and format of this file are
|
cannam@40
|
216 not specified by the Vamp API, but by convention the file may contain
|
cannam@40
|
217 lines of the format
|
cannam@40
|
218
|
cannam@40
|
219 vamp:pluginlibrary:pluginname::General Category > Specific Category
|
cannam@40
|
220
|
cannam@40
|
221 which a host may read and use to assign plugins a location within a
|
cannam@40
|
222 category tree for display to the user. The expectation is that
|
cannam@40
|
223 advanced users may also choose to set up their own preferred category
|
cannam@40
|
224 trees, which is why this information is not queried as part of the
|
cannam@75
|
225 Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also
|
cannam@75
|
226 provides support for plugin category lookup using this scheme.
|
cannam@32
|
227
|
cannam@14
|
228
|
cannam@14
|
229 Licensing
|
cannam@14
|
230 =========
|
cannam@14
|
231
|
cannam@18
|
232 This plugin SDK is freely redistributable under a "new-style BSD"
|
cannam@42
|
233 licence. See the file COPYING for more details. In short, you may
|
cannam@42
|
234 modify and redistribute the SDK and example plugins within any
|
cannam@42
|
235 commercial or non-commercial, proprietary or open-source plugin or
|
cannam@42
|
236 application under almost any conditions, with no obligation to provide
|
cannam@42
|
237 source code, provided you retain the original copyright note.
|
cannam@14
|
238
|
cannam@14
|
239
|
cannam@14
|
240 See Also
|
cannam@14
|
241 ========
|
cannam@14
|
242
|
cannam@14
|
243 Sonic Visualiser, an interactive open-source graphical audio
|
cannam@14
|
244 inspection, analysis and visualisation tool supporting Vamp plugins.
|
cannam@35
|
245 http://www.sonicvisualiser.org/
|
cannam@14
|
246
|
cannam@14
|
247
|
cannam@44
|
248 Authors
|
cannam@44
|
249 =======
|
cannam@44
|
250
|
cannam@44
|
251 Vamp and the Vamp SDK were designed and made at the Centre for Digital
|
cannam@64
|
252 Music at Queen Mary, University of London.
|
cannam@44
|
253
|
Chris@484
|
254 The SDK was written by Chris Cannam, copyright (c) 2005-2017
|
cannam@64
|
255 Chris Cannam and QMUL.
|
cannam@64
|
256
|
Chris@447
|
257 The SDK incorporates KissFFT code, copyright (c) 2003-2010 Mark
|
Chris@447
|
258 Borgerding.
|
Chris@447
|
259
|
cannam@64
|
260 Mark Sandler and Christian Landone provided ideas and direction, and
|
cannam@64
|
261 Mark Levy, Dan Stowell, Martin Gasser and Craig Sapp provided testing
|
cannam@64
|
262 and other input for the 1.0 API and SDK. The API also uses some ideas
|
cannam@64
|
263 from prior plugin systems, notably DSSI (http://dssi.sourceforge.net)
|
cannam@64
|
264 and FEAPI (http://feapi.sourceforge.net).
|
Chris@484
|
265
|