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
|