diff src/Silvet.cpp @ 31:c6d230c31713

Stubbing out Vamp plugin
author Chris Cannam
date Thu, 03 Apr 2014 17:38:45 +0100
parents
children da54468cc452
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Silvet.cpp	Thu Apr 03 17:38:45 2014 +0100
@@ -0,0 +1,236 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+  Silvet
+
+  A Vamp plugin for note transcription.
+  Centre for Digital Music, Queen Mary University of London.
+    
+  This program is free software; you can redistribute it and/or
+  modify it under the terms of the GNU General Public License as
+  published by the Free Software Foundation; either version 2 of the
+  License, or (at your option) any later version.  See the file
+  COPYING included with this distribution for more information.
+*/
+
+#include "Silvet.h"
+
+#include "data/include/templates.h"
+
+#include "dsp/rateconversion/Resampler.h"
+
+#include "constant-q-cpp/cpp-qm-dsp/ConstantQ.h"
+
+#include <vector>
+
+using std::vector;
+using std::cerr;
+using std::endl;
+
+static int processingSampleRate = 44100;
+static int processingBPO = 60;
+
+
+Silvet::Silvet(float inputSampleRate) :
+    Plugin(inputSampleRate),
+    m_resampler(0),
+    m_cq(0)
+{
+}
+
+Silvet::~Silvet()
+{
+    delete m_resampler;
+    delete m_cq;
+}
+
+string
+Silvet::getIdentifier() const
+{
+    return "silvet";
+}
+
+string
+Silvet::getName() const
+{
+    return "Silvet Note Transcription";
+}
+
+string
+Silvet::getDescription() const
+{
+    // Return something helpful here!
+    return "";
+}
+
+string
+Silvet::getMaker() const
+{
+    // Your name here
+    return "";
+}
+
+int
+Silvet::getPluginVersion() const
+{
+    return 1;
+}
+
+string
+Silvet::getCopyright() const
+{
+    // This function is not ideally named.  It does not necessarily
+    // need to say who made the plugin -- getMaker does that -- but it
+    // should indicate the terms under which it is distributed.  For
+    // example, "Copyright (year). All Rights Reserved", or "GPL"
+    return "";
+}
+
+Silvet::InputDomain
+Silvet::getInputDomain() const
+{
+    return TimeDomain;
+}
+
+size_t
+Silvet::getPreferredBlockSize() const
+{
+    return 0;
+}
+
+size_t 
+Silvet::getPreferredStepSize() const
+{
+    return 0;
+}
+
+size_t
+Silvet::getMinChannelCount() const
+{
+    return 1;
+}
+
+size_t
+Silvet::getMaxChannelCount() const
+{
+    return 1;
+}
+
+Silvet::ParameterList
+Silvet::getParameterDescriptors() const
+{
+    ParameterList list;
+    return list;
+}
+
+float
+Silvet::getParameter(string identifier) const
+{
+    return 0;
+}
+
+void
+Silvet::setParameter(string identifier, float value) 
+{
+}
+
+Silvet::ProgramList
+Silvet::getPrograms() const
+{
+    ProgramList list;
+    return list;
+}
+
+string
+Silvet::getCurrentProgram() const
+{
+    return ""; 
+}
+
+void
+Silvet::selectProgram(string name)
+{
+}
+
+Silvet::OutputList
+Silvet::getOutputDescriptors() const
+{
+    OutputList list;
+
+    OutputDescriptor d;
+    d.identifier = "transcription";
+    d.name = "Transcription";
+    d.description = ""; //!!!
+    d.unit = "Hz";
+    d.hasFixedBinCount = true;
+    d.binCount = 2;
+    d.binNames.push_back("Frequency");
+    d.binNames.push_back("Velocity");
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::VariableSampleRate;
+    d.sampleRate = 0;
+    d.hasDuration = true;
+    list.push_back(d);
+
+    return list;
+}
+
+bool
+Silvet::initialise(size_t channels, size_t stepSize, size_t blockSize)
+{
+    if (channels < getMinChannelCount() ||
+	channels > getMaxChannelCount()) return false;
+
+    if (stepSize != blockSize) {
+	cerr << "Silvet::initialise: Step size must be the same as block size ("
+	     << stepSize << " != " << blockSize << ")" << endl;
+	return false;
+    }
+
+    m_blockSize = blockSize;
+
+    reset();
+
+    return true;
+}
+
+void
+Silvet::reset()
+{
+    delete m_resampler;
+    delete m_cq;
+
+    if (m_inputSampleRate != processingSampleRate) {
+	m_resampler = new Resampler(m_inputSampleRate, processingSampleRate);
+    } else {
+	m_resampler = 0;
+    }
+
+    m_cq = new ConstantQ
+	(processingSampleRate, 27.5, processingSampleRate / 3, processingBPO);
+
+}
+
+Silvet::FeatureSet
+Silvet::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
+{
+    vector<double> data;
+    for (int i = 0; i < m_blockSize; ++i) data.push_back(inputBuffers[0][i]);
+
+    if (m_resampler) {
+	data = m_resampler->process(data.data(), data.size());
+    }
+
+    vector<vector<double> > cqout = m_cq->process(data);
+
+    return FeatureSet();
+}
+
+Silvet::FeatureSet
+Silvet::getRemainingFeatures()
+{
+
+    return FeatureSet();
+}
+