2021年1月13日水曜日

音楽をつまらなくするコード進行をディープラーニングしてみたらやっぱりつまらなかった

音楽におけるコードはあんまり好きじゃない。


かっちりしたコード進行なんてものが音楽をつまらなくするのだ、あんなものを覚えてしまうと型にはまった音楽しか作れなくなってしまう。もっと自由な方がいいのだ。

と常々勝手に思っていたが、まあしかしなんだかんだ実作業の面では便利だったりするので、結局学ばざるをえなかったりもする。

自動音楽生成でもコードは使わないぞ、と頑張ってきたのだけど、やっぱりなんらかの進行のヒントになるかもしれないので、一応こちらも自動生成を試してみることにしました。


音楽のコード進行


コード進行にはある程度の法則がある。

一番教科書的なルールとしては、

C -> F -> Gのような

立ち上がり(トニック)、ちょっと盛り上がり(サブドミナント)、盛り上がり(ドミナント)、みたいな形が基本。

例外はあるにせよ、C F# Dm Abみたいな脈絡のない妙なコード進行がくることはあんまりない。

これはちょうど文章と同じような形で、主語があって文末がある、みたいなもの。

ということで、コード進行データは「文章と同じ時系列のデータ」と捉えてしまって問題ないでしょう。

となれば話は簡単、文章をディープラーニングさせる時と同じ手法が使えます。

コードのデジタル表現


では、コード進行のデータをプログラム上でどうあらわすか。
これはドレミファソラシドを12bitのまとまりに置き換えて、

Cメジャーならば
[1,0,0,0,1,0,0,1,0,0,0,0]

Cmならば
[1,0,0,1,0,0,0,1,0,0,0,0]

C7ならば

[1,0,0,0,1,0,0,1,0,0,1,0]

とすることにする。

この方式だとCー>Fー>Gのコード進行は以下の通りになる。

[1,0,0,0,1,0,0,1,0,0,0,0] [1,0,0,0,0,1,0,0,0,1,0,0] [0,0,1,0,0,0,0,1,0,0,0,1]

学習データ


学習データは邦楽洋楽とりまぜてコード譜10000曲ほどを用意した。

そのうちkeyがCと明記されているもの2000曲あまりを学習データとした。

ちょっと数が心許ないけど仕方ない。

というわけでモデルを組んで学習させてみる
Epoch 1/50
33/33 [==============================] - 1s 21ms/step - loss: 0.6694 - val_loss: 0.5621
Epoch 2/50
33/33 [==============================] - 0s 2ms/step - loss: 0.5366 - val_loss: 0.4543
Epoch 3/50
33/33 [==============================] - 0s 2ms/step - loss: 0.4366 - val_loss: 0.3682
Epoch 4/50
33/33 [==============================] - 0s 2ms/step - loss: 0.3468 - val_loss: 0.2882

.
.
Epoch 46/50
33/33 [==============================] - 0s 2ms/step - loss: 8.5190e-04 - val_loss: 8.1676e-04
Epoch 47/50
33/33 [==============================] - 0s 2ms/step - loss: 8.0641e-04 - val_loss: 7.7746e-04
Epoch 48/50
33/33 [==============================] - 0s 1ms/step - loss: 7.6571e-04 - val_loss: 7.4075e-04
Epoch 49/50
33/33 [==============================] - 0s 1ms/step - loss: 7.3260e-04 - val_loss: 7.0640e-04
Epoch 50/50
33/33 [==============================] - 0s 2ms/step - loss: 6.9866e-04 - val_loss: 6.7435e-04


コード進行生成


生成させるのは8小節。

最初の2小節をこちらから与えることにする。

まずは、C->F を与えたものと、C->Amを与えたもの

とすると出てきた進行(例)はこんな感じ。
C, F , G , C, F, G, C, F

C, Am,  F , G ,C ,F ,G ,C ,F

ありゃ、どちらも、C->F->Gに収束してしまった。 まあ基本だからしょうがないな。
というわけで、Cキーでありながら、Gから入るという進行G->Amを与えてみる。
 
G ,Am ,G ,C ,F ,G ,C

おお、こちらもGに戻ってまた、C->F->Gに収束してしまう。それだけ、C->F->Gの進行が強いんだな。

