Mercurial > hg > qm-vamp-plugins
comparison plugins/SegmenterPlugin.cpp @ 38:9a2edd83775f
* Fixes and tidying in segmenter &c
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Thu, 10 Jan 2008 15:15:12 +0000 |
parents | 9ce0db4770a2 |
children | 7f499758cb23 |
comparison
equal
deleted
inserted
replaced
37:9ce0db4770a2 | 38:9a2edd83775f |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
1 /* | 3 /* |
2 * SegmenterPlugin.cpp | 4 * SegmenterPlugin.cpp |
3 * soundbite | |
4 * | 5 * |
5 * Created by Mark Levy on 24/03/2006. | 6 * Created by Mark Levy on 24/03/2006. |
6 * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. All rights reserved. | 7 * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. |
7 * | 8 * All rights reserved. |
8 */ | 9 */ |
9 | 10 |
10 #include <iostream> | 11 #include <iostream> |
11 #include <sstream> | 12 #include <sstream> |
12 | 13 |
18 using std::cerr; | 19 using std::cerr; |
19 using std::endl; | 20 using std::endl; |
20 using std::ostringstream; | 21 using std::ostringstream; |
21 | 22 |
22 SegmenterPlugin::SegmenterPlugin(float inputSampleRate) : | 23 SegmenterPlugin::SegmenterPlugin(float inputSampleRate) : |
23 Plugin(inputSampleRate), segmenter(0), nSegmentTypes(10), featureType(feature_types(1)) | 24 Plugin(inputSampleRate), |
25 segmenter(0), | |
26 nSegmentTypes(10), | |
27 featureType(feature_types(1)) | |
24 { | 28 { |
25 | 29 |
26 } | 30 } |
27 | 31 |
28 SegmenterPlugin::~SegmenterPlugin() | 32 SegmenterPlugin::~SegmenterPlugin() |
29 { | 33 { |
30 if (segmenter) | 34 delete segmenter; |
31 delete segmenter; | |
32 } | 35 } |
33 | 36 |
34 string | 37 string |
35 SegmenterPlugin::getMaker() const | 38 SegmenterPlugin::getMaker() const |
36 { | 39 { |
66 } | 69 } |
67 | 70 |
68 void | 71 void |
69 SegmenterPlugin::reset() | 72 SegmenterPlugin::reset() |
70 { | 73 { |
74 //!!! | |
71 } | 75 } |
72 | 76 |
73 size_t | 77 size_t |
74 SegmenterPlugin::getPreferredStepSize() const | 78 SegmenterPlugin::getPreferredStepSize() const |
75 { | 79 { |
76 if (!segmenter) makeSegmenter(); | 80 if (!segmenter) makeSegmenter(); |
77 return hopsize; | 81 return hopsize; |
78 } | 82 } |
79 | 83 |
80 size_t | 84 size_t |
81 SegmenterPlugin::getPreferredBlockSize() const | 85 SegmenterPlugin::getPreferredBlockSize() const |
82 { | 86 { |
83 if (!segmenter) makeSegmenter(); | 87 if (!segmenter) makeSegmenter(); |
84 return windowsize; | 88 return windowsize; |
85 } | 89 } |
86 | 90 |
87 SegmenterPlugin::ParameterList SegmenterPlugin::getParameterDescriptors() const | 91 SegmenterPlugin::ParameterList SegmenterPlugin::getParameterDescriptors() const |
88 { | 92 { |
89 ParameterList list; | 93 ParameterList list; |
122 { | 126 { |
123 if (param == "nSegmentTypes") { | 127 if (param == "nSegmentTypes") { |
124 return nSegmentTypes; | 128 return nSegmentTypes; |
125 } | 129 } |
126 | 130 |
127 if (param == "featureType") { | 131 if (param == "featureType") { |
128 return featureType; | 132 return featureType; |
129 } | 133 } |
130 | 134 |
131 std::cerr << "WARNING: SegmenterPlugin::getParameter: unknown parameter \"" | 135 std::cerr << "WARNING: SegmenterPlugin::getParameter: unknown parameter \"" |
132 << param << "\"" << std::endl; | 136 << param << "\"" << std::endl; |
133 return 0.0; | 137 return 0.0; |
134 } | 138 } |
135 | 139 |
136 void | 140 void |
137 SegmenterPlugin::setParameter(std::string param, float value) | 141 SegmenterPlugin::setParameter(std::string param, float value) |
138 { | 142 { |
139 if (param == "nSegmentTypes") { | 143 if (param == "nSegmentTypes") { |
144 | |
140 nSegmentTypes = int(value); | 145 nSegmentTypes = int(value); |
141 } else | 146 |
142 { | 147 } else { |
143 if (param == "featureType") { | 148 |
144 if (featureType != feature_types(value)) // feature type changed, create a new segmenter | 149 if (param == "featureType") { |
145 { | 150 if (featureType != feature_types(value)) // feature type changed, create a new segmenter |
146 featureType = feature_types(value); | 151 { |
147 makeSegmenter(); | 152 featureType = feature_types(value); |
148 } | 153 makeSegmenter(); |
149 } | 154 } |
150 else | 155 } |
151 { | 156 else |
152 std::cerr << "WARNING: SegmenterPlugin::setParameter: unknown parameter \"" | 157 { |
153 << param << "\"" << std::endl; | 158 std::cerr << "WARNING: SegmenterPlugin::setParameter: unknown parameter \"" |
154 } | 159 << param << "\"" << std::endl; |
155 } | 160 } |
161 } | |
156 } | 162 } |
157 | 163 |
158 void | 164 void |
159 SegmenterPlugin::makeSegmenter() const | 165 SegmenterPlugin::makeSegmenter() const |
160 { | 166 { |
161 ClusterMeltSegmenterParams params = ClusterMeltSegmenterParams(); | 167 ClusterMeltSegmenterParams params = ClusterMeltSegmenterParams(); |
162 params.featureType = (feature_types) featureType; | 168 params.featureType = (feature_types) featureType; |
163 if (params.featureType == FEATURE_TYPE_CONSTQ) | 169 |
164 { | 170 if (params.featureType == FEATURE_TYPE_CONSTQ) |
165 params.ncomponents = 20; | 171 { |
166 params.neighbourhoodLimit = 30; | 172 params.ncomponents = 20; |
167 } | 173 params.neighbourhoodLimit = 30; |
168 if (params.featureType == FEATURE_TYPE_CHROMA) | 174 } |
169 { | 175 if (params.featureType == FEATURE_TYPE_CHROMA) |
170 params.hopSize = 0.1; | 176 { |
171 params.windowSize = 0.372; | 177 params.hopSize = 0.1; |
172 params.nbins = 12; | 178 params.windowSize = 0.372; |
173 params.histogramLength = 20; | 179 params.nbins = 12; |
174 params.neighbourhoodLimit = 40; | 180 params.histogramLength = 20; |
175 } | 181 params.neighbourhoodLimit = 40; |
176 delete segmenter; | 182 } |
177 segmenter = new ClusterMeltSegmenter(params); | 183 delete segmenter; |
178 segmenter->initialise(static_cast<int>(m_inputSampleRate)); | 184 |
179 hopsize = segmenter->getHopsize(); | 185 segmenter = new ClusterMeltSegmenter(params); |
180 windowsize = segmenter->getWindowsize(); | 186 segmenter->initialise(m_inputSampleRate); |
187 hopsize = segmenter->getHopsize(); | |
188 windowsize = segmenter->getWindowsize(); | |
189 | |
190 std::cerr << "segmenter window size: " << segmenter->getWindowsize() | |
191 << std::endl; | |
181 } | 192 } |
182 | 193 |
183 SegmenterPlugin::OutputList | 194 SegmenterPlugin::OutputList |
184 SegmenterPlugin::getOutputDescriptors() const | 195 SegmenterPlugin::getOutputDescriptors() const |
185 { | 196 { |
186 OutputList list; | 197 OutputList list; |
187 | 198 |
188 OutputDescriptor segmentation; | 199 OutputDescriptor segmentation; |
189 segmentation.identifier = "segmentation"; | 200 segmentation.identifier = "segmentation"; |
190 segmentation.name = "Segmentation"; | 201 segmentation.name = "Segmentation"; |
191 segmentation.description = "Segmentation"; | 202 segmentation.description = "Segmentation"; |
192 segmentation.unit = "segment-type"; | 203 segmentation.unit = "segment-type"; |
193 segmentation.hasFixedBinCount = true; | 204 segmentation.hasFixedBinCount = true; |
194 segmentation.binCount = 1; | 205 segmentation.binCount = 1; |
195 segmentation.minValue = 1; | 206 segmentation.minValue = 1; |
196 segmentation.maxValue = nSegmentTypes; | 207 segmentation.maxValue = nSegmentTypes; |
197 segmentation.isQuantized = true; | 208 segmentation.isQuantized = true; |
198 segmentation.quantizeStep = 1; | 209 segmentation.quantizeStep = 1; |
199 segmentation.sampleType = OutputDescriptor::VariableSampleRate; | 210 segmentation.sampleType = OutputDescriptor::VariableSampleRate; |
200 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); | 211 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); |
201 | 212 |
202 list.push_back(segmentation); | 213 list.push_back(segmentation); |
203 | 214 |
204 return list; | 215 return list; |
205 } | 216 } |
206 | 217 |
207 SegmenterPlugin::FeatureSet | 218 SegmenterPlugin::FeatureSet |
208 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */) | 219 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */) |
209 { | 220 { |
210 // convert float* to double* | 221 // convert float* to double* |
211 double *tempBuffer = new double[windowsize]; | 222 double *tempBuffer = new double[windowsize]; |
212 for (size_t i = 0; i < windowsize; ++i) { | 223 for (size_t i = 0; i < windowsize; ++i) { |
213 tempBuffer[i] = inputBuffers[0][i]; | 224 tempBuffer[i] = inputBuffers[0][i]; |
214 } | 225 } |
215 | 226 |
216 segmenter->extractFeatures(tempBuffer, windowsize); | 227 segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize()); |
217 | 228 |
218 delete [] tempBuffer; | 229 delete [] tempBuffer; |
219 | 230 |
220 return FeatureSet(); | 231 return FeatureSet(); |
221 } | 232 } |
222 | 233 |
223 SegmenterPlugin::FeatureSet | 234 SegmenterPlugin::FeatureSet |
224 SegmenterPlugin::getRemainingFeatures() | 235 SegmenterPlugin::getRemainingFeatures() |
225 { | 236 { |
226 segmenter->segment(nSegmentTypes); | 237 segmenter->segment(nSegmentTypes); |
227 Segmentation segm = segmenter->getSegmentation(); | 238 Segmentation segm = segmenter->getSegmentation(); |
228 | 239 |
229 FeatureSet returnFeatures; | 240 FeatureSet returnFeatures; |
230 | 241 |
231 for (int i = 0; i < segm.segments.size(); ++i) { | 242 for (int i = 0; i < segm.segments.size(); ++i) { |
232 | 243 |
233 Segment s = segm.segments[i]; | 244 Segment s = segm.segments[i]; |
234 | 245 |
235 Feature feature; | 246 Feature feature; |
236 feature.hasTimestamp = true; | 247 feature.hasTimestamp = true; |
237 feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); | 248 feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); |
238 | 249 |
239 vector<float> floatval; | 250 vector<float> floatval; |
240 floatval.push_back(s.type); | 251 floatval.push_back(s.type); |
241 feature.values = floatval; | 252 feature.values = floatval; |
242 | 253 |
243 ostringstream oss; | 254 ostringstream oss; |
244 oss << s.type; | 255 oss << s.type; |
245 feature.label = oss.str(); | 256 feature.label = oss.str(); |
246 | 257 |
247 returnFeatures[0].push_back(feature); | 258 returnFeatures[0].push_back(feature); |
248 } | 259 } |
249 | 260 |
250 return returnFeatures; | 261 return returnFeatures; |
251 } | 262 } |