Mercurial > hg > qm-vamp-plugins
diff 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 |
line wrap: on
line diff
--- a/plugins/SegmenterPlugin.cpp Wed Jan 09 16:51:59 2008 +0000 +++ b/plugins/SegmenterPlugin.cpp Thu Jan 10 15:15:12 2008 +0000 @@ -1,10 +1,11 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + /* - * SegmenterPlugin.cpp - * soundbite + * SegmenterPlugin.cpp * - * Created by Mark Levy on 24/03/2006. - * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. All rights reserved. - * + * Created by Mark Levy on 24/03/2006. + * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. + * All rights reserved. */ #include <iostream> @@ -20,15 +21,17 @@ using std::ostringstream; SegmenterPlugin::SegmenterPlugin(float inputSampleRate) : - Plugin(inputSampleRate), segmenter(0), nSegmentTypes(10), featureType(feature_types(1)) + Plugin(inputSampleRate), + segmenter(0), + nSegmentTypes(10), + featureType(feature_types(1)) { } SegmenterPlugin::~SegmenterPlugin() { - if (segmenter) - delete segmenter; + delete segmenter; } string @@ -68,20 +71,21 @@ void SegmenterPlugin::reset() { + //!!! } size_t SegmenterPlugin::getPreferredStepSize() const { - if (!segmenter) makeSegmenter(); - return hopsize; + if (!segmenter) makeSegmenter(); + return hopsize; } size_t SegmenterPlugin::getPreferredBlockSize() const { - if (!segmenter) makeSegmenter(); - return windowsize; + if (!segmenter) makeSegmenter(); + return windowsize; } SegmenterPlugin::ParameterList SegmenterPlugin::getParameterDescriptors() const @@ -124,12 +128,12 @@ return nSegmentTypes; } - if (param == "featureType") { - return featureType; - } + if (param == "featureType") { + return featureType; + } - std::cerr << "WARNING: SegmenterPlugin::getParameter: unknown parameter \"" - << param << "\"" << std::endl; + std::cerr << "WARNING: SegmenterPlugin::getParameter: unknown parameter \"" + << param << "\"" << std::endl; return 0.0; } @@ -137,47 +141,54 @@ SegmenterPlugin::setParameter(std::string param, float value) { if (param == "nSegmentTypes") { + nSegmentTypes = int(value); - } else - { - if (param == "featureType") { - if (featureType != feature_types(value)) // feature type changed, create a new segmenter - { - featureType = feature_types(value); - makeSegmenter(); - } - } - else - { - std::cerr << "WARNING: SegmenterPlugin::setParameter: unknown parameter \"" - << param << "\"" << std::endl; - } - } + + } else { + + if (param == "featureType") { + if (featureType != feature_types(value)) // feature type changed, create a new segmenter + { + featureType = feature_types(value); + makeSegmenter(); + } + } + else + { + std::cerr << "WARNING: SegmenterPlugin::setParameter: unknown parameter \"" + << param << "\"" << std::endl; + } + } } void SegmenterPlugin::makeSegmenter() const { - ClusterMeltSegmenterParams params = ClusterMeltSegmenterParams(); - params.featureType = (feature_types) featureType; - if (params.featureType == FEATURE_TYPE_CONSTQ) - { - params.ncomponents = 20; - params.neighbourhoodLimit = 30; - } - if (params.featureType == FEATURE_TYPE_CHROMA) - { - params.hopSize = 0.1; - params.windowSize = 0.372; - params.nbins = 12; - params.histogramLength = 20; - params.neighbourhoodLimit = 40; - } - delete segmenter; - segmenter = new ClusterMeltSegmenter(params); - segmenter->initialise(static_cast<int>(m_inputSampleRate)); - hopsize = segmenter->getHopsize(); - windowsize = segmenter->getWindowsize(); + ClusterMeltSegmenterParams params = ClusterMeltSegmenterParams(); + params.featureType = (feature_types) featureType; + + if (params.featureType == FEATURE_TYPE_CONSTQ) + { + params.ncomponents = 20; + params.neighbourhoodLimit = 30; + } + if (params.featureType == FEATURE_TYPE_CHROMA) + { + params.hopSize = 0.1; + params.windowSize = 0.372; + params.nbins = 12; + params.histogramLength = 20; + params.neighbourhoodLimit = 40; + } + delete segmenter; + + segmenter = new ClusterMeltSegmenter(params); + segmenter->initialise(m_inputSampleRate); + hopsize = segmenter->getHopsize(); + windowsize = segmenter->getWindowsize(); + + std::cerr << "segmenter window size: " << segmenter->getWindowsize() + << std::endl; } SegmenterPlugin::OutputList @@ -185,23 +196,23 @@ { OutputList list; - OutputDescriptor segmentation; - segmentation.identifier = "segmentation"; + OutputDescriptor segmentation; + segmentation.identifier = "segmentation"; segmentation.name = "Segmentation"; segmentation.description = "Segmentation"; segmentation.unit = "segment-type"; segmentation.hasFixedBinCount = true; segmentation.binCount = 1; - segmentation.minValue = 1; - segmentation.maxValue = nSegmentTypes; - segmentation.isQuantized = true; - segmentation.quantizeStep = 1; + segmentation.minValue = 1; + segmentation.maxValue = nSegmentTypes; + segmentation.isQuantized = true; + segmentation.quantizeStep = 1; segmentation.sampleType = OutputDescriptor::VariableSampleRate; segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); list.push_back(segmentation); - return list; + return list; } SegmenterPlugin::FeatureSet @@ -210,41 +221,41 @@ // convert float* to double* double *tempBuffer = new double[windowsize]; for (size_t i = 0; i < windowsize; ++i) { - tempBuffer[i] = inputBuffers[0][i]; + tempBuffer[i] = inputBuffers[0][i]; } + + segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize()); + + delete [] tempBuffer; - segmenter->extractFeatures(tempBuffer, windowsize); - - delete [] tempBuffer; - - return FeatureSet(); + return FeatureSet(); } SegmenterPlugin::FeatureSet SegmenterPlugin::getRemainingFeatures() { segmenter->segment(nSegmentTypes); - Segmentation segm = segmenter->getSegmentation(); + Segmentation segm = segmenter->getSegmentation(); - FeatureSet returnFeatures; + FeatureSet returnFeatures; for (int i = 0; i < segm.segments.size(); ++i) { - Segment s = segm.segments[i]; + Segment s = segm.segments[i]; - Feature feature; - feature.hasTimestamp = true; - feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); + Feature feature; + feature.hasTimestamp = true; + feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); - vector<float> floatval; - floatval.push_back(s.type); - feature.values = floatval; + vector<float> floatval; + floatval.push_back(s.type); + feature.values = floatval; - ostringstream oss; - oss << s.type; - feature.label = oss.str(); + ostringstream oss; + oss << s.type; + feature.label = oss.str(); - returnFeatures[0].push_back(feature); + returnFeatures[0].push_back(feature); } return returnFeatures;