コード進行認識の古典を読む

Data Science

2019.9.12

Topics

 こんにちは。データサイエンスチームのtmtkです。
 この記事では、曲のコード進行をコンピュータで認識する手法についての論文「Realtime Chord Recognition of Musical Sound: a System Using Common Lisp Music」を紹介します。

はじめに

コード進行

 曲にはコード進行というものが(多くの場合)あります。コード(chord)というのは日本語でいうと和音です。曲中で使われているコード(和音)を順番に並べたものをコード進行といいます。プログラミングのコード(code)とは違う語です。
 たとえば、The Beatlesの「Let It Be」のコード進行は「C G Am ConE F……」となっています

 曲のコード進行は伴奏を要約して表していると考えることができます。そのため、メロディーと歌詞に加えてコード進行がわかれば、たとえば曲を弾き語りすることができます。ポピュラー音楽ではメロディー(と歌詞)とコード進行が重要なため、これらの要素だけを記したリードシートという楽譜が使われることもあります。

 このようにコード進行は曲の重要な情報です。しかし、コードというのは「ドミソ」のように一般に複数の音が重なってできているため、曲から直接聞き取ることは容易でなく、うまく聞き取れるようになるにはいわゆる音感を訓練する必要があります。

コード進行認識

 重要な情報でありながら曲から聞き取るのが難しいコード進行を、コンピュータに聞き取らせるコード進行認識という技術があります。
 既にソフトウェアになっており、スマートフォンアプリの「Chord Tracker」ウェブアプリケーションのChordifyなどがあります。

 この記事では、1999年に発表されたコード進行認識の古典的な論文である「Takuya Fujishima, Realtime Chord Recognition of Musical Sound: a System Using Common Lisp Music」を紹介・解説します。

論文について

 当該論文で提案されている手法は、大きく以下の3つのステップを踏んでいるようです。

  1. 離散フーリエ変換で音信号を周波数スペクトルに変換する
  2. 周波数スペクトルからPitch Class Profileを計算する
  3. Pitch Class Profileに対して、最近傍法か「Weighted Sum Method」でパターンマッチングをし、コードを決定する

 離散フーリエ変換については当テックブログの以前の記事で紹介しています。

関連記事
高速フーリエ変換で畳み込みを高速化する 1. 離散フーリエ変換入門

 手順1では離散フーリエ変換を使って音信号を周波数スペクトルに変換しています。簡単にいえば鳴っている音の高さを調べているということです。
 Pitch Class Profileは各要素が非負の12次元のベクトルで、C, C♯, D, D♯, E, F, F♯, G, G♯, A, A♯, Bの12音がそれぞれどれくらいの強さで鳴っているかを表しているものです。

 手順3では、Pitch Class Profileからパターンマッチングでコードを決定しています。ここでは「最近傍法」と「Weighted Sum Method」の2つの手法が提案されています。
 どちらの場合も、各コードに対して手本となるPitch Class Profileを設定し、それとの近さを調べる手法をとっています。例を挙げて説明します。
 コード「CM7」は、「C, E, G, B」の4つの音からなります。そこで、コード「CM7」をベクトル\left(1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1\right)と符号化します。論文中では、これをコードタイプM7に対する「Chord Type Template」と読んでいます。すべてのコードタイプに対して、この「Chord Type Template」を計算しておきます。

 最近傍法では、曲から計算したPitch Class ProfileとChord Type Template(を手作業でチューニングしたもの)の距離が一番近くなるようなコードを正解コードとして採用します。「Weighted Sum Method」では、Pitch Class ProfileとChord Type Template(を手作業でチューニングしたもの)の内積が一番大きくなるようなコードを正解コードとして採用します。コードのルートがCでない場合にも対応するため、Pitch Class Profileを「回転」させて、12種類のすべての音に対してそれがルートになっている場合についても計算します。

 これが論文中の手法の大枠です。これに加えて、いくつかのヒューリスティクスが加えられていますが、詳しくは論文をご参照ください。
 評価実験として、キーボードで鳴らしたコードを判定できるか、また実際の曲(スメタナの「モルダウ」)でコードを判定できるかが試されています。キーボードで鳴らしたコードは、最近傍法もWeighted Sum Methodもうまくいったが、実際の曲ではWeighted Sum Methodしかうまくいかなかったことが述べられています。
 また、実装をCommon Lispで行ったことなども書かれており、当時(1999年)のAI研究の空気が感じられます。

周辺の話題

 この論文の著者と思われる藤島琢哉氏が「Stanford大学CCRMA最新レポート」を書いています。これを読むと、当時著者が所属企業からStanford大学に派遣されていたことをうかがい知ることができます。また、当時のStanford大学のCCRMA(音楽・音響×コンピュータの研究所)の様子が伝わってきて興味深いです。
 今回紹介した論文は1999年の発表ですが、この分野はその後隠れマルコフモデルを応用したもの(2003年)RNNを応用したもの(2013年)に発展しているようです。

おわりに

 この記事では、コード進行認識の古典的な論文を紹介しました。

tmtk

データ分析と機械学習とソフトウェア開発をしています。 アルゴリズムとデータ構造が好きです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら