メインコンテンツへスキップ
見出し画像

ChatGPTにアイドルの曲を作詞作曲MIDI生成までさせてみた

    ChatGPTさんに作詞作曲させたついでにMIDIを生成させてみましたが…なかなかいいところまで行きましたが、たまには失敗談です。

    作詞家さんにChatGPTを見せてみた

    先日、プロの作詞家さんと飲む機会があったんですよ。

    画像
    鉄板焼きのお店でした。うまかったです。

    いくつか作詞をChatGPTにやらせてみて、感想をいただきました。

    • これ、普通の作詞家はこれでいいじゃん、ってレベルだね

    • 自分の今までの作詞データを喰わせてみたい

    • その方が良いものできるし、作詞家は新しい挑戦もできる

    いやほんと、わかってる人はわかってるなーと思います。
    「一廉(ひとかど)の人以上のプロ」は『AIに仕事が奪われる!』とか言わないのですよ…むしろ奪われる側の単純作業の方々ですら『AIに仕事奪われたい』って言ってるケースもあるし。

    「わがままメタバース」といういい曲がありました

    それはそれとして、とあるお仕事でAKB48さんの「わがままメタバース」という曲が視界に入ったんです。これがなかなか味わい深い歌詞で。さすが秋元康さん作詞。

    わがままメタバース · AKB48
    久しぶりのリップグロス Special Edition
    ℗ King Record Co.,Ltd
    Released on: 2022-10-19
    Composer: YASUSHI WATANABE
    Lyricist: 秋元康

    さっそくChatGPTに咀嚼させてみる


    秋元康さんの作詞ですから味わって食べてくださいね!

    画像
    ちゃんと理解している感じがする。

    「チャッチャッチャ バーチャル」についても聞いてみた。

    画像
    サビと音についてもよく理解している。

    楽曲のパートについてもどれぐらい理解しているんだろう

    ベタ打ちのテキストからいちど再出力してもらったら、
    きっちり整形して書き出してきた。

    画像
    転調するところ以外は改行の入り方もいいかんじ。

    これは人間がやるとそこそこに大変だし、歌詞を配信システムに入力する作業とかを手作業でやったことある人がいたら、これは感涙もの。

    「わがままメタバース」という曲、
    秋元康さん作詞でわるくはないのだけど
    「チャッチャッチャ バーチャル」ってのがすごい引っかかる大事なところだな…人間の所業だ。

    https://t.co/Iy6bjMlgvE

    — Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 10, 2023

    楽曲を吐かせてみる

    出来心で楽曲を生成させてみたかったのです。

    ヒェッ…コード進行とMIDI譜を生成してきた pic.twitter.com/5hiaM0tHLJ

    — Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 10, 2023

    実際に生成してきたコード進行

    プロンプトとしては
    「この歌のコード進行をテキストで:」と聞いただけです。

    この歌のコード進行をテキストで:
    以下が「わがままメタバース」のコード進行です。歌詞とコードの対応を示しました。

    イントロ:
    | Am | G | F | Em |

    Aメロ:
    | Am | G | F | Em |
    | Am | G | F | Em |
    | Am | G | F | Em |
    | Am | G | F | Em |

    プレコーラス:
    | F | F | G | G |

    コーラス:
    | Am | G | F | Em |
    | Am | G | F | Em |
    | F | F | G | G |
    | Am | G | F | Em |

    間奏:
    | Am | G | F | Em |
    | Am | G | F | Em |
    | F | F | G | G |
    | Am | G | F | Em |

    Bメロ:
    | Am | G | F | Em |
    | Am | G | F | Em |
    | Am | G | F | Em |
    | Am | G | F | Em |

    プレコーラス:
    | F | F | G | G |

    コーラス:
    | Am | G | F | Em |
    | Am | G | F | Em |
    | F | F | G | G |
    | Am | G | F | Em |

    アウトロ:
    | Am | G | F | Em |
    | Am | G | F | Em |
    | F | F | G | G |
    | Am | G | F | Em |
    ChatGPT

    正直分からん。

    「MIDI形式でお願いします」

    MIDI、StandardMidi形式のチャンネルとノートとVelocityデータですね。
    なるほど仕様通りだわ…(ちょうどそういう仕事があった)

    MFile 1 2 480
    MTrk
    0 On ch=1 n=69 v=100
    480 On ch=1 n=67 v=100
    960 On ch=1 n=65 v=100
    1440 On ch=1 n=64 v=100
    1920 On ch=1 n=69 v=100
    2400 On ch=1 n=67 v=100
    2880 On ch=1 n=65 v=100
    3360 On ch=1 n=64 v=100
    3840 On ch=1 n=69 v=100
    4320 On ch=1 n=67 v=100
    4800 On ch=1 n=65 v=100
    5280 On ch=1 n=64 v=100
    5760 On ch=1 n=69 v=100
    6240 On ch=1 n=67 v=100
    6720 On ch=1 n=65 v=100
    7200 On ch=1 n=64 v=100
    7680 On ch=1 n=65 v=100
    8160 On ch=1 n=64 v=100
    8640 On ch=1 n=67 v=100
    9120 On ch=1 n=67 v=100
    9600 On ch=1 n=69 v=100
    10080 On ch=1 n=67 v=100
    10560 On ch=1 n=65 v=100
    11040 On ch=1 n=64 v=100
    11520 On ch=1 n=69 v=100
    12000 On ch=1 n=67 v=100
    12480 On ch=1 n=65 v=100
    12960 On ch=1 n=64 v=100
    13440 On ch=1 n=65 v=100
    13920 On ch=1 n=64 v=100
    14400 On ch=1 n=67 v=100
    14880 On ch=1 n=67 v=100
    15360 On ch=1 n=69 v=100
    15840 On ch=1 n=67 v=100
    16320 On ch=1 n=65 v=100
    16800 On ch=1 n=64 v=100
    17280 On ch=1 n=69 v=100
    17760 On ch=1 n=67 v=100
    18240 On ch=1 n=65 v=100
    18720 On ch=1 n=64 v=100
    19200 On ch=1 n=69 v=100
    19680 On ch=1 n=67 v=100
    TrkEnd
    MTrk
    0 Meta Text "Created by MIDI.js - http://www.midijs.net" 
    TrkEnd
    MFileEnd

    最後にmidijs.net というサイトが出てくるけど、ここまでrawなMIDIを鳴らせることができるコードではなかった…。やればできるのかもだけど。

    もうちょっと人間がわかる形式はないものか

    具体的に統合されたHTMLにしてもらう

    画像
    一見動きそうだけど…
    <!DOCTYPE html>
    <html>
    <head>
      <title>コード進行のMIDI生成</title>
      <script src="https://cdn.jsdelivr.net/npm/midijs@2.1.0/midi.js"></script>
    </head>
    <body>
      <button onclick="generateMidi()">MIDI生成</button>
      <script>
        function generateMidi() {
          // コード進行のデータ
          const chords = [
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G'],
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G'],
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G'],
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G'],
            ['C', 'E', 'G'],
            ['F', 'A', 'C'],
            ['G', 'B', 'D'],
            ['C', 'E', 'G']
          ];
          
          // MIDIデータの初期化
          MIDI.loadPlugin({
            soundfontUrl: 'https://storage.googleapis.com/magentadata/js/soundfonts/sgm_plus',
            onsuccess: function() {
              const delay = 0;
              const noteDuration = 0.5;
              const tempo = 120;
              const track = MIDI.Track();
              track.setTempo(tempo);
              
              // コード進行をMIDIデータに変換
              let time = 0;
              for (const chord of chords) {
                for (const note of chord) {
                  track.addNote({
                    time: time,
                    note: MIDI.keyToNote[note + '4'],
                    velocity: 127,
                    duration: noteDuration
                  });
                }
                time += 4 * delay;
              }
              
              // MIDIファイルの生成と再生
              const write = MIDI.Writer({tracks: [track]});
              const binary = write.toArray();
              const base64 = btoa(binary);
              const dataUri = 'data:audio/midi;base64,' + base64;
              const player = new Audio(dataUri);
              player.play();
            }
          });
        }
      </script>
    </body>
    </html>
    

    (もちろんこのままでは動きません)
    そもそもライブラリが違う感じなんだが、そのあたりを修正しても一発では動かない。

    Magenta.jsも唱えてみた

    最近でた「Magentaで開発 AI作曲」という書籍があります。AI作曲と作曲理論の本です。

    プログラミング未経験……作曲未経験……それでも簡単にAI作曲を試せる!

    本書は、AI作曲の第一人者が教える「未経験でも簡単に試せるAI作曲」を身につける書籍です。

    「プログラミング経験がないからAIは名前を聞いたことがあるくらい」「音楽の知識が全くないから作曲なんてもってのほか」という方でも理解できるように、AI作曲を解説しています。まずコードをマネしてみると曲が生成されることに感動し、読み進めていくうちに作曲のための音楽の知識も曲を生成するためのプログラミングの方法も身につくのです。

    生成できる曲はシンプルなメロディー・ドラム・3パートのバンド・アドリブメロディー・バッハ風合唱曲・現代音楽・ピアノ演奏と幅広く、「AIを試してみたい!」「AIと音楽理論をどちらも一気に学びたい!」「作曲のアイデアが出てこない時、ヒントにしたい!」という方にオススメです。
    「Magentaで開発 AI作曲」書籍紹介より

    それっぽいコードが出てきます。これはこれで沼かも…(喜)

    画像
    MusicVAEの知識も必要
    <!DOCTYPE html>
    <html>
    <head>
      <title>Magenta.jsを使用したMIDIデータ生成</title>
      <script src="https://cdn.jsdelivr.net/npm/@magenta/music@2.0.4/dist/music.min.js"></script>
    </head>
    <body>
      <button onclick="generateMidi()">MIDI生成</button>
      <script>
        async function generateMidi() {
          // MusicVAEモデルの初期化
          const model = new music_vae.MusicVAE(
            'https://storage.googleapis.com/magentadata/js/checkpoints/music_vae/mel_2bar_small'
          );
          await model.initialize();
          
          // MIDIデータの初期化
          const notes = [];
          const sequenceLength = 32;
          const sequenceTempo = 120;
          
          // MusicVAEモデルから和音シーケンスを生成
          const chordSequence = model.sample(1, sequenceLength)[0];
          for (const chord of chordSequence) {
            for (const note of chord.notes) {
              notes.push({
                pitch: note.pitch,
                startTime: note.quantizedStartStep * (60 / sequenceTempo),
                endTime: note.quantizedEndStep * (60 / sequenceTempo)
              });
            }
          }
          
          // MIDIデータの生成と再生
          const midiData = mm.sequences.quantizeNoteSequence(
            {
              ticksPerQuarter: 220,
              totalTime: notes[notes.length - 1].endTime,
              notes: notes
            },
            1
          );
          const player = new mm.Player();
          player.start(midiData);
        }
      </script>
    </body>
    </html>
    
    このコードは、以下のように動作します。

    ボタンをクリックすると、generateMidi()関数が呼び出されます。
    MusicVAEモデルを初期化します。
    MIDIデータの初期化を行います。ここでは、notes配列にMIDIノートの情報を格納します。また、sequenceLength変数には和音シーケンスの長さ、sequenceTempo変数にはシーケンスのテンポを設定します。
    MusicVAEモデルから和音シーケンスを生成し、notes配列にMIDIノートの情報を追加します。
    notes配列をMIDIデータに変換し、再生します。この例では、mm.Playerを使用してMIDIデータを再生しています。
    ChatGPTによる説明

    まさか曲と作詞までお願いできたりはしないと思ったのですが

    むしろMagenta.js を紹介してきた!

    画像
    機械学習により作曲AIシステムを作ろうとする
    <!DOCTYPE html>
    <html>
    <head>
      <title>Magenta.jsを使用した「わがままメタバース」のMIDIデータ生成</title>
      <script src="https://cdn.jsdelivr.net/npm/@magenta/music@2.0.4/dist/music.min.js"></script>
    </head>
    <body>
      <button onclick="generateMidi()">MIDI生成</button>
      <script>
        async function generateMidi() {
          // MusicRNNモデルの初期化
          const model = new music_rnn.MusicRNN(
            'https://storage.googleapis.com/magentadata/js/checkpoints/music_rnn/melody_rnn/chord_pitches_improv'
          );
          await model.initialize();
          
          // MIDIデータの初期化
          const notes = [];
          const sequenceLength = 32;
          const sequenceTempo = 120;
          
          // MusicRNNモデルからメロディシーケンスを生成
          const seed = {
            notes: [
              { pitch: 60, startTime: 0.0, endTime: 0.5 },
              { pitch: 62, startTime: 0.5, endTime: 1.0 },
              { pitch: 64, startTime: 1.0, endTime: 1.5 },
              { pitch: 65, startTime: 1.5, endTime: 2.0 }
            ],
            totalQuantizedSteps: 8,
            quantizationInfo: { stepsPerQuarter: 4 }
          };
          const melodySequence = await model.continueSequence(seed, sequenceLength);
          for (const note of melodySequence.notes) {
            notes.push({
              pitch: note.pitch,
              startTime: note.startTime,
              endTime: note.endTime
            });
          }
          
          // MIDIデータの生成と再生
          const midiData = mm.sequences.quantizeNoteSequence(
            {
              ticksPerQuarter: 220,
              totalTime: notes[notes.length - 1].endTime,
              notes: notes
            },
            1
          );
          const player = new mm.Player();
          player.start(midiData);
        }
      </script>
    </body>
    </html>
    

    もはやメタAIここに現る…という感じ。

    まとめ:ChatGPTで作詞作曲ができるか?


    ・楽曲の構造や歌詞の韻を踏んだりは理解している風
    ・楽曲のコード生成については音楽知識がないと生成されたものの是非がわからない
    ・テキスト生成された楽曲をMIDI等の音源に変換する方法はもうちょっといい方法がありそう(継続研究必要)
    ・以上は日本語のポップミュージックでの例。古い楽曲や洋楽なら違った結果になる可能性はたはい。
    ・MusicRNN、VAE、Magentaを使ったAI曲作りの知識を入れてから再度触りたい

    実際に、松尾さん(お亡くなりになった奥様の声を使ってAI歌手を生成していらっしゃるクリエイターさん)がなかなかいい結果を出していることを見つけました。すばらしいです。

    ChatGPTといっしょに曲作りをしてみた。俺たちコンビ、けっこうやっていけるかも(CloseBox)/テクノロジー AI (2023 Jan 30 10:30) 松尾公也

    もちろん音楽生成系AIモデルはいくつかあるのですが、まずは松尾Pのブログを読んでみていただけるとよいと思います!

    以上失敗談でした!

    後日談:松尾さんからご感想いただいてしまった

    いやすごい。コードしか出せないと思ってたらMIDIまでいけるとは! 参考にさせていただきます! https://t.co/zPbwod3sYf

    — Koya Matsuo (@mazzo) March 12, 2023

    MusicXMLならもっと楽だったかも?

    やったぜ!

    っていうかいまやってみたらMusicXMLを語ってくれた…(不完全ですが) pic.twitter.com/Yh0bkc34gy

    — Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 12, 2023

    TidalCyclesだ、そうだ、それがあったのだ

    TidalCyclesの形式で出してくれって命令すると和音のテキスト出してくれたはずです!!
    さらにChatGPT→TidalCycles→DAWとすればMIDIで出してくれます!https://t.co/BeX7nese6Y

    — Kazz Fukuda (@kazz_fukuda) March 12, 2023

    https://tidalcycles.org/

    ライブコーディングでメガデモ風なVJできるoFチックなスクリプト環境

    本日の告知

    第1回AIアートグランプリの表彰式です
    https://www.aiartgrandprix.com/

    トークセッションに出演します。1時間ぐらいたったところからです。

    レポ書きました!

    あと、明日、誕生日です!40代がおわる!

    https://twitter.com/o_ob/status/1634932741715394560

    風船飛んだ🎈
    さようなら40代

    これからも子供みたいな心で生きます pic.twitter.com/tgmscey0nt

    — Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 12, 2023

    といいつつ1日にブログ2件もpublishしてしまった。


    恒例のタイトル画像おまけコーナー


    なんか一生懸命歌ってるアイドルっていいですよね…元気をもらえる…歌の上手い下手だけじゃないんですよ…プロンプトは忘れてしまいました。にじジャーニーで生成です。

    画像
    画像
    画像
    画像



     
    未来から来た、AIとVRとGPUのUXをエンタメにするホワイトハッカー作家。 年間700本以上の記事を書きながら、生成AI時代の「つくる人」の技術を 「難しいまま、面白く」社会に実装しています。 講演依頼なども歓迎です https://akihiko.shirai.as