Top View


Author Ryu Ishibashi

自作の自動作曲サイトで作った曲をMuseMorphoseでアレンジしてみた

2022/08/31

MuseMorphoseとは

論文リンク https://slseanwu.github.io/site-musemorphose/

入力のピアノ曲を、同時に発音するハーモニーの数(poly)と一小節あたりの音の数(rhym)を変化させてアレンジできる技術です。

楽譜データであるmidiから新たな音楽を生成する分野では、最近自然言語処理でも使われるTransformerを導入することで、自然な音楽的繰り替えしを表現できるようになってきました。しかし、Transformerを用いる学習だけでは生成される曲の曲調を指定できません。

そこでこの技術では生成モデルのVAEと組み合わせて学習することで出来上がった曲調を指定できるようにしたそうです。具体的にはVAEのエンコーダとデコーダにtransformerを使用し、デコーダではエンコードされたデータだけでなく、polyとrhymと共にデコードするようにしています。それによって生成する曲のハーモニーやリズムをどのくらいにするか数値で指定できるようにしています。

僕の作曲サイトもメロディのキャラクターを調整できる様にしている点で発想が似ているなと思い興味を持ちました。音楽的要素を指定して曲調の方向性を示すのは作曲家的な視点で面白いと思います。自動で作曲した曲を自動でアレンジできたらいいなという感じで今回試してみました。

実際にやってみた

原曲の準備

自分のサイトで生成した曲はこれ。

グレーの部分がコード、黒い部分がメロディでカラオケの音程バーみたいな感じですね。今回の曲のコード進行はAmFGCの小室進行の曲。哀愁漂いつつ、でもだからといって暗すぎるってこともない進行。Get Wildなどが有名です。 全音符のみの3和音のコードに八部音符のみで構成されたメロディというシンプルな状態からアレンジしてもらいます。

MuseMorphoseに入力できるように、まずこの曲を自分の作曲ソフト上でmidi形式の楽譜にしました。各ノートのベロシティなどの値は全てデフォルトのままで一定です。今回は作曲サイトとピアノの音色の違いを考慮して、サイトから1オクターブ下げてmidiデータを作成しています。

この楽譜データをMuseMorphoseで使用するにはさらにいくつか工程があるのですが、そのやり方については記事の最後に回します。

MuseMorphoseで曲をアレンジ

いろいろなパラメータ設定で実験してみたので、それぞれ鑑賞していきます。

poly, rhymの片方のみを大きくした場合

poly+3 rhym+0

原曲どおり8分音符のメロディ。同時に鳴らす音の数は増えており、メロディがコード構成音の単音連打になっています。

poly+0 rhym+2

メロディに16分音符が増えて細かいリズムになっています。

poly, rhymのどちらも増やした場合

poly +3 rhym+3

メロディに単音連打が増えつつ、時々16分音符の細かいリズムで刻むようなメロディになっています。 さらに数字を増やすと...

poly+5 rhym+4

poly+6 rhym+4

どちらも増やすと和声の数が増えますが、和音の音にCメジャースケールのダイアトニックコードでないコードが含まれる様になってますね。つまり複雑な響きを持つ音も選ぶ様になってきています。メロディは単音連打が多いですが、時々16分音符の細かいリズムで刻むようなメロディになっています。 またここまでの設定ではコードが全音符であるということは変更されていません。

polyを減らし、rhymを増やした場合

poly-1 rhym+2

poly-2 rhym+2

polyの数が減るとともにコードの全音符だった部分が細かく刻まれ、こなれたコードバッキングのようになっています。メロディの部分も音の高さの移動が大きくなって激しいメロディになってます。

polyを増やし、rhymを減らした場合

poly+1 rhym-2

メロディはコード構成音を選択しつつ、音と音の間に隙間が生まれ、ゆったりとした叙情的な感じになりました。

どちらも減らした場合

poly-3 rhym-3

和音の数も減り、メロディも単音でシンプルになっちゃいました。

polyをより優位に増やしつつ、rhymも増やしてみると...

poly+5 rhym+1

最初の小節のメロディをコードに合わせて変形しながら繰り返しています。この自然な繰り返しはtransformerのおかげなのかな?

パラメーターpoly, rhymと生成曲の関係について少し考察

polyを増やすと同時に発音する音が増え、rhymを増やすと8分音符だけだったメロディにより細かい16分音符を導入することで細かなリズムのメロディを作っているみたいです。

