音楽におけるコードはあんまり好きじゃない。
かっちりしたコード進行なんてものが音楽をつまらなくするのだ、あんなものを覚えてしまうと型にはまった音楽しか作れなくなってしまう。もっと自由な方がいいのだ。
と常々勝手に思っていたが、まあしかしなんだかんだ実作業の面では便利だったりするので、結局学ばざるをえなかったりもする。
自動音楽生成でもコードは使わないぞ、と頑張ってきたのだけど、やっぱりなんらかの進行のヒントになるかもしれないので、一応こちらも自動生成を試してみることにしました。
音楽のコード進行
コード進行にはある程度の法則がある。
一番教科書的なルールとしては、
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の基本がめちゃ強くて、それ以外のバリエーションが大量にある(使用されている)というわけではないということですね。
こんな結論ですみませぬ。