DAW悪戦苦闘記

DAWやMIDIを通じてちまちまとDTMを楽しむ記録+MIDI検定1級到達記

Magentaによるメロディ生成 (3) MIDIデータ生成

随分と間が空いてしまったが、前回の環境構築に引き続き、MIDIデータの生成を試してみる(かなりマニアックです)。

daw-jones.hatenablog.com

プリセットの学習済みデータ

有難いことに、Magentaには数千曲のMIDIデータを使って学習したモデル一式が添付されており、ユーザ独自のデータを学習させないのであれば、これらの学習済みモデルをそのまま流用することも可能である。

学習済みのモデルとデータ一式は Bundle File (.magファイル)と呼ばれており、デフォルトの環境では/magenta-modelsディレクトリの下にあらかじめいくつか格納されている(下図参照)。特にattention.magbasic_rnn.mag、およびlookback_rnn.magの3種が代表的なものである。

f:id:daw_jones:20170917212732p:plain

生成モデル

生成モデルに応じていくつかのコマンドが用意されている。この中で実行例として最も頻繁に引用されるモデルは 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"の節を参照。

github.com

コマンドに与えるパラメータに関しては、以下のQiita記事なども参考になるかと思う(前回に引き続いて再掲)。ただし、Magentaのバージョン改訂に伴い、生成コマンド自体は古くなっているので読み換える必要がある(いちいち都度ビルドしたりPythonスクリプトを指定実行するような煩わしさがなくなった)。

qiita.com

qiita.com

パラメータについて若干補足しておくと、

  • 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等ユーザ領域へコピーしておいた方がよいだろう。

f:id:daw_jones:20170917225227p:plain

生成MIDIデータの中身

生成結果の一つをDominoで開いてみると、以下のようなMIDIデータが観察される。

f:id:daw_jones:20170918125227p:plain

見ての通り、現バージョンではベロシティは表現手段として使われていない。学習結果を反映している手前、一応それなりのメロディにはなっており、まったくランダムなデタラメという感じではない。ただし生成結果が全部使い物になるというわけでもなく、10個生成したらこの中から使えそうなものだけ取捨選択するという運用になろう。

生成メロディのままではまともな楽曲として成立しないので、これをChordanaに入力し、伴奏アレンジを加えれば結構面白い制作物ができるかもしれない。なお、現状ChordanaはSMFをインポートできないので、大体ざっくりした感じでいいからキーボード手入力か鼻歌で入れてみるとよい。Chordanaとのコラボについてはまた後日実験してみたいと思う。