piem@89: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ piem@89: piem@89: /* piem@89: Vamp feature extraction plugins using Paul Brossier's Aubio library. piem@89: piem@89: Copyright (C) 2006-2015 Paul Brossier piem@89: piem@110: This file is part of vamp-aubio-plugins. piem@89: piem@89: vamp-aubio is free software: you can redistribute it and/or modify piem@89: it under the terms of the GNU General Public License as published by piem@89: the Free Software Foundation, either version 3 of the License, or piem@89: (at your option) any later version. piem@89: piem@89: vamp-aubio is distributed in the hope that it will be useful, piem@89: but WITHOUT ANY WARRANTY; without even the implied warranty of piem@89: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the piem@89: GNU General Public License for more details. piem@89: piem@89: You should have received a copy of the GNU General Public License piem@89: along with aubio. If not, see . piem@89: piem@89: */ piem@89: piem@89: #include piem@89: #include "SpecDesc.h" piem@89: piem@89: using std::string; piem@89: using std::vector; piem@89: using std::cerr; piem@89: using std::endl; piem@89: piem@89: SpecDesc::SpecDesc(float inputSampleRate) : piem@89: Plugin(inputSampleRate), piem@89: m_ibuf(0), piem@89: m_pvoc(0), piem@89: m_ispec(0), piem@89: m_specdesc(0), piem@89: m_out(0), piem@89: m_specdesctype(SpecDescFlux) piem@89: { piem@89: } piem@89: piem@89: SpecDesc::~SpecDesc() piem@89: { piem@89: if (m_specdesc) del_aubio_specdesc(m_specdesc); piem@89: if (m_pvoc) del_aubio_pvoc(m_pvoc); piem@89: if (m_ibuf) del_fvec(m_ibuf); piem@89: if (m_ispec) del_cvec(m_ispec); piem@89: if (m_out) del_fvec(m_out); piem@89: } piem@89: piem@89: string piem@89: SpecDesc::getIdentifier() const piem@89: { piem@89: return "aubiospecdesc"; piem@89: } piem@89: piem@89: string piem@89: SpecDesc::getName() const piem@89: { piem@89: return "Aubio Spectral Descriptor"; piem@89: } piem@89: piem@89: string piem@89: SpecDesc::getDescription() const piem@89: { piem@89: return "Compute spectral descriptor"; piem@89: } piem@89: piem@89: string piem@89: SpecDesc::getMaker() const piem@89: { piem@89: return "Paul Brossier"; piem@89: } piem@89: piem@89: int piem@89: SpecDesc::getPluginVersion() const piem@89: { piem@89: return 2; piem@89: } piem@89: piem@89: string piem@89: SpecDesc::getCopyright() const piem@89: { piem@89: return "GPL"; piem@89: } piem@89: piem@89: bool piem@89: SpecDesc::initialise(size_t channels, size_t stepSize, size_t blockSize) piem@89: { piem@89: if (channels != 1) { piem@89: std::cerr << "SpecDesc::initialise: channels must be 1" << std::endl; piem@89: return false; piem@89: } piem@89: piem@89: m_stepSize = stepSize; piem@89: m_blockSize = blockSize; piem@89: piem@89: m_ibuf = new_fvec(stepSize); piem@89: m_ispec = new_cvec(blockSize); piem@89: m_out = new_fvec(1); piem@89: piem@89: reset(); piem@89: piem@89: return true; piem@89: } piem@89: piem@89: void piem@89: SpecDesc::reset() piem@89: { piem@89: if (m_pvoc) del_aubio_pvoc(m_pvoc); piem@89: if (m_specdesc) del_aubio_specdesc(m_specdesc); piem@89: piem@89: m_specdesc = new_aubio_specdesc piem@89: (const_cast(getAubioNameForSpecDescType(m_specdesctype)), piem@89: m_blockSize); piem@89: piem@89: m_pvoc = new_aubio_pvoc(m_blockSize, m_stepSize); piem@89: } piem@89: piem@89: size_t piem@89: SpecDesc::getPreferredStepSize() const piem@89: { piem@89: return 512; piem@89: } piem@89: piem@89: size_t piem@89: SpecDesc::getPreferredBlockSize() const piem@89: { piem@89: return 2 * getPreferredStepSize(); piem@89: } piem@89: piem@89: SpecDesc::ParameterList piem@89: SpecDesc::getParameterDescriptors() const piem@89: { piem@89: ParameterList list; piem@89: piem@89: ParameterDescriptor desc; piem@89: desc.identifier = "specdesctype"; piem@89: desc.name = "Spectral Descriptor Type"; piem@89: desc.description = "Type of spectral descriptor to use"; piem@89: desc.minValue = 0; piem@89: desc.maxValue = 7; piem@89: desc.defaultValue = (int)SpecDescFlux; piem@89: desc.isQuantized = true; piem@89: desc.quantizeStep = 1; piem@89: desc.valueNames.push_back("Spectral Flux"); piem@89: desc.valueNames.push_back("Spectral Centroid"); piem@89: desc.valueNames.push_back("Spectral Spread"); piem@89: desc.valueNames.push_back("Spectral Skewness"); piem@89: desc.valueNames.push_back("Spectral Kurtosis"); piem@89: desc.valueNames.push_back("Spectral Slope"); piem@89: desc.valueNames.push_back("Spectral Decrease"); piem@89: desc.valueNames.push_back("Spectral Rolloff"); piem@89: list.push_back(desc); piem@89: piem@89: return list; piem@89: } piem@89: piem@89: float piem@89: SpecDesc::getParameter(std::string param) const piem@89: { piem@89: if (param == "specdesctype") { piem@89: return m_specdesctype; piem@89: } else { piem@89: return 0.0; piem@89: } piem@89: } piem@89: piem@89: void piem@89: SpecDesc::setParameter(std::string param, float value) piem@89: { piem@89: if (param == "specdesctype") { piem@89: switch (lrintf(value)) { piem@89: case 0: m_specdesctype = SpecDescFlux; break; piem@89: case 1: m_specdesctype = SpecDescCentroid; break; piem@89: case 2: m_specdesctype = SpecDescSpread; break; piem@89: case 3: m_specdesctype = SpecDescSkeweness; break; piem@89: case 4: m_specdesctype = SpecDescKurtosis; break; piem@89: case 5: m_specdesctype = SpecDescSlope; break; piem@89: case 6: m_specdesctype = SpecDescDecrease; break; piem@89: case 7: m_specdesctype = SpecDescRolloff; break; piem@89: } piem@89: } piem@89: } piem@89: piem@89: SpecDesc::OutputList piem@89: SpecDesc::getOutputDescriptors() const piem@89: { piem@89: OutputList list; piem@89: piem@89: OutputDescriptor d; piem@89: d.identifier = "specdesc"; piem@89: d.name = "Spectral descriptor output"; piem@89: d.description = "Output of the spectral descpriptor"; piem@89: d.binCount = 1; piem@89: d.isQuantized = true; piem@89: d.quantizeStep = 1.0; piem@89: d.sampleType = OutputDescriptor::OneSamplePerStep; piem@89: list.push_back(d); piem@89: piem@89: return list; piem@89: } piem@89: piem@89: SpecDesc::FeatureSet piem@89: SpecDesc::process(const float *const *inputBuffers, piem@134: UNUSED Vamp::RealTime timestamp) piem@89: { piem@89: for (size_t i = 0; i < m_stepSize; ++i) { piem@89: fvec_set_sample(m_ibuf, inputBuffers[0][i], i); piem@89: } piem@89: piem@89: aubio_pvoc_do(m_pvoc, m_ibuf, m_ispec); piem@89: aubio_specdesc_do(m_specdesc, m_ispec, m_out); piem@89: piem@89: FeatureSet returnFeatures; piem@89: piem@89: Feature specdesc; piem@89: specdesc.hasTimestamp = false; piem@89: specdesc.values.push_back(m_out->data[0]); piem@89: returnFeatures[0].push_back(specdesc); piem@89: piem@89: return returnFeatures; piem@89: } piem@89: piem@89: SpecDesc::FeatureSet piem@89: SpecDesc::getRemainingFeatures() piem@89: { piem@89: return FeatureSet(); piem@89: } piem@89: