Skip to content

クロマ特徴量

クロマは、ハーモニー解析を可能にする表現です。スペクトル全体を 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 音名、と考えると読みやすくなります。

CHROMA · PITCH CLASSIDLE
クロマグラム — ハーモニーを12ビンに畳む

すべての周波数を12のピッチクラスのどれかへ畳み込むため、オクターブは忘れられ、ハーモニーだけが残ります。このクリップは C–Am–F–G を循環します。コードが変わるたびに点灯する行が移るのを見て、再生して進行を追ってください。

クロマがハーモニーに適し、メロディに不向きな理由

問いクロマを使う?理由
キーは何か?はい全体のピッチクラス分布が調性の中心を示します
今鳴っているコードは?はいフレームのクロマがコードテンプレートと一致します
ベースのオクターブは?いいえオクターブは畳み込まれています
リードメロディの音は?いいえピッチ追跡を使います。クロマは旋律線を分離できません
どの楽器か?いいえ音色はスペクトル形状が必要なので MFCC を使います

表現を問いに合わせるのが MIR(Music Information Retrieval、音楽情報検索)で繰り返し問われる技能です。クロマはハーモニーを明確にするため、オクターブと音色の詳細をあえて手放します。

libsonare がクロマをどう構築するか

Chroma クラスは STFT のパワースペクトルにクロマフィルターバンクを適用し、各周波数ビンを(上記のオクターブ包絡で重み付けしながら)そのピッチクラスへ対応づけて 12 ビンへ累積し、フレームごとに最大値が 1.0 になるよう正規化します(L-infinity)。振幅ではなくパワーを入力とするため、強い倍音ほど大きく効きます。

項目内容
基本設定n_chroma = 12fminn_octaves も設定に含まれますが、STFT クロマのフィルターバンクはこれらを参照しません(CQT クロマ側の概念で、指定しても解析範囲は変わりません)
解析窓n_fft = 2048hop_length = 512、Hann 窓
チューニングtuning に A440 からのずれをビン分数で指定します。既定は 0(A440)で、信号からの自動推定は行いません
算出方式STFT ベース、CQT ベース(chromaCqt / chroma_cqtChromaCqtConfiglibrosa.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 に渡してください。

関連: MIR の全体像キー検出コード認識スペクトログラムと STFT