昔ってのはゼビウスとかディグダグとか、1980年代前半までさかのぼるくらいの昔。この頃のレトロアーケードゲームのBGMは、4~8小節くらいの短いフレーズを繰り返すものがあった。
自作ミニゲームのBGMとしてそういったBGMが欲しい、できれば自動生成したい、というもくろみが前々からあって、いくつかそういった技術を探していた。
一つはWolframTones。セルラオートマタを切り出してメロディにする手法。これはお手軽でよさそうなのだが、16分音符で完全五度で往復するベースとか、昔のゲームでよく見るフレーズが再現できないのが弱点に見える。
最新のものだとOpenAIのJukeboxがあるが、これは楽譜ではなく音楽の波形を生成するものなので、レトロゲーム向けではない。
そこでMagentaだ。MagentaはGoogleがやっている、機械学習を音楽や絵に応用するリサーチプロジェクト。ブラウザで動かせる実装として、Magenta.jsが公開されている。
Magenta.jsは曲の楽譜を入力すると、それに続くフレーズを自動生成してくれる、MusicRNNを備えている。これにレトロゲームの短い楽譜を与えれば、それっぽい別の曲を作ってくれるのではないか、と思って、以下を試作してみた。
真ん中の「Generate」ボタンを押すと、画面左のフレーズを元に新たなフレーズを生成し、画面右に表示、再生する。メロディとベースの2トラックのみから成るシンプルなフレーズの生成だが、一応それっぽいものが作れているように思える。複数トラックを元のフレーズとして入力する方法が分からなかったので、それぞれ別々にフレーズを作成した上で、ベースがメロディと不協和音だった場合に調整(振動数が1~4くらいの比率になるようにするだけ)した。画面中央下のチェックボックスを外すとこの調整を行わなくなるので、より自由なフレーズが生成される。
Magenta.jsの使い方については以下の記事が詳しい。
Magenta.js組み込みのプレイヤーが同時発声できなかったので、そのへんはTone.jsを使って自力で再生している。あとフレーズの入出力はMMLが個人的に楽なので、mml-iteratorでパースしている。
後は効果音も似たような感じで生成できるといいのだが、MusicRNNはあくまでメロディを生成する目的なので、同じアプローチではできなさそう。
上の記事にスーマリの効果音の楽譜があるけど、ゲームの効果音って楽譜で見るとあまりに特殊なので、生成手法の関連研究とか無さそうな気がする。世の中の効果音生成ツールって、だいたいsfxrを祖とした波形生成ベースのものが多くて、楽譜として生成するものは見たことが無い。情報求む。