Skip to content

ビートとダウンビート

ビートは音楽の中で知覚される拍の位置です。ダウンビートは小節の最初の拍、つまり拍子を支える強い「1」です。libsonare はビート検出とダウンビート検出の両方を時刻配列として公開します。

ビート・ダウンビート・小節

ビートは単一の拍です。足で刻むもの、と考えると分かりやすいです。

小節は決まった数の拍をまとめたものです。拍子がその数を表します。4/4 なら 1 小節は 4 拍です。

ダウンビートは各小節の最初の拍で、サイクルの始まりとして感じるアクセントです。ビート追跡はグリッドを与え、ダウンビート検出はグリッドがどこで繰り返し始まるかを教えます。ループ・歌詞・セクションをそろえる先はこのダウンビートです。

DETECTOR · BEAT / DOWNBEATIDLE
ビートとダウンビート — 小節の頭を見つける

ビートは一定の拍、ダウンビートは各小節の頭にあたる強い「1」です。表示を切り替えると、すべての拍から小節の頭だけへと絞り込まれ、マーカーがぐっと減って1小節ごとの間隔になります。再生すると、カウントがリセットされる位置が体感できます。

検出

ビートが「テンポ÷拍子」では済まない理由

テンポが分かればビートは自明 — タイムラインを等分するだけ、と思うかもしれません。実際の音楽はそれを打ち破ります。テンポは揺れ、奏者は前後に押し引きし、イントロはルバート(テンポを自由に伸び縮みさせる演奏)で、オンセットはノイジーです。素朴な等間隔は演奏とすぐ位相がずれるため、ビート追跡は最適化を解きます。強いオンセットにそろい、かつテンポ付近でほぼ一定の間隔を保つビート時刻を見つけるのです。動的計画法は、最も近いオンセットへ貪欲に吸着して誤差をためるのではなく、全体最適なトレードオフを見つけます。

ビート追跡

ビート追跡は、オンセット強度包絡線とテンポ推定から始まります。トラッカーはオンセット根拠の強いフレームを評価し、期待される拍周期に近い間隔を保つ列を動的計画法で選びます。

ネイティブ設定で adaptive tempo が有効な場合は、急なジャンプにペナルティを与えつつ、局所的な周期変化にも追従できます。ただしこれは拍の推定であり、スコアレベルの採譜ではありません。

イメージとしては、メトロノームの目盛りを曲の上に重ね、目盛りができるだけ強いオンセットに当たるよう、全体を少しずつ伸縮・平行移動させる作業です。1 か所だけ近い音に合わせると後ろがずれるので、曲全体を見渡して最も整合する置き方を選びます。

ダウンビート追跡

ダウンビートは、ビートを置いた後で推定されます。libsonare は拍子位相を推定し、ビート強度、低域エネルギー、位相の事前情報を使って各拍位置を採点します。そのためダウンビート結果は、通常のビート追跡よりもアレンジ上の手がかりに左右されます。

コード変化も 4 つめの手がかりになりますが、これはコードが分かってからでないと使えません。曲全体を解析する経路はコードを検出したうえで、その根拠を加えてダウンビートをもう一度補正します。単体の detectDownbeats はこの段階まで進みません。ダウンビートの位置が重要で、かつアレンジの中でハーモニーが最も明確な手がかりである場合は、曲全体の解析を呼んでください。

疎なイントロ、アウフタクト(小節の頭より前から入る弱起)、弱いベース、曖昧な拍子では、知覚される「1」がずれることがあります。UI では絶対的な答えではなく、補助的なオーバーレイとして見せるのが適切です。

言い換えると、ビート追跡が「拍がどこか」を答えるのに対し、ダウンビート追跡は「どの拍が小節の頭か」を答えます。前者は規則的な目盛りだけで決まりますが、後者は低音やコードチェンジといった音楽的なアクセントに頼るため、判断が難しく外れやすい一段上の推定です。

libsonare がどう計算するか

BeatAnalyzer はメル由来のオンセット強度を計算し、BpmAnalyzer で BPM を推定して、候補フレーム上の動的計画法でビートを追跡します。その後、オンセット強度、低域エネルギー、拍子位相を含む DownbeatObservations でダウンビートを補正します。この時点ではコード変化の項は空で、MusicAnalyzer がコード検出のあとに同じ補正をもう一度呼び出して埋めます。detectBeatsdetectDownbeats などの公開ヘルパーは、秒単位の Float32Array / float 配列を返し、コードを使わない 1 回目の補正で止まります。

関連: オンセット検出テンポと BPMコード認識