
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に咀嚼させてみる
秋元康さんの作詞ですから味わって食べてくださいね!

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

楽曲のパートについてもどれぐらい理解しているんだろう
ベタ打ちのテキストからいちど再出力してもらったら、
きっちり整形して書き出してきた。

これは人間がやるとそこそこに大変だし、歌詞を配信システムに入力する作業とかを手作業でやったことある人がいたら、これは感涙もの。
「わがままメタバース」という曲、
— Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 10, 2023
秋元康さん作詞でわるくはないのだけど
「チャッチャッチャ バーチャル」ってのがすごい引っかかる大事なところだな…人間の所業だ。
https://t.co/Iy6bjMlgvE
楽曲を吐かせてみる
出来心で楽曲を生成させてみたかったのです。
ヒェッ…コード進行と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 |
正直分からん。
「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と音楽理論をどちらも一気に学びたい!」「作曲のアイデアが出てこない時、ヒントにしたい!」という方にオススメです。
それっぽいコードが出てきます。これはこれで沼かも…(喜)

<!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データを再生しています。
まさか曲と作詞までお願いできたりはしないと思ったのですが
むしろMagenta.js を紹介してきた!

<!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ならもっと楽だったかも?
やったぜ!
— Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 12, 2023
っていうかいまやってみたらMusicXMLを語ってくれた…(不完全ですが) pic.twitter.com/Yh0bkc34gy
TidalCyclesだ、そうだ、それがあったのだ
TidalCyclesの形式で出してくれって命令すると和音のテキスト出してくれたはずです!!
— Kazz Fukuda (@kazz_fukuda) March 12, 2023
さらにChatGPT→TidalCycles→DAWとすればMIDIで出してくれます!https://t.co/BeX7nese6Y
ライブコーディングでメガデモ風なVJできるoFチックなスクリプト環境
本日の告知
第1回AIアートグランプリの表彰式です
https://www.aiartgrandprix.com/
トークセッションに出演します。1時間ぐらいたったところからです。
レポ書きました!
あと、明日、誕生日です!40代がおわる!
https://twitter.com/o_ob/status/1634932741715394560
風船飛んだ🎈
— Dr.(Shirai)Hakase #AI神絵師本 #GREEVRStudioLab (@o_ob) March 12, 2023
さようなら40代
これからも子供みたいな心で生きます pic.twitter.com/tgmscey0nt
といいつつ1日にブログ2件もpublishしてしまった。
恒例のタイトル画像おまけコーナー
なんか一生懸命歌ってるアイドルっていいですよね…元気をもらえる…歌の上手い下手だけじゃないんですよ…プロンプトは忘れてしまいました。にじジャーニーで生成です。




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