テンポ(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)