Bibliothèque Javascript pour connaître le tempo (BPM) d'une chanson et le suivi des rythmes. Il utilise un algorithme "Beatroot" écrit par Simon Dixon
Exemple d'application
Documents
Dans un navigateur
<script src="musique-tempo.min.js"></script>
Utilisation de npm :
$ npm i --enregistrer le tempo de la musique
Transmettez au constructeur MusicTempo le tampon qui contient les données au format suivant : PCM linéaire 32 bits IEEE754 non entrelacé avec une plage nominale comprise entre -1 et +1, soit un tampon à virgule flottante de 32 bits, avec chaque échantillon entre -1,0 et 1.0. Ce format est utilisé dans l'interface AudioBuffer de l'API Web Audio. L'objet renvoyé par le constructeur contient les propriétés tempo
- valeur du tempo en battements par minute et beats
- tableau avec les temps de battement en secondes.
var contexte = new AudioContext({ sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { var fichiers = fileInput.files; if (files.length == 0) return; var lecteur = new FileReader(); reader.onload = function(fileEvent) {context.decodeAudioData(fileEvent.target.result, calcTempo); } reader.readAsArrayBuffer(files[0]);}var calcTempo = fonction (tampon) { varDonnées audio = []; // Faire la moyenne des deux canaux if (buffer.numberOfChannels == 2) {var canal1Data = buffer.getChannelData(0);var canal2Data = buffer.getChannelData(1);var longueur = canal1Data.length;for (var i = 0; i < longueur; i++) { données audio[i] = (canal1Data[i] + canal2Data[i]) / 2;} } else {audioData = buffer.getChannelData(0); } var mt = nouveau MusicTempo(audioData); console.log(mt.tempo); console.log(mt.beats);}
Dans l'environnement Node.js, la bibliothèque node-web-audio-api peut être utilisée
var AudioContext = require("web-audio-api").AudioContext;var MusicTempo = require("music-tempo");var fs = require("fs");var calcTempo = function (buffer) { varDonnées audio = []; // Faire la moyenne des deux canaux if (buffer.numberOfChannels == 2) {var canal1Data = buffer.getChannelData(0);var canal2Data = buffer.getChannelData(1);var longueur = canal1Data.length;for (var i = 0; i < longueur; i++) { données audio[i] = (canal1Data[i] + canal2Data[i]) / 2;} } else {audioData = buffer.getChannelData(0); } var mt = nouveau MusicTempo(audioData); console.log(mt.tempo); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var context = new AudioContext();context.decodeAudioData(data, calcTempo);
Vous pouvez passer un objet avec des paramètres comme deuxième argument au constructeur :
var p = { expiryTime : 30, maxBeatInterval : 1,5 };var mt = new MusicTempo (audioData, p);
Les plus utiles sont maxBeatInterval
/ minBeatInterval
et expiryTime
. Les deux premiers sont utilisés pour configurer le BPM maximum et minimum. La valeur par défaut de maxBeatInterval
est 1, ce qui signifie que le BPM minimum est de 60 (60/1 = 60). La valeur par défaut de minBeatInterval
est 0,3, ce qui signifie que le BPM maximum est de 200 (60 / 0,3 = 200). Attention, plus le BPM maximum est élevé, plus la probabilité d'erreurs 2x-BPM est élevée (par exemple si le BPM maximum = 210 et le tempo réel d'une chanson à 102 BPM, au final vous pouvez obtenir 204 BPM). expiryTime
peut être utilisé si le fichier audio comporte des périodes de silence ou presque et qu'à cause de cela, le suivi des battements échoue. D'autres paramètres sont répertoriés dans la documentation.
Nécessite du moka et du chai
$npmtest
Nécessite un esdoc
$ esdoc
Nécessite gulp et babel. D'autres dépendances peuvent être trouvées dans package.json
$ gulp construire
Licence MIT