ChatGTPが作曲した音をMuse Scoreで再現してみた

スポンサーリンク
ChatGPT作曲

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 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')
タイトルとURLをコピーしました