見出し画像

AIに「文字列」で作曲させる : Claude Code とMMLでレトロゲーム風音楽を作った話


テキスト形式ならAIでも作曲できるのでは?

音楽をAIで作るといったら、SUNOとかいろんなサービスがあります。私も、インディーゲーム開発に使えるのかどうか知るためにいくつか試してみたんですが、しかしどうしても納得いくものができませんでした。できた曲はすごいと思いつつも、私のイメージとは違う。ゲーム音楽としてそのまま使えるものではない、というのが私の結論でした。
それに私には、生成された曲を加工する技術がない。AI作曲サービスは、まさに確率が低すぎるガチャです。これはいくらなんでも手間がかかりすぎる。

とこんな発言をしていたんですが。
実はこのときすでに、あるアイデアを考えていました。それは「音声データは難しいけど文字列ならいけるんじゃね?」ということでした。

MML(Music Macro Language)という、音楽を文字列で表すための言語があります。CDEFGABが音符、数字が音の長さ、というものです。
MMLは昔のパソコンなどで使われていました。私も子供のころ、 MSX BASIC で書いた記憶があります。
現代では、レトロゲームエンジンPyxelなどで使うことができます。

これなら、複雑な音声データなどではなくただのシンプルな文字列です。AIにも理解しやすいに違いない。
Claude Code に「MMLで作曲して」といえばできるかもしれない。
と、そう考えたのでした。
やってみたら、もちろんそんな簡単な話ではなかったわけですが。

いま Claude Code に「今まで積み上げた経験を全部忘れて1曲作って」と指示してみました。するとこんな感じの曲が出てきました。

まあ思ったよりは形になってる?かな。
実際最初はこんな感じでした。ここからいろんな指示を与えていったわけです。

ちなみに、この実験の最終的な成果物を先に紹介しておきます。itch.ioに無料ゲームとして公開した『木こりよ走れ』というゲームのBGMに、この方法でAIが作曲した曲が使われています。興味があれば遊んでみてください。AI作曲は思ったよりは形になったんじゃないでしょうか。
ブラウザで無料で遊べます。

Pyxel+MMLの利点

まず、MML再生環境として選んだのはPyxelです。もし成功したらゲームに使いたかったからです。
Pyxel の音源には、4チャンネルだけという大変厳しい制約があります。これはだいたいファミコンくらいの性能になります。
しかしAI に作曲させる実験としては、この窮屈さこそが有利だと考えました。なにしろ4チャンネルしかないわけですから、各チャンネルの役割はだいたい定型化できます。
私が選んだ構成はこれ↓です。レトロゲームではよくある構成だと思います。

  • 主旋律+対旋律+ベース+和音アルペジオ

  • 主旋律+ベース+和音アルペジオ+ドラム

和音アルペジオと書いているのは、通常の曲ではピアノやギターが担当するコード和音に該当するパートのことです。レトロゲーム音楽では同時発声数が少なすぎて、コードの和音が全部入りません。そのため、和音を同時に鳴らすのではなく、代わりに1個ずつ順番に鳴らすというテクニックがよく使われました。そのテクニックのことを、ここでは和音アルペジオと呼んでいます。
これを入れるとお手軽にレトロゲームっぽくなります。

チャンネル構成は2種類だけ。ここまで厳しく制限してしまえば、AIも曲を作りやすいんじゃないかと考え、 Claude Code に指示を与えていきました。
(ちなみに、ここで使っている Claude Code のモデルはほぼすべてOpus4.8です)

このころの成果物はこんな感じ。

実際の曲を参考にする

なにも指示していない状態の Claude の作曲能力は大したものではありません。たいてい8小節か4小節のシンプルな曲を作ってきて、16小節まで延ばせというとなんか無理やり感のある曲が出来上がります。

今回私がやってみたかったのは、実際の曲を参考にするということです。
なにもないところから1曲の構成を作るのはAIには難しいみたいですが、既存の楽曲を参考にすることができればなにか変わるかも?という発想です。
といっても、ウェブ上にはMMLなんてなかなかありません。
そこで注目したのはMIDIデータです。MIDI形式は音程のデータを持っているので、MMLに変換することが可能のはず。まあ私はMIDIの形式なんて知りませんが、そこはAIに任せればなんとかなるでしょう。
そして実際なんとかなりました。……ただし最初のうちは、そんなの無理だとか喚いてました。聞いたことない作業をするとき、AIはわりと挙動不審になります。
ウェブからMIDIファイルをいくつかダウンロードして、それをMMLに変換させます。 Claude Code がそのためのPythonスクリプトを書きました。
そして、そのMMLを参考に作曲してみろという指示を出しました。

その結果ですが。
実際のところは、どのへんを参考にしてるのかわからなかったです。原曲と似てないし(似てないのは私の指示でもあります。コピーはするな、と指示していました)。
まあでも、とにかくよくなったような、そうでもないような気がしました。そしてAIには「よくなったよ」と伝えました。