では次は2小節目から転調してやれ、ということで、C->Eを与えてみる。
C ,E ,G ,C ,F ,G ,C ,F

あららららら、こちらも、Gに戻りまたC->F->Gに収束してしまった。。。。。


結論


冒頭の方でコード進行の教科書的な進行ということでC->F->Gを例にあげたけど、これだけ、C->F->Gにばかり収束するということは、実際の曲中でも、C->F->Gは結局それだけ例があるということか。

本当は、RNNの予測に使う過去のデータ数を2(最初に与える小節)ではなくもっと増やせば少し変わってくるとは思うのだけど、文章と比較すると小節は生成する量が少ない(通常文章が数十単語の羅列を生成するのに対して、音楽は8小説とか、16小節とかのみ)ため、そのアプローチにも限界がありそう。

それに、4・8小節でのまとまりがあるべきなのに、それを意識してないのも問題。

しかし、結論としてはやっぱりコード進行はC->F->Gの基本がめちゃ強くて、それ以外のバリエーションが大量にある(使用されている)というわけではないということですね。

こんな結論ですみませぬ。















2021年1月3日日曜日

AI作曲をコードと数式を使わず説明してみる、その3

再帰型ニューラルネットワーク(RNN)とその発展系(LSTM) 


前回出たのは、過去の時系列の並びから未来のことを予測するという再帰型ニューラルネットワーク。 

今回はその中でもLong Short-Term Memory(以後LSTM)を使うことにします。

LSTMは再帰型ニューラルネットワーク(以後RNN)の拡張、とでも言うべきもので、RNNもLSTMも過去の時系列の並びを手掛かりに未来の展開を予想すると言う意味では同じです。

RNNは直前のいくつかの音の並びしか手掛かりにできないのに対して、LSTMの方がずっと昔の音の並びを手掛かりにすることができます。

リフレインが音楽を作る


メロディは基本的に過去のフレーズを繰り返したり、展開したりすることで、構築されます。

まったく関連性のない音の並びがずっと続くということはありえません。

 たとえば、「世界に一つだけの花」であれば 「世界にひとつだけの花〜ひとりひとり同じ種を持つ、その花をさかせることだけに〜」と展開しますが、 冒頭の「世界に〜」と途中の「その花〜」は全く同じフレーズですよね。 

「世界に〜」を聞かせておいて「ひとりひとり〜」と違うフレーズを挟んでわすれたころにまた元に戻る。 

これが「メロディ」を強く人間に意識させるのです。

このような繰り返し、リフレインは至る所で使われます。

このように音楽製作者は意図的に繰り返しを多用します。

たとえば、音程を変えて、リズムだけリフレインしたり、コードをリフレインしたり、そもそもドラムパターンは基本リフレインですよね。

こういったリフレインこそが単なる音の並びを「音楽」にしているものと言えるでしょう。

リフレインを基本としたアプローチ


そこで「リフレイン」に強いアプローチとなると、前述LSTMのAIモデルを使用して、過去の音を学習して未来の音を予測させるという手法が意味をもってきます。

この時にどれくらい昔まで参考にするのか、1秒前なのか、5秒前なのか、どれくらいの重みでそれらを重要視するか、などを考えて設計していきます。




これらのパラメーターの設置次第で、様々な音を作ることができるわけです。

これが最もシンプルなAI音楽の姿と言えるでしょう。 

未来のAI音楽


ただ実際にはこれだけで、複雑な音楽を作れるわけではありません。  

音楽にはもっともっと様々なレイヤーが存在しています。  

調和した音程を作る「和音・コード」のレイヤー、AメロからBメロへ移り変わる「展開」のレイヤー、音色のレイヤー。 

今回は波形の話をしましたが、これをMIDIで行うアプローチもあります。  

今現在これらのレイヤーをすべて実用化のレベルで持っているというAIはほぼないでしょう。 

それはそれだけそれぞれの組み合わせが難しいと言うことでもあります。  

そうしてこういうアプローチを見ていくと、結局は人間の感覚、どうやって作品を生み出しているのか、聞く側はなぜこれを心地よいと感じるのか、を理解する必要があると言うところにぶつかります。 

 それだけ人間はいかに複雑なマシーンと言うことでもあるのですね。