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