曲のテンポ (BPM) を調べたり、ビートを追跡したりするための Javascript ライブラリ。 Simon Dixon が作成したアルゴリズム「Beatroot」を使用します。
サンプルアプリ
ドキュメント
ブラウザで
<script src="music-tempo.min.js"></script>
npm の使用:
$ npm i --save music-tempo
次の形式のデータを含むバッファをコンストラクター MusicTempo に渡します: 公称範囲が -1 から +1 までの非インターリーブ IEEE754 32 ビット リニア PCM、つまり、各サンプルが -1.0 から +1 までの 32 ビット浮動小数点バッファ1.0。この形式は、Web Audio API の AudioBuffer インターフェイスで使用されます。コンストラクターによって返されるオブジェクトには、 tempo
- 1 分あたりのビート数で表したテンポ値、およびbeats
- 秒単位のビート時間を含む配列のプロパティが含まれます。
var context = new AudioContext({sampleRate: 44100 });var fileInput = document.getElementById("fileInput");fileInput.onchange = function () { var ファイル = ファイル入力.ファイル; if (files.length == 0) が戻る; var リーダー = 新しい FileReader(); Reader.onload = function(fileEvent) {context.decodeAudioData(fileEvent.target.result, calcTempo); } Reader.readAsArrayBuffer(files[0]);}var calcTempo = 関数 (バッファ) { var audioData = []; // 2 つのチャネルの平均を取得します if (buffer.numberOfChannels == 2) {var channel1Data =buffer.getChannelData(0);var channel2Data =buffer.getChannelData(1);var length = channel1Data.length;for (var i = 0; i < length; i++) { audioData[i] = (チャンネル 1 データ [i] + チャンネル 2 データ [i]) / 2;} else {audioData =buffer.getChannelData(0); } var mt = 新しい 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) { var audioData = []; // 2 つのチャネルの平均を取得します if (buffer.numberOfChannels == 2) {var channel1Data =buffer.getChannelData(0);var channel2Data =buffer.getChannelData(1);var length = channel1Data.length;for (var i = 0; i < length; i++) { audioData[i] = (チャンネル 1 データ [i] + チャンネル 2 データ [i]) / 2;} else {audioData =buffer.getChannelData(0); } var mt = 新しい MusicTempo(audioData); console.log(mt.tempo); console.log(mt.beats);}var data = fs.readFileSync("songname.mp3");var context = new AudioContext();context.decodeAudioData(data, calcTempo);
パラメーターを含むオブジェクトを 2 番目の引数としてコンストラクターに渡すことができます。
var p = { expiryTime: 30, maxBeatInterval: 1.5 };var mt = new MusicTempo(audioData, p);
最も便利なのはmaxBeatInterval
/ minBeatInterval
およびexpiryTime
です。最初の 2 つは、最大 BPM と最小 BPM を設定するために使用されます。 maxBeatInterval
のデフォルト値は 1 で、最小 BPM が 60 (60 / 1 = 60) であることを意味します。 minBeatInterval
のデフォルト値は 0.3 で、これは最大 BPM が 200 (60 / 0.3 = 200) であることを意味します。最大 BPM の値が大きくなるほど、2x-BPM エラーが発生する可能性が高くなります (たとえば、最大 BPM = 210 で曲の実際のテンポが 102 BPM の場合、最終的には 204 BPM が得られます)。 expiryTime
オーディオ ファイルに無音またはほぼ無音の期間があり、そのためにビート追跡が失敗する場合に使用できます。他のパラメータはドキュメントに記載されています。
モカとチャイが必要です
$npmテスト
esdocが必要です
$エスドック
gulp と babel が必要です。他の依存関係はpackage.json
にあります。
$ gulp ビルド
MITライセンス