| cannam@229 | 1 | 
| cannam@229 | 2 /** \mainpage Vamp Plugin SDK | 
| cannam@229 | 3 | 
| cannam@229 | 4 \section about About Vamp | 
| cannam@229 | 5 | 
| cannam@229 | 6 Vamp is an API for C and C++ plugins that process sampled audio data | 
| cannam@229 | 7 to produce descriptive output (measurements or semantic observations). | 
| cannam@229 | 8 Find more information at http://www.vamp-plugins.org/ . | 
| cannam@229 | 9 | 
| cannam@229 | 10 Although the official API for Vamp plugins is defined in C for maximum | 
| cannam@229 | 11 binary compatibility, we strongly recommend using the provided C++ | 
| cannam@229 | 12 classes in the SDK to implement your own plugins and hosts. | 
| cannam@229 | 13 | 
| cannam@229 | 14 \section plugins For Plugins | 
| cannam@229 | 15 | 
| cannam@229 | 16 Plugins should subclass Vamp::Plugin, and then use a | 
| cannam@229 | 17 Vamp::PluginAdapter to expose the correct C API for the plugin.  Read | 
| cannam@229 | 18 the documentation for Vamp::PluginBase and Vamp::Plugin before | 
| cannam@229 | 19 starting. | 
| cannam@229 | 20 | 
| cannam@229 | 21 Plugins should be compiled and linked into dynamic libraries using the | 
| cannam@229 | 22 usual convention for your platform, and should link (preferably | 
| cannam@229 | 23 statically) with -lvamp-sdk.  Any number of plugins can reside in a | 
| cannam@229 | 24 single dynamic library.  See plugins.cpp in the example plugins | 
| cannam@229 | 25 directory for the sort of code that will need to accompany your plugin | 
| cannam@229 | 26 class or classes, to make it possible for a host to look up your | 
| cannam@229 | 27 plugins properly. | 
| cannam@229 | 28 | 
| cannam@239 | 29 Please read the relevant README file for your platform found in the | 
| cannam@239 | 30 Vamp SDK build/ directory, for details about how to ensure the | 
| cannam@239 | 31 resulting dynamic library exports the correct linker symbols. | 
| cannam@229 | 32 | 
| cannam@229 | 33 The following example plugins are provided.  You may legally reuse any | 
| cannam@229 | 34 amount of the code from these examples in any plugins you write, | 
| cannam@229 | 35 whether proprietary or open-source. | 
| cannam@229 | 36 | 
| cannam@229 | 37  - ZeroCrossing calculates the positions and density of zero-crossing | 
| cannam@229 | 38  points in an audio waveform. | 
| cannam@229 | 39 | 
| cannam@229 | 40  - SpectralCentroid calculates the centre of gravity of the frequency | 
| cannam@229 | 41  domain representation of each block of audio. | 
| cannam@229 | 42 | 
| cannam@242 | 43  - PowerSpectrum calculates a power spectrum from the input audio. | 
| cannam@245 | 44  Actually, it doesn't do any work except calculating power from a | 
| cannam@245 | 45  cartesian complex FFT output.  The work of calculating this frequency | 
| cannam@245 | 46  domain output is done for it by the host or host SDK; the plugin just | 
| cannam@245 | 47  needs to declare that it wants frequency domain input.  This is the | 
| cannam@245 | 48  simplest of the example plugins. | 
| cannam@242 | 49 | 
| cannam@229 | 50  - AmplitudeFollower is a simple implementation of SuperCollider's | 
| cannam@229 | 51  amplitude-follower algorithm. | 
| cannam@229 | 52 | 
| cannam@229 | 53  - PercussionOnsetDetector estimates the locations of percussive | 
| cannam@229 | 54  onsets using a simple method described in "Drum Source Separation | 
| cannam@229 | 55  using Percussive Feature Detection and Spectral Modulation" by Dan | 
| cannam@229 | 56  Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005. | 
| cannam@229 | 57 | 
| cannam@239 | 58  - FixedTempoEstimator calculates a single beats-per-minute value | 
| cannam@239 | 59  which is an estimate of the tempo of a piece of music that is assumed | 
| cannam@239 | 60  to be of fixed tempo, using autocorrelation of a frequency domain | 
| cannam@239 | 61  energy rise metric.  It has several outputs that return intermediate | 
| cannam@239 | 62  results used in the calculation, and may be a useful example of a | 
| cannam@239 | 63  plugin having several outputs with varying feature structures. | 
| cannam@229 | 64 | 
| Chris@337 | 65 Plugin authors should also read the Programmer's Guide at | 
| Chris@337 | 66 http://vamp-plugins.org/guide.pdf . | 
| Chris@337 | 67 | 
| cannam@229 | 68 \section hosts For Hosts | 
| cannam@229 | 69 | 
| cannam@229 | 70 Hosts will normally use a Vamp::PluginHostAdapter to convert each | 
| cannam@229 | 71 plugin's exposed C API back into a useful Vamp::Plugin C++ object. | 
| cannam@229 | 72 | 
| cannam@239 | 73 The Vamp::HostExt namespace contains several additional C++ classes to | 
| cannam@239 | 74 do this work for them, and make the host's life easier: | 
| cannam@229 | 75 | 
| cannam@239 | 76  - Vamp::HostExt::PluginLoader provides a very easy interface for a | 
| cannam@229 | 77  host to discover, load, and find out category information about the | 
| cannam@239 | 78  available plugins.  Most Vamp hosts will probably want to use this | 
| cannam@239 | 79  class. | 
| cannam@229 | 80 | 
| cannam@229 | 81  - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for | 
| cannam@239 | 82  hosts to handle plugins that want frequency-domain input, without | 
| cannam@229 | 83  having to convert the input themselves. | 
| cannam@229 | 84 | 
| cannam@229 | 85  - Vamp::HostExt::PluginChannelAdapter provides a simple means for | 
| cannam@229 | 86  hosts to use plugins that do not necessarily support the same number | 
| cannam@229 | 87  of audio channels as they have available, without having to apply a | 
| cannam@229 | 88  channel management / mixdown policy themselves. | 
| cannam@229 | 89 | 
| cannam@239 | 90  - Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to | 
| cannam@239 | 91  avoid having to negotiate the input step and block size, instead | 
| cannam@239 | 92  permitting the host to use any block size they desire (and a step | 
| cannam@239 | 93  size equal to it).  This is particularly useful for "streaming" hosts | 
| cannam@239 | 94  that cannot seek backwards in the input audio stream and so would | 
| cannam@239 | 95  otherwise need to implement an additional buffer to support step | 
| cannam@239 | 96  sizes smaller than the block size. | 
| cannam@229 | 97 | 
| cannam@239 | 98  - Vamp::HostExt::PluginSummarisingAdapter provides summarisation | 
| cannam@239 | 99  methods such as mean and median averages of output features, for use | 
| cannam@239 | 100  in any context where an available plugin produces individual values | 
| cannam@239 | 101  but the result that is actually needed is some sort of aggregate. | 
| cannam@229 | 102 | 
| cannam@229 | 103 The PluginLoader class can also use the input domain, channel, and | 
| cannam@229 | 104 buffering adapters automatically to make these conversions transparent | 
| cannam@229 | 105 to the host if required. | 
| cannam@229 | 106 | 
| cannam@239 | 107 Host authors should also refer to the example host code in the host | 
| cannam@239 | 108 directory of the SDK. | 
| cannam@239 | 109 | 
| cannam@229 | 110 Hosts should link with -lvamp-hostsdk. | 
| cannam@229 | 111 | 
| cannam@229 | 112 (The following notes in this section are mostly relevant for | 
| cannam@229 | 113 developers that are not using the HostExt classes, or that wish to | 
| cannam@229 | 114 know more about the policy they implement.) | 
| cannam@229 | 115 | 
| cannam@229 | 116 The Vamp API does not officially specify how to load plugin libraries | 
| cannam@229 | 117 or where to find them.  However, the SDK does include a function | 
| cannam@229 | 118 (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended | 
| cannam@239 | 119 directory search path that hosts may use for plugin libraries, and a | 
| cannam@239 | 120 class (Vamp::HostExt::PluginLoader) that implements a sensible | 
| cannam@239 | 121 cross-platform lookup policy using this path.  We recommend using this | 
| cannam@239 | 122 class in your host unless you have a good reason not to want to.  This | 
| cannam@239 | 123 implementation also permits the user to set the environment variable | 
| cannam@239 | 124 VAMP_PATH to override the default path if desired. | 
| cannam@229 | 125 | 
| cannam@239 | 126 The policy used by Vamp::HostExt::PluginLoader -- and our | 
| cannam@239 | 127 recommendation for any host -- is to search each directory in this | 
| cannam@239 | 128 path for .DLL (on Windows), .so (on Linux, Solaris, BSD etc) or .dylib | 
| cannam@239 | 129 (on OS/X) files, then to load each one and perform a dynamic name | 
| cannam@239 | 130 lookup on the vampGetPluginDescriptor function to enumerate the | 
| cannam@239 | 131 plugins in the library.  The example host has some code that may help, | 
| cannam@239 | 132 but this operation will necessarily be system-dependent. | 
| cannam@229 | 133 | 
| cannam@229 | 134 Vamp also has an informal convention for sorting plugins into | 
| cannam@229 | 135 functional categories.  In addition to the library file itself, a | 
| cannam@229 | 136 plugin library may install a category file with the same name as the | 
| cannam@229 | 137 library but .cat extension.  The existence and format of this file are | 
| cannam@229 | 138 not specified by the Vamp API, but by convention the file may contain | 
| cannam@229 | 139 lines of the format | 
| cannam@229 | 140 | 
| cannam@229 | 141 \code | 
| cannam@229 | 142 vamp:pluginlibrary:pluginname::General Category > Specific Category | 
| cannam@229 | 143 \endcode | 
| cannam@229 | 144 | 
| cannam@229 | 145 which a host may read and use to assign plugins a location within a | 
| cannam@229 | 146 category tree for display to the user.  The expectation is that | 
| cannam@229 | 147 advanced users may also choose to set up their own preferred category | 
| cannam@229 | 148 trees, which is why this information is not queried as part of the | 
| cannam@239 | 149 Vamp plugin's API itself.  The Vamp::HostExt::PluginLoader class also | 
| cannam@239 | 150 provides support for plugin category lookup using this scheme. | 
| cannam@229 | 151 | 
| cannam@229 | 152 \section license License | 
| cannam@229 | 153 | 
| cannam@229 | 154 This plugin SDK is freely redistributable under a "new-style BSD" | 
| cannam@229 | 155 licence.  See the file COPYING for more details.  In short, you may | 
| cannam@229 | 156 modify and redistribute the SDK and example plugins within any | 
| cannam@229 | 157 commercial or non-commercial, proprietary or open-source plugin or | 
| cannam@229 | 158 application under almost any conditions, with no obligation to provide | 
| cannam@229 | 159 source code, provided you retain the original copyright note. | 
| cannam@229 | 160 | 
| cannam@229 | 161 | 
| cannam@229 | 162 */ |