When different musicians or groups perform the same songs or pieces, they may change the tempo, style, instrumentation of the song, but typically retain enough of the melodic and harmonic content to preserve the identity of the piece. This project is concerned with automatic identification of cover versions through cross-correlation of beat-synchronous chroma representations.
See the overview description for more details on cover song detection. See the page on beat tracking and tempo estimation for details of the beat time extraction used as the time base for this processing. . See also the separate page on Chroma Feature Analysis and Synthesis that gives more detail about the feature representation which is used here.
We have collected a small development set of 80 pairs of pop music cover versions that can be used for developing cover systems - see the covers80 dataset page.
We are making the entire MATLAB code for our cover song system available under Gnu GPL. You can download the whole thing in a tar-gzip-ball, labrosa-coversongid.tgz. Here is its README file.
Note that the beat tracking (but not the IF chroma extraction or song matching) has been ported to Java as part of MEAPsoft.
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 = beat(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);
A simple cover song test might look like this:
>> % Check the contents of the file containing the list of soundfiles >> type list.txt bars_smith.mp3 bars_phillips.mp3 river_green.mp3 river_lennox.mp3 >> % Calculate beat-synchronous chroma features for all files >> qlist = calclistftrs('list.txt'); song 1 bars_smith.mp3 -> bars_smith 22:30:31 bars_smith.mp3 ncols=313 bpm=136.3636 song 2 bars_phillips.mp3 -> bars_phillips 22:31:13 bars_phillips.mp3 ncols=354 bpm=138.8889 song 3 river_green.mp3 -> river_green 22:32:31 river_green.mp3 ncols=884 bpm=238.0952 song 4 river_lennox.mp3 -> river_lennox 22:33:33 river_lennox.mp3 ncols=767 bpm=217.3913 >> % Calculate the matrix of cover song similarities >> R = coverTestLists(qlist) R = 0.3852 0.1482 0.0416 0.0364 0.1444 0.3148 0.0330 0.0376 0.0337 0.0290 0.2307 0.0208 0.0376 0.0325 0.0203 0.2373 >> % Leading diagonal is self similarity; first pair match well (0.1482), second doesn't (0.0208)
See also the poster we made describing our system and its top-ranked performance in the MIREX-06 Cover Song Identification Evaluation. Also check out the talk slides from the ICASSP presentation, which include many audio examples.
This material is based in part upon work supported by the National Science Foundation under Grant No. IIS-0238301. 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.