Javascript-Bibliothek zum Ermitteln des Tempos (BPM) eines Songs und zum Beat-Tracking. Es verwendet einen von Simon Dixon verfassten Algorithmus „Beatroot“.
Beispiel-App
Dokumente
In einem Browser
<script src="music-tempo.min.js"></script>
Mit npm:
$ npm i --save Musiktempo
Übergeben Sie dem Konstruktor MusicTempo den Puffer, der Daten im folgenden Format enthält: nicht verschachteltes lineares IEEE754 32-Bit-PCM mit einem Nennbereich zwischen -1 und +1, d. h. 32-Bit-Gleitkommapuffer, wobei jeder Abtastwert zwischen -1,0 und liegt 1,0. Dieses Format wird in der AudioBuffer-Schnittstelle der Web Audio API verwendet. Das vom Konstruktor zurückgegebene Objekt enthält die Eigenschaften tempo
– Tempowert in Schlägen pro Minute und beats
– Array mit Schlagzeiten in Sekunden.
var context = new AudioContext({ sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { var files = fileInput.files; if (files.length == 0) return; var reader = new FileReader(); reader.onload = function(fileEvent) {context.decodeAudioData(fileEvent.target.result, calcTempo); } reader.readAsArrayBuffer(files[0]);}var calcTempo = function (buffer) { var audioData = []; // Nimm den Durchschnitt der beiden Kanäle if (buffer.numberOfChannels == 2) {varchannel1Data = buffer.getChannelData(0);varchannel2Data = buffer.getChannelData(1);var length =channel1Data.length;for (var i = 0; i < length; i++) { audioData[i] = (channel1Data[i] +channel2Data[i]) / 2;} } else {audioData = buffer.getChannelData(0); } var mt = new MusicTempo(audioData); console.log(mt.tempo); console.log(mt.beats);}
In der Node.js-Umgebung kann die Node-Web-Audio-API-Bibliothek verwendet werden
var AudioContext = require("web-audio-api").AudioContext;var MusicTempo = require("music-tempo");var fs = require("fs");var calcTempo = function (buffer) { var audioData = []; // Nimm den Durchschnitt der beiden Kanäle if (buffer.numberOfChannels == 2) {varchannel1Data = buffer.getChannelData(0);varchannel2Data = buffer.getChannelData(1);var length =channel1Data.length;for (var i = 0; i < length; i++) { audioData[i] = (channel1Data[i] +channel2Data[i]) / 2;} } else {audioData = buffer.getChannelData(0); } var mt = new MusicTempo(audioData); console.log(mt.tempo); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var context = new AudioContext();context.decodeAudioData(data, calcTempo);
Sie können ein Objekt mit Parametern als zweites Argument an den Konstruktor übergeben:
var p = { expiryTime: 30, maxBeatInterval: 1.5 };var mt = new MusicTempo(audioData, p);
Am nützlichsten sind maxBeatInterval
/ minBeatInterval
und expiryTime
. Die ersten beiden werden zum Einrichten des maximalen und minimalen BPM verwendet. Der Standardwert für maxBeatInterval
ist 1, was bedeutet, dass der minimale BPM 60 beträgt (60 / 1 = 60). Der Standardwert für minBeatInterval
ist 0,3, was bedeutet, dass der maximale BPM 200 beträgt (60 / 0,3 = 200). Seien Sie vorsichtig, je größer der Wert des maximalen BPM ist, desto größer ist die Wahrscheinlichkeit von 2x-BPM-Fehlern (z. B. wenn der maximale BPM = 210 und das tatsächliche Tempo eines Songs 102 BPM beträgt, können Sie am Ende 204 BPM erhalten). expiryTime
kann verwendet werden, wenn die Audiodatei Stille- oder Fast-Stille-Zeiten aufweist und die Beatverfolgung daher fehlschlägt. Weitere Parameter sind in der Dokumentation aufgeführt.
Benötigt Mokka und Chai
$ npm-Test
Erfordert esdoc
$ esdoc
Erfordert Schluck und Babel. Weitere Abhängigkeiten finden Sie in package.json
$ gulp bauen
MIT-Lizenz