Biblioteca Javascript para descobrir o andamento (BPM) de uma música e rastrear a batida. Ele usa um algoritmo "Beatroot" de autoria de Simon Dixon
Aplicativo de exemplo
Documentos
Em um navegador
<script src="music-tempo.min.js"></script>
Usando npm:
$ npm i --save música-tempo
Passe para o construtor MusicTempo o buffer que contém os dados no seguinte formato: PCM linear de 32 bits IEEE754 não intercalado com faixa nominal entre -1 e +1, ou seja, buffer de ponto flutuante de 32 bits, com cada amostra entre -1,0 e 1,0. Este formato é usado na interface AudioBuffer da API Web Audio. O objeto retornado pelo construtor contém propriedades tempo
- valor do tempo em batidas por minuto e beats
- matriz com tempos de batida em segundos.
var context = new AudioContext({ sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { var arquivos = arquivoInput.files; if (arquivos.length == 0) retornar; var leitor = new FileReader(); leitor.onload = function(fileEvent) {context.decodeAudioData(fileEvent.target.result, calcTempo); } leitor.readAsArrayBuffer(arquivos[0]);}var calcTempo = função (buffer) { var audioData = []; // Calcula a média dos dois canais if (buffer.numberOfChannels == 2) {var canal1Data = buffer.getChannelData(0);var canal2Data = buffer.getChannelData(1);var comprimento = canal1Data.length;for (var i = 0; i < comprimento; i++) { audioData[i] = (canal1Data[i] + canal2Data[i]) / 2;} } else {audioData = buffer.getChannelData(0); } var mt = new MusicTempo(audioData); console.log(mt.tempo); console.log(mt.beats);}
No ambiente Node.js pode ser usada a biblioteca node-web-audio-api
var AudioContext = require("web-audio-api").AudioContext;var MusicTempo = require("music-tempo");var fs = require("fs");var calcTempo = function (buffer) { var audioData = []; // Calcula a média dos dois canais if (buffer.numberOfChannels == 2) {var canal1Data = buffer.getChannelData(0);var canal2Data = buffer.getChannelData(1);var comprimento = canal1Data.length;for (var i = 0; i < comprimento; i++) { audioData[i] = (canal1Data[i] + canal2Data[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);
Você pode passar um objeto com parâmetros como segundo argumento para o construtor:
var p = {expiryTime: 30, maxBeatInterval: 1,5 };var mt = new MusicTempo(audioData, p);
Os mais úteis são maxBeatInterval
/ minBeatInterval
e expiryTime
. Os dois primeiros usados para configurar BPM máximo e mínimo. O valor padrão para maxBeatInterval
é 1, o que significa que o BPM mínimo é 60 (60/1 = 60). O valor padrão para minBeatInterval
é 0,3, o que significa que o BPM máximo é 200 (60/0,3 = 200). Tenha cuidado, quanto maior o valor de BPM máximo, maior a probabilidade de erros de 2x-BPM (por exemplo, se BPM máximo = 210 e o tempo real de uma música 102 BPM, no final você pode obter 204 BPM). expiryTime
pode ser usado se o arquivo de áudio tiver períodos de silêncio ou quase silêncio e por causa disso o rastreamento da batida estiver falhando. Outros parâmetros estão listados na documentação.
Requer mocha e chai
$ teste npm
Requer esdoc
$esdoc
Requer gole e babel. Outras dependências podem ser encontradas em package.json
$ construção gole
Licença MIT