このときはわかりませんでしたが、最終的には、参考曲はかなり役に立ちました。リズムの骨格を参照曲に寄せたり、旋律の展開や音域を参照したりしているようです。試しに参考曲なしで作らせてみると、不自然な感じ、退屈な感じが強くなります。
試しに現状で、参照曲なしとありで作曲させてみました。

参考曲なし

参考曲あり

参考なしのほうはリズムが一定で、旋律がなんか機械的な感じがするような。参考曲ありの方が面白味があるような。
(でももうちょっと調整したくなります)

けっきょく人間が評価する

当初 Claude Code は、曲の良し悪しをスクリプトで採点しようとしていたようです。5曲作ってもっともスコアの高いものを採用するというようなプランを持っているようでした。
実際何回かはそれで動かしてみたんですが、品質が上がったようには感じられませんでした。まあ私の素人判断ですけど。
それにどっちにしろ、最終的に採用するかどうかは人間が決めるわけです。じゃあ評価スクリプトなんて意味ないよね、ということで廃止しました。評価は人間がするという方向に舵を切ったわけです。
現在は、曲を作るたびに Claude Code が人間の評価を聞いてくるようになっています。それにいちいち私が回答することで、各楽曲の評価をファイルに蓄積しています。
修正を指示したらそのことも記録して、次の生成手順を少し変えます。これをくりかえすことで、だんだんと品質が向上していきます。
AIは音を聴いていないし、楽曲の良し悪しはわかりません。人間の評価を基準にするという方針は正解だったと思います。

ところで勘違いしやすいところですが、これはいわゆる学習ではありません。この場合、成果物の品質が向上したのは Claude Code が賢くなったわけではなく、手順書が洗練されたからです。

他にやったこといろいろ

AIが作曲して私が評価するという手順を繰り返すうちに、いろいろなノウハウが記録されていきました。 Claude が提案したものもあるし、私がやれといったこともあります。その一部を挙げます。

  • 曲の長さは24小節以上

  • 繰り返しを避ける

  • 長くなったら転調とかする

  • ループ曲の最後はトニックで解決せず次につながるようにする

  • ループ曲の最後と最初を似せない

  • 参考曲からリズムの骨格を持ってくる

みたいな感じ。他にもけっこうあります。細かいですが、どの指示も品質向上のためには必要でした。
AIは当初、8小節の曲を24小節に引き延ばしたような曲を作っていました。繰り返しが多く、大きな展開がなく単調な感じです。
そこから、とにかくいろんな指示をしたりあいまいな感想をいったりを繰り返しました。
とはいえ私は素人なので「なんか単調」とか「なんかわざとらしい」「なんか不自然」などのあいまいな感想が多かったですが。
このあたり、音楽の知識がある人がやればたぶんもっとよくなると思います。

加えて、いくつかのスクリプトが作られたりもしました。

  • 作曲スクリプト

    • AIがコード進行、旋律、ベースパターン、ドラムパターンなどを決めてこのスクリプトに渡すと、スクリプトが各チャンネルを機械的に生成します。なにしろ最初から形式が決まっているから、ここはロジックでやれてしまいます。

  • MML文法チェッカー

  • 各チャンネルの長さ計測

    • 各チャンネルの長さが揃わないということが頻繁に起きるので導入されました。AIは自分が作った曲を音として聞いていないから、そういうことに気づきにくいみたいです。

  • タグ付け

    • テンポとか音の密度とか高さとか、いろんなものを測って各楽曲にタグ付けしてデータベース化してるらしい。

  • 旋律の音程プロファイル計測

    • 音程の跳躍の率を計測してるらしい。

そして、次第に納得いく楽曲が作られるようになっていきました。

実際にAIはなにをやっているのか

本人に訊いたところ、どうやらこんな感じみたいです。

  1. 指示文から参考曲を決め、テンポ、ベースパターン、ドラムパターン、コード進行とかを決める。

  2. コード進行に合わせて旋律を書く。

  3. 作曲スクリプトに渡す。

いろいろと補助をしてきましたが、AIが曲を作っていることに変わりはありません。上の手順でいうと、1と2に関しては知能的なものの判断が必要なはずです。
AIには耳がなく音を聞いていませんが、なんか音楽理論とか知識や統計とかでコード進行や旋律を作ることができるようです。

成果物と今後

最初にも書きましたが、今回の実験の成果がこちらです。
全6ステージと、ボスとかエンディングとかステージクリアのジングルとか、使われている音楽は全部AIによるものです。
私はいまでも、一般的には、現状のAIでゲーム用素材を作ることは難しいと思っています。でも今回のように条件を限定して工夫を凝らせば、できることが増えます。AIの面白さはこういうところです。

今後ですが、これは個人的な興味で、ローカルLLM作って本当にMMLを学習させてみたいと思っています。
作曲系のAIサービスはいろいろありますが、主に音声データを学習していて、楽譜を見ていないことが多いです。そのため、楽譜を吐き出せるAIというのはなかなかないのが現状です(ないわけではないみたいです)。
MMLというのは楽譜そのものなので、それを学習したらどうなるのかということに興味があります。
いまはモデルの学習などを実際に始めているところです。
といっても、たぶんこちらは実用まではいかないだろうなという感じ。


いいなと思ったら応援しよう!