【Magenta】作曲AIを使って作曲してみよう！

生成AIは昨今目覚ましい飛躍を遂げています。特にChatGPTなどのLLMがかなり注目されていると思います。画像やテキストの生成は気軽にできるようになっていますが、作曲すらもAIでできるようになりました。
今回は、Googleが開発した作曲AIライブラリのMagentaを使って作曲するまでの流れを紹介いたします！

## Magentaについて
MagentaとはGoogleが開発した音楽生成の機械学習ライブラリです。PythonやJavaScriptで使用することができ、オープンソースなので誰でもフリーに使うことができます。
現在のところ、オープンソースの音楽生成AIの中では最も手軽に使えて、最もアウトプットの出来が良いと言えます。（いずれ更新されるかもしれませんが・・・）

### Magentaの特徴
Magentaは以下の特徴があります。

- 専門的な音楽の知識がほとんど必要ない
- プログラム（生成できる音楽）の種類が多彩
- データも豊富に公開されている
- コードがすべて公開

上記の特徴から多少のプログラミングができれば、さまざまな楽曲を無料で生成することができます。
作曲という特殊な技能を専門的な知識なしにできるのもありがたいです。
さらに、改良やカスタマイズをすることも可能であり、自分だけの生成AIを作成することができます。


### Magentaで生成できる音楽の種類
Magentaでは様々な作曲AIモデルがあり、どんな音楽を作りたいかによって選ぶことができます。現在使用できる作曲のモデルは主に７つあります。

- Melody RNN(シンプルなメロディー)
- Drums RNN（ドラム演奏）
- MusicVAE（3パートのバンド演奏）
- Improv RNN（コード進行に沿ったメロディー）
- Polyphony RNN（バッハ風合唱曲）
- Pianoroll RNN（現代音楽的な複雑な和音）
- Performance RNN（高度なピアノ演奏）

やや複雑な音楽からシンプルで作曲しやすいモデルまでそろえています。複雑な作曲をしようとするほど、設定しなければいけないパラメータも増える傾向にあります。最初のうちはシンプルなモデルで試してからだんだん複雑なモデルを試していけば、作曲AIの使い方も覚えてくるでしょう。
ちなみに、この７種類は上から下になるほど複雑なものと思っていただければと思います。

### Magentaを使う準備を使用
Magentaを使用していく前に、環境を整えていきましょう。
まず、Python環境は当然のごとく必要なので用意しておきます。ローカルにないならGoogle Colaboratoryを使うのが手間も少なくていいと思います。計算リソースは無料アカウントでも十分でしょう。
あと、最低限使うライブラリはmagentaとtensorflowなのでpip installしておきます。

`pip install magenta tensorflow`

GithubにあるMagentaのソースも入れておきましょう。下記のリンクからクローンしておきましょう。これで一通りの準備は終わりです。

https://github.com/magenta/magenta/tree/main

## バッハ風音楽を作曲してみよう！
バッハ風の作曲できるモデルを試していきましょう。色々なモデルを試してきた中で、シンプルすぎず作曲できてる感があったのでこれを選んでみました。Polyphony RNNがそれに当たります。

事前準備として使うモデルの学習済みデータをダウンロードしておきます。
それぞれのモデルのページのREADMEからダウンロードできます。

githubからmegenta/modelsで各モデルのページに行きます。そこにあるPre-trainedの直下にリンクがあるので、.mag形式のファイルをダウンロードしてわかりやすいパスに入れておきましょう（後ほど使います）。これで一通りの準備は完了です。

https://github.com/magenta/magenta/tree/548dc4e2e6a8e3ac65e1921bd94fe589d661d47b/magenta/models/polyphony_rnn

まずはこの作曲モデルで扱う３つのオプションについて説明していきます。
多少の音楽理論の話が出てきますが、簡単なので難しく考えずにやっていただければと思います。３つのオプションは導入音を指定する方法で、３つのうちどれかを選ぶことになります。

```
- primer_melody
- primer_midi
- primer_pitches
```
#### primer_melody
導入で使用するメロディを指定します。指定する範囲は決められますが今回は２章節分で、四部音符の音を設定します。
ドが60と言う数値が割り当てられており、そこから半音上がるごとに数値も1上がっていくと言う仕組みになっています。-1は音を止める（ミュート）で-2はイベントなしなので前の音をそのまま伸ばすと言う指定になります。
２小節を四部音符で指定するので、８個の音をオプションで指定すればいいだけです。下記だとソの音のみで導入を作っています。もっと長くできますが、初心者の方は２小節の設定で試してもらえればと思います。

`
例：
--primer_melody="[67,-2,-2,-2,67,-2,-2,-1]"
`

各メロディに割り振られた数値は以下のとおりです。2つ空いているのは間に#/♭が入っています。
```
60(ド) 62(レ) 64(ミ) 65(ファ) 67(ソ) 69(ラ) 71(シ) 
```

#### primer_midi
上記と違って簡単なオプションです。導入をmidiファイルで以っているのであれば、それを利用することができるのでファイルのパスを指定するだけです。メロディを指定しない場合はmidiファイル指定で行けます。ただし、midiファイルを都合よく以ていないのであれば、この方法を使いましょう。

`
例: --primer_midi=/Users/Document/Path-to-file/
`

#### primer_pitches
これまでは短音の導入を想定していますが、和音をガイドに指定することができます。これがそのオプションです。
使い方はprimer_melodyと同じように使用する音を数値で指定するだけです。ただ、和音を１つ指定すればいいだけなので、和音をリストに入れて渡してやればいいだけです。和音の構成がわからない場合は、音楽に関するサイトなどを参考にしてみてください。

https://jp.yamaha.com/services/music_pal/study/chord/name/index.html

`
例: --primer_pitches="[71,69,67]"
`

### 作曲するためのコマンド全体
ここまでオプションについて書いていきましたが、いよいよ作曲のためのコマンドを打って、実際に作曲させていければと思います。他にも設定するオプションがあるので、それの解説も同時に行なっていきます。


```
polyphony_rnn_generate \
    --bundle_file=polyphony_rnn.magのパス \
    --output_dir=出力に指定する任意のパス \
    --num_outputs=生成する音楽数(int) \
    --num_steps=生成する曲の長さ（小節数:int） \
    --qpm=テンポ(曲の速さ:int) \
    --temperature=1.0 \
    --primer_meklody(or midi or pitches)=指定したガイド音 \
    --condition_on_primer=ガイド音を和音と認識するか（bool）
    --inject_primer_during_generation=ガイド音を生成曲に含めるか(bool)
```

上記のコマンドを打てば音楽の生成をすることができます。int指定のものは任意の数値を入れてみてください。boolはTrue、Falseのどちらかを指定してください。あまりオプションについて考えるよりも試してみた方が早いので、色々とオプションをいじってみて実際に出来上がった曲を聴いてみるのがいいでしょう。

ここまでで作曲できるので、ここから先は自分の手で試していただければと思います。

## 自分だけの作曲モデルも作成できる
githubをチェックしてもらえれば、わかりますがモデルの定義ファイルも格納されてます。そのパラメータをいじってみたり、学習データを自分で用意することで自分だけの作曲モデルを作成することができます。

上記の既存モデルを使うよりもハードルは上がりますが、自分だけの作曲AIを作れると言うのは夢があると思います。既存モデルを触ることに飽きてきたら次のステップとしてぜひオリジナルAI作成を検討してみてください。
以上が作曲AI Magentaの紹介になります。