changeset 15:368bb5a1b4bf

Don't carry out expensive construction in the Vamp plugin ctor. Add tuning freq parameter (not implemented yet though)
author Chris Cannam
date Mon, 17 Aug 2015 15:51:13 +0100
parents 19088c4ba50a
children 68fe8789b7ef
files src/PitchFilterbank.cpp src/PitchFilterbank.h src/TipicVampPlugin.cpp src/TipicVampPlugin.h
diffstat 4 files changed, 45 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/PitchFilterbank.cpp	Mon Aug 17 12:48:49 2015 +0100
+++ b/src/PitchFilterbank.cpp	Mon Aug 17 15:51:13 2015 +0100
@@ -23,10 +23,15 @@
 class PitchFilterbank::D
 {
 public:
-    D(int sampleRate) :
+    D(int sampleRate, float tuningFrequency) :
 	m_nfilters(HIGHEST_FILTER_INDEX + 1),
-	m_sampleRate(sampleRate)
+	m_sampleRate(sampleRate),
+	m_tuningFrequency(tuningFrequency)
     {
+	//!!! todo: tuning frequency adjustment
+	// * resample input by a small amount
+	// * adjust output block timings by a small amount
+	
 	m_resamplers[882] = new Resampler(sampleRate, 882);
 	m_resamplers[4410] = new Resampler(sampleRate, 4410);
 	m_resamplers[22050] = new Resampler(sampleRate, 22050);
@@ -50,6 +55,7 @@
     }
 
     int getSampleRate() const { return m_sampleRate; }
+    float getTuningFrequency() const { return m_tuningFrequency; }
     
     /// A series of real-valued samples ordered in time.
     typedef vector<double> RealSequence;
@@ -196,6 +202,7 @@
 private:
     int m_nfilters;
     int m_sampleRate;
+    float m_tuningFrequency;
 
     // This vector is initialised with 88 filter instances.
     // m_filters[n] (for n from 0 to 87) is for MIDI pitch 21+n, so we
@@ -238,8 +245,8 @@
     }
 };
 
-PitchFilterbank::PitchFilterbank(int sampleRate) :
-    m_d(new D(sampleRate))
+PitchFilterbank::PitchFilterbank(int sampleRate, float tuningFrequency) :
+    m_d(new D(sampleRate, tuningFrequency))
 {
 }
 
@@ -252,8 +259,9 @@
 PitchFilterbank::reset()
 {
     int rate = m_d->getSampleRate();
+    float freq = m_d->getTuningFrequency();
     delete m_d;
-    m_d = new D(rate);
+    m_d = new D(rate, freq);
 }
 
 PitchFilterbank::RealBlock
--- a/src/PitchFilterbank.h	Mon Aug 17 12:48:49 2015 +0100
+++ b/src/PitchFilterbank.h	Mon Aug 17 15:51:13 2015 +0100
@@ -8,7 +8,7 @@
 class PitchFilterbank
 {
 public:
-    PitchFilterbank(int sampleRate);
+    PitchFilterbank(int sampleRate, float tuningFrequency);
     ~PitchFilterbank();
 
     /// A series of real-valued samples ordered in time.
--- a/src/TipicVampPlugin.cpp	Mon Aug 17 12:48:49 2015 +0100
+++ b/src/TipicVampPlugin.cpp	Mon Aug 17 15:51:13 2015 +0100
@@ -10,17 +10,21 @@
 
 using namespace breakfastquay;
 
+static const float defaultTuningFrequency = 440.f;
+
 Tipic::Tipic(float inputSampleRate) :
     Plugin(inputSampleRate),
     m_stepSize(0),
     m_blockSize(0),
-    m_filterbank(inputSampleRate),
+    m_tuningFrequency(defaultTuningFrequency),
+    m_filterbank(0),
     m_pitchOutputNo(-1)
 {
 }
 
 Tipic::~Tipic()
 {
+    delete m_filterbank;
 }
 
 string
@@ -103,18 +107,36 @@
 Tipic::getParameterDescriptors() const
 {
     ParameterList list;
+
+    ParameterDescriptor desc;
+    desc.identifier = "tuning";
+    desc.name = "Tuning Frequency";
+    desc.unit = "Hz";
+    desc.description = "Frequency of concert A";
+    desc.minValue = 360;
+    desc.maxValue = 500;
+    desc.defaultValue = defaultTuningFrequency;
+    desc.isQuantized = false;
+    list.push_back(desc);
+    
     return list;
 }
 
 float
 Tipic::getParameter(string identifier) const
 {
+    if (identifier == "tuning") {
+        return m_tuningFrequency;
+    }
     return 0;
 }
 
 void
 Tipic::setParameter(string identifier, float value) 
 {
+    if (identifier == "tuning") {
+        m_tuningFrequency = value;
+    }
 }
 
 Tipic::ProgramList
@@ -189,7 +211,10 @@
 void
 Tipic::reset()
 {
-    m_filterbank.reset();
+    if (!m_filterbank) {
+	m_filterbank = new PitchFilterbank(m_inputSampleRate, m_tuningFrequency);
+    }
+    m_filterbank->reset();
 }
 
 Tipic::FeatureSet
@@ -199,7 +224,7 @@
     in.resize(m_blockSize);
     v_convert(in.data(), inputBuffers[0], m_blockSize);
     
-    PitchFilterbank::RealBlock pitchFiltered = m_filterbank.process(in);
+    PitchFilterbank::RealBlock pitchFiltered = m_filterbank->process(in);
 
     FeatureSet fs;
     addPitchFeatures(fs, pitchFiltered);
@@ -209,7 +234,7 @@
 Tipic::FeatureSet
 Tipic::getRemainingFeatures()
 {
-    PitchFilterbank::RealBlock pitchFiltered = m_filterbank.getRemainingOutput();
+    PitchFilterbank::RealBlock pitchFiltered = m_filterbank->getRemainingOutput();
 
     FeatureSet fs;
     addPitchFeatures(fs, pitchFiltered);
--- a/src/TipicVampPlugin.h	Mon Aug 17 12:48:49 2015 +0100
+++ b/src/TipicVampPlugin.h	Mon Aug 17 15:51:13 2015 +0100
@@ -47,7 +47,8 @@
 protected:
     int m_stepSize;
     int m_blockSize;
-    PitchFilterbank m_filterbank;
+    float m_tuningFrequency;
+    PitchFilterbank *m_filterbank;
     mutable int m_pitchOutputNo;
 
     void addPitchFeatures(FeatureSet &, const PitchFilterbank::RealBlock &);