FMODをつかってインタラクティブミュージック(1) オーサリング編


FMODをつかってノンリニア＆インタラクティブなMusicを作ってみたいとおもいます。オーサリングと組み込みで必要とする人がちがうとおもいます。本文書ではオーサリングの手順を説明します

## ゴール

今回は[Unity公式のデモ]( https://bitbucket.org/Unity-Technologies/audiodemos )をFMODで作ってしまいたいと思います。しかしこのデモは何度見てもすごい。

### 遷移情報
遷移としては以下です。
- Intoro -> Main1に遷移
- Main1->{Main1, Main2, BreakDown}のいずれかに遷移
- Main2->{Main1, Main2, BreakDown}のいずれかに遷移
- Breakdown->{Main1, Main2}のいずれかに遷移
- 
## FMODについて

### FMODとは

FMODについてざっくりと説明すると、ADX2やWwiseなどとおなじサウンドエンジンです。
たとえばUnityの標準オーディオシステムはFMODを基本として実装されています。Stream再生なんかでいい感じにバグらせるとFMODのエラーが剥き出しで吐かれたりします。
GDCなどの発表でも結構つかってる人は多く、Forza7とかRise of the TombRaiderとか、あと個人的に大好きなダクソ3が[採用リスト]( https://www.fmod.com/games )にはいっててびっくりしました。

### インストール

まず[FMOD公式サイト](https://www.fmod.com/)にいきます。
そして右上Sign Inからユーザー登録します。ユーザー登録がおわったら[ダウンロードページ](https://www.fmod.com/download)からFMOD Studio(オーサリングツール)と、あとで使うのでIntegrationタブのなかにあるUnity Integrationをダウンロードします。
![スクリーンショット 2018-01-25 13.38.30.png](https://qiita-image-store.s3.amazonaws.com/0/18557/62d5e644-27bd-c44e-9adc-381ad1cf2540.png "スクリーンショット 2018-01-25 13.38.30.png")
なおこのページ、表示までに少々時間がかかるのでしずかに待ちます。

ダウンロードが終了したらそのまま使えます。MacならApplicationフォルダにつっこんでおきます。

## Introつくる

### 音源を追加する

さきにUnityDemoのなかにあるoggをなんらかの手段([こんなの](https://qiita.com/dTAT/items/392e3784a8ef0b8d44f3))でまとめて、あらかじめwavに変換しておきます。

用意ができたらFMOD Studioを起動します。
起動したら左のExplorerのAssetsタブのウィンドウにほうりこみます。
![スクリーンショット 2018-01-25 14.07.44.png](https://qiita-image-store.s3.amazonaws.com/0/18557/9cc503b2-9d29-39e2-3030-cde0cc59d153.png "スクリーンショット 2018-01-25 14.07.44.png")

## Introを作る

まず簡単なIntro部分から作成します。
楽曲構成は以下です。各トラックは{}内から1つ抽選されます。
Intro
- Bell: {intro bell synth1, 空トラック}
- Marble: {intro rolling marble, 空トラック}
- Melody: {intro sonar1, ambience organ1}

### 構成を作る

FMODではEventという単位で音を管理します。Eventsタブに移動し、ウィンドウで右クリック>NewEvent>New2DEventを選択します。
![スクリーンショット 2018-01-25 14.26.38.png](https://qiita-image-store.s3.amazonaws.com/0/18557/5ca86523-1501-2673-11b7-15f61b1cab58.png "スクリーンショット 2018-01-25 14.26.38.png")	
すると新しいEventが追加され、右側にトラックが表示されます。
Introでは全部で3トラック必要なのでAudio1を右クリック>Add Audio Trackをして3トラックつくります。

### トラックの中身を作る
まずはMelodyトラックをつくります。これは2音源から1つ抽選してならします。
作成したトラックを選択し、トラックの中身あたりで右クリック>Add MultiInstrumentを選択します。
![スクリーンショット 2018-01-25 14.39.31.png](https://qiita-image-store.s3.amazonaws.com/0/18557/bb25aeb0-f270-9904-290e-8939c725847b.png "スクリーンショット 2018-01-25 14.39.31.png")
つぎに作成してできたフレームのなかに必要な2ファイルを選択(MacならCmd押しながら、WinならCtrlおしながら選択)して放り込みます
![スクリーンショット 2018-01-25 14.43.07.png](https://qiita-image-store.s3.amazonaws.com/0/18557/12a722a4-4a1d-82e0-b812-a955a9b46e6f.png "スクリーンショット 2018-01-25 14.43.07.png")
はい。じつはこれで完成です
追加してできたフレームを選択すると、画面下部が以下のようになります。
![スクリーンショット 2018-01-25 14.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/18557/3591cd51-9793-0e66-e34f-34375b7c2282.png "スクリーンショット 2018-01-25 14.49.22.png")
このダイスマークはランダムをあらあわしており、デフォルトでオンです。これにより放り込んだだけでそれらの音源から1つえらぶというのが実現されます。


### 発音されるかがランダムなトラックをつくる
ただ、残りのBellトラックなどはすこし特殊です。
Bell: {intro bell synth1, 空トラック}
は要するにintro bellは1/2で発音する、というになります。
この場合はTriggerBehaviorの設定をいじります。

まずintro bell synth1をトラックに放り込みSingle Intrumentトラックをつくります。つくったトラックを選択すると下部にそのトラックの情報が表示されます。そのウィンドウの左上の白三角をクリックするとTriggerBehaviorの設定にきりかわります。
ここにもダイスボタンがあるのでそれをクリックしてランダム設定にします。そして下のProvabllityのつまみをドラッグして50%にします。これで50%の確率で発音されるようにできました。

![スクリーンショット 2018-01-25 14.58.52.png](https://qiita-image-store.s3.amazonaws.com/0/18557/dfbf6255-62cc-7c30-548a-cc394d5b09e7.png "スクリーンショット 2018-01-25 14.58.52.png")

仕上げにループを作ります。
タイムラインの上部、LogicTracks(トラックの一番上の黒い帯になっている部分)で右クリック>Add LoopRegionして青い帯をつくります。これがループ区間を示すので、Introの場合は0~16秒の部分までドラッグして伸ばします。

![スクリーンショット 2018-01-25 15.41.55.png](https://qiita-image-store.s3.amazonaws.com/0/18557/126a0cbf-a005-7142-76dc-1f4479e50289.png "スクリーンショット 2018-01-25 15.41.55.png")

再生ボタンをおすとこの区間がループ再生されるのを確認できます。


## Main1, Main2, Breakdownをつくる

ほぼおなじ手順で残りをつくります。
構成は以下で、各トラックは{}から1つ抽選されます。

Main1
- Drum: {808 drums1, shaker hihat1}
- Hard Dram: {hard drums 1}
- Pad: {verse pad[1..4]}
- Bass: {bounce bass[1..4]}
- Morse: {morse [1..4]}
- Bell: {bell melody [1..3], 空トラックx3}
Main2
- Drum: {808 drums1, shaker hihat1}
- Hard Dram: {hard drums 1}
- Pad: {verse pad[1..4]}
- Bass: {bounce bass[1..4]}
- Morse: {morse [1..4]}
Breakdown
- Pad: {ambience pad1}
- Organ: {ambience organ1}
- Bass: {ambience bounce bass 1, ambience legato bass[1..2]}
- Morse: {ambience morse melody 1}
- Marble: {intro rolling marble 1}

簡単なのでほとんど説明ははぶきます。がんばって作りましょう。

Bell: {bell melody [1..3], 空トラックx3}
はIntroの応用で、MultiInstrumentをつくってbell melody[1..3]をほうりこみ、そのTriggerBehaviourを50%乱数設定にすれば実現可能です。

![スクリーンショット 2018-01-25 15.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/18557/92898800-661a-cd38-4094-185241de5125.png "スクリーンショット 2018-01-25 15.10.20.png")

いいかんじに4Eventがつくれました。

## Event同士の遷移をつくる

### トラックをつくる

まずこれまでとおなじ流れでMusicという新しいEventを作成します。	作成したらこれまた同様に3トラック分作成し、Intro&Breakdownはそのまま、Main1&2はMultiInstrumentを作成してその中にほうりこみます。できたら、Intro, Main, Breakdownの順番になるように調整します。

![スクリーンショット 2018-01-26 17.01.01.png](https://qiita-image-store.s3.amazonaws.com/0/18557/300e3bb8-7432-11ec-f1d3-b578b3050e51.png "スクリーンショット 2018-01-26 17.01.01.png")

### ループを組む

![スクリーンショット 2018-01-26 17.12.41.png](https://qiita-image-store.s3.amazonaws.com/0/18557/352879de-983c-7511-58fe-f9b89a4f9c64.png "スクリーンショット 2018-01-26 17.12.41.png")
作成した3トラック、それぞれに対応したループをくみます。
IntroはIntroのみ、BreakdownはBreakdownのみ、MainはMain1 or Main2のみが再生されるループができます。

### マーカーをつける

遷移さきの目印となるマーカーをつけます。
LogicTracksにおいて各トラック頭の位置で右クリック>Add Destination Markerします。これが遷移先の目印となるマーカーなのでわかりやすいように名前(Intro, Main, Breakdown)をつけておきます。名前のあたりをダブルクリックすると変更できます。

![スクリーンショット 2018-01-26 17.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/18557/5c98dfa5-9b24-e78c-76f0-1bea41a22fb8.png "スクリーンショット 2018-01-26 17.15.55.png")

### 遷移区間を作る

それぞれのループからぬけだすための遷移を作成します。
Introループの右あたりのLogicTracksにて右クリック>AddTransitionRegionTo>Mainとします。すると黄緑リボンがでるのでこれをドラッグしてIntroのループ幅にあわせます。同様にLogicTracksにて右クリック>AddTransitionRegionTo>Breakdownとしてもう一つ黄緑リボンを作成したら同様にループ幅に合わせます。

![スクリーンショット 2018-01-26 17.33.10.png](https://qiita-image-store.s3.amazonaws.com/0/18557/532a5f87-77f9-fd92-c60c-132aa97dab63.png "スクリーンショット 2018-01-26 17.33.10.png")

これを、MainではInttroとBreakdown、BreakdownではIntroとMainの計6個つくります。この黄緑リボンはTransitionRegionといい、自身の区間で条件がみたされたときに指定遷移先への遷移を発生させます。次に遷移条件と遷移タイミングの調整をおこないます。

### 遷移条件パラメータを追加する	

遷移条件を決定するためのパラメータを追加します。
![スクリーンショット 2018-01-26 17.49.51.png](https://qiita-image-store.s3.amazonaws.com/0/18557/f5f7044c-f581-f812-062a-529497eeea33.png "スクリーンショット 2018-01-26 17.49.51.png")
LogicTracksの上、＋タブの横あたりを右クリック>Add Parameterします。
![スクリーンショット 2018-01-26 17.47.25.png](https://qiita-image-store.s3.amazonaws.com/0/18557/1b740912-4985-7fe4-a734-f94e2024a63d.png "スクリーンショット 2018-01-26 17.47.25.png")
ダイアログが表示されるのでName欄に条件設定用のパラメータ名を記入します。ここではIntensityにしておきました。

### 遷移条件を調整する。

追加したパラメータを条件として遷移を作成します。
TransitionRegionを選択すると下部がTrangitionRegion編集ウィンドウに切り替わります。AddConditionボタン>Add Pramerter Conditionで先ほど作成したIntensityを選択します。Add Conditionの上にIntensityの条件が追加されます。これはIntencityの値が設定された値になった時に遷移することを意味します。ToMainは0.67~1.0、ToBreakdownは0.34~0.66、ToIntroは0.00~0.33になるように調整します。

![スクリーンショット 2018-01-26 18.03.59.png](https://qiita-image-store.s3.amazonaws.com/0/18557/88c3da8f-59c3-74b5-50b9-dda17b9ac31e.png "スクリーンショット 2018-01-26 18.03.59.png")

これをすべてのTransitionRegionで設定すれば条件設定は完了します。

### 遷移タイミングを調整する

ここまででパラメトリックに遷移することが可能になりましたが、現状では条件成立時に即遷移してしまっています。これをもうしこし気持ちよく遷移するようにします。

さきほど同じようにTransitionRegionを選択してTransitionEditorに切り替え、右下のなかから2と書かれたボタンをおします。これは2小節ごとに遷移することを意味します。

ほかにも1~8小節ごとや、拍ごとの設定もできます。このデモでいろいろ試してみましたがたぶん2小節ごとがいいと思います。

![スクリーンショット 2018-01-26 18.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/18557/cc8aff9b-3880-1894-f8b8-529899face7c.png "スクリーンショット 2018-01-26 18.54.32.png")

## 完成

完成したので再生ボタンをおして努力の成果を確認しつつ、上部にあるIntensityツマミを動かして遊びます。Nice DJ!

![スクリーンショット 2018-01-26 18.58.45.png](https://qiita-image-store.s3.amazonaws.com/0/18557/20f25644-93e2-50be-7850-64a65670096e.png "スクリーンショット 2018-01-26 18.58.45.png")

## まとめ

UX(アイコンなど)がわかりやすくかつ少なめに整理されているため、かなり簡単に作り上げることができました。かなり簡単なのでお手元の名曲をループと遷移をうまく使ってインタラクティブミュージック的なものにしてみると楽しいと思います。(4つ打ちとかじゃないとループとるの非常に大変ですが...)
次回はUnityに組み込んでみたいと思います。

## 参考
- [FMOD公式サイト](https://www.fmod.com/)