annotate modules-and-plug-ins/vamp-plugin/BTrackVamp.cpp @ 28:7af87d3f2ce2 develop

Added a function to allow updates to the hop and frame size of the beat tracker
author Adam <adamstark.uk@gmail.com>
date Tue, 28 Jan 2014 00:31:17 +0000
parents deb49a2590f3
children
rev   line source
adamstark@24 1
adamstark@24 2 // This is a skeleton file for use in creating your own plugin
adamstark@24 3 // libraries. Replace BTrackVamp and myPlugin throughout with the name
adamstark@24 4 // of your first plugin class, and fill in the gaps as appropriate.
adamstark@24 5
adamstark@24 6
adamstark@24 7 #include "BTrackVamp.h"
adamstark@24 8
adamstark@24 9
adamstark@24 10 BTrackVamp::BTrackVamp(float inputSampleRate) :
adamstark@24 11 Plugin(inputSampleRate)
adamstark@24 12 // Also be sure to set your plugin parameters (presumably stored
adamstark@24 13 // in member variables) to their default values here -- the host
adamstark@24 14 // will not do that for you
adamstark@24 15 {
adamstark@24 16 }
adamstark@24 17
adamstark@24 18 BTrackVamp::~BTrackVamp()
adamstark@24 19 {
adamstark@24 20 }
adamstark@24 21
adamstark@24 22 string
adamstark@24 23 BTrackVamp::getIdentifier() const
adamstark@24 24 {
adamstark@24 25 return "btrack-vamp";
adamstark@24 26 }
adamstark@24 27
adamstark@24 28 string
adamstark@24 29 BTrackVamp::getName() const
adamstark@24 30 {
adamstark@24 31 return "BTrack";
adamstark@24 32 }
adamstark@24 33
adamstark@24 34 string
adamstark@24 35 BTrackVamp::getDescription() const
adamstark@24 36 {
adamstark@24 37 // Return something helpful here!
adamstark@24 38 return "A Real-Time Beat Tracker";
adamstark@24 39 }
adamstark@24 40
adamstark@24 41 string
adamstark@24 42 BTrackVamp::getMaker() const
adamstark@24 43 {
adamstark@24 44 // Your name here
adamstark@24 45 return "Adam Stark, Matthew Davies and Mark Plumbley";
adamstark@24 46 }
adamstark@24 47
adamstark@24 48 int
adamstark@24 49 BTrackVamp::getPluginVersion() const
adamstark@24 50 {
adamstark@24 51 // Increment this each time you release a version that behaves
adamstark@24 52 // differently from the previous one
adamstark@24 53 return 1;
adamstark@24 54 }
adamstark@24 55
adamstark@24 56 string
adamstark@24 57 BTrackVamp::getCopyright() const
adamstark@24 58 {
adamstark@24 59 // This function is not ideally named. It does not necessarily
adamstark@24 60 // need to say who made the plugin -- getMaker does that -- but it
adamstark@24 61 // should indicate the terms under which it is distributed. For
adamstark@24 62 // example, "Copyright (year). All Rights Reserved", or "GPL"
adamstark@24 63 return "";
adamstark@24 64 }
adamstark@24 65
adamstark@24 66 BTrackVamp::InputDomain
adamstark@24 67 BTrackVamp::getInputDomain() const
adamstark@24 68 {
adamstark@24 69 return TimeDomain;
adamstark@24 70 }
adamstark@24 71
adamstark@24 72 size_t
adamstark@24 73 BTrackVamp::getPreferredBlockSize() const
adamstark@24 74 {
adamstark@24 75 return 1024; // 0 means "I can handle any block size"
adamstark@24 76 }
adamstark@24 77
adamstark@24 78 size_t
adamstark@24 79 BTrackVamp::getPreferredStepSize() const
adamstark@24 80 {
adamstark@24 81 return 512; // 0 means "anything sensible"; in practice this
adamstark@24 82 // means the same as the block size for TimeDomain
adamstark@24 83 // plugins, or half of it for FrequencyDomain plugins
adamstark@24 84 }
adamstark@24 85
adamstark@24 86 size_t
adamstark@24 87 BTrackVamp::getMinChannelCount() const
adamstark@24 88 {
adamstark@24 89 return 1;
adamstark@24 90 }
adamstark@24 91
adamstark@24 92 size_t
adamstark@24 93 BTrackVamp::getMaxChannelCount() const
adamstark@24 94 {
adamstark@24 95 return 1;
adamstark@24 96 }
adamstark@24 97
adamstark@24 98 BTrackVamp::ParameterList
adamstark@24 99 BTrackVamp::getParameterDescriptors() const
adamstark@24 100 {
adamstark@24 101 ParameterList list;
adamstark@24 102
adamstark@24 103 // If the plugin has no adjustable parameters, return an empty
adamstark@24 104 // list here (and there's no need to provide implementations of
adamstark@24 105 // getParameter and setParameter in that case either).
adamstark@24 106
adamstark@24 107 // Note that it is your responsibility to make sure the parameters
adamstark@24 108 // start off having their default values (e.g. in the constructor
adamstark@24 109 // above). The host needs to know the default value so it can do
adamstark@24 110 // things like provide a "reset to default" function, but it will
adamstark@24 111 // not explicitly set your parameters to their defaults for you if
adamstark@24 112 // they have not changed in the mean time.
adamstark@24 113
adamstark@24 114 // ParameterDescriptor d;
adamstark@24 115 // d.identifier = "parameter";
adamstark@24 116 // d.name = "Some Parameter";
adamstark@24 117 // d.description = "";
adamstark@24 118 // d.unit = "";
adamstark@24 119 // d.minValue = 0;
adamstark@24 120 // d.maxValue = 10;
adamstark@24 121 // d.defaultValue = 5;
adamstark@24 122 // d.isQuantized = false;
adamstark@24 123 // list.push_back(d);
adamstark@24 124
adamstark@24 125 return list;
adamstark@24 126 }
adamstark@24 127
adamstark@24 128 float
adamstark@24 129 BTrackVamp::getParameter(string identifier) const
adamstark@24 130 {
adamstark@24 131 if (identifier == "parameter") {
adamstark@24 132 return 5; // return the ACTUAL current value of your parameter here!
adamstark@24 133 }
adamstark@24 134 return 0;
adamstark@24 135 }
adamstark@24 136
adamstark@24 137 void
adamstark@24 138 BTrackVamp::setParameter(string identifier, float value)
adamstark@24 139 {
adamstark@24 140 if (identifier == "parameter") {
adamstark@24 141 // set the actual value of your parameter
adamstark@24 142 }
adamstark@24 143 }
adamstark@24 144
adamstark@24 145 BTrackVamp::ProgramList
adamstark@24 146 BTrackVamp::getPrograms() const
adamstark@24 147 {
adamstark@24 148 ProgramList list;
adamstark@24 149
adamstark@24 150 // If you have no programs, return an empty list (or simply don't
adamstark@24 151 // implement this function or getCurrentProgram/selectProgram)
adamstark@24 152
adamstark@24 153 return list;
adamstark@24 154 }
adamstark@24 155
adamstark@24 156 string
adamstark@24 157 BTrackVamp::getCurrentProgram() const
adamstark@24 158 {
adamstark@24 159 return ""; // no programs
adamstark@24 160 }
adamstark@24 161
adamstark@24 162 void
adamstark@24 163 BTrackVamp::selectProgram(string name)
adamstark@24 164 {
adamstark@24 165 }
adamstark@24 166
adamstark@24 167 BTrackVamp::OutputList
adamstark@24 168 BTrackVamp::getOutputDescriptors() const
adamstark@24 169 {
adamstark@24 170 OutputList list;
adamstark@24 171
adamstark@24 172 // See OutputDescriptor documentation for the possibilities here.
adamstark@24 173 // Every plugin must have at least one output.
adamstark@24 174
adamstark@24 175 OutputDescriptor d;
adamstark@24 176 d.identifier = "beats";
adamstark@24 177 d.name = "Beats";
adamstark@24 178 d.description = "Beat locations";
adamstark@24 179 d.unit = "";
adamstark@24 180 d.hasFixedBinCount = true;
adamstark@24 181 d.binCount = 0;
adamstark@24 182 d.hasKnownExtents = false;
adamstark@24 183 d.isQuantized = false;
adamstark@24 184 d.sampleType = OutputDescriptor::VariableSampleRate;
adamstark@24 185 d.sampleRate = m_inputSampleRate;
adamstark@24 186 list.push_back(d);
adamstark@24 187
adamstark@24 188 return list;
adamstark@24 189 }
adamstark@24 190
adamstark@24 191 bool
adamstark@24 192 BTrackVamp::initialise(size_t channels, size_t stepSize, size_t blockSize)
adamstark@24 193 {
adamstark@24 194 if (channels < getMinChannelCount() ||
adamstark@24 195 channels > getMaxChannelCount()) return false;
adamstark@24 196
adamstark@24 197
adamstark@24 198 m_stepSize = stepSize;
adamstark@24 199 m_blockSize = blockSize;
adamstark@24 200
adamstark@28 201 b.updateHopAndFrameSize(m_stepSize,m_blockSize);
adamstark@28 202
adamstark@24 203
adamstark@24 204 return true;
adamstark@24 205 }
adamstark@24 206
adamstark@24 207 void
adamstark@24 208 BTrackVamp::reset()
adamstark@24 209 {
adamstark@24 210 // Clear buffers, reset stored values, etc
adamstark@24 211 }
adamstark@24 212
adamstark@24 213 BTrackVamp::FeatureSet
adamstark@24 214 BTrackVamp::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
adamstark@24 215 {
adamstark@28 216 // create an array to hold our audio frame
adamstark@24 217 double frame[m_blockSize];
adamstark@24 218
adamstark@28 219 // copy samples into our frame
adamstark@24 220 for (int i = 0;i < m_blockSize;i++)
adamstark@24 221 {
adamstark@24 222 frame[i] = (double) inputBuffers[0][i];
adamstark@24 223 }
adamstark@24 224
adamstark@28 225 // process the frame in the beat tracker
adamstark@24 226 b.processAudioFrame(frame);
adamstark@24 227
adamstark@28 228 // create a FeatureSet
adamstark@24 229 FeatureSet featureSet;
adamstark@24 230
adamstark@28 231 // if there is a beat in this frame
adamstark@24 232 if (b.beatDueInCurrentFrame())
adamstark@24 233 {
adamstark@28 234 // add a beat to the FeatureSet
adamstark@24 235 Feature beat;
adamstark@24 236 beat.hasTimestamp = true;
adamstark@24 237 beat.timestamp = timestamp - Vamp::RealTime::frame2RealTime(m_stepSize, int(m_inputSampleRate + 0.5));
adamstark@24 238 featureSet[0].push_back(beat);
adamstark@24 239 }
adamstark@24 240
adamstark@28 241 // return the feature set
adamstark@24 242 return featureSet;
adamstark@24 243 }
adamstark@24 244
adamstark@24 245 BTrackVamp::FeatureSet
adamstark@24 246 BTrackVamp::getRemainingFeatures()
adamstark@24 247 {
adamstark@24 248 return FeatureSet();
adamstark@24 249 }
adamstark@24 250