Chris@2: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@2: Chris@2: /* Chris@2: Vamp feature extraction plugin for the BeatRoot beat tracker. Chris@2: Chris@2: Centre for Digital Music, Queen Mary, University of London. Chris@2: This file copyright 2011 Simon Dixon, Chris Cannam and QMUL. Chris@2: Chris@2: This program is free software; you can redistribute it and/or Chris@2: modify it under the terms of the GNU General Public License as Chris@2: published by the Free Software Foundation; either version 2 of the Chris@2: License, or (at your option) any later version. See the file Chris@2: COPYING included with this distribution for more information. Chris@2: */ Chris@2: Chris@2: #include "BeatRootProcessor.h" Chris@2: Chris@2: bool Chris@2: BeatRootProcessor::silent = true; Chris@2: Chris@15: void BeatRootProcessor::processFrame(const float *const *inputBuffers) { Chris@15: double flux = 0; Chris@15: for (int i = 0; i <= fftSize/2; i++) { Chris@15: double mag = sqrt(inputBuffers[0][i*2] * inputBuffers[0][i*2] + Chris@15: inputBuffers[0][i*2+1] * inputBuffers[0][i*2+1]); Chris@15: if (mag > prevFrame[i]) flux += mag - prevFrame[i]; Chris@15: prevFrame[i] = mag; Chris@15: } Chris@15: Chris@15: spectralFlux.push_back(flux); Chris@15: Chris@15: } // processFrame() Chris@15: Chris@36: EventList BeatRootProcessor::beatTrack(EventList *unfilledReturn) { Chris@15: Chris@15: #ifdef DEBUG_BEATROOT Chris@15: std::cerr << "Spectral flux:" << std::endl; Chris@15: for (int i = 0; i < spectralFlux.size(); ++i) { Chris@15: if ((i % 8) == 0) std::cerr << "\n"; Chris@15: std::cerr << spectralFlux[i] << " "; Chris@15: } Chris@15: #endif Chris@15: Chris@15: double hop = hopTime; Chris@15: Peaks::normalise(spectralFlux); Chris@15: vector peaks = Peaks::findPeaks(spectralFlux, (int)lrint(0.06 / hop), 0.35, 0.84, true); Chris@15: onsets.clear(); Chris@15: onsets.resize(peaks.size(), 0); Chris@15: vector::iterator it = peaks.begin(); Chris@15: onsetList.clear(); Chris@15: double minSalience = Peaks::min(spectralFlux); Chris@22: for (int i = 0; i < (int)onsets.size(); i++) { Chris@15: int index = *it; Chris@15: ++it; Chris@15: onsets[i] = index * hop; Chris@15: Event e = BeatTracker::newBeat(onsets[i], 0); Chris@15: // if (debug) Chris@15: // System.err.printf("Onset: %8.3f %8.3f %8.3f\n", Chris@15: // onsets[i], energy[index], slope[index]); Chris@15: // e.salience = slope[index]; // or combination of energy + slope?? Chris@15: // Note that salience must be non-negative or the beat tracking system fails! Chris@15: e.salience = spectralFlux[index] - minSalience; Chris@15: onsetList.push_back(e); Chris@15: } Chris@15: Chris@15: #ifdef DEBUG_BEATROOT Chris@15: std::cerr << "Onsets: " << onsetList.size() << std::endl; Chris@15: #endif Chris@15: Chris@36: return BeatTracker::beatTrack(agentParameters, onsetList, unfilledReturn); Chris@15: Chris@15: } // processFile() Chris@15: