adamstark@24: adamstark@24: // This is a skeleton file for use in creating your own plugin adamstark@24: // libraries. Replace BTrackVamp and myPlugin throughout with the name adamstark@24: // of your first plugin class, and fill in the gaps as appropriate. adamstark@24: adamstark@24: adamstark@24: #include "BTrackVamp.h" adamstark@24: adamstark@24: adamstark@24: BTrackVamp::BTrackVamp(float inputSampleRate) : adamstark@24: Plugin(inputSampleRate) adamstark@24: // Also be sure to set your plugin parameters (presumably stored adamstark@24: // in member variables) to their default values here -- the host adamstark@24: // will not do that for you adamstark@24: { adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::~BTrackVamp() adamstark@24: { adamstark@24: } adamstark@24: adamstark@24: string adamstark@24: BTrackVamp::getIdentifier() const adamstark@24: { adamstark@24: return "btrack-vamp"; adamstark@24: } adamstark@24: adamstark@24: string adamstark@24: BTrackVamp::getName() const adamstark@24: { adamstark@24: return "BTrack"; adamstark@24: } adamstark@24: adamstark@24: string adamstark@24: BTrackVamp::getDescription() const adamstark@24: { adamstark@24: // Return something helpful here! adamstark@24: return "A Real-Time Beat Tracker"; adamstark@24: } adamstark@24: adamstark@24: string adamstark@24: BTrackVamp::getMaker() const adamstark@24: { adamstark@24: // Your name here adamstark@24: return "Adam Stark, Matthew Davies and Mark Plumbley"; adamstark@24: } adamstark@24: adamstark@24: int adamstark@24: BTrackVamp::getPluginVersion() const adamstark@24: { adamstark@24: // Increment this each time you release a version that behaves adamstark@24: // differently from the previous one adamstark@24: return 1; adamstark@24: } adamstark@24: adamstark@24: string adamstark@24: BTrackVamp::getCopyright() const adamstark@24: { adamstark@24: // This function is not ideally named. It does not necessarily adamstark@24: // need to say who made the plugin -- getMaker does that -- but it adamstark@24: // should indicate the terms under which it is distributed. For adamstark@24: // example, "Copyright (year). All Rights Reserved", or "GPL" adamstark@24: return ""; adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::InputDomain adamstark@24: BTrackVamp::getInputDomain() const adamstark@24: { adamstark@24: return TimeDomain; adamstark@24: } adamstark@24: adamstark@24: size_t adamstark@24: BTrackVamp::getPreferredBlockSize() const adamstark@24: { adamstark@24: return 1024; // 0 means "I can handle any block size" adamstark@24: } adamstark@24: adamstark@24: size_t adamstark@24: BTrackVamp::getPreferredStepSize() const adamstark@24: { adamstark@24: return 512; // 0 means "anything sensible"; in practice this adamstark@24: // means the same as the block size for TimeDomain adamstark@24: // plugins, or half of it for FrequencyDomain plugins adamstark@24: } adamstark@24: adamstark@24: size_t adamstark@24: BTrackVamp::getMinChannelCount() const adamstark@24: { adamstark@24: return 1; adamstark@24: } adamstark@24: adamstark@24: size_t adamstark@24: BTrackVamp::getMaxChannelCount() const adamstark@24: { adamstark@24: return 1; adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::ParameterList adamstark@24: BTrackVamp::getParameterDescriptors() const adamstark@24: { adamstark@24: ParameterList list; adamstark@24: adamstark@24: // If the plugin has no adjustable parameters, return an empty adamstark@24: // list here (and there's no need to provide implementations of adamstark@24: // getParameter and setParameter in that case either). adamstark@24: adamstark@24: // Note that it is your responsibility to make sure the parameters adamstark@24: // start off having their default values (e.g. in the constructor adamstark@24: // above). The host needs to know the default value so it can do adamstark@24: // things like provide a "reset to default" function, but it will adamstark@24: // not explicitly set your parameters to their defaults for you if adamstark@24: // they have not changed in the mean time. adamstark@24: adamstark@24: // ParameterDescriptor d; adamstark@24: // d.identifier = "parameter"; adamstark@24: // d.name = "Some Parameter"; adamstark@24: // d.description = ""; adamstark@24: // d.unit = ""; adamstark@24: // d.minValue = 0; adamstark@24: // d.maxValue = 10; adamstark@24: // d.defaultValue = 5; adamstark@24: // d.isQuantized = false; adamstark@24: // list.push_back(d); adamstark@24: adamstark@24: return list; adamstark@24: } adamstark@24: adamstark@24: float adamstark@24: BTrackVamp::getParameter(string identifier) const adamstark@24: { adamstark@24: if (identifier == "parameter") { adamstark@24: return 5; // return the ACTUAL current value of your parameter here! adamstark@24: } adamstark@24: return 0; adamstark@24: } adamstark@24: adamstark@24: void adamstark@24: BTrackVamp::setParameter(string identifier, float value) adamstark@24: { adamstark@24: if (identifier == "parameter") { adamstark@24: // set the actual value of your parameter adamstark@24: } adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::ProgramList adamstark@24: BTrackVamp::getPrograms() const adamstark@24: { adamstark@24: ProgramList list; adamstark@24: adamstark@24: // If you have no programs, return an empty list (or simply don't adamstark@24: // implement this function or getCurrentProgram/selectProgram) adamstark@24: adamstark@24: return list; adamstark@24: } adamstark@24: adamstark@24: string adamstark@24: BTrackVamp::getCurrentProgram() const adamstark@24: { adamstark@24: return ""; // no programs adamstark@24: } adamstark@24: adamstark@24: void adamstark@24: BTrackVamp::selectProgram(string name) adamstark@24: { adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::OutputList adamstark@24: BTrackVamp::getOutputDescriptors() const adamstark@24: { adamstark@24: OutputList list; adamstark@24: adamstark@24: // See OutputDescriptor documentation for the possibilities here. adamstark@24: // Every plugin must have at least one output. adamstark@24: adamstark@24: OutputDescriptor d; adamstark@24: d.identifier = "beats"; adamstark@24: d.name = "Beats"; adamstark@24: d.description = "Beat locations"; adamstark@24: d.unit = ""; adamstark@24: d.hasFixedBinCount = true; adamstark@24: d.binCount = 0; adamstark@24: d.hasKnownExtents = false; adamstark@24: d.isQuantized = false; adamstark@24: d.sampleType = OutputDescriptor::VariableSampleRate; adamstark@24: d.sampleRate = m_inputSampleRate; adamstark@24: list.push_back(d); adamstark@24: adamstark@24: return list; adamstark@24: } adamstark@24: adamstark@24: bool adamstark@24: BTrackVamp::initialise(size_t channels, size_t stepSize, size_t blockSize) adamstark@24: { adamstark@24: if (channels < getMinChannelCount() || adamstark@24: channels > getMaxChannelCount()) return false; adamstark@24: adamstark@24: adamstark@24: m_stepSize = stepSize; adamstark@24: m_blockSize = blockSize; adamstark@24: adamstark@24: // Real initialisation work goes here! adamstark@24: adamstark@24: return true; adamstark@24: } adamstark@24: adamstark@24: void adamstark@24: BTrackVamp::reset() adamstark@24: { adamstark@24: // Clear buffers, reset stored values, etc adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::FeatureSet adamstark@24: BTrackVamp::process(const float *const *inputBuffers, Vamp::RealTime timestamp) adamstark@24: { adamstark@24: double frame[m_blockSize]; adamstark@24: adamstark@24: for (int i = 0;i < m_blockSize;i++) adamstark@24: { adamstark@24: frame[i] = (double) inputBuffers[0][i]; adamstark@24: } adamstark@24: adamstark@24: b.processAudioFrame(frame); adamstark@24: adamstark@24: FeatureSet featureSet; adamstark@24: adamstark@24: if (b.beatDueInCurrentFrame()) adamstark@24: { adamstark@24: Feature beat; adamstark@24: beat.hasTimestamp = true; adamstark@24: beat.timestamp = timestamp - Vamp::RealTime::frame2RealTime(m_stepSize, int(m_inputSampleRate + 0.5)); adamstark@24: featureSet[0].push_back(beat); adamstark@24: } adamstark@24: adamstark@24: // Do actual work! adamstark@24: return featureSet; adamstark@24: } adamstark@24: adamstark@24: BTrackVamp::FeatureSet adamstark@24: BTrackVamp::getRemainingFeatures() adamstark@24: { adamstark@24: return FeatureSet(); adamstark@24: } adamstark@24: