ビートとダウンビート
ビートは音楽の中で知覚される拍の位置です。ダウンビートは小節の最初の拍、つまり拍子を支える強い「1」です。libsonare はビート検出とダウンビート検出の両方を時刻配列として公開します。
ビート・ダウンビート・小節
ビートは単一の拍です。足で刻むもの、と考えると分かりやすいです。
小節は決まった数の拍をまとめたものです。拍子がその数を表します。4/4 なら 1 小節は 4 拍です。
ダウンビートは各小節の最初の拍で、サイクルの始まりとして感じるアクセントです。ビート追跡はグリッドを与え、ダウンビート検出はグリッドがどこで繰り返し始まるかを教えます。ループ・歌詞・セクションをそろえる先はこのダウンビートです。
ビートが「テンポ÷拍子」では済まない理由
テンポが分かればビートは自明 — タイムラインを等分するだけ、と思うかもしれません。実際の音楽はそれを打ち破ります。テンポは揺れ、奏者は前後に押し引きし、イントロはルバートで、オンセットはノイジーです。素朴な等間隔は演奏とすぐ位相がずれるため、ビート追跡は最適化を解きます。強いオンセットにそろい、かつテンポ付近でほぼ一定の間隔を保つビート時刻を見つけるのです。動的計画法は、最も近いオンセットへ貪欲に吸着して誤差をためるのではなく、全体最適なトレードオフを見つけます。
ビート追跡
ビート追跡は、オンセット強度エンベロープとテンポ推定から始まります。トラッカーはオンセット根拠の強いフレームを評価し、期待される拍周期に近い間隔を保つ列を動的計画法で選びます。
ネイティブ設定で adaptive tempo が有効な場合は、急なジャンプにペナルティを与えつつ、局所的な周期変化にも追従できます。ただしこれは拍の推定であり、スコアレベルの採譜ではありません。
イメージとしては、メトロノームの目盛りを曲の上に重ね、目盛りができるだけ強いオンセットに当たるよう、全体を少しずつ伸縮・平行移動させる作業です。1 か所だけ近い音に合わせると後ろがずれるので、曲全体を見渡して最も整合する置き方を選びます。
ダウンビート追跡
ダウンビートは、ビートを置いた後で推定されます。libsonare は拍子位相を推定し、ビート強度、低域エネルギー、コード変化の根拠、位相の事前情報を使って各拍位置を採点します。そのためダウンビート結果は、通常のビート追跡よりもアレンジ上の手がかりに左右されます。
疎なイントロ、アウフタクト、弱いベース、曖昧な拍子では、知覚される「1」がずれることがあります。UI では絶対的な答えではなく、補助的なオーバーレイとして見せるのが適切です。
言い換えると、ビート追跡が「拍がどこか」を答えるのに対し、ダウンビート追跡は「どの拍が小節の頭か」を答えます。前者は規則的な目盛りだけで決まりますが、後者は低音やコードチェンジといった音楽的なアクセントに頼るため、判断が難しく外れやすい一段上の推定です。
libsonare がどう計算するか
BeatAnalyzer はメル由来のオンセット強度を計算し、BpmAnalyzer で BPM を推定して、候補フレーム上の動的計画法でビートを追跡します。その後、オンセット強度、低域エネルギー、コード変化、拍子位相を含む DownbeatObservations でダウンビートを補正します。detectBeats や detectDownbeats などの公開ヘルパーは、秒単位の Float32Array / float 配列を返します。