# HG changeset patch # User Chris Cannam # Date 1389874745 0 # Node ID 937432fc28982873707b9cd6f0e0eea4b3962964 # Parent 1d750999a9db01ce3bd9fdbe803801756a28ad7b Add output for un-filled (pre-interpolation) beats diff -r 1d750999a9db -r 937432fc2898 BeatRootProcessor.cpp --- a/BeatRootProcessor.cpp Fri Dec 06 15:58:54 2013 +0000 +++ b/BeatRootProcessor.cpp Thu Jan 16 12:19:05 2014 +0000 @@ -31,7 +31,7 @@ } // processFrame() -EventList BeatRootProcessor::beatTrack() { +EventList BeatRootProcessor::beatTrack(EventList *unfilledReturn) { #ifdef DEBUG_BEATROOT std::cerr << "Spectral flux:" << std::endl; @@ -67,7 +67,7 @@ std::cerr << "Onsets: " << onsetList.size() << std::endl; #endif - return BeatTracker::beatTrack(agentParameters, onsetList); + return BeatTracker::beatTrack(agentParameters, onsetList, unfilledReturn); } // processFile() diff -r 1d750999a9db -r 937432fc2898 BeatRootProcessor.h --- a/BeatRootProcessor.h Fri Dec 06 15:58:54 2013 +0000 +++ b/BeatRootProcessor.h Thu Jan 16 12:19:05 2014 +0000 @@ -118,7 +118,7 @@ /** Tracks beats once all frames have been processed by processFrame */ - EventList beatTrack(); + EventList beatTrack(EventList *optionalUnfilledBeatReturn); protected: /** Allocates or re-allocates memory for arrays, based on parameter settings */ diff -r 1d750999a9db -r 937432fc2898 BeatRootVampPlugin.cpp --- a/BeatRootVampPlugin.cpp Fri Dec 06 15:58:54 2013 +0000 +++ b/BeatRootVampPlugin.cpp Thu Jan 16 12:19:05 2014 +0000 @@ -239,6 +239,11 @@ d.hasDuration = false; list.push_back(d); + d.identifier = "unfilled"; + d.name = "Un-interpolated beats"; + d.description = "Locations of detected beats, before agent interpolation occurs"; + list.push_back(d); + return list; } @@ -300,7 +305,8 @@ BeatRootVampPlugin::FeatureSet BeatRootVampPlugin::getRemainingFeatures() { - EventList el = m_processor->beatTrack(); + EventList unfilled; + EventList el = m_processor->beatTrack(&unfilled); Feature f; f.hasTimestamp = true; @@ -315,6 +321,12 @@ fs[0].push_back(f); } + for (EventList::const_iterator i = unfilled.begin(); + i != unfilled.end(); ++i) { + f.timestamp = m_origin + Vamp::RealTime::fromSeconds(i->time); + fs[1].push_back(f); + } + return fs; } diff -r 1d750999a9db -r 937432fc2898 BeatTracker.cpp --- a/BeatTracker.cpp Fri Dec 06 15:58:54 2013 +0000 +++ b/BeatTracker.cpp Thu Jan 16 12:19:05 2014 +0000 @@ -16,7 +16,8 @@ #include "BeatTracker.h" EventList BeatTracker::beatTrack(AgentParameters params, - EventList events, EventList beats) + EventList events, EventList beats, + EventList *unfilledReturn) { AgentList agents; int count = 0; @@ -43,6 +44,7 @@ Agent *best = agents.bestAgent(); EventList results; if (best) { + if (unfilledReturn) *unfilledReturn = best->events; best->fillBeats(beatTime); results = best->events; } diff -r 1d750999a9db -r 937432fc2898 BeatTracker.h --- a/BeatTracker.h Fri Dec 06 15:58:54 2013 +0000 +++ b/BeatTracker.h Thu Jan 16 12:19:05 2014 +0000 @@ -54,19 +54,25 @@ /** Perform beat tracking. * @param events The onsets or peaks in a feature list + * @param unfilledReturn Pointer to list in which to return + * un-interpolated beats, or NULL * @return The list of beats, or an empty list if beat tracking fails */ - static EventList beatTrack(AgentParameters params, EventList events) { - return beatTrack(params, events, EventList()); + static EventList beatTrack(AgentParameters params, EventList events, + EventList *unfilledReturn) { + return beatTrack(params, events, EventList(), unfilledReturn); } /** Perform beat tracking. * @param events The onsets or peaks in a feature list * @param beats The initial beats which are given, if any + * @param unfilledReturn Pointer to list in which to return + * un-interpolated beats, or NULL * @return The list of beats, or an empty list if beat tracking fails */ static EventList beatTrack(AgentParameters params, - EventList events, EventList beats); + EventList events, EventList beats, + EventList *unfilledReturn); // Various get and set methods