| cannam@14 | 1 | 
| cannam@14 | 2 Vamp | 
| cannam@14 | 3 ==== | 
| cannam@35 | 4 http://www.sonicvisualiser.org/vamp.html | 
| cannam@14 | 5 | 
| cannam@14 | 6 An API for audio analysis and feature extraction plugins. | 
| cannam@14 | 7 | 
| cannam@14 | 8 Vamp is an API for C and C++ plugins that process sampled audio data | 
| cannam@18 | 9 to produce descriptive output (measurements or semantic observations). | 
| cannam@14 | 10 | 
| cannam@14 | 11 The principal differences between Vamp and a real-time audio | 
| cannam@14 | 12 processing plugin system such as VST are: | 
| cannam@14 | 13 | 
| cannam@14 | 14  * Vamp plugins may output complex multidimensional data with labels. | 
| cannam@14 | 15    As a consequence, they are likely to work best when the output | 
| cannam@14 | 16    data has a much lower sampling rate than the input.  (This also | 
| cannam@14 | 17    means it is usually desirable to implement them in C++ using the | 
| cannam@14 | 18    high-level base class provided rather than use the raw C API.) | 
| cannam@14 | 19 | 
| cannam@14 | 20  * While Vamp plugins receive data block-by-block, they are not | 
| cannam@14 | 21    required to return output immediately on receiving the input. | 
| cannam@14 | 22    A Vamp plugin may be non-causal, preferring to store up data | 
| cannam@14 | 23    based on its input until the end of a processing run and then | 
| cannam@14 | 24    return all results at once. | 
| cannam@14 | 25 | 
| cannam@14 | 26  * Vamp plugins have more control over their inputs than a typical | 
| cannam@14 | 27    real-time processing plugin.  For example, they can indicate to | 
| cannam@18 | 28    the host their preferred processing block and step sizes, and these | 
| cannam@18 | 29    may differ. | 
| cannam@18 | 30 | 
| cannam@18 | 31  * Vamp plugins may ask to receive data in the frequency domain | 
| cannam@18 | 32    instead of the time domain.  The host takes the responsibility | 
| cannam@18 | 33    for converting the input data using an FFT of windowed frames. | 
| cannam@18 | 34    This simplifies plugins that do straightforward frequency-domain | 
| cannam@18 | 35    processing and permits the host to cache frequency-domain data | 
| cannam@18 | 36    when possible. | 
| cannam@14 | 37 | 
| cannam@14 | 38  * A Vamp plugin is configured once before each processing run, and | 
| cannam@14 | 39    receives no further parameter changes during use -- unlike real | 
| cannam@14 | 40    time plugin APIs in which the input parameters may change at any | 
| cannam@14 | 41    time.  This also means that fundamental properties such as the | 
| cannam@14 | 42    number of values per output or the preferred processing block | 
| cannam@18 | 43    size may depend on the input parameters. | 
| cannam@14 | 44 | 
| cannam@38 | 45  * Vamp plugins do not have to be able to run in real time. | 
| cannam@38 | 46 | 
| cannam@31 | 47 Vamp reuses some ideas from several existing systems, notably DSSI | 
| cannam@31 | 48 (http://dssi.sourceforge.net) and FEAPI (http://feapi.sourceforge.net). | 
| cannam@31 | 49 | 
| cannam@14 | 50 | 
| cannam@14 | 51 About this SDK | 
| cannam@14 | 52 ============== | 
| cannam@14 | 53 | 
| cannam@14 | 54 This Software Development Kit contains the following: | 
| cannam@14 | 55 | 
| cannam@14 | 56  * vamp/vamp.h | 
| cannam@14 | 57 | 
| cannam@14 | 58 The formal C language plugin API for Vamp plugins. | 
| cannam@14 | 59 | 
| cannam@14 | 60 A Vamp plugin is a dynamic library (.so, .dll or .dylib depending on | 
| cannam@14 | 61 platform) exposing one C-linkage entry point (vampGetPluginDescriptor) | 
| cannam@14 | 62 which returns data defined in the rest of this C header. | 
| cannam@14 | 63 | 
| cannam@14 | 64 Although this is the official API for Vamp, we don't recommend that | 
| cannam@14 | 65 you program directly to it.  The C++ abstraction in the SDK directory | 
| cannam@18 | 66 (below) is likely to be preferable for most purposes, and is better | 
| cannam@14 | 67 documented. | 
| cannam@14 | 68 | 
| cannam@14 | 69  * vamp-sdk | 
| cannam@14 | 70 | 
| cannam@14 | 71 C++ classes for straightforwardly implementing Vamp plugins and hosts. | 
| cannam@18 | 72 | 
| cannam@18 | 73 Plugins should subclass Vamp::Plugin and then use a | 
| cannam@18 | 74 Vamp::PluginAdapter to expose the correct C API for the plugin.  Read | 
| cannam@18 | 75 vamp-sdk/PluginBase.h and Plugin.h for code documentation. | 
| cannam@18 | 76 | 
| cannam@14 | 77 Hosts may use the Vamp::PluginHostAdapter to convert the loaded | 
| cannam@14 | 78 plugin's C API back into a Vamp::Plugin object. | 
| cannam@14 | 79 | 
| cannam@14 | 80  * examples | 
| cannam@14 | 81 | 
| cannam@14 | 82 Example plugins implemented using the C++ classes.  ZeroCrossing | 
| cannam@14 | 83 calculates the positions and density of zero-crossing points in an | 
| cannam@35 | 84 audio waveform.  SpectralCentroid calculates the centre of gravity of | 
| cannam@14 | 85 the frequency domain representation of each block of audio. | 
| cannam@35 | 86 PercussionOnsetDetector estimates the locations of percussive onsets | 
| cannam@35 | 87 using a simple method described in "Drum Source Separation using | 
| cannam@35 | 88 Percussive Feature Detection and Spectral Modulation" by Dan Barry, | 
| cannam@35 | 89 Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005. | 
| cannam@14 | 90 | 
| cannam@14 | 91  * host | 
| cannam@14 | 92 | 
| cannam@16 | 93 A simple command-line Vamp host, capable of loading a plugin and using | 
| cannam@16 | 94 it to process a complete audio file, with its default parameters. | 
| cannam@16 | 95 Requires libsndfile. | 
| cannam@14 | 96 | 
| cannam@32 | 97 The Vamp API doesn't officially specify how to load plugin libraries | 
| cannam@32 | 98 or where to find them.  However, good practice for a host is to use | 
| cannam@32 | 99 the Vamp path returned by Vamp::PluginHostAdapter::getPluginPath() and | 
| cannam@32 | 100 search each directory in this path for .so, .dll or .dylib files | 
| cannam@32 | 101 (depending on platform), loading each one and testing for the | 
| cannam@32 | 102 vampGetPluginDescriptor function to enumerate the plugins in this | 
| cannam@32 | 103 object.  The example host has some code that may help. | 
| cannam@32 | 104 | 
| cannam@14 | 105 | 
| cannam@14 | 106 Building the SDK | 
| cannam@14 | 107 ================ | 
| cannam@14 | 108 | 
| cannam@18 | 109 Edit the Makefile to suit your platform according to the comments in | 
| cannam@18 | 110 it.  Type "make". | 
| cannam@14 | 111 | 
| cannam@14 | 112 | 
| cannam@14 | 113 Licensing | 
| cannam@14 | 114 ========= | 
| cannam@14 | 115 | 
| cannam@18 | 116 This plugin SDK is freely redistributable under a "new-style BSD" | 
| cannam@18 | 117 licence.  See the file COPYING for more details.  In short, you are | 
| cannam@18 | 118 permitted to reuse the SDK and example plugins in any commercial or | 
| cannam@18 | 119 non-commercial, proprietary or open-source application or plugin under | 
| cannam@18 | 120 almost any conditions provided you retain the original copyright note. | 
| cannam@14 | 121 | 
| cannam@14 | 122 | 
| cannam@14 | 123 See Also | 
| cannam@14 | 124 ======== | 
| cannam@14 | 125 | 
| cannam@14 | 126 Sonic Visualiser, an interactive open-source graphical audio | 
| cannam@14 | 127 inspection, analysis and visualisation tool supporting Vamp plugins. | 
| cannam@35 | 128 http://www.sonicvisualiser.org/ | 
| cannam@14 | 129 | 
| cannam@14 | 130 | 
| cannam@14 | 131 Chris Cannam | 
| cannam@14 | 132 Centre for Digital Music | 
| cannam@14 | 133 Queen Mary, University of London |