Perpustakaan Javascript untuk mengetahui tempo (BPM) suatu lagu dan pelacakan ketukan. Ini menggunakan algoritma "Beatroot" yang ditulis oleh Simon Dixon
Contoh Aplikasi
dokumen
Di peramban
<skrip src="music-tempo.min.js"></skrip>
Menggunakan npm:
$ npm i --simpan tempo musik
Teruskan ke konstruktor MusicTempo buffer yang berisi data dalam format berikut: IEEE754 non-interleaved PCM linier 32-bit dengan rentang nominal antara -1 dan +1, yaitu buffer floating point 32-bit, dengan masing-masing sampel antara -1,0 dan 1.0. Format ini digunakan dalam antarmuka AudioBuffer dari Web Audio API. Objek yang dikembalikan oleh konstruktor berisi properti tempo
- nilai tempo dalam ketukan per menit dan beats
- larik dengan waktu ketukan dalam hitungan detik.
var konteks = AudioContext baru({ sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { var file = fileInput.file; if (files.length == 0) kembali; var pembaca = FileReader baru(); reader.onload = function(fileEvent) {context.decodeAudioData(fileEvent.target.result, calcTempo); } reader.readAsArrayBuffer(files[0]);}var calcTempo = fungsi (buffer) { var data audio = []; // Ambil rata-rata dari kedua saluran if (buffer.numberOfChannels == 2) {var channel1Data = buffer.getChannelData(0);var channel2Data = buffer.getChannelData(1);var length = channel1Data.length;for (var i = 0; i < panjang; i++) { audioData[i] = (saluran1Data[i] + saluran2Data[i]) / 2;} } lain {audioData = buffer.getChannelData(0); } var mt = MusikTempo baru(audioData); console.log(mt.tempo); console.log(mt.beats);}
Di lingkungan Node.js dapat digunakan perpustakaan node-web-audio-api
var AudioContext = memerlukan("web-audio-api").AudioContext;var MusicTempo = memerlukan("music-tempo");var fs = memerlukan("fs");var calcTempo = function (buffer) { var data audio = []; // Ambil rata-rata dari kedua saluran if (buffer.numberOfChannels == 2) {var channel1Data = buffer.getChannelData(0);var channel2Data = buffer.getChannelData(1);var length = channel1Data.length;for (var i = 0; i < panjang; i++) { audioData[i] = (saluran1Data[i] + saluran2Data[i]) / 2;} } lain {audioData = buffer.getChannelData(0); } var mt = MusikTempo baru(audioData); console.log(mt.tempo); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var konteks = new AudioContext();context.decodeAudioData(data, calcTempo);
Anda dapat meneruskan objek dengan parameter sebagai argumen kedua ke konstruktor:
var p = { ExpiryTime: 30, maxBeatInterval: 1,5 };var mt = new MusicTempo(audioData, p);
Yang paling berguna adalah maxBeatInterval
/ minBeatInterval
dan expiryTime
. Dua yang pertama digunakan untuk mengatur BPM maksimum dan minimum. Nilai default untuk maxBeatInterval
adalah 1 yang berarti BPM minimum adalah 60 (60/1 = 60). Nilai default untuk minBeatInterval
adalah 0,3 yang berarti BPM maksimum adalah 200 (60/0,3 = 200). Hati-hati, semakin besar nilai BPM maksimum, semakin besar kemungkinan kesalahan 2x BPM (misalnya jika BPM maks = 210 dan tempo sebenarnya sebuah lagu 102 BPM, pada akhirnya Anda bisa mendapatkan 204 BPM). expiryTime
dapat digunakan jika file audio memiliki periode hening atau hampir hening dan karena itu pelacakan detak gagal. Parameter lainnya tercantum dalam dokumentasi.
Membutuhkan mocha dan chai
tes $npm
Membutuhkan esdoc
$esdoc
Membutuhkan tegukan dan babel. Dependensi lainnya dapat ditemukan di package.json
$ teguk membangun
Lisensi MIT