音楽を作曲してくれるAIです。MIDIでアウトプットされます。
GPT-2をベースに作成されました。任意の長さの音楽を生成出来て、さらにコード進行を指定して生成させることも可能です。
あるいは、作りかけの曲の続きを作曲してくれます。
出力された音楽は、著作権や利用範囲の制限のないフリーコンテンツとして利用出来ます。
学習済みのモデルは、出力トラック数が5トラックの「base_5tr」と、17トラックを出力する「base_17tr」の2種類あります。
モデル | 出力トラック | 総パラメーター数 |
---|---|---|
base_5tr (backup url) |
Drums, Piano, Guitar, Bass, Strings | 86167296 |
base_17tr (backup url) |
Drums, Piano, Chromatic Percussion, Organ, Guitar, Bass, Strings, Ensemble, Brass, Reed, Pipe, Synth Lead, Synth Pad, Synth Effects, Ethnic, Percussive, Sound Effects |
86941440 |
まず、GitHubからクローンします。
$ git clone https://github.com/tanreinama/chord2melody
$ cd chord2melody
上記のリンクから学習済みのモデルをダウンロードして展開します。
$ wget https://www.nama.ne.jp/models/chord2melody-base_5tr.tar.bz2
$ tar xvfj chord2melody-base_5tr.tar.bz2
モデルを指定し、chord2melody.pyを起動すると、MIDIファイルが作成されます。
$ python3 chord2melody.py --model base_5tr
出力可能な音楽の長さに制限はありません。合計で何小節分の音楽を生成するかは、「--num_bars」オプションで指定します。
$ python3 chord2melody.py --num_bars 48
コード進行を指定するには、「--chord」オプションを使用します。1小節に何個のコードを入れるかは「--chordbeat」オプションで指定します。
$ python3 chord2melody.py --chord "C|C|C|C|Dm|Dm|Dm|Dm|G7|G7|G7|G7|Am|Am|Am|Am" --chordbeat 4
「--chord」オプションには、利用出来るコード一覧にあるものか「auto」を、「|」で繋げて指定します。
「melody2melody.py」プログラムは、作りかけの曲の続きを自動で作曲してくれます。「melody2melody.py」に「--input」オプションで、続きを作りたいMIDIファイルを指定します。
$ python3 melody2melody.py --input halfway.mid
「--top_p」を指定することで、曲の揺らぎを指定出来ます。
$ python3 chord2melody.py --chord "C|C|C|C|Dm|Dm|Dm|Dm" --top_p 45,7
「--top_p」には、一つか二つの数字を入れます。一つ目の数字はコード進行がある時に使用され、二つ目は(指定されていれば)コード進行が「auto」の時に使用されます。
学習のためのデータは、 Lakh Pianoroll Datasetを使用します。予め、lpd_5_full.tar.gz又は、lpd-17-full.tar.gzをダウンロードして展開しておきます。
trainディレクトリに移動して、「encode.py」を実行して、学習データファイルを作成します。
「--da」オプションで、変調によるData Augmentationを指定出来ます。ランダムに変調を行ったデータで、学習データを増やします。
$ cd train
$ python3 encode.py --dataset lpd_5 --output lpd_5_dataset
「--dataset」にデータセットの種類(lpd_5/lpd_7)を、「--input」にエンコードされた学習データファイルを指定して、「train.py」を実行します。
$ python3 train.py --dataset lpd_5 --input lpd_5_dataset
自前のデータを使ってファインチューニングするには、まずデータを5トラック or 17トラックのMIDIデータに編集する必要があります。
そして、トラックの並び順を、元のモデルと同じ順番にして、pypianoroll形式で保存します。
その後、「encoder.py」で学習データファイルを作成し、「--restore_from」にオリジナルの学習済みのモデルを指定してやると、ファインチューニングすることが出来ます。
$ python3 train.py --dataset lpd_5 --input lpd_5_dataset --restore_from ../base_5tr