changeset 12:23572f9d25d9

Rename & duplicate plugin
author Chris Cannam
date Wed, 04 Feb 2015 10:15:57 +0000
parents 08af0d25b61c
children c74071731d74
files chroma-compare-plugin/Makefile.inc chroma-compare-plugin/Makefile.linux chroma-compare-plugin/Makefile.mingw32 chroma-compare-plugin/Makefile.osx chroma-compare-plugin/TuningDifference.cpp chroma-compare-plugin/TuningDifference.h chroma-compare-plugin/plugins.cpp chroma-compare-plugin/vamp-plugin.list chroma-compare-plugin/vamp-plugin.map spectrum-compare-plugin/Makefile.inc spectrum-compare-plugin/Makefile.linux spectrum-compare-plugin/Makefile.mingw32 spectrum-compare-plugin/Makefile.osx spectrum-compare-plugin/TuningDifference.cpp spectrum-compare-plugin/TuningDifference.h spectrum-compare-plugin/plugins.cpp spectrum-compare-plugin/vamp-plugin.list spectrum-compare-plugin/vamp-plugin.map spectrum-compare/Makefile.inc spectrum-compare/Makefile.linux spectrum-compare/Makefile.mingw32 spectrum-compare/Makefile.osx spectrum-compare/TuningDifference.cpp spectrum-compare/TuningDifference.h spectrum-compare/plugins.cpp spectrum-compare/vamp-plugin.list spectrum-compare/vamp-plugin.map
diffstat 27 files changed, 1268 insertions(+), 634 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/Makefile.inc	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,77 @@
+
+##  Makefile for Vamp plugin builds using command-line tools.
+##
+##  This file defines all of the system-independent information about
+##  your project: the list of source files, plugin library name, etc.
+##  Edit this file to make sure it has all the right information.
+##
+##  This file does not define the system-specific stuff such as which
+##  compiler to use -- that goes into Makefile.osx, Makefile.mingw32,
+##  Makefile.linux etc.  Those files all include this file, so that
+##  they all have a consistent set of project data.
+##
+##  To build the plugin project, type
+##
+##    $ gmake -f Makefile.osx
+##
+##  or whatever the equivalent filename suffix is for your platform.
+##
+##  This requires GNU make, which is what you get with OS/X, Linux, or
+##  MinGW/Cygwin on Windows.
+##
+##  (For Windows builds using MS Visual Studio, start instead with the
+##  VampExamplePlugins project found in the build directory of the SDK.)
+
+
+# Edit this to the base name of your plugin library
+#
+PLUGIN_LIBRARY_NAME := tuning-difference
+
+# Edit this to list the .cpp or .c files in your plugin project
+#
+PLUGIN_SOURCES := TuningDifference.cpp plugins.cpp
+
+# Edit this to list the .h files in your plugin project
+#
+PLUGIN_HEADERS := TuningDifference.h
+
+
+##  Normally you should not edit anything below this line
+
+SRC_DIR		:= .
+
+CFLAGS		:= $(ARCHFLAGS) $(CFLAGS)
+CXXFLAGS	:= $(CFLAGS) -I. -I$(VAMPSDK_DIR) $(CXXFLAGS)
+
+LDFLAGS		:= $(ARCHFLAGS) $(LDFLAGS) 
+PLUGIN_LDFLAGS	:= $(LDFLAGS) $(PLUGIN_LDFLAGS)
+
+# Defaults, overridden from the platform-specific Makefile
+VAMPSDK_DIR	?= ../vamp-plugin-sdk
+PLUGIN_EXT	?= .so
+CXX 		?= g++
+CC 		?= gcc
+
+PLUGIN 		:= $(PLUGIN_LIBRARY_NAME)$(PLUGIN_EXT)
+
+PLUGIN_OBJECTS 	:= $(PLUGIN_SOURCES:.cpp=.o)
+PLUGIN_OBJECTS 	:= $(PLUGIN_OBJECTS:.c=.o)
+
+$(PLUGIN): $(PLUGIN_OBJECTS) 
+	   $(CXX) -o $@ $^ $(PLUGIN_LDFLAGS)
+
+$(PLUGIN_OBJECTS): $(PLUGIN_HEADERS)
+
+clean:
+	rm -f $(PLUGIN_OBJECTS)
+
+distclean:	clean
+	rm -f $(PLUGIN)
+
+depend:
+	makedepend -Y -fMakefile.inc $(PLUGIN_SOURCES) $(PLUGIN_HEADERS)
+
+# DO NOT DELETE
+
+TuningDifference.o: TuningDifference.h
+plugins.o: TuningDifference.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/Makefile.linux	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,38 @@
+
+##  Makefile for Vamp plugin using GNU tools on Linux.
+##
+##  Edit this to adjust compiler and library settings when
+##  building for Linux.
+##
+##  Note that the list of source files, etc, goes in Makefile.inc
+##  instead so that it can be included by all platform Makefiles.
+
+
+# For a debug build...
+
+CFLAGS		:= -Wall -Wextra -g -fPIC
+
+# ... or for a release build
+
+#CFLAGS		:= -Wall -Wextra -O3 -msse -msse2 -mfpmath=sse -ftree-vectorize -fPIC
+
+
+# Location of Vamp plugin SDK relative to the project directory
+
+VAMPSDK_DIR	:= ../vamp-plugin-sdk
+
+
+# Libraries and linker flags required by plugin: add any -l<library>
+# options here
+
+PLUGIN_LDFLAGS	:= -shared -Wl,-Bsymbolic -Wl,-z,defs -Wl,--version-script=vamp-plugin.map $(VAMPSDK_DIR)/libvamp-sdk.a
+
+
+# File extension for plugin library on this platform
+
+PLUGIN_EXT	:= .so
+
+
+include Makefile.inc
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/Makefile.mingw32	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,43 @@
+
+##  Makefile for Vamp plugin using MinGW tools on Windows.
+##
+##  Edit this to adjust compiler and library settings when
+##  building using MinGW.
+##
+##  Note that the list of source files, etc, goes in Makefile.inc
+##  instead so that it can be included by all platform Makefiles.
+
+TOOLPREFIX     ?= 
+CXX		= $(TOOLPREFIX)g++
+CC		= $(TOOLPREFIX)gcc
+LD		= $(TOOLPREFIX)g++
+AR		= $(TOOLPREFIX)ar
+RANLIB		= $(TOOLPREFIX)ranlib
+
+
+# For a debug build...
+
+CFLAGS		:= -Wall -Wextra -g
+
+# ... or for a release build
+
+#CFLAGS		:= -Wall -Wextra -O3 -ftree-vectorize
+
+
+# Location of Vamp plugin SDK relative to the project directory
+
+VAMPSDK_DIR	:= ../vamp-plugin-sdk
+
+
+# Libraries and linker flags required by plugin: add any -l<library>
+# options here
+
+PLUGIN_LDFLAGS	:= -shared -static -Wl,--retain-symbols-file=vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a
+
+
+# File extension for plugin library on this platform
+
+PLUGIN_EXT	:= .dll
+
+
+include Makefile.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/Makefile.osx	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,43 @@
+
+##  Makefile for Vamp plugin using command-line tools on OS/X.
+##
+##  Edit this to adjust compiler and library settings when
+##  building for OS/X.
+##
+##  Note that the list of source files, etc, goes in Makefile.inc
+##  instead so that it can be included by all platform Makefiles.
+
+
+# For a debug build...
+
+CFLAGS		:= -Wall -Wextra -g -fPIC
+
+# ... or for a release build
+
+#CFLAGS		:= -Wall -Wextra -O3 -ftree-vectorize -fPIC
+
+
+# Flags to determine processor architecture and system SDK
+
+ARCHFLAGS	?= -mmacosx-version-min=10.6 -arch x86_64 -arch i386
+
+
+# Location of Vamp plugin SDK relative to the project directory
+
+VAMPSDK_DIR	:= ../vamp-plugin-sdk
+
+
+# Libraries and linker flags required by plugin: add any -l<library>
+# options here
+
+PLUGIN_LDFLAGS	:= -dynamiclib -exported_symbols_list vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a
+
+
+# File extension for plugin library on this platform
+
+PLUGIN_EXT	:= .dylib
+
+
+include Makefile.inc
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/TuningDifference.cpp	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,354 @@
+
+#include "TuningDifference.h"
+
+#include <iostream>
+
+#include <cmath>
+#include <cstdio>
+
+using std::cerr;
+using std::endl;
+
+static double targetFmin = 60.0;
+static double targetFmax = 1500.0;
+
+TuningDifference::TuningDifference(float inputSampleRate) :
+    Plugin(inputSampleRate)
+{
+}
+
+TuningDifference::~TuningDifference()
+{
+}
+
+string
+TuningDifference::getIdentifier() const
+{
+    return "tuning-difference";
+}
+
+string
+TuningDifference::getName() const
+{
+    return "Tuning Difference";
+}
+
+string
+TuningDifference::getDescription() const
+{
+    // Return something helpful here!
+    return "";
+}
+
+string
+TuningDifference::getMaker() const
+{
+    // Your name here
+    return "";
+}
+
+int
+TuningDifference::getPluginVersion() const
+{
+    // Increment this each time you release a version that behaves
+    // differently from the previous one
+    return 1;
+}
+
+string
+TuningDifference::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 "";
+}
+
+TuningDifference::InputDomain
+TuningDifference::getInputDomain() const
+{
+    return FrequencyDomain;
+}
+
+size_t
+TuningDifference::getPreferredBlockSize() const
+{
+    return 16384;
+}
+
+size_t 
+TuningDifference::getPreferredStepSize() const
+{
+    return 0;
+}
+
+size_t
+TuningDifference::getMinChannelCount() const
+{
+    return 2;
+}
+
+size_t
+TuningDifference::getMaxChannelCount() const
+{
+    return 2;
+}
+
+TuningDifference::ParameterList
+TuningDifference::getParameterDescriptors() const
+{
+    ParameterList list;
+    return list;
+}
+
+float
+TuningDifference::getParameter(string) const
+{
+    return 0;
+}
+
+void
+TuningDifference::setParameter(string, float) 
+{
+}
+
+TuningDifference::ProgramList
+TuningDifference::getPrograms() const
+{
+    ProgramList list;
+    return list;
+}
+
+string
+TuningDifference::getCurrentProgram() const
+{
+    return ""; // no programs
+}
+
+void
+TuningDifference::selectProgram(string)
+{
+}
+
+TuningDifference::OutputList
+TuningDifference::getOutputDescriptors() const
+{
+    OutputList list;
+
+    OutputDescriptor d;
+    d.identifier = "cents";
+    d.name = "Tuning Difference";
+    d.description = "Difference in averaged frequency profile between channels 1 and 2, in cents. A positive value means channel 2 is higher.";
+    d.unit = "cents";
+    d.hasFixedBinCount = true;
+    d.binCount = 1;
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::VariableSampleRate;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    d.identifier = "tuningfreq";
+    d.name = "Relative Tuning Frequency";
+    d.description = "Tuning frequency of channel 2, if channel 1 is assumed to contain the same music as it at a tuning frequency of A=440Hz.";
+    d.unit = "hz";
+    d.hasFixedBinCount = true;
+    d.binCount = 1;
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::VariableSampleRate;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    d.identifier = "curve";
+    d.name = "Shift Correlation Curve";
+    d.description = "Correlation between shifted and unshifted sources, for each probed shift in cents.";
+    d.unit = "";
+    d.hasFixedBinCount = true;
+    d.binCount = 1;
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::FixedSampleRate;
+    d.sampleRate = 100;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    int targetBinMin = int(floor(targetFmin * m_blockSize / m_inputSampleRate));
+    int targetBinMax = int(ceil(targetFmax * m_blockSize / m_inputSampleRate));
+    cerr << "target bin range: " << targetBinMin << " -> " << targetBinMax << endl;
+
+    d.identifier = "averages";
+    d.name = "Spectrum averages";
+    d.description = "Average magnitude spectrum for each channel.";
+    d.unit = "";
+    d.hasFixedBinCount = true;
+    d.binCount = (targetBinMax > targetBinMin ? targetBinMax - targetBinMin + 1 : 100);
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::FixedSampleRate;
+    d.sampleRate = 1;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    return list;
+}
+
+bool
+TuningDifference::initialise(size_t channels, size_t stepSize, size_t blockSize)
+{
+    if (channels < getMinChannelCount() ||
+	channels > getMaxChannelCount()) return false;
+
+    if (blockSize != getPreferredBlockSize() ||
+	stepSize != blockSize/2) return false;
+
+    m_blockSize = blockSize;
+
+    reset();
+    
+    return true;
+}
+
+void
+TuningDifference::reset()
+{
+    m_sum[0].clear();
+    m_sum[1].clear();
+    m_frameCount = 0;
+}
+
+TuningDifference::FeatureSet
+TuningDifference::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
+{
+    for (int c = 0; c < 2; ++c) {
+	if (m_sum[c].size() == 0) {
+	    m_sum[c].resize(m_blockSize/2 + 1, 0.0);
+	}
+	for (int i = 0; i <= m_blockSize/2; ++i) {
+	    double energy =
+		inputBuffers[c][i*2  ] * inputBuffers[c][i*2  ] +
+		inputBuffers[c][i*2+1] * inputBuffers[c][i*2+1];
+	    double mag = sqrt(energy);
+	    m_sum[c][i] += mag;
+	    m_sum[c][i/2] += mag;
+	}
+    }
+    
+    ++m_frameCount;
+    return FeatureSet();
+}
+
+TuningDifference::FeatureSet
+TuningDifference::getRemainingFeatures()
+{
+    int n = m_sum[0].size();
+    if (n == 0) return FeatureSet();
+
+    Feature f;
+    FeatureSet fs;
+
+    int maxshift = 2400; // cents
+
+    int bestshift = -1;
+    double bestdist = 0;
+
+    for (int i = 0; i < n; ++i) {
+	m_sum[0][i] /= m_frameCount;
+	m_sum[1][i] /= m_frameCount;
+    }
+
+    for (int c = 0; c < 2; ++c) {
+	double tot = 0.0;
+	for (int i = 0; i < n; ++i) {
+	    tot += m_sum[c][i];
+	}
+	if (tot != 0.0) {
+	    for (int i = 0; i < n; ++i) {
+		m_sum[c][i] /= tot;
+	    }
+	}
+    }
+
+    int targetBinMin = int(floor(targetFmin * m_blockSize / m_inputSampleRate));
+    int targetBinMax = int(ceil(targetFmax * m_blockSize / m_inputSampleRate));
+    cerr << "target bin range: " << targetBinMin << " -> " << targetBinMax << endl;
+	
+    f.values.clear();
+    for (int i = targetBinMin; i < targetBinMax; ++i) {
+	f.values.push_back(m_sum[0][i]);
+    }
+    fs[3].push_back(f);
+    f.values.clear();
+    for (int i = targetBinMin; i < targetBinMax; ++i) {
+	f.values.push_back(m_sum[1][i]);
+    }
+    fs[3].push_back(f);
+
+    f.values.clear();
+    
+    for (int shift = -maxshift; shift <= maxshift; ++shift) {
+
+	double multiplier = pow(2.0, double(shift) / 1200.0);
+	double dist = 0.0;
+
+//	cerr << "shift = " << shift << ", multiplier = " << multiplier << endl;
+
+	int contributing = 0;
+	
+	for (int i = targetBinMin; i < targetBinMax; ++i) {
+
+	    double source = i / multiplier;
+	    int s0 = int(source), s1 = s0 + 1;
+	    double p1 = source - s0;
+	    double p0 = 1.0 - p1;
+
+	    double value = 0.0;
+	    if (s0 >= 0 && s0 < n) {
+		value += p0 * m_sum[1][s0];
+		++contributing;
+	    }
+	    if (s1 >= 0 && s1 < n) {
+		value += p1 * m_sum[1][s1];
+		++contributing;
+	    }
+
+//	    if (shift == -1) {
+//		cerr << "for multiplier " << multiplier << ", target " << i << ", source " << source << ", value " << p0 << " * " << m_sum[1][s0] << " + " << p1 << " * " << m_sum[1][s1] << " = " << value << ", other " << m_sum[0][i] << endl;
+//	    }
+	    
+	    double diff = fabs(m_sum[0][i] - value);
+	    dist += diff;
+	}
+
+	dist /= contributing;
+	
+	f.values.clear();
+	f.values.push_back(dist);
+	char label[100];
+	sprintf(label, "%f at shift %d freq mult %f", dist, shift, multiplier);
+	f.label = label;
+	fs[2].push_back(f);
+
+	if (bestshift == -1 || dist < bestdist) {
+	    bestshift = shift;
+	    bestdist = dist;
+	}
+    }
+
+    f.timestamp = Vamp::RealTime::zeroTime;
+    f.hasTimestamp = true;
+    f.label = "";
+
+    f.values.clear();
+//    cerr << "best dist = " << bestdist << " at shift " << bestshift << endl;
+    f.values.push_back(-bestshift);
+    fs[0].push_back(f);
+
+    f.values.clear();
+    f.values.push_back(440.0 / pow(2.0, double(bestshift) / 1200.0));
+    fs[1].push_back(f);
+    
+    return fs;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/TuningDifference.h	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,53 @@
+#ifndef TUNING_DIFFERENCE_H
+#define TUNING_DIFFERENCE_H
+
+#include <vamp-sdk/Plugin.h>
+
+using std::string;
+using std::vector;
+
+class TuningDifference : public Vamp::Plugin
+{
+public:
+    TuningDifference(float inputSampleRate);
+    virtual ~TuningDifference();
+
+    string getIdentifier() const;
+    string getName() const;
+    string getDescription() const;
+    string getMaker() const;
+    int getPluginVersion() const;
+    string getCopyright() const;
+
+    InputDomain getInputDomain() const;
+    size_t getPreferredBlockSize() const;
+    size_t getPreferredStepSize() const;
+    size_t getMinChannelCount() const;
+    size_t getMaxChannelCount() const;
+
+    ParameterList getParameterDescriptors() const;
+    float getParameter(string identifier) const;
+    void setParameter(string identifier, float value);
+
+    ProgramList getPrograms() const;
+    string getCurrentProgram() const;
+    void selectProgram(string name);
+
+    OutputList getOutputDescriptors() const;
+
+    bool initialise(size_t channels, size_t stepSize, size_t blockSize);
+    void reset();
+
+    FeatureSet process(const float *const *inputBuffers,
+                       Vamp::RealTime timestamp);
+
+    FeatureSet getRemainingFeatures();
+
+protected:
+    int m_blockSize;
+    vector<double> m_sum[2];
+    int m_frameCount;
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/plugins.cpp	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,21 @@
+
+#include <vamp/vamp.h>
+#include <vamp-sdk/PluginAdapter.h>
+
+#include "TuningDifference.h"
+
+static Vamp::PluginAdapter<TuningDifference> tdAdapter;
+
+
+const VampPluginDescriptor *
+vampGetPluginDescriptor(unsigned int version, unsigned int index)
+{
+    if (version < 1) return 0;
+
+    switch (index) {
+    case  0: return tdAdapter.getDescriptor();
+    default: return 0;
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/vamp-plugin.list	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,1 @@
+_vampGetPluginDescriptor
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chroma-compare-plugin/vamp-plugin.map	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,4 @@
+{
+	global: vampGetPluginDescriptor;
+	local: *;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/Makefile.inc	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,77 @@
+
+##  Makefile for Vamp plugin builds using command-line tools.
+##
+##  This file defines all of the system-independent information about
+##  your project: the list of source files, plugin library name, etc.
+##  Edit this file to make sure it has all the right information.
+##
+##  This file does not define the system-specific stuff such as which
+##  compiler to use -- that goes into Makefile.osx, Makefile.mingw32,
+##  Makefile.linux etc.  Those files all include this file, so that
+##  they all have a consistent set of project data.
+##
+##  To build the plugin project, type
+##
+##    $ gmake -f Makefile.osx
+##
+##  or whatever the equivalent filename suffix is for your platform.
+##
+##  This requires GNU make, which is what you get with OS/X, Linux, or
+##  MinGW/Cygwin on Windows.
+##
+##  (For Windows builds using MS Visual Studio, start instead with the
+##  VampExamplePlugins project found in the build directory of the SDK.)
+
+
+# Edit this to the base name of your plugin library
+#
+PLUGIN_LIBRARY_NAME := tuning-difference
+
+# Edit this to list the .cpp or .c files in your plugin project
+#
+PLUGIN_SOURCES := TuningDifference.cpp plugins.cpp
+
+# Edit this to list the .h files in your plugin project
+#
+PLUGIN_HEADERS := TuningDifference.h
+
+
+##  Normally you should not edit anything below this line
+
+SRC_DIR		:= .
+
+CFLAGS		:= $(ARCHFLAGS) $(CFLAGS)
+CXXFLAGS	:= $(CFLAGS) -I. -I$(VAMPSDK_DIR) $(CXXFLAGS)
+
+LDFLAGS		:= $(ARCHFLAGS) $(LDFLAGS) 
+PLUGIN_LDFLAGS	:= $(LDFLAGS) $(PLUGIN_LDFLAGS)
+
+# Defaults, overridden from the platform-specific Makefile
+VAMPSDK_DIR	?= ../vamp-plugin-sdk
+PLUGIN_EXT	?= .so
+CXX 		?= g++
+CC 		?= gcc
+
+PLUGIN 		:= $(PLUGIN_LIBRARY_NAME)$(PLUGIN_EXT)
+
+PLUGIN_OBJECTS 	:= $(PLUGIN_SOURCES:.cpp=.o)
+PLUGIN_OBJECTS 	:= $(PLUGIN_OBJECTS:.c=.o)
+
+$(PLUGIN): $(PLUGIN_OBJECTS) 
+	   $(CXX) -o $@ $^ $(PLUGIN_LDFLAGS)
+
+$(PLUGIN_OBJECTS): $(PLUGIN_HEADERS)
+
+clean:
+	rm -f $(PLUGIN_OBJECTS)
+
+distclean:	clean
+	rm -f $(PLUGIN)
+
+depend:
+	makedepend -Y -fMakefile.inc $(PLUGIN_SOURCES) $(PLUGIN_HEADERS)
+
+# DO NOT DELETE
+
+TuningDifference.o: TuningDifference.h
+plugins.o: TuningDifference.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/Makefile.linux	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,38 @@
+
+##  Makefile for Vamp plugin using GNU tools on Linux.
+##
+##  Edit this to adjust compiler and library settings when
+##  building for Linux.
+##
+##  Note that the list of source files, etc, goes in Makefile.inc
+##  instead so that it can be included by all platform Makefiles.
+
+
+# For a debug build...
+
+CFLAGS		:= -Wall -Wextra -g -fPIC
+
+# ... or for a release build
+
+#CFLAGS		:= -Wall -Wextra -O3 -msse -msse2 -mfpmath=sse -ftree-vectorize -fPIC
+
+
+# Location of Vamp plugin SDK relative to the project directory
+
+VAMPSDK_DIR	:= ../vamp-plugin-sdk
+
+
+# Libraries and linker flags required by plugin: add any -l<library>
+# options here
+
+PLUGIN_LDFLAGS	:= -shared -Wl,-Bsymbolic -Wl,-z,defs -Wl,--version-script=vamp-plugin.map $(VAMPSDK_DIR)/libvamp-sdk.a
+
+
+# File extension for plugin library on this platform
+
+PLUGIN_EXT	:= .so
+
+
+include Makefile.inc
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/Makefile.mingw32	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,43 @@
+
+##  Makefile for Vamp plugin using MinGW tools on Windows.
+##
+##  Edit this to adjust compiler and library settings when
+##  building using MinGW.
+##
+##  Note that the list of source files, etc, goes in Makefile.inc
+##  instead so that it can be included by all platform Makefiles.
+
+TOOLPREFIX     ?= 
+CXX		= $(TOOLPREFIX)g++
+CC		= $(TOOLPREFIX)gcc
+LD		= $(TOOLPREFIX)g++
+AR		= $(TOOLPREFIX)ar
+RANLIB		= $(TOOLPREFIX)ranlib
+
+
+# For a debug build...
+
+CFLAGS		:= -Wall -Wextra -g
+
+# ... or for a release build
+
+#CFLAGS		:= -Wall -Wextra -O3 -ftree-vectorize
+
+
+# Location of Vamp plugin SDK relative to the project directory
+
+VAMPSDK_DIR	:= ../vamp-plugin-sdk
+
+
+# Libraries and linker flags required by plugin: add any -l<library>
+# options here
+
+PLUGIN_LDFLAGS	:= -shared -static -Wl,--retain-symbols-file=vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a
+
+
+# File extension for plugin library on this platform
+
+PLUGIN_EXT	:= .dll
+
+
+include Makefile.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/Makefile.osx	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,43 @@
+
+##  Makefile for Vamp plugin using command-line tools on OS/X.
+##
+##  Edit this to adjust compiler and library settings when
+##  building for OS/X.
+##
+##  Note that the list of source files, etc, goes in Makefile.inc
+##  instead so that it can be included by all platform Makefiles.
+
+
+# For a debug build...
+
+CFLAGS		:= -Wall -Wextra -g -fPIC
+
+# ... or for a release build
+
+#CFLAGS		:= -Wall -Wextra -O3 -ftree-vectorize -fPIC
+
+
+# Flags to determine processor architecture and system SDK
+
+ARCHFLAGS	?= -mmacosx-version-min=10.6 -arch x86_64 -arch i386
+
+
+# Location of Vamp plugin SDK relative to the project directory
+
+VAMPSDK_DIR	:= ../vamp-plugin-sdk
+
+
+# Libraries and linker flags required by plugin: add any -l<library>
+# options here
+
+PLUGIN_LDFLAGS	:= -dynamiclib -exported_symbols_list vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a
+
+
+# File extension for plugin library on this platform
+
+PLUGIN_EXT	:= .dylib
+
+
+include Makefile.inc
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/TuningDifference.cpp	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,354 @@
+
+#include "TuningDifference.h"
+
+#include <iostream>
+
+#include <cmath>
+#include <cstdio>
+
+using std::cerr;
+using std::endl;
+
+static double targetFmin = 60.0;
+static double targetFmax = 1500.0;
+
+TuningDifference::TuningDifference(float inputSampleRate) :
+    Plugin(inputSampleRate)
+{
+}
+
+TuningDifference::~TuningDifference()
+{
+}
+
+string
+TuningDifference::getIdentifier() const
+{
+    return "tuning-difference";
+}
+
+string
+TuningDifference::getName() const
+{
+    return "Tuning Difference";
+}
+
+string
+TuningDifference::getDescription() const
+{
+    // Return something helpful here!
+    return "";
+}
+
+string
+TuningDifference::getMaker() const
+{
+    // Your name here
+    return "";
+}
+
+int
+TuningDifference::getPluginVersion() const
+{
+    // Increment this each time you release a version that behaves
+    // differently from the previous one
+    return 1;
+}
+
+string
+TuningDifference::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 "";
+}
+
+TuningDifference::InputDomain
+TuningDifference::getInputDomain() const
+{
+    return FrequencyDomain;
+}
+
+size_t
+TuningDifference::getPreferredBlockSize() const
+{
+    return 16384;
+}
+
+size_t 
+TuningDifference::getPreferredStepSize() const
+{
+    return 0;
+}
+
+size_t
+TuningDifference::getMinChannelCount() const
+{
+    return 2;
+}
+
+size_t
+TuningDifference::getMaxChannelCount() const
+{
+    return 2;
+}
+
+TuningDifference::ParameterList
+TuningDifference::getParameterDescriptors() const
+{
+    ParameterList list;
+    return list;
+}
+
+float
+TuningDifference::getParameter(string) const
+{
+    return 0;
+}
+
+void
+TuningDifference::setParameter(string, float) 
+{
+}
+
+TuningDifference::ProgramList
+TuningDifference::getPrograms() const
+{
+    ProgramList list;
+    return list;
+}
+
+string
+TuningDifference::getCurrentProgram() const
+{
+    return ""; // no programs
+}
+
+void
+TuningDifference::selectProgram(string)
+{
+}
+
+TuningDifference::OutputList
+TuningDifference::getOutputDescriptors() const
+{
+    OutputList list;
+
+    OutputDescriptor d;
+    d.identifier = "cents";
+    d.name = "Tuning Difference";
+    d.description = "Difference in averaged frequency profile between channels 1 and 2, in cents. A positive value means channel 2 is higher.";
+    d.unit = "cents";
+    d.hasFixedBinCount = true;
+    d.binCount = 1;
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::VariableSampleRate;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    d.identifier = "tuningfreq";
+    d.name = "Relative Tuning Frequency";
+    d.description = "Tuning frequency of channel 2, if channel 1 is assumed to contain the same music as it at a tuning frequency of A=440Hz.";
+    d.unit = "hz";
+    d.hasFixedBinCount = true;
+    d.binCount = 1;
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::VariableSampleRate;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    d.identifier = "curve";
+    d.name = "Shift Correlation Curve";
+    d.description = "Correlation between shifted and unshifted sources, for each probed shift in cents.";
+    d.unit = "";
+    d.hasFixedBinCount = true;
+    d.binCount = 1;
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::FixedSampleRate;
+    d.sampleRate = 100;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    int targetBinMin = int(floor(targetFmin * m_blockSize / m_inputSampleRate));
+    int targetBinMax = int(ceil(targetFmax * m_blockSize / m_inputSampleRate));
+    cerr << "target bin range: " << targetBinMin << " -> " << targetBinMax << endl;
+
+    d.identifier = "averages";
+    d.name = "Spectrum averages";
+    d.description = "Average magnitude spectrum for each channel.";
+    d.unit = "";
+    d.hasFixedBinCount = true;
+    d.binCount = (targetBinMax > targetBinMin ? targetBinMax - targetBinMin + 1 : 100);
+    d.hasKnownExtents = false;
+    d.isQuantized = false;
+    d.sampleType = OutputDescriptor::FixedSampleRate;
+    d.sampleRate = 1;
+    d.hasDuration = false;
+    list.push_back(d);
+
+    return list;
+}
+
+bool
+TuningDifference::initialise(size_t channels, size_t stepSize, size_t blockSize)
+{
+    if (channels < getMinChannelCount() ||
+	channels > getMaxChannelCount()) return false;
+
+    if (blockSize != getPreferredBlockSize() ||
+	stepSize != blockSize/2) return false;
+
+    m_blockSize = blockSize;
+
+    reset();
+    
+    return true;
+}
+
+void
+TuningDifference::reset()
+{
+    m_sum[0].clear();
+    m_sum[1].clear();
+    m_frameCount = 0;
+}
+
+TuningDifference::FeatureSet
+TuningDifference::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
+{
+    for (int c = 0; c < 2; ++c) {
+	if (m_sum[c].size() == 0) {
+	    m_sum[c].resize(m_blockSize/2 + 1, 0.0);
+	}
+	for (int i = 0; i <= m_blockSize/2; ++i) {
+	    double energy =
+		inputBuffers[c][i*2  ] * inputBuffers[c][i*2  ] +
+		inputBuffers[c][i*2+1] * inputBuffers[c][i*2+1];
+	    double mag = sqrt(energy);
+	    m_sum[c][i] += mag;
+	    m_sum[c][i/2] += mag;
+	}
+    }
+    
+    ++m_frameCount;
+    return FeatureSet();
+}
+
+TuningDifference::FeatureSet
+TuningDifference::getRemainingFeatures()
+{
+    int n = m_sum[0].size();
+    if (n == 0) return FeatureSet();
+
+    Feature f;
+    FeatureSet fs;
+
+    int maxshift = 2400; // cents
+
+    int bestshift = -1;
+    double bestdist = 0;
+
+    for (int i = 0; i < n; ++i) {
+	m_sum[0][i] /= m_frameCount;
+	m_sum[1][i] /= m_frameCount;
+    }
+
+    for (int c = 0; c < 2; ++c) {
+	double tot = 0.0;
+	for (int i = 0; i < n; ++i) {
+	    tot += m_sum[c][i];
+	}
+	if (tot != 0.0) {
+	    for (int i = 0; i < n; ++i) {
+		m_sum[c][i] /= tot;
+	    }
+	}
+    }
+
+    int targetBinMin = int(floor(targetFmin * m_blockSize / m_inputSampleRate));
+    int targetBinMax = int(ceil(targetFmax * m_blockSize / m_inputSampleRate));
+    cerr << "target bin range: " << targetBinMin << " -> " << targetBinMax << endl;
+	
+    f.values.clear();
+    for (int i = targetBinMin; i < targetBinMax; ++i) {
+	f.values.push_back(m_sum[0][i]);
+    }
+    fs[3].push_back(f);
+    f.values.clear();
+    for (int i = targetBinMin; i < targetBinMax; ++i) {
+	f.values.push_back(m_sum[1][i]);
+    }
+    fs[3].push_back(f);
+
+    f.values.clear();
+    
+    for (int shift = -maxshift; shift <= maxshift; ++shift) {
+
+	double multiplier = pow(2.0, double(shift) / 1200.0);
+	double dist = 0.0;
+
+//	cerr << "shift = " << shift << ", multiplier = " << multiplier << endl;
+
+	int contributing = 0;
+	
+	for (int i = targetBinMin; i < targetBinMax; ++i) {
+
+	    double source = i / multiplier;
+	    int s0 = int(source), s1 = s0 + 1;
+	    double p1 = source - s0;
+	    double p0 = 1.0 - p1;
+
+	    double value = 0.0;
+	    if (s0 >= 0 && s0 < n) {
+		value += p0 * m_sum[1][s0];
+		++contributing;
+	    }
+	    if (s1 >= 0 && s1 < n) {
+		value += p1 * m_sum[1][s1];
+		++contributing;
+	    }
+
+//	    if (shift == -1) {
+//		cerr << "for multiplier " << multiplier << ", target " << i << ", source " << source << ", value " << p0 << " * " << m_sum[1][s0] << " + " << p1 << " * " << m_sum[1][s1] << " = " << value << ", other " << m_sum[0][i] << endl;
+//	    }
+	    
+	    double diff = fabs(m_sum[0][i] - value);
+	    dist += diff;
+	}
+
+	dist /= contributing;
+	
+	f.values.clear();
+	f.values.push_back(dist);
+	char label[100];
+	sprintf(label, "%f at shift %d freq mult %f", dist, shift, multiplier);
+	f.label = label;
+	fs[2].push_back(f);
+
+	if (bestshift == -1 || dist < bestdist) {
+	    bestshift = shift;
+	    bestdist = dist;
+	}
+    }
+
+    f.timestamp = Vamp::RealTime::zeroTime;
+    f.hasTimestamp = true;
+    f.label = "";
+
+    f.values.clear();
+//    cerr << "best dist = " << bestdist << " at shift " << bestshift << endl;
+    f.values.push_back(-bestshift);
+    fs[0].push_back(f);
+
+    f.values.clear();
+    f.values.push_back(440.0 / pow(2.0, double(bestshift) / 1200.0));
+    fs[1].push_back(f);
+    
+    return fs;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/TuningDifference.h	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,53 @@
+#ifndef TUNING_DIFFERENCE_H
+#define TUNING_DIFFERENCE_H
+
+#include <vamp-sdk/Plugin.h>
+
+using std::string;
+using std::vector;
+
+class TuningDifference : public Vamp::Plugin
+{
+public:
+    TuningDifference(float inputSampleRate);
+    virtual ~TuningDifference();
+
+    string getIdentifier() const;
+    string getName() const;
+    string getDescription() const;
+    string getMaker() const;
+    int getPluginVersion() const;
+    string getCopyright() const;
+
+    InputDomain getInputDomain() const;
+    size_t getPreferredBlockSize() const;
+    size_t getPreferredStepSize() const;
+    size_t getMinChannelCount() const;
+    size_t getMaxChannelCount() const;
+
+    ParameterList getParameterDescriptors() const;
+    float getParameter(string identifier) const;
+    void setParameter(string identifier, float value);
+
+    ProgramList getPrograms() const;
+    string getCurrentProgram() const;
+    void selectProgram(string name);
+
+    OutputList getOutputDescriptors() const;
+
+    bool initialise(size_t channels, size_t stepSize, size_t blockSize);
+    void reset();
+
+    FeatureSet process(const float *const *inputBuffers,
+                       Vamp::RealTime timestamp);
+
+    FeatureSet getRemainingFeatures();
+
+protected:
+    int m_blockSize;
+    vector<double> m_sum[2];
+    int m_frameCount;
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/plugins.cpp	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,21 @@
+
+#include <vamp/vamp.h>
+#include <vamp-sdk/PluginAdapter.h>
+
+#include "TuningDifference.h"
+
+static Vamp::PluginAdapter<TuningDifference> tdAdapter;
+
+
+const VampPluginDescriptor *
+vampGetPluginDescriptor(unsigned int version, unsigned int index)
+{
+    if (version < 1) return 0;
+
+    switch (index) {
+    case  0: return tdAdapter.getDescriptor();
+    default: return 0;
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/vamp-plugin.list	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,1 @@
+_vampGetPluginDescriptor
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spectrum-compare-plugin/vamp-plugin.map	Wed Feb 04 10:15:57 2015 +0000
@@ -0,0 +1,4 @@
+{
+	global: vampGetPluginDescriptor;
+	local: *;
+};
--- a/spectrum-compare/Makefile.inc	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-
-##  Makefile for Vamp plugin builds using command-line tools.
-##
-##  This file defines all of the system-independent information about
-##  your project: the list of source files, plugin library name, etc.
-##  Edit this file to make sure it has all the right information.
-##
-##  This file does not define the system-specific stuff such as which
-##  compiler to use -- that goes into Makefile.osx, Makefile.mingw32,
-##  Makefile.linux etc.  Those files all include this file, so that
-##  they all have a consistent set of project data.
-##
-##  To build the plugin project, type
-##
-##    $ gmake -f Makefile.osx
-##
-##  or whatever the equivalent filename suffix is for your platform.
-##
-##  This requires GNU make, which is what you get with OS/X, Linux, or
-##  MinGW/Cygwin on Windows.
-##
-##  (For Windows builds using MS Visual Studio, start instead with the
-##  VampExamplePlugins project found in the build directory of the SDK.)
-
-
-# Edit this to the base name of your plugin library
-#
-PLUGIN_LIBRARY_NAME := tuning-difference
-
-# Edit this to list the .cpp or .c files in your plugin project
-#
-PLUGIN_SOURCES := TuningDifference.cpp plugins.cpp
-
-# Edit this to list the .h files in your plugin project
-#
-PLUGIN_HEADERS := TuningDifference.h
-
-
-##  Normally you should not edit anything below this line
-
-SRC_DIR		:= .
-
-CFLAGS		:= $(ARCHFLAGS) $(CFLAGS)
-CXXFLAGS	:= $(CFLAGS) -I. -I$(VAMPSDK_DIR) $(CXXFLAGS)
-
-LDFLAGS		:= $(ARCHFLAGS) $(LDFLAGS) 
-PLUGIN_LDFLAGS	:= $(LDFLAGS) $(PLUGIN_LDFLAGS)
-
-# Defaults, overridden from the platform-specific Makefile
-VAMPSDK_DIR	?= ../vamp-plugin-sdk
-PLUGIN_EXT	?= .so
-CXX 		?= g++
-CC 		?= gcc
-
-PLUGIN 		:= $(PLUGIN_LIBRARY_NAME)$(PLUGIN_EXT)
-
-PLUGIN_OBJECTS 	:= $(PLUGIN_SOURCES:.cpp=.o)
-PLUGIN_OBJECTS 	:= $(PLUGIN_OBJECTS:.c=.o)
-
-$(PLUGIN): $(PLUGIN_OBJECTS) 
-	   $(CXX) -o $@ $^ $(PLUGIN_LDFLAGS)
-
-$(PLUGIN_OBJECTS): $(PLUGIN_HEADERS)
-
-clean:
-	rm -f $(PLUGIN_OBJECTS)
-
-distclean:	clean
-	rm -f $(PLUGIN)
-
-depend:
-	makedepend -Y -fMakefile.inc $(PLUGIN_SOURCES) $(PLUGIN_HEADERS)
-
-# DO NOT DELETE
-
-TuningDifference.o: TuningDifference.h
-plugins.o: TuningDifference.h
--- a/spectrum-compare/Makefile.linux	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-
-##  Makefile for Vamp plugin using GNU tools on Linux.
-##
-##  Edit this to adjust compiler and library settings when
-##  building for Linux.
-##
-##  Note that the list of source files, etc, goes in Makefile.inc
-##  instead so that it can be included by all platform Makefiles.
-
-
-# For a debug build...
-
-CFLAGS		:= -Wall -Wextra -g -fPIC
-
-# ... or for a release build
-
-#CFLAGS		:= -Wall -Wextra -O3 -msse -msse2 -mfpmath=sse -ftree-vectorize -fPIC
-
-
-# Location of Vamp plugin SDK relative to the project directory
-
-VAMPSDK_DIR	:= ../vamp-plugin-sdk
-
-
-# Libraries and linker flags required by plugin: add any -l<library>
-# options here
-
-PLUGIN_LDFLAGS	:= -shared -Wl,-Bsymbolic -Wl,-z,defs -Wl,--version-script=vamp-plugin.map $(VAMPSDK_DIR)/libvamp-sdk.a
-
-
-# File extension for plugin library on this platform
-
-PLUGIN_EXT	:= .so
-
-
-include Makefile.inc
-
-
--- a/spectrum-compare/Makefile.mingw32	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-
-##  Makefile for Vamp plugin using MinGW tools on Windows.
-##
-##  Edit this to adjust compiler and library settings when
-##  building using MinGW.
-##
-##  Note that the list of source files, etc, goes in Makefile.inc
-##  instead so that it can be included by all platform Makefiles.
-
-TOOLPREFIX     ?= 
-CXX		= $(TOOLPREFIX)g++
-CC		= $(TOOLPREFIX)gcc
-LD		= $(TOOLPREFIX)g++
-AR		= $(TOOLPREFIX)ar
-RANLIB		= $(TOOLPREFIX)ranlib
-
-
-# For a debug build...
-
-CFLAGS		:= -Wall -Wextra -g
-
-# ... or for a release build
-
-#CFLAGS		:= -Wall -Wextra -O3 -ftree-vectorize
-
-
-# Location of Vamp plugin SDK relative to the project directory
-
-VAMPSDK_DIR	:= ../vamp-plugin-sdk
-
-
-# Libraries and linker flags required by plugin: add any -l<library>
-# options here
-
-PLUGIN_LDFLAGS	:= -shared -static -Wl,--retain-symbols-file=vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a
-
-
-# File extension for plugin library on this platform
-
-PLUGIN_EXT	:= .dll
-
-
-include Makefile.inc
--- a/spectrum-compare/Makefile.osx	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-
-##  Makefile for Vamp plugin using command-line tools on OS/X.
-##
-##  Edit this to adjust compiler and library settings when
-##  building for OS/X.
-##
-##  Note that the list of source files, etc, goes in Makefile.inc
-##  instead so that it can be included by all platform Makefiles.
-
-
-# For a debug build...
-
-CFLAGS		:= -Wall -Wextra -g -fPIC
-
-# ... or for a release build
-
-#CFLAGS		:= -Wall -Wextra -O3 -ftree-vectorize -fPIC
-
-
-# Flags to determine processor architecture and system SDK
-
-ARCHFLAGS	?= -mmacosx-version-min=10.6 -arch x86_64 -arch i386
-
-
-# Location of Vamp plugin SDK relative to the project directory
-
-VAMPSDK_DIR	:= ../vamp-plugin-sdk
-
-
-# Libraries and linker flags required by plugin: add any -l<library>
-# options here
-
-PLUGIN_LDFLAGS	:= -dynamiclib -exported_symbols_list vamp-plugin.list $(VAMPSDK_DIR)/libvamp-sdk.a
-
-
-# File extension for plugin library on this platform
-
-PLUGIN_EXT	:= .dylib
-
-
-include Makefile.inc
-
-
--- a/spectrum-compare/TuningDifference.cpp	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
-
-#include "TuningDifference.h"
-
-#include <iostream>
-
-#include <cmath>
-#include <cstdio>
-
-using std::cerr;
-using std::endl;
-
-static double targetFmin = 60.0;
-static double targetFmax = 1500.0;
-
-TuningDifference::TuningDifference(float inputSampleRate) :
-    Plugin(inputSampleRate)
-{
-}
-
-TuningDifference::~TuningDifference()
-{
-}
-
-string
-TuningDifference::getIdentifier() const
-{
-    return "tuning-difference";
-}
-
-string
-TuningDifference::getName() const
-{
-    return "Tuning Difference";
-}
-
-string
-TuningDifference::getDescription() const
-{
-    // Return something helpful here!
-    return "";
-}
-
-string
-TuningDifference::getMaker() const
-{
-    // Your name here
-    return "";
-}
-
-int
-TuningDifference::getPluginVersion() const
-{
-    // Increment this each time you release a version that behaves
-    // differently from the previous one
-    return 1;
-}
-
-string
-TuningDifference::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 "";
-}
-
-TuningDifference::InputDomain
-TuningDifference::getInputDomain() const
-{
-    return FrequencyDomain;
-}
-
-size_t
-TuningDifference::getPreferredBlockSize() const
-{
-    return 16384;
-}
-
-size_t 
-TuningDifference::getPreferredStepSize() const
-{
-    return 0;
-}
-
-size_t
-TuningDifference::getMinChannelCount() const
-{
-    return 2;
-}
-
-size_t
-TuningDifference::getMaxChannelCount() const
-{
-    return 2;
-}
-
-TuningDifference::ParameterList
-TuningDifference::getParameterDescriptors() const
-{
-    ParameterList list;
-    return list;
-}
-
-float
-TuningDifference::getParameter(string) const
-{
-    return 0;
-}
-
-void
-TuningDifference::setParameter(string, float) 
-{
-}
-
-TuningDifference::ProgramList
-TuningDifference::getPrograms() const
-{
-    ProgramList list;
-    return list;
-}
-
-string
-TuningDifference::getCurrentProgram() const
-{
-    return ""; // no programs
-}
-
-void
-TuningDifference::selectProgram(string)
-{
-}
-
-TuningDifference::OutputList
-TuningDifference::getOutputDescriptors() const
-{
-    OutputList list;
-
-    OutputDescriptor d;
-    d.identifier = "cents";
-    d.name = "Tuning Difference";
-    d.description = "Difference in averaged frequency profile between channels 1 and 2, in cents. A positive value means channel 2 is higher.";
-    d.unit = "cents";
-    d.hasFixedBinCount = true;
-    d.binCount = 1;
-    d.hasKnownExtents = false;
-    d.isQuantized = false;
-    d.sampleType = OutputDescriptor::VariableSampleRate;
-    d.hasDuration = false;
-    list.push_back(d);
-
-    d.identifier = "tuningfreq";
-    d.name = "Relative Tuning Frequency";
-    d.description = "Tuning frequency of channel 2, if channel 1 is assumed to contain the same music as it at a tuning frequency of A=440Hz.";
-    d.unit = "hz";
-    d.hasFixedBinCount = true;
-    d.binCount = 1;
-    d.hasKnownExtents = false;
-    d.isQuantized = false;
-    d.sampleType = OutputDescriptor::VariableSampleRate;
-    d.hasDuration = false;
-    list.push_back(d);
-
-    d.identifier = "curve";
-    d.name = "Shift Correlation Curve";
-    d.description = "Correlation between shifted and unshifted sources, for each probed shift in cents.";
-    d.unit = "";
-    d.hasFixedBinCount = true;
-    d.binCount = 1;
-    d.hasKnownExtents = false;
-    d.isQuantized = false;
-    d.sampleType = OutputDescriptor::FixedSampleRate;
-    d.sampleRate = 100;
-    d.hasDuration = false;
-    list.push_back(d);
-
-    int targetBinMin = int(floor(targetFmin * m_blockSize / m_inputSampleRate));
-    int targetBinMax = int(ceil(targetFmax * m_blockSize / m_inputSampleRate));
-    cerr << "target bin range: " << targetBinMin << " -> " << targetBinMax << endl;
-
-    d.identifier = "averages";
-    d.name = "Spectrum averages";
-    d.description = "Average magnitude spectrum for each channel.";
-    d.unit = "";
-    d.hasFixedBinCount = true;
-    d.binCount = (targetBinMax > targetBinMin ? targetBinMax - targetBinMin + 1 : 100);
-    d.hasKnownExtents = false;
-    d.isQuantized = false;
-    d.sampleType = OutputDescriptor::FixedSampleRate;
-    d.sampleRate = 1;
-    d.hasDuration = false;
-    list.push_back(d);
-
-    return list;
-}
-
-bool
-TuningDifference::initialise(size_t channels, size_t stepSize, size_t blockSize)
-{
-    if (channels < getMinChannelCount() ||
-	channels > getMaxChannelCount()) return false;
-
-    if (blockSize != getPreferredBlockSize() ||
-	stepSize != blockSize/2) return false;
-
-    m_blockSize = blockSize;
-
-    reset();
-    
-    return true;
-}
-
-void
-TuningDifference::reset()
-{
-    m_sum[0].clear();
-    m_sum[1].clear();
-    m_frameCount = 0;
-}
-
-TuningDifference::FeatureSet
-TuningDifference::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
-{
-    for (int c = 0; c < 2; ++c) {
-	if (m_sum[c].size() == 0) {
-	    m_sum[c].resize(m_blockSize/2 + 1, 0.0);
-	}
-	for (int i = 0; i <= m_blockSize/2; ++i) {
-	    double energy =
-		inputBuffers[c][i*2  ] * inputBuffers[c][i*2  ] +
-		inputBuffers[c][i*2+1] * inputBuffers[c][i*2+1];
-	    double mag = sqrt(energy);
-	    m_sum[c][i] += mag;
-	    m_sum[c][i/2] += mag;
-	}
-    }
-    
-    ++m_frameCount;
-    return FeatureSet();
-}
-
-TuningDifference::FeatureSet
-TuningDifference::getRemainingFeatures()
-{
-    int n = m_sum[0].size();
-    if (n == 0) return FeatureSet();
-
-    Feature f;
-    FeatureSet fs;
-
-    int maxshift = 2400; // cents
-
-    int bestshift = -1;
-    double bestdist = 0;
-
-    for (int i = 0; i < n; ++i) {
-	m_sum[0][i] /= m_frameCount;
-	m_sum[1][i] /= m_frameCount;
-    }
-
-    for (int c = 0; c < 2; ++c) {
-	double tot = 0.0;
-	for (int i = 0; i < n; ++i) {
-	    tot += m_sum[c][i];
-	}
-	if (tot != 0.0) {
-	    for (int i = 0; i < n; ++i) {
-		m_sum[c][i] /= tot;
-	    }
-	}
-    }
-
-    int targetBinMin = int(floor(targetFmin * m_blockSize / m_inputSampleRate));
-    int targetBinMax = int(ceil(targetFmax * m_blockSize / m_inputSampleRate));
-    cerr << "target bin range: " << targetBinMin << " -> " << targetBinMax << endl;
-	
-    f.values.clear();
-    for (int i = targetBinMin; i < targetBinMax; ++i) {
-	f.values.push_back(m_sum[0][i]);
-    }
-    fs[3].push_back(f);
-    f.values.clear();
-    for (int i = targetBinMin; i < targetBinMax; ++i) {
-	f.values.push_back(m_sum[1][i]);
-    }
-    fs[3].push_back(f);
-
-    f.values.clear();
-    
-    for (int shift = -maxshift; shift <= maxshift; ++shift) {
-
-	double multiplier = pow(2.0, double(shift) / 1200.0);
-	double dist = 0.0;
-
-//	cerr << "shift = " << shift << ", multiplier = " << multiplier << endl;
-
-	int contributing = 0;
-	
-	for (int i = targetBinMin; i < targetBinMax; ++i) {
-
-	    double source = i / multiplier;
-	    int s0 = int(source), s1 = s0 + 1;
-	    double p1 = source - s0;
-	    double p0 = 1.0 - p1;
-
-	    double value = 0.0;
-	    if (s0 >= 0 && s0 < n) {
-		value += p0 * m_sum[1][s0];
-		++contributing;
-	    }
-	    if (s1 >= 0 && s1 < n) {
-		value += p1 * m_sum[1][s1];
-		++contributing;
-	    }
-
-//	    if (shift == -1) {
-//		cerr << "for multiplier " << multiplier << ", target " << i << ", source " << source << ", value " << p0 << " * " << m_sum[1][s0] << " + " << p1 << " * " << m_sum[1][s1] << " = " << value << ", other " << m_sum[0][i] << endl;
-//	    }
-	    
-	    double diff = fabs(m_sum[0][i] - value);
-	    dist += diff;
-	}
-
-	dist /= contributing;
-	
-	f.values.clear();
-	f.values.push_back(dist);
-	char label[100];
-	sprintf(label, "%f at shift %d freq mult %f", dist, shift, multiplier);
-	f.label = label;
-	fs[2].push_back(f);
-
-	if (bestshift == -1 || dist < bestdist) {
-	    bestshift = shift;
-	    bestdist = dist;
-	}
-    }
-
-    f.timestamp = Vamp::RealTime::zeroTime;
-    f.hasTimestamp = true;
-    f.label = "";
-
-    f.values.clear();
-//    cerr << "best dist = " << bestdist << " at shift " << bestshift << endl;
-    f.values.push_back(-bestshift);
-    fs[0].push_back(f);
-
-    f.values.clear();
-    f.values.push_back(440.0 / pow(2.0, double(bestshift) / 1200.0));
-    fs[1].push_back(f);
-    
-    return fs;
-}
-
--- a/spectrum-compare/TuningDifference.h	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-#ifndef TUNING_DIFFERENCE_H
-#define TUNING_DIFFERENCE_H
-
-#include <vamp-sdk/Plugin.h>
-
-using std::string;
-using std::vector;
-
-class TuningDifference : public Vamp::Plugin
-{
-public:
-    TuningDifference(float inputSampleRate);
-    virtual ~TuningDifference();
-
-    string getIdentifier() const;
-    string getName() const;
-    string getDescription() const;
-    string getMaker() const;
-    int getPluginVersion() const;
-    string getCopyright() const;
-
-    InputDomain getInputDomain() const;
-    size_t getPreferredBlockSize() const;
-    size_t getPreferredStepSize() const;
-    size_t getMinChannelCount() const;
-    size_t getMaxChannelCount() const;
-
-    ParameterList getParameterDescriptors() const;
-    float getParameter(string identifier) const;
-    void setParameter(string identifier, float value);
-
-    ProgramList getPrograms() const;
-    string getCurrentProgram() const;
-    void selectProgram(string name);
-
-    OutputList getOutputDescriptors() const;
-
-    bool initialise(size_t channels, size_t stepSize, size_t blockSize);
-    void reset();
-
-    FeatureSet process(const float *const *inputBuffers,
-                       Vamp::RealTime timestamp);
-
-    FeatureSet getRemainingFeatures();
-
-protected:
-    int m_blockSize;
-    vector<double> m_sum[2];
-    int m_frameCount;
-};
-
-
-#endif
--- a/spectrum-compare/plugins.cpp	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-
-#include <vamp/vamp.h>
-#include <vamp-sdk/PluginAdapter.h>
-
-#include "TuningDifference.h"
-
-static Vamp::PluginAdapter<TuningDifference> tdAdapter;
-
-
-const VampPluginDescriptor *
-vampGetPluginDescriptor(unsigned int version, unsigned int index)
-{
-    if (version < 1) return 0;
-
-    switch (index) {
-    case  0: return tdAdapter.getDescriptor();
-    default: return 0;
-    }
-}
-
-
--- a/spectrum-compare/vamp-plugin.list	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-_vampGetPluginDescriptor
--- a/spectrum-compare/vamp-plugin.map	Tue Feb 03 13:53:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-{
-	global: vampGetPluginDescriptor;
-	local: *;
-};