changeset 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
files plugins/KeyDetect.cpp plugins/SegmenterPlugin.cpp plugins/SegmenterPlugin.h
diffstat 3 files changed, 120 insertions(+), 133 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/KeyDetect.cpp	Wed Jan 09 16:51:59 2008 +0000
+++ b/plugins/KeyDetect.cpp	Thu Jan 10 15:15:12 2008 +0000
@@ -1,37 +1,10 @@
 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
 
 /*
-    Vamp
-
-    An API for audio analysis and feature extraction plugins.
+    QM Vamp Plugin Set
 
     Centre for Digital Music, Queen Mary, University of London.
-    Copyright 2006-2007 QMUL.
-  
-    Permission is hereby granted, free of charge, to any person
-    obtaining a copy of this software and associated documentation
-    files (the "Software"), to deal in the Software without
-    restriction, including without limitation the rights to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell copies
-    of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be
-    included in all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
-    ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-    Except as contained in this notice, the names of the Centre for
-    Digital Music; Queen Mary, University of London; and Chris Cannam
-    shall not be used in advertising or otherwise to promote the sale,
-    use or other dealings in this Software without prior written
-    authorization.
+    All rights reserved.
 */
 
 #include "KeyDetect.h"
@@ -98,7 +71,7 @@
 string
 KeyDetector::getCopyright() const
 {
-    return "Copyright (c) 2006-2007 - All Rights Reserved";
+    return "Copyright (c) 2006-2008 - All Rights Reserved";
 }
 
 KeyDetector::ParameterList
@@ -311,9 +284,9 @@
         if (minor) feature.label += " minor";
         else feature.label += " major";
         returnFeatures[2].push_back(feature); // key
-		cerr << "int key = "<<key<<endl;
-		cerr << "int tonic = "<<tonic<<endl;
-		cerr << "feature label = "<<feature.label<<endl;
+//		cerr << "int key = "<<key<<endl;
+//		cerr << "int tonic = "<<tonic<<endl;
+//		cerr << "feature label = "<<feature.label<<endl;
     }
 
     m_prevKey = key;
--- 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;
--- a/plugins/SegmenterPlugin.h	Wed Jan 09 16:51:59 2008 +0000
+++ b/plugins/SegmenterPlugin.h	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: */
+
 /*
- *  SegmeterPlugin.h
- *  soundbite
+ * SegmenterPlugin.h
  *
- *  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.
  */
 
 #ifndef _SEGMENTER_PLUGIN_H_
@@ -15,6 +16,8 @@
 #include "dsp/segmentation/Segmenter.h"
 #include "dsp/segmentation/segment.h"
 
+class Decimator;
+
 class SegmenterPlugin : public Vamp::Plugin
 {
 public:
@@ -24,8 +27,8 @@
     bool initialise(size_t channels, size_t stepSize, size_t blockSize);
     void reset();
 	
-	std::string getIdentifier() const { return "qm-segmenter"; }
-	std::string getName() const { return "Segmenter"; }
+    std::string getIdentifier() const { return "qm-segmenter"; }
+    std::string getName() const { return "Segmenter"; }
     std::string getDescription() const { return "Divide the track into a sequence of consistent segments"; }
     std::string getMaker() const;
     int getPluginVersion() const;
@@ -33,26 +36,26 @@
 	
     size_t getPreferredStepSize() const;
     size_t getPreferredBlockSize() const;
-	InputDomain getInputDomain() const { return TimeDomain; }
-	
-	SegmenterPlugin::ParameterList getParameterDescriptors() const;
-	float getParameter(std::string param) const;
-	void setParameter(std::string param, float value);
-	
+    InputDomain getInputDomain() const { return TimeDomain; }
+    
+    SegmenterPlugin::ParameterList getParameterDescriptors() const;
+    float getParameter(std::string param) const;
+    void setParameter(std::string param, float value);
+    
     OutputList getOutputDescriptors() const;
-	
+    
     FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp);
-	
+    
     FeatureSet getRemainingFeatures();
 	
 protected:
-	mutable Segmenter* segmenter;
-	mutable int hopsize;
-	mutable int windowsize;
-	int nSegmentTypes;
-	feature_types featureType;	// 1 = constant-Q, 2 = chroma
-
-	void makeSegmenter() const;
+    mutable Segmenter* segmenter;
+    mutable int hopsize;
+    mutable int windowsize;
+    int nSegmentTypes;
+    feature_types featureType;	// 1 = constant-Q, 2 = chroma
+    
+    void makeSegmenter() const;
 };
 
 #endif