# HG changeset patch # User matthiasm # Date 1394124507 0 # Node ID b13d82111c8f36e68dc76d346fc352e65d3ef1a2 # Parent b39d6745c59626a90d40140812eb52e03dbc0e9c# Parent 27682ab6070c1ed50e19d9ec5c6d79388fb767cd merge diff -r b39d6745c596 -r b13d82111c8f Makefile.linux64 --- a/Makefile.linux64 Thu Mar 06 16:47:52 2014 +0000 +++ b/Makefile.linux64 Thu Mar 06 16:48:27 2014 +0000 @@ -1,11 +1,11 @@ -CFLAGS := -Wall -O3 -fPIC -I../vamp-plugin-sdk/ +CFLAGS := -Wall -O3 -fPIC -I../vamp-plugin-sdk/ -I../../vamp-plugin-sdk/ #CFLAGS := -g -fPIC -I../vamp-plugin-sdk CXXFLAGS := $(CFLAGS) -PLUGIN_LDFLAGS := -shared -Wl,-Bstatic -L../vamp-plugin-sdk -lvamp-sdk -Wl,-Bdynamic -Wl,--version-script=vamp-plugin.map -TEST_LDFLAGS := -Wl,-Bstatic -L../vamp-plugin-sdk -lvamp-sdk -Wl,-Bdynamic -lboost_unit_test_framework +PLUGIN_LDFLAGS := -shared -Wl,-Bstatic -L../vamp-plugin-sdk -L../../vamp-plugin-sdk -lvamp-sdk -Wl,-Bdynamic -Wl,--version-script=vamp-plugin.map +TEST_LDFLAGS := -Wl,-Bstatic -L../vamp-plugin-sdk -L../../vamp-plugin-sdk -lvamp-sdk -Wl,-Bdynamic -lboost_unit_test_framework PLUGIN_EXT := .so diff -r b39d6745c596 -r b13d82111c8f Makefile.osx --- a/Makefile.osx Thu Mar 06 16:47:52 2014 +0000 +++ b/Makefile.osx Thu Mar 06 16:48:27 2014 +0000 @@ -1,8 +1,8 @@ ARCHFLAGS := -arch x86_64 -mmacosx-version-min=10.7 -CFLAGS := $(ARCHFLAGS) -O3 -I../vamp-plugin-sdk -I/usr/local/boost -Wall -fPIC +CFLAGS := $(ARCHFLAGS) -O3 -I../vamp-plugin-sdk -I../../vamp-plugin-sdk -I/usr/local/boost -Wall -fPIC CXXFLAGS := $(CFLAGS) -LDFLAGS := -L../vamp-plugin-sdk -lvamp-sdk $(ARCHFLAGS) +LDFLAGS := -L../vamp-plugin-sdk -L../../vamp-plugin-sdk -lvamp-sdk $(ARCHFLAGS) PLUGIN_LDFLAGS := -dynamiclib $(LDFLAGS) -exported_symbols_list vamp-plugin.list TEST_LDFLAGS := $(LDFLAGS) -lboost_unit_test_framework PLUGIN_EXT := .dylib diff -r b39d6745c596 -r b13d82111c8f Yin.cpp --- a/Yin.cpp Thu Mar 06 16:47:52 2014 +0000 +++ b/Yin.cpp Thu Mar 06 16:48:27 2014 +0000 @@ -1,181 +1,181 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - pYIN - A fundamental frequency estimator for monophonic audio - 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 "Yin.h" - -#include "vamp-sdk/FFT.h" -#include "MeanFilter.h" -#include "YinUtil.h" - -#include -#include -#include -#include -#include - -using std::vector; - -Yin::Yin(size_t frameSize, size_t inputSampleRate, double thresh) : - m_frameSize(frameSize), - m_inputSampleRate(inputSampleRate), - m_thresh(thresh), - m_threshDistr(2), - m_yinBufferSize(frameSize/2) -{ - if (frameSize & (frameSize-1)) { - throw "N must be a power of two"; - } -} - -Yin::~Yin() -{ -} - -Yin::YinOutput -Yin::process(const double *in) const { - - double* yinBuffer = new double[m_yinBufferSize]; - - // calculate aperiodicity function for all periods - YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); - YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); - - int tau = 0; - tau = YinUtil::absoluteThreshold(yinBuffer, m_yinBufferSize, m_thresh); - - double interpolatedTau; - double aperiodicity; - double f0; - - if (tau!=0 && tau!=m_yinBufferSize-1) - { - interpolatedTau = YinUtil::parabolicInterpolation(yinBuffer, abs(tau), m_yinBufferSize); - f0 = m_inputSampleRate * (1.0 / interpolatedTau); - } else { - interpolatedTau = 0; - f0 = 0; - } - double rms = std::sqrt(YinUtil::sumSquare(in, 0, m_yinBufferSize)/m_yinBufferSize); - aperiodicity = yinBuffer[abs(tau)]; - // std::cerr << aperiodicity << std::endl; - if (tau < 0) f0 = -f0; - - Yin::YinOutput yo(f0, 1-aperiodicity, rms); - for (size_t iBuf = 0; iBuf < m_yinBufferSize; ++iBuf) - { - yo.salience.push_back(yinBuffer[iBuf] < 1 ? 1-yinBuffer[iBuf] : 0); // why are the values sometimes < 0 if I don't check? - } - - delete [] yinBuffer; - return yo; -} - -Yin::YinOutput -Yin::processProbabilisticYin(const double *in) const { - - double* yinBuffer = new double[m_yinBufferSize]; - - // calculate aperiodicity function for all periods - YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); - YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); - - vector peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize); - - // basic yin output - Yin::YinOutput yo(0,0,0); - for (size_t iBuf = 1; iBuf < m_yinBufferSize-1; ++iBuf) - { - if (peakProbability[iBuf] > 0) - { - double currentF0 = - m_inputSampleRate * (1.0 / - YinUtil::parabolicInterpolation(yinBuffer, iBuf, m_yinBufferSize)); - yo.freqProb.push_back(pair(currentF0, peakProbability[iBuf])); - } - } - - // add salience - for (size_t iBuf = 0; iBuf < m_yinBufferSize; ++iBuf) { - yo.salience.push_back(peakProbability[iBuf]); - } - - // std::cerr << yo.freqProb.size() << std::endl; - - delete [] yinBuffer; - return yo; -} - - -int -Yin::setThreshold(double parameter) -{ - m_thresh = static_cast(parameter); - return 0; -} - -int -Yin::setThresholdDistr(float parameter) -{ - m_threshDistr = static_cast(parameter); - return 0; -} - -int -Yin::setFrameSize(size_t parameter) -{ - m_frameSize = parameter; - m_yinBufferSize = m_frameSize/2; - return 0; -} - -// int -// Yin::setRemoveUnvoiced(bool parameter) -// { -// m_removeUnvoiced = parameter; -// return 0; -// } - -float -Yin::constrainedMinPick(const double *in, const float minFreq, const int maxFreq) const { - - double* yinBuffer = new double[m_yinBufferSize]; - - // calculate aperiodicity function for all periods - YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); - YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); - - int minPeriod = m_inputSampleRate / maxFreq; - int maxPeriod = m_inputSampleRate / minFreq; - - if (minPeriod < 0 || maxPeriod > m_yinBufferSize || minPeriod > maxPeriod) { - delete [] yinBuffer; - return 0.f; - } - - float bestVal = 1000; - int bestTau = 0; - for (int tau = minPeriod; tau <= maxPeriod; ++tau) - { - if (yinBuffer[tau] < bestVal) - { - bestVal = yinBuffer[tau]; - bestTau = tau; - } - } - - float interpolatedTau = - YinUtil::parabolicInterpolation(yinBuffer, bestTau, m_yinBufferSize); - - delete [] yinBuffer; - return m_inputSampleRate * (1.0 / interpolatedTau); +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + pYIN - A fundamental frequency estimator for monophonic audio + 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 "Yin.h" + +#include "vamp-sdk/FFT.h" +#include "MeanFilter.h" +#include "YinUtil.h" + +#include +#include +#include +#include +#include + +using std::vector; + +Yin::Yin(size_t frameSize, size_t inputSampleRate, double thresh) : + m_frameSize(frameSize), + m_inputSampleRate(inputSampleRate), + m_thresh(thresh), + m_threshDistr(2), + m_yinBufferSize(frameSize/2) +{ + if (frameSize & (frameSize-1)) { + // throw "N must be a power of two"; + } +} + +Yin::~Yin() +{ +} + +Yin::YinOutput +Yin::process(const double *in) const { + + double* yinBuffer = new double[m_yinBufferSize]; + + // calculate aperiodicity function for all periods + YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); + YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); + + int tau = 0; + tau = YinUtil::absoluteThreshold(yinBuffer, m_yinBufferSize, m_thresh); + + double interpolatedTau; + double aperiodicity; + double f0; + + if (tau!=0 && tau!=m_yinBufferSize-1) + { + interpolatedTau = YinUtil::parabolicInterpolation(yinBuffer, abs(tau), m_yinBufferSize); + f0 = m_inputSampleRate * (1.0 / interpolatedTau); + } else { + interpolatedTau = 0; + f0 = 0; + } + double rms = std::sqrt(YinUtil::sumSquare(in, 0, m_yinBufferSize)/m_yinBufferSize); + aperiodicity = yinBuffer[abs(tau)]; + // std::cerr << aperiodicity << std::endl; + if (tau < 0) f0 = -f0; + + Yin::YinOutput yo(f0, 1-aperiodicity, rms); + for (size_t iBuf = 0; iBuf < m_yinBufferSize; ++iBuf) + { + yo.salience.push_back(yinBuffer[iBuf] < 1 ? 1-yinBuffer[iBuf] : 0); // why are the values sometimes < 0 if I don't check? + } + + delete [] yinBuffer; + return yo; +} + +Yin::YinOutput +Yin::processProbabilisticYin(const double *in) const { + + double* yinBuffer = new double[m_yinBufferSize]; + + // calculate aperiodicity function for all periods + YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); + YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); + + vector peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize); + + // basic yin output + Yin::YinOutput yo(0,0,0); + for (size_t iBuf = 1; iBuf < m_yinBufferSize-1; ++iBuf) + { + if (peakProbability[iBuf] > 0) + { + double currentF0 = + m_inputSampleRate * (1.0 / + YinUtil::parabolicInterpolation(yinBuffer, iBuf, m_yinBufferSize)); + yo.freqProb.push_back(pair(currentF0, peakProbability[iBuf])); + } + } + + // add salience + for (size_t iBuf = 0; iBuf < m_yinBufferSize; ++iBuf) { + yo.salience.push_back(peakProbability[iBuf]); + } + + // std::cerr << yo.freqProb.size() << std::endl; + + delete [] yinBuffer; + return yo; +} + + +int +Yin::setThreshold(double parameter) +{ + m_thresh = static_cast(parameter); + return 0; +} + +int +Yin::setThresholdDistr(float parameter) +{ + m_threshDistr = static_cast(parameter); + return 0; +} + +int +Yin::setFrameSize(size_t parameter) +{ + m_frameSize = parameter; + m_yinBufferSize = m_frameSize/2; + return 0; +} + +// int +// Yin::setRemoveUnvoiced(bool parameter) +// { +// m_removeUnvoiced = parameter; +// return 0; +// } + +float +Yin::constrainedMinPick(const double *in, const float minFreq, const int maxFreq) const { + + double* yinBuffer = new double[m_yinBufferSize]; + + // calculate aperiodicity function for all periods + YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); + YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); + + int minPeriod = m_inputSampleRate / maxFreq; + int maxPeriod = m_inputSampleRate / minFreq; + + if (minPeriod < 0 || maxPeriod > m_yinBufferSize || minPeriod > maxPeriod) { + delete [] yinBuffer; + return 0.f; + } + + float bestVal = 1000; + int bestTau = 0; + for (int tau = minPeriod; tau <= maxPeriod; ++tau) + { + if (yinBuffer[tau] < bestVal) + { + bestVal = yinBuffer[tau]; + bestTau = tau; + } + } + + float interpolatedTau = + YinUtil::parabolicInterpolation(yinBuffer, bestTau, m_yinBufferSize); + + delete [] yinBuffer; + return m_inputSampleRate * (1.0 / interpolatedTau); } \ No newline at end of file diff -r b39d6745c596 -r b13d82111c8f win32-build/pyin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/win32-build/pyin.pro Thu Mar 06 16:48:27 2014 +0000 @@ -0,0 +1,40 @@ +TEMPLATE = lib + +INCLUDEPATH += ../../../vamp-plugin-sdk/include ../../../boost_1_54_0 +LIBS += ../../../vamp-plugin-sdk/lib/libvamp-sdk.a -Wl,--version-script=../win32-build/vamp-plugin.map + +CONFIG -= qt +CONFIG += plugin release warn_on + +TARGET = pyin + +SOURCES += \ + ../YinUtil.cpp \ + ../Yin.cpp \ + ../SparseHMM.cpp \ + ../MonoPitchHMM.cpp \ + ../MonoPitch.cpp \ + ../MonoNoteParameters.cpp \ + ../MonoNoteHMM.cpp \ + ../MonoNote.cpp \ + ../libmain.cpp \ + ../YinVampFreqConstrained.cpp \ + ../YinVamp.cpp \ + ../PYinVamp.cpp \ + ../LocalCandidatePYIN.cpp + +HEADERS += \ + ../YinUtil.h \ + ../Yin.h \ + ../SparseHMM.h \ + ../MonoPitchHMM.h \ + ../MonoPitch.h \ + ../MonoNoteParameters.h \ + ../MonoNoteHMM.h \ + ../MonoNote.h \ + ../MeanFilter.h \ + ../YinVampFreqConstrained.h \ + ../YinVamp.h \ + ../PYinVamp.h \ + ../LocalCandidatePYIN.h + diff -r b39d6745c596 -r b13d82111c8f win32-build/vamp-plugin.map --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/win32-build/vamp-plugin.map Thu Mar 06 16:48:27 2014 +0000 @@ -0,0 +1,4 @@ +{ + global: vampGetPluginDescriptor; + local: *; +};