随分と間が空いてしまったが、前回の環境構築に引き続き、MIDIデータの生成を試してみる(かなりマニアックです)。
プリセットの学習済みデータ
有難いことに、Magentaには数千曲のMIDIデータを使って学習したモデル一式が添付されており、ユーザ独自のデータを学習させないのであれば、これらの学習済みモデルをそのまま流用することも可能である。
学習済みのモデルとデータ一式は Bundle File (.mag
ファイル)と呼ばれており、デフォルトの環境では/magenta-models
ディレクトリの下にあらかじめいくつか格納されている(下図参照)。特にattention.mag
とbasic_rnn.mag
、およびlookback_rnn.mag
の3種が代表的なものである。
生成モデル
生成モデルに応じていくつかのコマンドが用意されている。この中で実行例として最も頻繁に引用されるモデルは Melody RNN だと思う。今回もこのモデル・コマンドを使ってみる。他にも興味深いものとしては、コード進行ベースの学習モデルである Improv RNN などもあるが、後々試すこととしたい。
DockerによるMagentaの実行
前回記事でも触れた通り、ターミナルから以下のコマンド一行でMagentaの環境を立ち上げてLinuxの配下に入る。起動コマンドのオプション等詳細については、公式サイトの入門ページか、もしくはQiitaの記事などを参照されたい。
docker run -it -p 6006:6006 -v /tmp/magenta:/magenta-data tensorflow/magenta
ここで特に重要なのは-v
(ボリューム)オプションで、ホスト側(Macなど)の/tmp/magenta
ディレクトリをDocker上のLinux環境下/magenta-data
ディレクトリに同期(マウント)する。これで両者間でのデータのやりとりが可能となる。そうしないと、せっかく生成したMIDIデータがコンテナ終了後に消えてしまい、保存再生することができない。
MIDI生成コマンドとパラメータ
上記 Melody RNN モデルを使い、メロディのMIDIデータを生成するためには、生成コマンドmelody_rnn_generate
を実行するだけでよい。蛇足ながらこのコマンドは、上述の通りにDockerからMagentaの環境を立ち上げた状態のLinux上で投入する。
melody_rnn_generate \ --config=lookback_rnn \ --bundle_file=/magenta-models/lookback_rnn.mag \ --output_dir=/magenta-data/lookback_rnn/generated \ --num_outputs=10 \ --num_steps=128 \ --primer_melody="[60]"
本コマンド詳細については、以下の公式ページより"Generate a melody"の節を参照。
コマンドに与えるパラメータに関しては、以下のQiita記事なども参考になるかと思う(前回に引き続いて再掲)。ただし、Magentaのバージョン改訂に伴い、生成コマンド自体は古くなっているので読み換える必要がある(いちいち都度ビルドしたりPythonスクリプトを指定実行するような煩わしさがなくなった)。
パラメータについて若干補足しておくと、
- bundle_file: 本例では上述の学習済みプリセット・データを指定する。今回はやらないが、ユーザ独自の学習データを使う場合はその際に作成した Bundle File を指定してもよい。
- output_dir: 本例の
/magenta-data
ディレクトリは、Magenta起動時のDockerコマンドでボリューム指定した場所と同じにする。サブディレクトリのlookback_rnn/generated
は自動的に作成される。生成されたMIDIデータ(SMF)はこのサブディレクトリに保存される。 - primer_melody: 出だしのメロディを指定できる。ノート番号はMIDI規格の通りに中央ドを60とし、16分音符単位のステップ・シーケンスでリスト表記する。SMFを与えることも可能。本例ではC3単音のみ指定。したがって、生成データはすべてC3からスタートすることになる。
生成ファイル
本例ではパラメータ指定の通りに10個の生成結果(SMF)を所定のディレクトリに書き出す(下図参照)。DockerにてMagenta立ち上げ時のボリューム指定により、これらはすべてMac上の/tmp/magenta
ディレクトリに保存され、Dockerセッション終了後もそのまま消えないで残るが、念のために$HOME/Documents
等ユーザ領域へコピーしておいた方がよいだろう。
生成MIDIデータの中身
生成結果の一つをDominoで開いてみると、以下のようなMIDIデータが観察される。
見ての通り、現バージョンではベロシティは表現手段として使われていない。学習結果を反映している手前、一応それなりのメロディにはなっており、まったくランダムなデタラメという感じではない。ただし生成結果が全部使い物になるというわけでもなく、10個生成したらこの中から使えそうなものだけ取捨選択するという運用になろう。
生成メロディのままではまともな楽曲として成立しないので、これをChordanaに入力し、伴奏アレンジを加えれば結構面白い制作物ができるかもしれない。なお、現状ChordanaはSMFをインポートできないので、大体ざっくりした感じでいいからキーボード手入力か鼻歌で入れてみるとよい。Chordanaとのコラボについてはまた後日実験してみたいと思う。