ChatGPTは日々進化をとげています。今回はChatGPT Plusに作曲に挑戦してもらいました。イメージとしては「音楽再生のファイルを作成してもらえる」というものでしたが、まだ、専用のファイル作成とはいきませんでした。そこで、macのターミナルとMuseScore 4というアプリをつかうことにしました。
ChatGPTに作曲を依頼する
ChatGPTにどんな曲を作って欲しいか依頼します。
ショパン風のテンポが速い3分程度のピアノ練習曲をパイソンで作成してください。と入力すると以下のような回答が出てきました。
現在の環境では、music21
ライブラリを使用することができません。しかし、ショパン風のテンポが速いピアノ練習曲を作成するためのPythonスクリプトのコンセプトをご提案できます。このコンセプトをもとに、ご自身でスクリプトを実行することが可能です。
ショパン風のピアノ練習曲のPythonスクリプト概念
とりあえず、以下のようなコードが出てきたので、テキストファイルにコピーしてchopin_style_etude.pyのファイル名で保存しました。
python
from music21 import stream, note, tempo, meter # Creating a Chopin-style, fast-paced piano etude # Initialize a music stream piece = stream.Stream() # Set the tempo to "Presto" (very fast) piece.append(tempo.MetronomeMark('Presto', 160)) # Set the time signature to 4/4 piece.append(meter.TimeSignature('4/4')) # Define a melody and rhythm in a Chopin-esque style # Using a range of notes and typical romantic era flourishes notes = ['C4', 'E4', 'G4', 'C5', 'E5', 'G5', 'C6', 'E6', 'G6', 'C7', 'E7', 'G7', 'C7', 'G6', 'E6', 'C6', 'G5', 'E5', 'C5', 'G4', 'E4', 'C4'] # Add notes to the stream with a mix of eighth and sixteenth notes for a fast tempo for i, n in enumerate(notes): new_note = note.Note(n) new_note.duration.type = '16th' if i % 2 == 0 else 'eighth' piece.append(new_note) # Repeat the pattern to extend the piece to approximately 3 minutes for _ in range(20): # Adjust the range for the desired length for i, n in enumerate(notes): new_note = note.Note(n) new_note.duration.type = '16th' if i % 2 == 0 else 'eighth' piece.append(new_note) # Save the piece as a MIDI file midi_file_path = "Chopin_Style_Etude.mid" piece.write('midi', fp=midi_file_path)
曲を再現する環境を整える
曲を再現するには、Python、music21
ライブラリ、MuseScore 4(アプリ)が必要です。私はMacユーザーでこの解説はMacのケースとなります。
Pythonのインストールから始まり、music21
を使用してMusicXMLファイルを生成し、MuseScoreで開くまでの手順をまとめました。
Pythonのインストール
- Pythonがインストールされているか確認する: ターミナルを開き、
python3 --version
と入力してPythonがインストールされているかを確認します。
インストールされていればPython 3.12.0とか、バージョンが表示されます。 - Pythonがインストールされていない場合: Python公式ウェブサイトからPythonをダウンロードしてインストールします。
ターミナルでmusic21をインストールする
コードのことをまったく知らないドシロートの私にとって、問題は次のライブラリのインストールでした。ターミナルを触ったら何かおかしくなるんじゃないの?と不安でしたが、なんのことはありません。
music21のインストール: 以下のコマンドをターミナルに入力して、music21
をインストールします。
pip3 install music21
コードがズラーっと書き込まれます。大丈夫かな?なんて。
と素人の私は心配でしたが、書き込まれたコマンドをコピペしてGTPに聞くと問題ないとのことでした。うまくいかなければGTPと対話しながら進めるのもありです。
ターミナルでファイルが保存されているディレクトリに移行する
ターミナルでファイルを実行するには、ファイルのディレクトリを示さなければなりません。私はわかりやすいようにデスクトップにしました。ターミナルに入力するコマンドは次のとおりです。
cd Desktop
スクリプトを実行するためのコマンドを入力します。
python3
chopin_style_etude.py
うまく実行されれば、デスクトップにファイルが現れます。
ChatGPTでCM曲は作成できるのか?
パイソンとmusi21のライブラリを作成することでChatGPTに音楽が作曲できることがわかりました。そこでピアノ、サックス、ドラムの15秒のCMメロディーの作成を依頼しました。
しかし、一発ではできませんでした。ターミナルに入力してもエラーが出ます。そしてそのコードをGTPに入力して修正してもらいます。
今度はうまく行ったのですが、第1章節しかちゃんと出力しませんでした。時間が15秒というと5秒分くらいしかまともに作らないのです。何度かやるうちに15秒間はできるようになったのですが、全ての楽器が同じメロディに・・・。
でプロンプトを「4つの楽器がハーモニックに響き、疾走するような速いテンポの30秒のCMメロディーのPythonスクリプトにしてください」に変更しました。
データ解析の時も少しずつしか進まなかったのでAPI使わないと限界があるのかなと感じる。30秒オーダーしてできたのが12秒ちょっと。しかし、これは工程を繰り返すことで可能なことがわかりました。
MuseScore 4での再現
MuseScoreをダウンロードして音声ファイルをファイルを開けると楽譜が現れます。プレイボタンを押すと音が聞こえます。
実際の音は下の▶︎ボタンで聴けます。作曲というよりイメージに近い感じでしょうか。
パイソンのコードは次のとおりです。
python
from music21 import stream, note, chord, tempo, instrument, meter
# 基本設定
duration = 30 # 秒数
bpm = 120 # ビート/分
beats = duration / 60 * bpm # 合計ビート数
# ストリーム(楽譜)オブジェクトの作成
score = stream.Score()
score.insert(0, meter.TimeSignature('4/4')) # 拍子記号
score.insert(0, tempo.MetronomeMark(number=bpm)) # テンポ
# 各楽器のパートを作成
piano_part = stream.Part()
piano_part.insert(0, instrument.Piano())
sax_part = stream.Part()
sax_part.insert(0, instrument.AltoSaxophone())
violin_part = stream.Part()
violin_part.insert(0, instrument.Violin())
drum_part = stream.Part()
drum_part.insert(0, instrument.Percussion())
# ピアノのハーモニー(コード進行の拡張)
chords_piano = [['C', 'E', 'G'], ['A', 'C', 'E'], ['F', 'A', 'C'], ['G', 'B', 'D'], ['E', 'G', 'B'], ['F', 'A', 'C'], ['G', 'B', 'D'], ['C', 'E', 'G'], ['A', 'C#', 'E'], ['D', 'F', 'A'], ['G', 'B', 'D'], ['C', 'E', 'G']] * 2 # 2回繰り返し
for c in chords_piano:
piano_part.append(chord.Chord(c, quarterLength=1)) # 1拍子でコードを短くする
# サックスのメロディ(長さを増やす)
notes_sax = ['C', 'D', 'E', 'F', 'G', 'A', 'B', 'C5', 'D5', 'E5', 'F5', 'G5', 'A5', 'G5', 'F5', 'E5'] * 2 # 2回繰り返し
for n in notes_sax:
sax_part.append(note.Note(n, quarterLength=0.5)) # 0.5拍子を維持
# バイオリンのメロディ(長さを増やす)
notes_violin = ['G', 'A', 'B', 'C5', 'D5', 'E5', 'F5', 'G5', 'A5', 'B5', 'C6', 'D6', 'E6', 'D6', 'C6', 'B5'] * 2 # 2回繰り返し
for n in notes_violin:
violin_part.append(note.Note(n, quarterLength=0.5)) # 0.5拍子を維持
# ドラムのリズム(長さを増やす)
rhythm_drum = ['C', 'E', 'G', 'C', 'E', 'G', 'C', 'E', 'G', 'C', 'E', 'G', 'C', 'E', 'G', 'C'] * 4 # 4回繰り返し
for r in rhythm_drum:
drum_part.append(note.Note(r, quarterLength=0.25)) # 0.25拍子を維持
# 各パートをスコアに追加
score.append(piano_part)
score.append(sax_part)
score.append(violin_part)
score.append(drum_part)
# MIDIファイルとして保存
score.write('midi', 'cm_song_complete.mid')