annotate README @ 238:4b5a3031cd08

* Update Visual C++ projects
author cannam
date Sun, 09 Nov 2008 17:42:37 +0000
parents 3ad28b1e2150
children cc467e52da4c
rev   line source
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
cannam@14 12 The principal differences between Vamp and a real-time audio
cannam@14 13 processing plugin system such as VST are:
cannam@14 14
cannam@14 15 * Vamp plugins may output complex multidimensional data with labels.
cannam@14 16 As a consequence, they are likely to work best when the output
cannam@14 17 data has a much lower sampling rate than the input. (This also
cannam@14 18 means it is usually desirable to implement them in C++ using the
cannam@14 19 high-level base class provided rather than use the raw C API.)
cannam@14 20
cannam@14 21 * While Vamp plugins receive data block-by-block, they are not
cannam@14 22 required to return output immediately on receiving the input.
cannam@14 23 A Vamp plugin may be non-causal, preferring to store up data
cannam@14 24 based on its input until the end of a processing run and then
cannam@14 25 return all results at once.
cannam@14 26
cannam@14 27 * Vamp plugins have more control over their inputs than a typical
cannam@14 28 real-time processing plugin. For example, they can indicate to
cannam@18 29 the host their preferred processing block and step sizes, and these
cannam@18 30 may differ.
cannam@18 31
cannam@18 32 * Vamp plugins may ask to receive data in the frequency domain
cannam@18 33 instead of the time domain. The host takes the responsibility
cannam@18 34 for converting the input data using an FFT of windowed frames.
cannam@18 35 This simplifies plugins that do straightforward frequency-domain
cannam@18 36 processing and permits the host to cache frequency-domain data
cannam@18 37 when possible.
cannam@14 38
cannam@14 39 * A Vamp plugin is configured once before each processing run, and
cannam@78 40 receives no further parameter changes during use -- unlike real-
cannam@14 41 time plugin APIs in which the input parameters may change at any
cannam@14 42 time. This also means that fundamental properties such as the
cannam@14 43 number of values per output or the preferred processing block
cannam@18 44 size may depend on the input parameters.
cannam@14 45
cannam@38 46 * Vamp plugins do not have to be able to run in real time.
cannam@38 47
cannam@14 48
cannam@14 49 About this SDK
cannam@14 50 ==============
cannam@14 51
cannam@237 52 This is version 2.0 of the Vamp plugin Software Development Kit.
cannam@237 53
cannam@78 54 Plugins and hosts built with this SDK are binary compatible with those
cannam@78 55 built using version 1.0 of the SDK.
cannam@78 56
cannam@215 57 A documentation guide to writing plugins using the Vamp SDK can be
cannam@215 58 found at http://www.vamp-plugins.org/guide.pdf .
cannam@215 59
cannam@78 60 This SDK contains the following:
cannam@14 61
cannam@14 62 * vamp/vamp.h
cannam@14 63
cannam@14 64 The formal C language plugin API for Vamp plugins.
cannam@14 65
cannam@14 66 A Vamp plugin is a dynamic library (.so, .dll or .dylib depending on
cannam@14 67 platform) exposing one C-linkage entry point (vampGetPluginDescriptor)
cannam@14 68 which returns data defined in the rest of this C header.
cannam@14 69
cannam@78 70 Although the C API is the official API for Vamp, we don't recommend
cannam@78 71 that you program directly to it. The C++ abstraction found in the
cannam@78 72 vamp-sdk directory (below) is preferable for most purposes and is
cannam@78 73 more thoroughly documented.
cannam@14 74
cannam@14 75 * vamp-sdk
cannam@14 76
cannam@237 77 C++ classes for implementing Vamp plugins.
cannam@18 78
cannam@78 79 Plugins should subclass Vamp::Plugin and then use Vamp::PluginAdapter
cannam@78 80 to expose the correct C API for the plugin. Plugin authors should
cannam@78 81 read vamp-sdk/PluginBase.h and Plugin.h for code documentation, and
cannam@78 82 refer to the example plugin code in the examples directory. Plugins
cannam@162 83 should link with -lvamp-sdk.
cannam@18 84
cannam@237 85 * vamp-hostsdk
cannam@14 86
cannam@237 87 C++ classes for implementing Vamp hosts.
cannam@64 88
cannam@237 89 Hosts can use the Vamp::PluginHostAdapter to convert the loaded
cannam@237 90 plugin's C API back into a Vamp::Plugin object.
cannam@237 91
cannam@237 92 Host authors should refer to the example host code in the host
cannam@237 93 directory. Hosts should link with -lvamp-hostsdk.
cannam@237 94
cannam@237 95 The Vamp::HostExt namespace contains several additional C++ classes to
cannam@237 96 make a host's life easier:
cannam@64 97
cannam@78 98 Vamp::HostExt::PluginLoader provides a very easy interface for a host
cannam@78 99 to discover, load, and find out category information about the
cannam@64 100 available plugins. Most "casual" Vamp hosts will probably want to use
cannam@64 101 this class.
cannam@64 102
cannam@78 103 Vamp::HostExt::PluginInputDomainAdapter provides a means for hosts to
cannam@78 104 handle plugins that expect frequency-domain input, without having to
cannam@78 105 convert the input themselves.
cannam@64 106
cannam@78 107 Vamp::HostExt::PluginChannelAdapter provides a means for hosts to use
cannam@78 108 plugins that do not necessarily support the same number of audio
cannam@78 109 channels as they have available, without having to worry about
cannam@78 110 applying a channel management / mixdown policy themselves.
cannam@64 111
cannam@125 112 Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to
cannam@125 113 avoid having to negotiate the input step and block size, instead
cannam@125 114 permitting the host to use any block size they desire (and a step size
cannam@125 115 equal to it). This is particularly useful for "streaming" hosts that
cannam@125 116 cannot seek backwards in the input audio stream and so would otherwise
cannam@125 117 need to implement an additional buffer to support step sizes smaller
cannam@125 118 than the block size.
cannam@125 119
cannam@75 120 The PluginLoader class can also use the input domain and channel
cannam@75 121 adapters automatically to make the entire conversion process
cannam@75 122 transparent to the host if required.
cannam@64 123
cannam@14 124 * examples
cannam@14 125
cannam@14 126 Example plugins implemented using the C++ classes. ZeroCrossing
cannam@14 127 calculates the positions and density of zero-crossing points in an
cannam@35 128 audio waveform. SpectralCentroid calculates the centre of gravity of
cannam@14 129 the frequency domain representation of each block of audio.
cannam@78 130 AmplitudeFollower tracks the amplitude of a signal based on a method
cannam@78 131 from the SuperCollider real-time audio system.
cannam@35 132 PercussionOnsetDetector estimates the locations of percussive onsets
cannam@35 133 using a simple method described in "Drum Source Separation using
cannam@35 134 Percussive Feature Detection and Spectral Modulation" by Dan Barry,
cannam@35 135 Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005.
cannam@14 136
cannam@14 137 * host
cannam@14 138
cannam@16 139 A simple command-line Vamp host, capable of loading a plugin and using
cannam@16 140 it to process a complete audio file, with its default parameters.
cannam@64 141 Requires libsndfile (http://www.mega-nerd.com/libsndfile/).
cannam@64 142
cannam@64 143 If you don't have libsndfile, you may want to edit the Makefile to
cannam@75 144 change the default build target from "all" to "sdk", so as to compile
cannam@75 145 only the SDK and not the host.
cannam@14 146
cannam@40 147
cannam@40 148 Plugin Lookup and Categorisation
cannam@40 149 ================================
cannam@40 150
cannam@40 151 The Vamp API does not officially specify how to load plugin libraries
cannam@40 152 or where to find them. However, the SDK does include a function
cannam@40 153 (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended
cannam@75 154 directory search path that hosts may use for plugin libraries, and a
cannam@75 155 class (Vamp::HostExt::PluginLoader) that implements a sensible
cannam@75 156 cross-platform lookup policy using this path. We recommend using this
cannam@75 157 class in your host unless you have a good reason not to want to. This
cannam@75 158 implementation also permits the user to set the environment variable
cannam@75 159 VAMP_PATH to override the default path if desired.
cannam@40 160
cannam@75 161 The policy used by Vamp::HostExt::PluginLoader -- and our
cannam@75 162 recommendation for any host -- is to search each directory in the path
cannam@75 163 returned by getPluginPath for .DLL (on Windows), .so (on Linux,
cannam@75 164 Solaris, BSD etc) or .dylib (on OS/X) files, then to load each one and
cannam@75 165 perform a dynamic name lookup on the vampGetPluginDescriptor function
cannam@75 166 to enumerate the plugins in the library. This operation will
cannam@75 167 necessarily be system-dependent.
cannam@40 168
cannam@40 169 Vamp also has an informal convention for sorting plugins into
cannam@40 170 functional categories. In addition to the library file itself, a
cannam@40 171 plugin library may install a category file with the same name as the
cannam@40 172 library but .cat extension. The existence and format of this file are
cannam@40 173 not specified by the Vamp API, but by convention the file may contain
cannam@40 174 lines of the format
cannam@40 175
cannam@40 176 vamp:pluginlibrary:pluginname::General Category > Specific Category
cannam@40 177
cannam@40 178 which a host may read and use to assign plugins a location within a
cannam@40 179 category tree for display to the user. The expectation is that
cannam@40 180 advanced users may also choose to set up their own preferred category
cannam@40 181 trees, which is why this information is not queried as part of the
cannam@75 182 Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also
cannam@75 183 provides support for plugin category lookup using this scheme.
cannam@32 184
cannam@14 185
cannam@162 186 Compiling the SDK and Examples
cannam@162 187 ==============================
cannam@14 188
cannam@162 189 This SDK is intended for use on Windows, OS/X, Linux, and other POSIX
cannam@162 190 platforms.
cannam@162 191
cannam@162 192 * Windows
cannam@162 193
cannam@212 194 Two Visual C++ project files are included:
cannam@212 195
cannam@212 196 VampPluginSDK.vcproj -- builds the SDK into a single static
cannam@212 197 library, but does not build the example plugins or host
cannam@212 198
cannam@212 199 VampExamplePlugins.vcproj -- builds the example plugins DLL, but
cannam@214 200 does not build the library or host
cannam@162 201
cannam@162 202 Alternatively, when using Visual Studio or another IDE to build a
cannam@212 203 plugin or host using the SDK, you may prefer to simply add the .h and
cannam@212 204 .cpp files in the vamp-sdk and vamp-sdk/hostext directories to your
cannam@212 205 existing project.
cannam@212 206
cannam@212 207 As the command-line host has additional library dependencies (namely
cannam@212 208 libsndfile), no pre-packaged project is included to build it.
cannam@212 209
cannam@212 210 When using Visual C++ to build plugins, you will need to ensure that
cannam@212 211 the plugin entry point (vampGetPluginDescriptor) is exported from the
cannam@212 212 DLL so that the plugins can be loaded. One way to achieve this is to
cannam@212 213 add the linker option /EXPORT:vampGetPluginDescriptor to your project.
cannam@212 214 The included VampExamplePlugins.vcproj does this.
cannam@162 215
cannam@162 216 If you are using a Cygwin or MinGW GNU toolchain, use the included
cannam@162 217 Makefile (see Linux and other POSIX platforms below).
cannam@162 218
cannam@162 219 * OS/X
cannam@162 220
cannam@162 221 Run "make -f Makefile.osx" to build the SDK, example plugins, and
cannam@162 222 command-line host.
cannam@162 223
cannam@162 224 Note that the host requires that you have libsndfile
cannam@162 225 (http://www.mega-nerd.com/libsndfile/) installed. To build only the
cannam@162 226 SDK and examples, "make -f Makefile.osx sdk examples".
cannam@162 227
cannam@212 228 If you are using an IDE, you may prefer to simply add the .h and .cpp
cannam@212 229 files in the vamp-sdk and vamp-sdk/hostext directories to your
cannam@212 230 existing project.
cannam@162 231
cannam@214 232 * Linux and other Unixesque platforms
cannam@162 233
cannam@162 234 To build the SDK, example plugins, and command-line host, edit the
cannam@42 235 Makefile to suit your platform according to the comments in it, then
cannam@42 236 run "make".
cannam@42 237
cannam@162 238 Note that the host requires that you have libsndfile
cannam@162 239 (http://www.mega-nerd.com/libsndfile/) installed. To build only the
cannam@162 240 SDK and examples, edit the Makefile then run "make sdk examples".
cannam@94 241
cannam@162 242
cannam@162 243 Installing the Example Plugins
cannam@162 244 ==============================
cannam@85 245
cannam@42 246 Installing the example plugins so that they can be found by other Vamp
cannam@42 247 hosts depends on your platform:
cannam@42 248
cannam@44 249 * Windows: copy the files
cannam@44 250 examples/vamp-example-plugins.dll
cannam@44 251 examples/vamp-example-plugins.cat
cannam@44 252 to
cannam@44 253 C:\Program Files\Vamp Plugins
cannam@42 254
cannam@44 255 * Linux: copy the files
cannam@44 256 examples/vamp-example-plugins.so
cannam@44 257 examples/vamp-example-plugins.cat
cannam@44 258 to
cannam@44 259 /usr/local/lib/vamp/
cannam@42 260
cannam@44 261 * OS/X: copy the files
cannam@44 262 examples/vamp-example-plugins.dylib
cannam@44 263 examples/vamp-example-plugins.cat
cannam@44 264 to
cannam@44 265 /Library/Audio/Plug-Ins/Vamp
cannam@42 266
cannam@14 267
cannam@14 268 Licensing
cannam@14 269 =========
cannam@14 270
cannam@18 271 This plugin SDK is freely redistributable under a "new-style BSD"
cannam@42 272 licence. See the file COPYING for more details. In short, you may
cannam@42 273 modify and redistribute the SDK and example plugins within any
cannam@42 274 commercial or non-commercial, proprietary or open-source plugin or
cannam@42 275 application under almost any conditions, with no obligation to provide
cannam@42 276 source code, provided you retain the original copyright note.
cannam@14 277
cannam@14 278
cannam@14 279 See Also
cannam@14 280 ========
cannam@14 281
cannam@14 282 Sonic Visualiser, an interactive open-source graphical audio
cannam@14 283 inspection, analysis and visualisation tool supporting Vamp plugins.
cannam@35 284 http://www.sonicvisualiser.org/
cannam@14 285
cannam@14 286
cannam@44 287 Authors
cannam@44 288 =======
cannam@44 289
cannam@44 290 Vamp and the Vamp SDK were designed and made at the Centre for Digital
cannam@64 291 Music at Queen Mary, University of London.
cannam@44 292
cannam@127 293 The SDK was written by Chris Cannam, copyright (c) 2005-2008
cannam@64 294 Chris Cannam and QMUL.
cannam@64 295
cannam@64 296 Mark Sandler and Christian Landone provided ideas and direction, and
cannam@64 297 Mark Levy, Dan Stowell, Martin Gasser and Craig Sapp provided testing
cannam@64 298 and other input for the 1.0 API and SDK. The API also uses some ideas
cannam@64 299 from prior plugin systems, notably DSSI (http://dssi.sourceforge.net)
cannam@64 300 and FEAPI (http://feapi.sourceforge.net).
cannam@64 301