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に咀嚼させてみる
秋元康さんの作詞ですから味わって食べてくださいね!
「チャッチャッチャ バーチャル」についても聞いてみた。
楽曲のパートについてもどれぐらい理解しているんだろう
ベタ打ちのテキストからいちど再出力してもらったら、
きっちり整形して書き出してきた。
これは人間がやるとそこそこに大変だし、歌詞を配信システムに入力する作業とかを手作業でやったことある人がいたら、これは感涙もの。
楽曲を吐かせてみる
出来心で楽曲を生成させてみたかったのです。
実際に生成してきたコード進行
プロンプトとしては
「この歌のコード進行をテキストで:」と聞いただけです。
正直分からん。
「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作曲と作曲理論の本です。
それっぽいコードが出てきます。これはこれで沼かも…(喜)
<!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>
まさか曲と作詞までお願いできたりはしないと思ったのですが
むしろ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のブログを読んでみていただけるとよいと思います!
以上失敗談でした!
後日談:松尾さんからご感想いただいてしまった
MusicXMLならもっと楽だったかも?
TidalCyclesだ、そうだ、それがあったのだ
ライブコーディングでメガデモ風なVJできるoFチックなスクリプト環境
本日の告知
第1回AIアートグランプリの表彰式です
https://www.aiartgrandprix.com/
トークセッションに出演します。1時間ぐらいたったところからです。
レポ書きました!
あと、明日、誕生日です!40代がおわる!
https://twitter.com/o_ob/status/1634932741715394560
といいつつ1日にブログ2件もpublishしてしまった。
恒例のタイトル画像おまけコーナー
なんか一生懸命歌ってるアイドルっていいですよね…元気をもらえる…歌の上手い下手だけじゃないんですよ…プロンプトは忘れてしまいました。にじジャーニーで生成です。