diff MatchVampPlugin.cpp @ 16:4c8526c5bf58

Implement features outputs
author Chris Cannam
date Fri, 10 Oct 2014 13:16:54 +0100
parents a82276091bbd
children 27f418d77095
line wrap: on
line diff
--- a/MatchVampPlugin.cpp	Fri Oct 10 12:55:05 2014 +0100
+++ b/MatchVampPlugin.cpp	Fri Oct 10 13:16:54 2014 +0100
@@ -49,9 +49,9 @@
 
 MatchVampPlugin::MatchVampPlugin(float inputSampleRate) :
     Plugin(inputSampleRate),
-    m_stepSize(0),
+    m_stepSize(inputSampleRate * defaultStepTime + 0.001),
     m_stepTime(defaultStepTime),
-    m_blockSize(0),
+    m_blockSize(2048),
     m_serialise(false),
     m_begin(true),
     m_locked(false)
@@ -252,6 +252,7 @@
     desc.quantizeStep = 1;
     desc.sampleType = OutputDescriptor::VariableSampleRate;
     desc.sampleRate = outRate;
+    m_pathOutNo = list.size();
     list.push_back(desc);
 
     desc.identifier = "a_b";
@@ -264,6 +265,7 @@
     desc.isQuantized = false;
     desc.sampleType = OutputDescriptor::VariableSampleRate;
     desc.sampleRate = outRate;
+    m_abOutNo = list.size();
     list.push_back(desc);
 
     desc.identifier = "b_a";
@@ -276,6 +278,7 @@
     desc.isQuantized = false;
     desc.sampleType = OutputDescriptor::VariableSampleRate;
     desc.sampleRate = outRate;
+    m_baOutNo = list.size();
     list.push_back(desc);
 
     desc.identifier = "a_b_divergence";
@@ -288,6 +291,7 @@
     desc.isQuantized = false;
     desc.sampleType = OutputDescriptor::VariableSampleRate;
     desc.sampleRate = outRate;
+    m_abDivOutNo = list.size();
     list.push_back(desc);
 
     desc.identifier = "a_b_temporatio";
@@ -300,18 +304,35 @@
     desc.isQuantized = false;
     desc.sampleType = OutputDescriptor::VariableSampleRate;
     desc.sampleRate = outRate;
+    m_abRatioOutNo = list.size();
     list.push_back(desc);
 
+    Matcher::Parameters params(m_inputSampleRate, m_stepTime, m_blockSize);
+
     desc.identifier = "a_features";
     desc.name = "A Features";
     desc.description = "Spectral features extracted from performance A";
     desc.unit = "";
     desc.hasFixedBinCount = true;
-    desc.binCount = 1;
+    desc.binCount = Matcher::getFeatureSize(params);
     desc.hasKnownExtents = false;
     desc.isQuantized = false;
-    desc.sampleType = OutputDescriptor::VariableSampleRate;
+    desc.sampleType = OutputDescriptor::FixedSampleRate;
     desc.sampleRate = outRate;
+    m_aFeaturesOutNo = list.size();
+    list.push_back(desc);
+
+    desc.identifier = "b_features";
+    desc.name = "B Features";
+    desc.description = "Spectral features extracted from performance B";
+    desc.unit = "";
+    desc.hasFixedBinCount = true;
+    desc.binCount = Matcher::getFeatureSize(params);
+    desc.hasKnownExtents = false;
+    desc.isQuantized = false;
+    desc.sampleType = OutputDescriptor::FixedSampleRate;
+    desc.sampleRate = outRate;
+    m_bFeaturesOutNo = list.size();
     list.push_back(desc);
 
     return list;
@@ -336,12 +357,33 @@
     
 //    std::cerr << timestamp.toString();
 
-    feeder->feed(inputBuffers);
+    MatchFeeder::Features ff = feeder->feedAndGetFeatures(inputBuffers);
+
+    FeatureSet returnFeatures;
+
+    Feature f;
+    f.hasTimestamp = false;
+
+    for (int i = 0; i < (int)ff.f1.size(); ++i) {
+        f.values.clear();
+        for (int j = 0; j < (int)ff.f1[i].size(); ++j) {
+            f.values.push_back(ff.f1[i][j]);
+        }
+        returnFeatures[m_aFeaturesOutNo].push_back(f);
+    }
+
+    for (int i = 0; i < (int)ff.f2.size(); ++i) {
+        f.values.clear();
+        for (int j = 0; j < (int)ff.f2[i].size(); ++j) {
+            f.values.push_back(ff.f2[i][j]);
+        }
+        returnFeatures[m_bFeaturesOutNo].push_back(f);
+    }
 
 //    std::cerr << ".";
 //    std::cerr << std::endl;
 
-    return FeatureSet();
+    return returnFeatures;
 }
 
 MatchVampPlugin::FeatureSet
@@ -364,7 +406,7 @@
 
 //        std::cerr << pathx.size() << ": (" << x << "," << y << ")" << std::endl;
 
-        switch (finder->getDistance() & ADVANCE_BOTH){
+        switch (finder->getDistance() & ADVANCE_BOTH) {
         case ADVANCE_THIS:  y--; break;
         case ADVANCE_OTHER: x--; break;
         case ADVANCE_BOTH:  x--; y--; break;
@@ -399,7 +441,7 @@
         feature.timestamp = m_startTime + xt;
         feature.values.clear();
         feature.values.push_back(yt.sec + double(yt.nsec)/1.0e9);
-        returnFeatures[0].push_back(feature);
+        returnFeatures[m_pathOutNo].push_back(feature);
         
         if (x != prevx) {
 
@@ -407,12 +449,12 @@
             feature.timestamp = m_startTime + xt;
             feature.values.clear();
             feature.values.push_back(yt.sec + yt.msec()/1000.0);
-            returnFeatures[1].push_back(feature);
+            returnFeatures[m_abOutNo].push_back(feature);
 
             Vamp::RealTime diff = yt - xt;
             feature.values.clear();
             feature.values.push_back(diff.sec + diff.msec()/1000.0);
-            returnFeatures[3].push_back(feature);
+            returnFeatures[m_abDivOutNo].push_back(feature);
 
             if (i > 0) {
                 int lookback = 100; //!!! arbitrary
@@ -424,7 +466,7 @@
                     if (ratio < 8 && ratio > (1.0/8)) { //!!! just for now, since we aren't dealing properly with silence yet
                         feature.values.clear();
                         feature.values.push_back(ratio);
-                        returnFeatures[4].push_back(feature);
+                        returnFeatures[m_abRatioOutNo].push_back(feature);
                     }
                 }
             }
@@ -435,7 +477,7 @@
             feature.timestamp = m_startTime + yt;
             feature.values.clear();
             feature.values.push_back(xt.sec + xt.msec()/1000.0);
-            returnFeatures[2].push_back(feature);
+            returnFeatures[m_baOutNo].push_back(feature);
         }
 
         prevx = x;