adamstark@5: //======================================================================= adamstark@5: /** @file BTrack.h adamstark@6: * @brief BTrack - a real-time beat tracker adamstark@5: * @author Adam Stark adamstark@5: * @copyright Copyright (C) 2008-2014 Queen Mary University of London adamstark@5: * adamstark@5: * This program is free software: you can redistribute it and/or modify adamstark@5: * it under the terms of the GNU General Public License as published by adamstark@5: * the Free Software Foundation, either version 3 of the License, or adamstark@5: * (at your option) any later version. adamstark@5: * adamstark@5: * This program is distributed in the hope that it will be useful, adamstark@5: * but WITHOUT ANY WARRANTY; without even the implied warranty of adamstark@5: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the adamstark@5: * GNU General Public License for more details. adamstark@5: * adamstark@5: * You should have received a copy of the GNU General Public License adamstark@5: * along with this program. If not, see . adamstark@5: */ adamstark@5: //======================================================================= adamstark@5: adamstark@5: #ifndef __BTRACK_H adamstark@5: #define __BTRACK_H adamstark@5: adamstark@18: #include "OnsetDetectionFunction.h" adamstark@18: adamstark@5: class BTrack { adamstark@5: adamstark@5: public: adamstark@14: adamstark@18: /** constructor assuming hop size of 512 and frame size of 1024 */ adamstark@14: BTrack(); adamstark@14: adamstark@18: /** constructor assuming frame size will be double hopSize adamstark@18: * @param hopSize the step size in audio samples by which we will receive audio frames adamstark@18: */ adamstark@18: BTrack(int hopSize); adamstark@18: adamstark@18: /** constructor taking both hopSize and frameSize adamstark@18: * @param hopSize the step size in audio samples by which we will receive audio frames adamstark@18: * @param frameSize the audio frame size in audio samples adamstark@18: */ adamstark@18: BTrack(int hopSize,int frameSize); adamstark@18: adamstark@14: /** destructor */ adamstark@14: ~BTrack(); adamstark@5: adamstark@18: void initialise(int hopSize,int frameSize); adamstark@14: adamstark@18: /** Initialise with hop size and set all frame sizes accordingly */ adamstark@18: void setHopSize(int hopSize); adamstark@18: adamstark@18: /** Process a single audio frame */ adamstark@18: void processAudioFrame(double *frame); adamstark@18: adamstark@18: /** Add new onset detection function sample to buffer and apply beat tracking */ adamstark@18: void processOnsetDetectionFunctionSample(double sample); adamstark@14: adamstark@14: /** Set the tempo of the beat tracker */ adamstark@17: void settempo(double tempo); adamstark@14: adamstark@14: /** fix tempo to roughly around some value */ adamstark@17: void fixtempo(double tempo); adamstark@14: adamstark@14: /** do not fix the tempo anymore */ adamstark@5: void unfixtempo(); adamstark@18: adamstark@18: static double getBeatTimeInSeconds(long frameNumber,int hopSize,int fs); adamstark@18: adamstark@18: static double getBeatTimeInSeconds(int frameNumber,int hopSize,int fs); adamstark@18: adamstark@5: int playbeat; adamstark@17: double cscoreval; adamstark@17: double est_tempo; adamstark@5: adamstark@5: private: adamstark@14: adamstark@14: /** Convert detection function from N samples to 512 */ adamstark@14: void dfconvert(); adamstark@14: adamstark@14: /** update the cumulative score */ adamstark@17: void updatecumscore(double df_sample); adamstark@14: adamstark@14: /** predicts the next beat */ adamstark@14: void predictbeat(); adamstark@14: adamstark@14: /** Calculates the current tempo expressed as the beat period in detection function samples */ adamstark@14: void calcTempo(); adamstark@14: adamstark@14: /** calculates an adaptive threshold which is used to remove low level energy from detection adamstark@14: * function and emphasise peaks adamstark@14: */ adamstark@17: void adapt_thresh(double *x,int N); adamstark@14: adamstark@14: /** calculates the mean of values in an array from index locations [start,end] */ adamstark@17: double mean_array(double *array,int start,int end); adamstark@14: adamstark@14: /** normalises a given array */ adamstark@17: void normalise(double *array,int N); adamstark@14: adamstark@14: /** calculates the balanced autocorrelation of the smoothed detection function */ adamstark@17: void acf_bal(double *df_thresh); adamstark@14: adamstark@14: /** returns the output of the comb filter */ adamstark@14: void getrcfoutput(); adamstark@5: adamstark@5: // buffers adamstark@17: double *dfbuffer; /**< to hold detection function */ adamstark@17: double df512[512]; /**< to hold resampled detection function */ adamstark@17: double *cumscore; /**< to hold cumulative score */ adamstark@5: adamstark@17: double acf[512]; /**< to hold autocorrelation function */ adamstark@5: adamstark@17: double wv[128]; /**< to hold weighting vector */ adamstark@5: adamstark@17: double rcf[128]; /**< to hold comb filter output */ adamstark@17: double t_obs[41]; /**< to hold tempo version of comb filter output */ adamstark@5: adamstark@17: double delta[41]; /**< to hold final tempo candidate array */ adamstark@17: double prev_delta[41]; /**< previous delta */ adamstark@17: double prev_delta_fix[41]; /**< fixed tempo version of previous delta */ adamstark@5: adamstark@17: double t_tmat[41][41]; /**< transition matrix */ adamstark@5: adamstark@18: OnsetDetectionFunction odf; adamstark@5: adamstark@5: // parameters adamstark@17: double tightness; adamstark@17: double alpha; adamstark@17: double bperiod; adamstark@17: double tempo; adamstark@5: adamstark@5: adamstark@17: double p_fact; adamstark@5: adamstark@5: adamstark@5: // adamstark@5: int m0; // indicates when the next point to predict the next beat is adamstark@5: int beat; adamstark@5: adamstark@5: int dfbuffer_size; adamstark@5: adamstark@5: adamstark@5: int framesize; adamstark@5: adamstark@5: adamstark@5: int tempofix; adamstark@5: adamstark@5: adamstark@5: }; adamstark@5: adamstark@5: #endif