BPM

by fschwiet

HTML

<script src="http://localhost:3000/lib/dsp.js"></script>
<script src="http://localhost:3000/lib/beatdetektor.js"></script>
<div id="output"/>

JavaScript

var windowSize = 1024;
var bd = new BeatDetektor(48,95);

window.AudioContext = window.AudioContext || window.webkitAudioContext;

window.loadAudioData = function(url,callback) {
	var request = new XMLHttpRequest();
	request.open('GET', url, true);
	request.responseType = 'arraybuffer';

	// Decode asynchronously
	request.onload = function() {
		var context = new AudioContext();
		context.decodeAudioData(request.response, function(buffer) {
			callback(buffer);
		});
	}
	request.send();
}

function print(str) {
    var div = $("<div>");
    div.text(str);
    $("#output").append(div);
}

$(function() {
    print("starting....");
    loadAudioData("http://localhost:3000/segment_0001.mp3", function(data) {
        print("have data.");
        
        var channelData = Array.prototype.slice.call(data.getChannelData(0));
        print("have data: " + channelData.length);
        channelData = channelData.slice(0, windowSize * 100);
        var sampleRate = data.sampleRate;
       
        for(var i = 0; i < channelData.length; i += windowSize) {
            var fft = new FFT(1024, sampleRate);
            var subarray = channelData.slice(i, i + windowSize);
            
            if (subarray.length < windowSize) {
                break;
            }
            
            fft.forward(Array.prototype.slice.call(subarray));
            bd.process(i / sampleRate, fft.spectrum);
        }
        
        print("BPM: " + bd.win_val);
        print("Beat length(s): " + 60.0 / bd.win_val);
    });
});