ADX2 for UE4でインタラクティブミュージック（フィルインの実装）

# はじめに
UE4.23+「ADX2 LE v2.10.05」を使用します。
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、
ゲーム中の展開に応じてBGMがシームレスに変化していく「インタラクティブミュージック」を実装します。
フレーズが移り変わる際に滑らかな遷移にするため、またアクセントをつけて盛り上げるためにドラムなどの特殊なフレーズを追加する「フィルイン」を盛り込んでみます。

![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/22f92926-8f48-1539-d4a9-c5a7c2db7b20.png)

フレーズをループさせている間は通常の演奏ですが、ループを脱してサビに遷移する際などに専用のフレーズを再生させます。


# 前提
「ADX2 for UE4 LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX2 for UE4の導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を（実践編）
https://qiita.com/SigRem/items/c089b71c42e898980a46

**今回メインで使用する「ブロック再生」の基本的な実装法はこちらの記事にまとめてあります。**
ADX2 for UE4でインタラクティブミュージック（ブロック再生編）
https://qiita.com/SigRem/items/696ab6f1b4e533eebdbf


#やること
- AtomCraftで遷移時専用のフレーズを追加する
- ブループリントで遷移を制御する
- 遷移時フレーズを確認する


# 実装

手元に適切な音源がなくても実装を試せるよう、サンプルの素材を用意しました。
**基本フレーズ素材**（ブロック再生編と同じものです）
https://drive.google.com/file/d/12FlChB751am1Gp-KwbU9Q-Jq6_MH3N--/view?usp=sharing
**フィルインフレーズ素材**
https://drive.google.com/file/d/1SRlEgonkhj2s6I1ivNd73vK6322oj8CG/view?usp=sharing

## AtomCraftでフィルインを追加する

###素材をインポートする
まずはAtomCraftを開き、今回フィルインに使う素材をマテリアルツリーに格納しておきます。
上記の素材を使用する場合は、基本フレーズとフィルインフレーズをどちらもインポートします。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3d1b2faa-dfa5-74ce-f20c-5b7dce8cc513.png)
「○○__ FilIn」がサビ前に使用するフィルイン素材、「○○__ Crash」が遷移後に使用するクラッシュ素材です。

###トラックに音源を追加
マテリアルツリーからタイムラインにドラッグアンドドロップして、新しくトラックを作成します。
適当なタイミングで音が鳴るよう、**フィルイン素材はサビ直前にフレーズを配置**します。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4cc148dc-2798-b8f7-fa9a-e9adb3a552a3.png)
**クラッシュ素材はサビと同時になるよう配置**します。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5a90dd89-2062-3f5b-b2da-3eb39d392bb2.png)

###ブロック再生設定
一曲をいくつかのブロックに分割してありますが、サビ直前のフレーズとサビのフレーズに一度ずつループを設定します。
2箇所のブロックを選択し、それぞれのインスペクターに対して「ブロックループ回数」を「1」に設定しておきます。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/79e95c20-dd59-a187-0841-7f969bf0587f.png)
これでサビ直前とサビのフレーズがそれぞれ1度だけ繰り返されることになります。

次にフィルインとして配置したトラックを選択します。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d7677707-fa16-934d-4286-d2b4b4d60d02.png)
インスペクターにて、「ブロック遷移発音タイプ」が設定できます。
![A052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2c56824e-2083-196a-b529-1dc8657739f6.png)
これは
「常時発音」の場合、常に演奏　通常のフレーズに
「遷移時発音」の場合、（遷移前に再生される）　主にフィルインに使用
「遷移後初回発音」の場合、（遷移後に再生される）　主に遷移後のクラッシュシンバルなどに使用

このトラックは遷移前のフィルイン用なので、「遷移時発音」を指定しておきます。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/40ae6774-994d-a5c3-9763-6d9d4f086433.png)
同じ用に、クラッシュ用トラックについてはサビ遷移直後に再生されるので「遷移後初回発音」を指定します。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/726b110d-1c01-b72d-772d-a5da1362a15b.png)
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d8461513-3271-f1ce-3818-4ec62f90f8fc.png)

この状態でテスト再生（F5)してみましょう。ブロックのループ時は普通に再生されますが、サビに移り変わる直前・直後のみ特殊な音が鳴るはずです。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7101b9b4-6a0c-3bd2-d6ae-01c885ead4cd.png)

さらに、「イントロからAメロへの遷移」「アウトロへの遷移」時にもクラッシュを置いておくのもいいでしょう。曲の区切りに鳴らすイメージです。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d1d44901-1738-d94c-51de-1d41a8f29e4f.png)

### キューシートのビルド
ここまですべて完了したら、キューシートをビルドします。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fab9cf0e-da6a-437a-2bb4-dcd05de3478b.png)



##UE4で遷移を制御する
### キューシートのインポート

ビルドしたキューシートを、UE4のコンテンツブラウザにインポートします。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/05c679bc-e1ef-758f-715f-4cca5f7ab500.png)

### キューを再生する
キューをレベル上に配置します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/103814b6-40d4-9ecc-9a37-c5ec030fd348.png)
この状態でテスト再生（Play in Editor, Alt+Pキー)するとそのままBGMが再生されます。
AtomCraftで設定したようにサビ直前、サビのフレーズが1度ずつ繰り返され、遷移時のみ追加フレーズが演奏されているはずです。

### キーからループを制御する
ブループリントから、キーを押すごとに対応したブロックに飛ぶよう制御してみます。
ビューポートまたはWorld Outliner上でAtom Cueを選択しておきます。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ab3e88ef-8c44-e7db-7c83-2e0b35e8b74c.png)
レベルブループリントを開きます。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ca1b8c29-5b51-bf6f-ebb0-2f458c6f93dd.png)
イベントグラフの空欄で右クリックし、「Create a Reference to (Atom Cue名)」をクリックします。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6ab1cf4b-842a-a9c1-3005-6a04ec351773.png)
リファレンスノードが作られます。
![B08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/440e42a9-d58d-5e20-db7b-0cb2cc7ef89e.png)
**Input Key**ノードで1,2,3キーの入力から始まるイベントを作ります。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1164daef-bae8-f49a-273a-d074b2a3e45b.png)
**Set Next Block Index**ノードを使い、それぞれ「イントロ」「Aメロ」「サビ」に対応したトラックに飛ぶよう配置します。
![B07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bfc6c970-cdb2-64a0-a443-5cb2f6345747.png)

### 再生の確認
テスト再生すると、通常通り再生されるほか、1,2,3キーで対応したフレーズに遷移します。遷移時は追加トラックも再生されるはずです。

**「Set Next Block Index」ノードで遷移を制御した場合、同じブロックへと遷移した際も「遷移時のみ再生」にしたトラックも再生される**ことに注意してください。
もし再生させたくない場合、セレクタなどを使用してトラック自体の再生を制御するのが良さそうです。