Javascript-библиотека для определения темпа (BPM) песни и отслеживания битов. Он использует алгоритм Beatroot, автором которого является Саймон Диксон.
Пример приложения
Документы
В браузере
<script src="music-tempo.min.js"></script>
Использование НПМ:
$ npm i --save music-tempo
Передайте конструктору MusicTempo буфер, содержащий данные в следующем формате: 32-битный линейный PCM IEEE754 без чередования с номинальным диапазоном от -1 до +1, то есть 32-битный буфер с плавающей запятой, с каждой выборкой от -1,0 до 1.0. Этот формат используется в интерфейсе AudioBuffer API веб-аудио. Объект, возвращаемый конструктором, содержит свойства tempo
— значение темпа в ударах в минуту и beats
— массив со временем ударов в секундах.
var context = new AudioContext({ sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { вар файлы = fileInput.files; если (files.length == 0) return; вар читатель = новый FileReader (); reader.onload = function(fileEvent) {context.decodeAudioData(fileEvent.target.result, CalcTempo); } readAsArrayBuffer(files[0]);}var CalcTempo = функция (буфер) { вар audioData = []; // Берем среднее значение двух каналов if (buffer.numberOfChannels == 2) {varchannel1Data =uffer.getChannelData(0);varchannel2Data = buffer.getChannelData(1);var length =channel1Data.length;for (var i = 0; i < length; i++) { audioData[i] = (channel1Data[i] +channel2Data[i]) / 2;} } Еще {audioData = buffer.getChannelData(0); } вар мт = новый MusicTempo (audioData); console.log(mt.tempo); console.log(mt.beats);}
В среде Node.js можно использовать библиотеку node-web-audio-api.
var AudioContext = require("web-audio-api").AudioContext;var MusicTempo = require("music-tempo");var fs = require("fs");var CalcTempo = function (buffer) { вар audioData = []; // Берем среднее значение двух каналов if (buffer.numberOfChannels == 2) {varchannel1Data =uffer.getChannelData(0);varchannel2Data = buffer.getChannelData(1);var length =channel1Data.length;for (var i = 0; i < length; i++) { audioData[i] = (channel1Data[i] +channel2Data[i]) / 2;} } Еще {audioData = buffer.getChannelData(0); } вар мт = новый MusicTempo (audioData); console.log(mt.tempo); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var context = new AudioContext();context.decodeAudioData(data, CalcTempo);
Вы можете передать объект с параметрами в качестве второго аргумента конструктору:
вар р = {expiryTime: 30, maxBeatInterval: 1,5};вар мт = новый MusicTempo (audioData, p);
Наиболее полезными являются maxBeatInterval
/ minBeatInterval
и expiryTime
. Первые два используются для настройки максимального и минимального BPM. Значение по умолчанию для maxBeatInterval
равно 1, что означает, что минимальный BPM равен 60 (60 / 1 = 60). Значение по умолчанию для minBeatInterval
— 0,3, что означает, что максимальный BPM — 200 (60/0,3 = 200). Будьте осторожны, чем больше значение максимального BPM, тем больше вероятность ошибок 2x-BPM (например, если max BPM = 210, а реальный темп песни 102 BPM, в итоге вы можете получить 204 BPM). expiryTime
можно использовать, если в аудиофайле есть периоды тишины или почти тишины, и из-за этого отслеживание битов не удается. Остальные параметры указаны в документации.
Требуется мокко и чай
$ npm тест
Требуется эсдок
$ эсдок
Требуется gulp и Babel. Другие зависимости можно найти в package.json
$ глоток сборки
Лицензия MIT