また、メロディに使う音の選択の仕方に注目してみると、polyを増やすとコード構成音から選ぶ傾向が強まり、メロディの音の高さの変化が少なくなる。rhymはその逆になっているように見えます。これは一般的にハーモニーが多い曲は緊張感のある響きの音を選択することが減り、逆に細かくリズムを刻む曲は一瞬緊張感が高まる音の選び方をしても違和感を感じにくいため、そういった学習をしたのではないでしょうか?

またpolyもrhymも減らした方がこなれた曲を生成したのは想定外で面白かったです。もともと初めの曲はどちらも隙間なく音が敷き詰められていたため、その一部を除いていくことでいい感じに抑揚が生まれたのかなと思います。1小節あたりの音の数であるrhymを増やせばリズミカルな曲になると想定していたのですが、今回の場合はそうでもないみたいですね。たしかに音を抜くこともリズムを生む一つの要因となりますもんね。

アレンジとは何かを考えてみたときに、リズムの数やハーモニーの厚さの抑揚をつけるというこの技術の視点は面白いですね。多くの楽器が使われている曲では楽器を変えることでメリハリが付けられるかもしれませんが、今回の様に楽器が一つだけの曲ならより重要になりそうです。

音楽における機械学習について初めて調べてみましたが、音楽的な発見もあっておもしろいです。これから他の研究も色々みてみたいです。

MuseMorphoseの使い方

Githubにコード(https://github.com/YatingMusic/MuseMorphose )がありますが、少し沼ったところもあったので、最後に注意点をつらつら書いておきます。

楽譜のデータ形式について

midiファイルを変形したREMIという形式が採用されています。各音の小節内での時間などを含んだデータとなっており、MusuMorphoseを使うにはmidiデータを解析してこの形に変形しpythonのpickleモジュールでpklファイルにして保存する必要があります。

このやり方については(https://github.com/YatingMusic/MuseMorphose/issues/1#issuecomment-1178514744 )にまとめられてはいますが、それを踏まえた上で以下のところに注意です。

  • midiデータ→REMIとする場合の手順について 上のリンク先に書いてある通り、https://github.com/YatingMusic/compound-word-transformer/blob/main/dataset/Dataset.md を使うのですが、これはmp3→midi→REMIに変換するときのやり方です。今回の様にmidiファイルから変換する場合はmidiデータをmidi_synchronizedフォルダにいれて、analyzer.pyから実行していけばいけるはず。

  • DAWソフトからmidiファイルをエクスポートする時は、そのトラックに楽器がインサートしていてはいけない?

    これはDAWに依存する話かもしれません。僕は作曲用のソフトとしてStudio One5を使ってますが、トラックに自分の音源をインサートした状態でmidiを書き出すと、上のやり方でREMIに変換してくれず、僕はそこで結構沼りました。midiには楽器の情報も含まれているので、その関係かもしれません。

  • REMIデータのファイル名は’数字.pkl’にしないとMuseMorphoseで使えない。

    1.pkl, 6451.pklみたいな形にしましょう。

MuseMorphoseの実行について

今回僕はREADMEにあるように学習済みモデルをダウンロードして使用しました。 READMEのコードを実行していけば元々あるデータを元に曲を生成をしてくれるはずですが、自前のデータを使う際はもう少し変更しないといけない部分があります。上記のissueでまとめられいますが、それ以外に変更が必要な部分で覚えているものを書いておきます。

  • pickles/test_pieces.pkl の変更 PKLはPython Pickleファイルで、pythonモジュールのpickleで作成します。このファイルはどのREMIデータをアレンジするか配列で指定しています。例えば今回のように’1.pkl’とREMIデータが1つなら[1.pkl]といった配列で保存します。わかりやすいので僕はそうしました。pickles/test_pieces.pklを変更するのではなく、新たにファイルを作ってそこで指定する場合はconfig/deffault.yamlの data: test_spilit: でパスを変更します。

  • genarate.pyについて このファイルの実行コマンド

    python generate.py config/default.yaml musemorphose_pretrained_weights.pt generations/ 10 5

    これは10の部分がアレンジするREMIデータの数(1曲しかしない場合は1)、5の部分が一曲あたり何種類のアレンジをするかです。poly、rhymの値はgenerate.pyの以下の部分、

    def random_shift_attr_cls(n_samples, upper=3, lower=-3):
      return np.random.randint(lower, upper, (n_samples,))
    

    このupperとlowerの値の範囲でランダムに選ばれます。ここを変えることで目的の値を設定できます。

Ryu Ishibashi

Ryu Ishibashi

機械学習/Vue/React/Laravelとかやってます