見出し画像

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に咀嚼させてみる


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

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

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

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

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

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

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

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

楽曲を吐かせてみる

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

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

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

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

イントロ:
| 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のブログを読んでみていただけるとよいと思います!

以上失敗談でした!

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

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

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

https://tidalcycles.org/

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

本日の告知

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

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

レポ書きました!

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

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

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


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


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



この記事が気に入ったらサポートをしてみませんか?