Biblioteca Javascript para averiguar el tempo (BPM) de una canción y realizar un seguimiento del ritmo. Utiliza un algoritmo "Beatroot" escrito por Simon Dixon.
Aplicación de ejemplo
Documentos
en un navegador
<script src="music-tempo.min.js"></script>
Usando npm:
$ npm i --guardar música-tempo
Pasar al constructor MusicTempo el buffer que contiene datos en el siguiente formato: PCM lineal de 32 bits IEEE754 no entrelazado con un rango nominal entre -1 y +1, es decir, buffer de coma flotante de 32 bits, con cada muestra entre -1.0 y 1.0. Este formato se utiliza en la interfaz AudioBuffer de Web Audio API. El objeto devuelto por el constructor contiene propiedades tempo
- valor de tempo en tiempos por minuto y beats
- matriz con tiempos de tiempo en segundos.
var contexto = new AudioContext({ sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { archivos var = fileInput.files; si (archivos.longitud == 0) regresa; var lector = nuevo FileReader(); lector.onload = función(fileEvent) {context.decodeAudioData(fileEvent.target.result, calcTempo); } lector.readAsArrayBuffer(archivos[0]);}var calcTempo = función (búfer) { var datos de audio = []; // Toma el promedio de los dos canales. if (buffer.numberOfChannels == 2) {var canal1Data = buffer.getChannelData(0);var canal2Data = buffer.getChannelData(1);var longitud = canal1Data.length;for (var i = 0; i < longitud; i++) { audioData[i] = (canal1Datos[i] + canal2Datos[i]) / 2;} } más {audioData = buffer.getChannelData(0); } var mt = nuevo MusicTempo(audioData); consola.log(mt.tempo); consola.log(mt.beats);}
En el entorno Node.js se puede utilizar la biblioteca node-web-audio-api
var AudioContext = require("web-audio-api").AudioContext;var MusicTempo = require("music-tempo");var fs = require("fs");var calcTempo = función (búfer) { var datos de audio = []; // Toma el promedio de los dos canales. if (buffer.numberOfChannels == 2) {var canal1Data = buffer.getChannelData(0);var canal2Data = buffer.getChannelData(1);var longitud = canal1Data.length;for (var i = 0; i < longitud; i++) { audioData[i] = (canal1Datos[i] + canal2Datos[i]) / 2;} } más {audioData = buffer.getChannelData(0); } var mt = nuevo MusicTempo(audioData); consola.log(mt.tempo); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var context = new AudioContext();context.decodeAudioData(data, calcTempo);
Puedes pasar un objeto con parámetros como segundo argumento al constructor:
var p = {expiryTime: 30, maxBeatInterval: 1.5 };var mt = new MusicTempo(audioData, p);
Los más útiles son maxBeatInterval
/ minBeatInterval
y expiryTime
. Los dos primeros se utilizan para configurar BPM máximo y mínimo. El valor predeterminado para maxBeatInterval
es 1, lo que significa que el BPM mínimo es 60 (60/1 = 60). El valor predeterminado para minBeatInterval
es 0,3, lo que significa que el BPM máximo es 200 (60/0,3 = 200). Cuidado, cuanto mayor sea el valor del BPM máximo, mayor será la probabilidad de errores de 2x-BPM (por ejemplo, si el BPM máximo = 210 y el tempo real de una canción es 102 BPM, al final puedes obtener 204 BPM). expiryTime
se puede utilizar si el archivo de audio tiene períodos de silencio o casi silencio y debido a eso el seguimiento del ritmo falla. Otros parámetros se enumeran en la documentación.
Requiere moca y chai
prueba $npm
Requiere esdoc
$esdoc
Requiere trago y babel. Otras dependencias se pueden encontrar en package.json
$ trago de construcción
Licencia MIT