Chris@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: /* Chris@0: Vamp feature extraction plugin for the BeatRoot beat tracker. Chris@0: Chris@0: Centre for Digital Music, Queen Mary, University of London. Chris@0: This file copyright 2011 Simon Dixon, Chris Cannam and QMUL. Chris@0: Chris@0: This program is free software; you can redistribute it and/or Chris@0: modify it under the terms of the GNU General Public License as Chris@0: published by the Free Software Foundation; either version 2 of the Chris@0: License, or (at your option) any later version. See the file Chris@0: COPYING included with this distribution for more information. Chris@0: */ Chris@0: Chris@0: #include "BeatRootVampPlugin.h" Chris@2: #include "BeatRootProcessor.h" Chris@0: Chris@9: #include Chris@0: Chris@0: BeatRootVampPlugin::BeatRootVampPlugin(float inputSampleRate) : Chris@0: Plugin(inputSampleRate) Chris@0: { Chris@0: m_processor = new BeatRootProcessor(inputSampleRate); Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::~BeatRootVampPlugin() Chris@0: { Chris@0: delete m_processor; Chris@0: } Chris@0: Chris@0: string Chris@0: BeatRootVampPlugin::getIdentifier() const Chris@0: { Chris@0: return "beatroot"; Chris@0: } Chris@0: Chris@0: string Chris@0: BeatRootVampPlugin::getName() const Chris@0: { Chris@0: return "BeatRoot Beat Tracker"; Chris@0: } Chris@0: Chris@0: string Chris@0: BeatRootVampPlugin::getDescription() const Chris@0: { Chris@0: return "Identify beat locations in music"; Chris@0: } Chris@0: Chris@0: string Chris@0: BeatRootVampPlugin::getMaker() const Chris@0: { Chris@0: return "Simon Dixon (plugin by Chris Cannam)"; Chris@0: } Chris@0: Chris@0: int Chris@0: BeatRootVampPlugin::getPluginVersion() const Chris@0: { Chris@0: // Increment this each time you release a version that behaves Chris@0: // differently from the previous one Chris@0: return 1; Chris@0: } Chris@0: Chris@0: string Chris@0: BeatRootVampPlugin::getCopyright() const Chris@0: { Chris@0: return "GPL"; Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::InputDomain Chris@0: BeatRootVampPlugin::getInputDomain() const Chris@0: { Chris@0: return FrequencyDomain; Chris@0: } Chris@0: Chris@0: size_t Chris@0: BeatRootVampPlugin::getPreferredBlockSize() const Chris@0: { Chris@0: return m_processor->getFFTSize(); Chris@0: } Chris@0: Chris@0: size_t Chris@0: BeatRootVampPlugin::getPreferredStepSize() const Chris@0: { Chris@0: return m_processor->getHopSize(); Chris@0: } Chris@0: Chris@0: size_t Chris@0: BeatRootVampPlugin::getMinChannelCount() const Chris@0: { Chris@0: return 1; Chris@0: } Chris@0: Chris@0: size_t Chris@0: BeatRootVampPlugin::getMaxChannelCount() const Chris@0: { Chris@0: return 1; Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::ParameterList Chris@0: BeatRootVampPlugin::getParameterDescriptors() const Chris@0: { Chris@0: ParameterList list; Chris@0: return list; Chris@0: } Chris@0: Chris@0: float Chris@0: BeatRootVampPlugin::getParameter(string identifier) const Chris@0: { Chris@0: return 0; Chris@0: } Chris@0: Chris@0: void Chris@0: BeatRootVampPlugin::setParameter(string identifier, float value) Chris@0: { Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::ProgramList Chris@0: BeatRootVampPlugin::getPrograms() const Chris@0: { Chris@0: ProgramList list; Chris@0: return list; Chris@0: } Chris@0: Chris@0: string Chris@0: BeatRootVampPlugin::getCurrentProgram() const Chris@0: { Chris@0: return ""; // no programs Chris@0: } Chris@0: Chris@0: void Chris@0: BeatRootVampPlugin::selectProgram(string name) Chris@0: { Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::OutputList Chris@0: BeatRootVampPlugin::getOutputDescriptors() const Chris@0: { Chris@0: OutputList list; Chris@0: Chris@0: // See OutputDescriptor documentation for the possibilities here. Chris@0: // Every plugin must have at least one output. Chris@0: Chris@0: OutputDescriptor d; Chris@0: d.identifier = "beats"; Chris@0: d.name = "Beats"; Chris@0: d.description = "Estimated beat locations"; Chris@0: d.unit = ""; Chris@0: d.hasFixedBinCount = true; Chris@0: d.binCount = 0; Chris@0: d.hasKnownExtents = false; Chris@0: d.isQuantized = false; Chris@0: d.sampleType = OutputDescriptor::VariableSampleRate; Chris@0: d.hasDuration = false; Chris@0: list.push_back(d); Chris@0: Chris@0: return list; Chris@0: } Chris@0: Chris@0: bool Chris@0: BeatRootVampPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) Chris@0: { Chris@0: if (channels < getMinChannelCount() || Chris@0: channels > getMaxChannelCount()) { Chris@0: std::cerr << "BeatRootVampPlugin::initialise: Unsupported number (" Chris@0: << channels << ") of channels" << std::endl; Chris@0: return false; Chris@0: } Chris@0: Chris@0: if (stepSize != getPreferredStepSize()) { Chris@0: std::cerr << "BeatRootVampPlugin::initialise: Unsupported step size " Chris@0: << "for sample rate (" << stepSize << ", required step is " Chris@0: << getPreferredStepSize() << " for rate " << m_inputSampleRate Chris@0: << ")" << std::endl; Chris@0: return false; Chris@0: } Chris@0: Chris@0: if (blockSize != getPreferredBlockSize()) { Chris@0: std::cerr << "BeatRootVampPlugin::initialise: Unsupported block size " Chris@0: << "for sample rate (" << blockSize << ", required size is " Chris@0: << getPreferredBlockSize() << " for rate " << m_inputSampleRate Chris@0: << ")" << std::endl; Chris@0: return false; Chris@0: } Chris@0: Chris@9: m_processor->reset(); Chris@0: Chris@0: return true; Chris@0: } Chris@0: Chris@0: void Chris@0: BeatRootVampPlugin::reset() Chris@0: { Chris@0: m_processor->reset(); Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::FeatureSet Chris@0: BeatRootVampPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp) Chris@0: { Chris@0: // Do actual work! Chris@0: return FeatureSet(); Chris@0: } Chris@0: Chris@0: BeatRootVampPlugin::FeatureSet Chris@0: BeatRootVampPlugin::getRemainingFeatures() Chris@0: { Chris@0: return FeatureSet(); Chris@0: } Chris@0: Chris@0: Chris@0: static Vamp::PluginAdapter brAdapter; Chris@0: Chris@0: const VampPluginDescriptor *vampGetPluginDescriptor(unsigned int version, Chris@0: unsigned int index) Chris@0: { Chris@0: if (version < 1) return 0; Chris@0: Chris@0: switch (index) { Chris@0: case 0: return brAdapter.getDescriptor(); Chris@0: default: return 0; Chris@0: } Chris@0: } Chris@0: