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);
});
});