さまざまな楽器の音が重なって構成される音楽を、シンプルなアルゴリズムで楽器ごとに分解して楽譜化するツール「Audio Decomposition」を、コンピューターサイエンスを勉強中という高校生のマシュー・バード氏が公開しています。

Matthew Bird - Audio Decomposition

https://matthew-bird.com/blogs/Audio-Decomposition.html

GitHub - mbird1258/Audio-Decomposition

https://github.com/mbird1258/Audio-Decomposition

バード氏によると、Audio Decompositionはもともと「音楽を楽譜に変換したい」という自身のニーズと、オープンソースで簡単なアルゴリズムによる音源分離ツールが不足していることから始まったプロジェクトで、外部の楽器分離ライブラリを使用せずにゼロから開発されています。

Auto Decompositionに音楽ファイルを入力すると、その中に含まれる各楽器のパートを分離し、それぞれの楽器がどの音符をいつ演奏しているかを分析してくれます。以下のムービーでは、ピアノで演奏したドビュッシーの「月の光」をシーケンスに変換した結果を見ることができます。

Audio Decomposition (Clair de Lune) - YouTube

「イザベラの唄」をAudio Decompositionにかけた結果が以下のムービー。右上に分解した楽器が表示されており、それぞれがシーケンスで楽譜化されています。

Audio Decomposition (Isabella's Lullaby) - YouTube

Audio Decompositionはフーリエ変換とエンベロープ解析に基づいています。

フーリエ変換による分析では、0.1秒ごとに音楽ファイルのフーリエ変換を行います。そして、保存された各楽器のフーリエ変換を組み合わせることで、その0.1秒の音楽を再現します。ここで使われる楽器のデータはアイオワ大学電子音楽スタジオの楽器データベースから取得したとのこと。



エンベロープ解析では、まず音波を小さなチャンクに分割し、各チャンクの最大値を取得してエンベロープを作成します。このエンベロープは、音の立ち上がり(アタック)、持続部分(サステイン)、減衰部分(リリース)の3つに分割して解析されます。



楽器の種類によってエンベロープパターンは異なり、ピアノのような指数関数的な減衰を示す静的減衰と、バイオリンのように音量が増減可能な動的減衰があります。Audio Decompositionはこの減衰パターンを判別し、楽器音の特定と音符の検出を行います。



具体的には、まず各音符の周波数に対してバンドパスフィルターを適用します。次に、各楽器について正規化されたアタックとリリースの相互相関を計算して音符の開始と終了を特定し、フィルターされた音声と楽器波形のMSEを計算してコストを算出。最終的な振幅は、フーリエ変換で見つけた振幅とエンベロープステップのコストの逆数を掛け合わせて決定されます。

最終的な出力は、matplotlibを使用して表示されます。音楽で使う楽譜そのものではありませんが、シーケンス形式なので、耳コピをする際の補助ツールとして使用することができます。



バード氏は実際にAuto Decompositionを用いて、YouTubeに公開されている演奏動画から音程を特定し、ピアノ譜を作成することに成功しています。

Auto Decompositionはオープンソースで開発されており、GitHubにソースコードが公開されています。