こんばんは。
さだまさしアドベントカレンダーも23日目。
今日はさだまさし曲のコード進行を、遺伝的アルゴリズムを使って、どんどん「大空と大地の中で」に近づけていきたいと思います。余談ですが、さだまさしと松山千春は犬猿の仲(でも、ほんとは仲良し?)と言われています。
これをすることに何か意味あんのかよッて感じですが、この活動の最終ゴールとしては何か任意の楽曲をインプットしたらさだまさしっぽくして返す「さだまさジーン」を作りたいと思っています。(それに対する意味の問いかけはNG。)
この曲をさだまさしがアレンジしたら、きっとこんな感じになるんだろうな〜っていう世界を実現できれば嬉しいです。今回は実現できていないですが。。まぁ今回で終わらず、連載化していきたいと思いますので、興味がある人は今後ともよろしくお願いします。
前置きが長くなって申し訳ありません!ということで、はじめましょう。
遺伝的アルゴリズム
遺伝的アルゴリズムとは、生物進化における遺伝と適者生存による自然淘汰の仕組みをソフトウェア的に模すことで複雑な問題に対する最適解を探索する手法です。
ある命題に対する解の候補を遺伝子(gene)とその集合体である染色体(chromosome)で表現した個体(individual)を複数用意し、適応度(fitness)の高い個体を優先して交叉(crossover)、突然変異(mutation)などの操作を繰り返し、適応度の高い個体を優先して保存しながら、最適解の探索を行う。
はい!詳しくはこちら!
http://www.slideshare.net/kzokm/genetic-algorithm-41617242
実用性もあって、たとえば、新幹線「N700系」の顔を創りだしたのも「遺伝的アルゴリズム」です。遺伝的アルゴリズムを用いた空力シミュレーションを使って「N700系」の顔を作り出しました。
はい!詳しくはこちら!
http://trendy.nikkeibp.co.jp/article/column/20070620/1001047/
遺伝的アルゴリズムを楽曲に適応させる
自動作曲という分野は古くからあるみたいで、その多くは音符とかもろもろ含んだものになっていますが、簡略化のため私はコード進行のみを対象とします。
自動作曲について詳しくはこちら!
http://sourceforge.net/projects/musicalgorithm1/
それでは適応方法を説明します。
遺伝子(gene)を1つのコードとします。染色体(chromosome)はコード進行です。
例として「大空と大地の中で」のAメロの1節を染色体(chromosome)にするとこんな感じです。
| F# | A#m | B | A#m | B | A#m | G#m | C# |
適応度については、「大空と大地の中で」の染色体(コード進行)と比較対象の染色体(コード進行)を比較し、一致しているものが多ければ適応度が高いというようにしました。ここに対して音楽的なアプローチは一切無しです。(ホントは色々とやりたかったのですが、私の情熱に対して今日という一日は短すぎた。)
交叉(crossover)は一様交叉を採用しました。(とくにそこに想いは無く簡単だったからです。)交叉対象の選択にはN者トーナメント方式を使っています(とくにそこに想いは無く簡単だったからです。)
突然変異(mutation)はコードをランダムに変更させました。
例えばC->FM7みたいに(ここも、もっと色々アプローチしたかった。)
試してみましょう
では、交配させていきましょう。交配する対象のさだまさし染色体はカラオケランキングから上位5曲をピックアップしました。
- 案山子
- 関白宣言
- 秋桜
- 精霊流し
- 防人の詩
本当は1曲まるまる染色体として表現したかったのですけど、簡略化のため、今回はAメロの1節のみを対象としました。
10,000回くらい交配させたら、、
はい、こんな子が生まれました!
ふむ、なんとも言えない"音痴"感。
しかも、そこにさだまさしっぽさは皆無です。(そらそうだが、、)
反省と今後
率直な感想は未完成です。まだまだやれることはあるでしょう。
今後やりたいこととしては、、
- 適応度判定、突然変異にもっと音楽的な観点を含めたい。じゃないといつまでたっても音痴。それに合わせて交叉ももっと工夫したい。
- さだまさしっぽさを学習するためのシステムも必要。このコードの流れはまさにさだだねぇ〜みたいなものを導き出したい。deep learningでもしてみようかしら。
- 染色体を選定するためのシステムも考えたい。例えば、悲しい曲をさだまさジーンのインプットにするならさだまさしの悲しい曲達を染色体としてピックアップするとか。感情分析して染色体をピックアップを自動で出来るようになると嬉しいですね。
- ソースコードを公開できるくらいちゃんと整備したい。現状のソースは突貫工事でとても人の目に当てられるものではない。
やりたいことが多いです。でも楽しくなってきたので、ゆっくり実現していきたいと思います。
それでは。