Identifying the beat times in music audio is a useful precursor for other operations, since the beats define the most relevant "time base" for things like feature extraction and structure discovery. This page presents information on our beat tracking / tempo extraction tools, which are based on a simple dynamic-programming approach.
Note: The beat-tracking code is also distributed as part of our cover song detection system. It has also been ported to Java as part of MEAPsoft.
You might also be interested in beatsimple.m, the stripped-down dynamic programming routine references in the JNMR paper below, and beatdyn.m, a modified routine that attempts to track time-varying tempo (at the expense of global optimality for any single tempo).
Here's an example of beat-tracking a music sample, then playing it along with its extracted click-track:
>> % Load a song >> [d,sr] = wavread('train/train2.wav'); >> % Calculate the beat times >> b = beat2(d,sr); >> % Resynthesize a blip-track of the same length >> db = mkblips(b,sr,length(d)) >> % Listen to them mixed together >> soundsc(d+db,sr);
We developed this code using the really nice human tapping data collected by Martin McKinney and Dirk Moelants at Philips Research. This was the development data for the 2006 MIREX Beat Tracking evaluation. You can download this data from here as mirex06train.zip (62 MB).
This material is based in part upon work supported by the National Science Foundation under Grants Nos. IIS-0238301 and IIS-0713334. Any opinions, findings and conclusions or recomendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation (NSF).
This work was also supported by the Columbia Academic Quality Fund.