TensorFlow製音楽生成プロジェクト「Magenta」を開発環境の設定から曲生成までやってみる。

# はじめに
magentaのGitHubの[README](https://github.com/tensorflow/magenta)を元に、Dockerを使わずにmagentaの開発環境を設定し、
[Basic RNN](https://github.com/tensorflow/magenta/tree/master/magenta/models/basic_rnn)で曲を生成したいと思います。

モデルは、訓練済みのものをダウンロードし用います。

手軽にDockerを用いてやる場合はこちらをご参考ください。
[TensorFlow製アート・音楽生成プロジェクト「magenta」で曲を作ってみる。](http://qiita.com/tackey/items/cd75d385ec08094dbd7f)


# 開発環境

Magentaの開発環境の準備には
・MagentaのGitHubレポジトリ
・Bazel
・TensorFlow
の3つが必要です。

また、現時点でMagentaはPython2.7のみ対応しているようなので、私はMacで、virtualenvでPython2.7の環境を作成した上で設定しました。

## MagentaのGitHubレポジトリのクローン

```
git clone https://github.com/tensorflow/magenta.git
```

## Bazel のインストール
https://www.bazel.io/versions/master/docs/install.html

```
$ brew install bazel
```


## TensorFlow
https://www.tensorflow.org/versions/master/get_started/os_setup.html

なお、TensorFlowのインストール時には、自分のPCがCPU onlyなのか、GPUも使えるのか、ご確認いただければと思います。
TensorFlowではCUDAというGPUに対応しているそうなので、Macに搭載されている方はそちらを使ってもいいかもしれません。
参考：[TensorflowでOSXのGPUが対応されたよ](http://qiita.com/tawago/items/15160c6aa0ebd1c61715)


私はCPU onlyで進めました。

```
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py2-none-any.whl
```

```
$ pip install --upgrade $TF_BINARY_URL
```


設定が終わったらテストを実行してみましょう。
git cloneした/magenta/配下に進み、下記のコマンドを叩きます。

```
bazel test //magenta/...
```

下記のようなメッセージが出れば成功、設定完了です。

```
.........
INFO: Found 65 targets and 27 test targets...
INFO: Elapsed time: 43.359s, Critical Path: 35.97s
//magenta/common:concurrency_test                                        PASSED in 5.4s
//magenta/interfaces/midi:midi_hub_test                                  PASSED in 14.8s
(中略)

Executed 27 out of 27 tests: 27 tests pass.
There were tests whose specified size is too big. Use the --test_verbose_timeout_warnings command line option to see which ones these are.
```



# Basic RNNで曲を作ってみる。

Magentaには学習モデルとして、Basic RNN、LookBack RNN、Attention RNNの3種がありますが、
今回は[Basic RNN](https://github.com/tensorflow/magenta/tree/master/magenta/models/basic_rnn)の手法を試します。

このモデルは、同タイミングには一つの音しか鳴らないメロディーとなります。
本投稿では行いませんが、自分でMIDIを入れて学習させる場合、そのMIDIで同タイミングに鳴る音があったとしても、ひとつの音しか考慮されないようです。

## 学習済みモデルのダウンロード

[こちら](http://download.magenta.tensorflow.org/models/basic_rnn.mag)からダウンロードできます。

ダウンロードしたら、任意の場所においてください。

## パスの設定

上記でダウンロードした学習済みモデルのパスを「絶対パス」で設定します。

```
BUNDLE_PATH=<absolute path of basic_rnn.mag>
```


## 曲の生成

下記のコマンドで生成できます。

```
bazel run //magenta/models/basic_rnn:basic_rnn_generate -- \
--bundle_file=${BUNDLE_PATH} \
--output_dir=/tmp/basic_rnn/generated \
--num_outputs=10 \
--num_steps=128 \
--primer_melody="[60]"
```

オプションは下記の意味があるようです。

### 曲の生成先

```
--output_dir=/tmp/basic_rnn/generated \
```
曲の生成先を決めることができます。

### 曲数
```
--num_outputs=10 \
```
曲を何曲作るかを決められます。

### 曲の長さ
```
--num_steps=128 \
```

何音、何小節の曲を作るかを設定します。128で8小節の曲が作られます。
1小節あたり、16個の音が入れられる、ということになると思います。
(「小節」などの言葉の定義曖昧ですが。。。)

### 曲のイントロ
```
--primer_melody="[60]"
```
曲を何の音で始めるか、になります。
例としては、
```--primer_melody="[60, -2, 60, -2, 67, -2, 67, -2]”```
これは「ドードーソーソー」を示しており、キラキラ星のイントロで始まる曲が生成されるようになります。
(ちなみに、上記だと8音なので、1小節目の半分を設定したことになります。)

なお数字は、
-2：no event
-1：note-off event
という風に設定がされていて、言葉だとよくわからないのですが、
`[60, -2, 60, -2, 67, -2, 67, -2]`の場合は「ドードーソーソー」と、その前の音が続くのに対し、
`[60, -1, 60, -1, 67, -1, 67, -1]`の場合は「ド・ド・ソ・ソ・」と、音が途切れるような聞こえ方になりました。
「何もしない」と「音を消す」という違いでしょうか。

60：ド
67：ソ
というのは、ピアノの鍵盤数で音を示しているのかと思います。

実行すると、曲が生成されます。


# 結果
下記の曲ができました。
「ド・ド・ソ・ソ・」のイントロで始まり、16小節の曲にしました。
[サンプル](https://clyp.it/shk4kgz3)

最初を「ドードーソーソー」にしたものがこちらです。
[サンプル](https://clyp.it/h54asinz)


結構雰囲気が変わりますし、イントロの設定がその後のメロディにも影響を与えていることが実感できますね。

ありがとうございました。