クロマ特徴量
クロマは、ハーモニー解析を可能にする表現です。スペクトル全体を 12 のピッチクラスビン — C、C♯、D、… B — へ畳み込み、各フレームが「C のエネルギーはどれだけ、C♯ はどれだけ…」をオクターブによらず示します。キー検出もコード認識もここから読み取ります。本ページは MIR の全体像 のハーモニーの節を掘り下げます。
ピッチクラス: オクターブを忘れる
ピッチクラスは、ある音名のすべてのオクターブをひとまとめにします。C2、C3、C4 は別々の音高ですが、同じピッチクラス「C」です。西洋音楽には半音ごとに 12 のピッチクラスがあります。クロマは STFT フレーム内の全周波数に広がるエネルギーを、その 12 ビンへ合算します — どのオクターブで弾かれた C も同じビンに入ります。
ただし、すべてのオクターブが同じ重みで足されるわけではありません。libsonare のフィルターバンクは librosa のリファレンスに合わせ、C5 付近を中心とする幅 2 オクターブほどのガウス包絡で各ビンの寄与に重みを付けます。そのため中音域の成分がクロマベクトルを支配し、とても低いベース音やとても高い倍音の寄与は小さくなります。はっきり聞こえているベースラインがクロマグラム上では薄く見えるのは、このためです。
この意図的な「忘却」が要点です。ハーモニーはどのオクターブではなくどの音の話です。C メジャーコードは、低く配置されても高く配置されても C メジャーコードです。オクターブを畳み込むことで、各時点のハーモニーを表す 12 次元のすっきりした指紋が得られます。
たとえば低い C、中央の C、高い C が同時に鳴っていても、クロマでは全部 C のビンに足されます。一方で、C と E と G が強ければ C メジャーらしい、A と C と E が強ければ A マイナーらしい、という判断に使えます。つまりクロマは「音名の分布」を見る道具です。
クロマグラム: 時間軸上のクロマ
各フレームのクロマベクトルを積み重ねるとクロマグラムになります — ピッチクラスのエネルギーが曲の中をどう動くかを示す 12 行の画像です。持続するコードは安定した水平の帯として現れ、キーの変化は点灯し続けるビンを移します。ビジュアライザーはこれを直接描き、アナライザーはここからパターンを読み出します。
フレームは「音声を短く切った 1 コマ」です。動画が静止画の連続でできているように、クロマグラムは短い時間ごとのクロマを横に並べたものです。横方向が時間、縦方向が 12 音名、と考えると読みやすくなります。
クロマがハーモニーに適し、メロディに不向きな理由
| 問い | クロマを使う? | 理由 |
|---|---|---|
| キーは何か? | はい | 全体のピッチクラス分布が調性の中心を示します |
| 今鳴っているコードは? | はい | フレームのクロマがコードテンプレートと一致します |
| ベースのオクターブは? | いいえ | オクターブは畳み込まれています |
| リードメロディの音は? | いいえ | ピッチ追跡を使います。クロマは旋律線を分離できません |
| どの楽器か? | いいえ | 音色はスペクトル形状が必要なので MFCC を使います |
表現を問いに合わせるのが MIR(Music Information Retrieval、音楽情報検索)で繰り返し問われる技能です。クロマはハーモニーを明確にするため、オクターブと音色の詳細をあえて手放します。
libsonare がクロマをどう構築するか
Chroma クラスは STFT のパワースペクトルにクロマフィルターバンクを適用し、各周波数ビンを(上記のオクターブ包絡で重み付けしながら)そのピッチクラスへ対応づけて 12 ビンへ累積し、フレームごとに最大値が 1.0 になるよう正規化します(L-infinity)。振幅ではなくパワーを入力とするため、強い倍音ほど大きく効きます。
| 項目 | 内容 |
|---|---|
| 基本設定 | n_chroma = 12。fmin と n_octaves も設定に含まれますが、STFT クロマのフィルターバンクはこれらを参照しません(CQT クロマ側の概念で、指定しても解析範囲は変わりません) |
| 解析窓 | n_fft = 2048/hop_length = 512、Hann 窓 |
| チューニング | tuning に A440 からのずれをビン分数で指定します。既定は 0(A440)で、信号からの自動推定は行いません |
| 算出方式 | STFT ベース、CQT ベース(chromaCqt / chroma_cqt、ChromaCqtConfig。librosa.feature.chroma_cqt の直接の相当)、CENS(ChromaCensConfig) |
| コード向け変種 | NnlsChromaConfig(非負最小二乗)で倍音の影響を抑える |
クロマは KeyAnalyzer(Krumhansl-Schmuckler 系)と ChordAnalyzer(テンプレートマッチング)で使われるため、クロマ段を改善すると下流の 2 機能が同時に良くなります。
チューニングは自動推定されません
ChromaConfig.tuning の既定は 0、つまり A440 で、libsonare がこれを信号から推定することはありません。librosa.feature.chroma_stft は既定の tuning=None でまず estimate_tuning() を実行するので、この点で挙動が異なります。A440 から半音の何分の一かずれた録音では、ピッチクラスの格子が実際の倍音列と合わなくなり、エネルギーが隣のビンへにじみ、キーやコードの結果が何の警告もないまま劣化します。
素材が A440 でない可能性がある場合 — 古い録音、テープ、生演奏、意図的に別の基準ピッチで演奏されたもの — は、音声に対して estimateTuning()/estimate_tuning() を実行し、その結果を tuning に渡してください。