テンポ(BPM)検出(計測)精度はどれぐらい必要なのか?
(写真はイメージです)
今回は、既存の楽曲音源のテンポ(BPM)を検出(計測)する際に必要な精度についてお話しようと思います。
既存の楽曲音源について、以下のようなことでお悩みの方に特におススメの内容の内容です。
- 検出(計測)してもテンポ(BPM)が合わない
- どれぐらいの精度でテンポ(BPM)を設定すればよいかわからない
カバー曲音源を制作する場合などには「テンポ(BPM)を原曲に揃えたい」ということがあるかと思います。
テンポ(BPM)は整数値で指定されることが多いですが、
対象となる原曲の既存音源は、必ずしもテンポ(BPM)が整数値になっておらず、
検出(計測)しようとすると、小数点以下での格闘になることも多いかと思います。
そうなると
「どこまで細かく追えばよいのだろうか・・・」
と、途方に暮れる方もいらっしゃるのではないでしょうか?
最初に結論をお伝えしておきますと、以下最小値~最大値のBPM値になっていれば、まずOKです(デジタルオーディオにおけるサンプリングレートの影響は無視して導出)。
- 最小値:bpm/(1+te/T)
- 最大値:bpm/(1-te/T)
(各文字の意味は以下の通り(全て正の値でte<T))
- bpm:真のBPM値[1/min]
- T:曲長さ[s]
- te:曲中の許容ずれ時間[s]
式だけだとイメージしにくいと思いますが、
例えば、BPM120の4分間の曲において、(テンポ検出誤差によって生じる)0.01s(10ms)の時間ずれが許容可能な場合、BPMの設定単位が0.001であることを仮定しますと、
119.996~120.005
の間で検出できればよいことになります。
「意外と細かいな」と思われる方もいらっしゃるかもしれませんね。
もっとも、実用上は真のテンポ(BPM)がわからないので、この値レベルを念頭において、テンポ(BPM)を探っていけばよいかと思います。
以下、少し詳しくお伝えしていきます。
1.基本的な考え方
自分が作った曲ならともかく、他人の、それも音源ファイルしかない曲のBPM値を完全に特定するのは困難です。
そこで「これぐらいの精度で検出できればよい」と、ある程度割り切ることを考えます。
BPM値のずれは、原曲との時間ずれに影響してきますが、この時間ずれが許容できるレベル(許容ずれ時間)以下になっていれば、問題ないので、
「許容ずれ時間から必要な検出精度を求める」
ことにします。
最初に結果を述べると、冒頭でお伝えした通り、真のBPM値bpm、曲長さT[s]、許容ずれ時間te[s](全て正の値でte<T)に対して、以下最小値~最大値のBPM値になっていれば、まずOK、ということになります(デジタルオーディオにおけるサンプリングレートの影響は無視して導出)。
- 最小値:bpm/(1+te/T)
- 最大値:bpm/(1-te/T)
この式から、
- BPM値(bpm)が小さい(テンポが遅い)ほど
- 許容ずれ時間teが小さい(少しのずれも許さない)ほど
- 長い曲(Tが大きい)ほど
最小値~最大値間の差が小さくなり、それだけシビアな検出が要求される傾向にあることがわかります。
式だけだとわかりにくいところもありますので、実例を1つ。
例えば、真のBPM値が120、曲長さTが240s(4分)の曲に対し、BPMを0.001単位で設定できるDAWソフト上で、許容ずれ時間を0.01s(10ms)以下にしたい場合、
- 最小値:119.996
- 最大値:120.005
となります。
もっとも、実用上は真のBPM値がわからないので、
- BPM値を整数レベルで絞り込む(「あたり」をつける)
- 「あたり」をつけたBPM値と、上記最小値~最大値間の値差を参考に、小数点以下でBPM値を探っていく
というようにすると、よろしいかと思います。
なお、許容ずれ時間は、その時間分ずれた2つの音が重なっても、聴感上目立たないレベルで考えるとよいでしょう。
その意味で、上の例で挙げた0.01s(10ms)という値も、それほど悪いものではないと思います(厳密に聴くと気づくレベルかもしれませんが)。
2.導出過程
これまでお伝えしてきた最小値、最大値の式を導出する過程を述べます。
説明の前に、今回の考察に関係する値(既出のもの含む)の文字定義を、以下に示しておきます(全て正の値でte<T)。
- 真のBPM値bpm[1/min]
- 検出BPM値bpm'[1/min]
- bpmに対応する一拍あたりの時間t(=60/bpm)[s]
- bpm'に対応する一拍あたりの時間t'(=60/bpm')[s]
- 曲長さT[s]
- 繰り返し数n(=T/t)
- 許容ずれ時間te[s]
真のBPM値と検出BPM値とのずれによって「一拍あたりt'-tの時間差」が生じます。
この差は曲が進むにつれて、どんどん積み上がっていきます。
曲長さT分の時間中「一拍あたりt'-tの時間差」がn回繰り返されることになるので、曲の最後(時間T経過後)には
(t'-t)*n
の時間ずれが発生します。
nは上の定義からn=T/tなので、これを代入すると
(t'-t)*T/t
となります。
この時間は、曲中の最後、積もりに積もったずれ時間ということですから、これが許容ずれ時間te以内に収まればよいわけです。
なお、ずれの方向には、原曲よりも遅くなる方向、原曲よりも速くなる方向の2通りありますから、これを考慮すると
-te≦T*(t'/t-1)≦te
という条件式(不等式)が得られます。
ここで、tとt'の代わりにBPM値であるbpmとbpm'を用いると、
- t=60/bpm
- t'=60/bpm'
の関係から、上の不等式は
-te≦T*(bpm/bpm'-1)≦te
と表せます。
この不等式から、bpm'の最小値(遅め)と最大値(速め)を求めたものが、以下になります(冒頭及び1で挙げた式)。
- 最小値:bpm/(1+te/T)
- 最大値:bpm/(1-te/T)