ADX2 for UE4で、BGMに動的なエフェクトをかける

# はじめに
UE4.23+「ADX2 LE v2.10.05」を使用します。
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、
ゲーム内のBGMに対してエフェクトを動的にかける処理を実装します。

## サウンドに動的なエフェクトを使う場面の例
- 雨天の屋外から屋内へ入る場合際に、段々と雨の音をくぐもらせる
- スローモーション演出時にローパスフィルタをかける
- 浮遊感や疾走感の表現として、ハイパスフィルタをかける
- ダンスフロア等のロケーション表現
- リバーブエフェクトをかけ、空間を表現


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


#やること
- AtomCraftでキューを作成
- DSPバスを設定し、エフェクトを用意
- UE4にインポート
- ブループリントでリアルタイムにエフェクトのかかり方を変更する


# 実装

##AtomCraft側

###キューの作成
キューシート、およびキューを作成します。
![A_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bc1c5e07-0576-2927-5c0b-84953a6ed099.png)
画像では「ポリフォニック」で作っていますが、セレクタによるトラック遷移など、他の処理を混ぜたい場合キューのタイプを任意のものにしましょう。
マテリアルからサウンドをトラックに入れます。
![A_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/bc36e9ea-f48b-3109-83ab-839e43a3cc62.png)


### DSPバスの作成
エフェクトを構成する「DSPバス」の設定をします。
プロジェクトツリーの「DSPバス設定」を右クリックし、「新規オブジェクト」→「DSPバス設定の作成」を選びます。
![A_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a6e58216-9a14-68e3-4b55-8145dda5d422.png)
新規に「DspBusSetting_1」が作られますので、分かりやすいようF2キーなどでリネームします。
![A_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/55e3b292-509f-ab7f-f51e-2ce874fffa61.png)


DSPバスの中身を編集……するまえに、まずは必要なパネルを表示します。
ツールバーの「表示」→「メインビュー」→「ミキサー（DSPバス設定）」をクリックして、ミキサーのパネルを表示させます。
![A_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/54b9b6a2-39d9-549d-1311-d4b715014bd2.png)
下の画像の場所にタブが出たと思います。もしない場合、もう一度ツールバーから表示を行ってみてください。
![A_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8630b02f-421d-4a01-f1be-c4912cf6f6d5.png)
タブをクリックするとDSPバスの編集画面に移ります。
![A_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2ac135f2-49a9-393e-fc88-ad9687a9c589.png)


### DSPバスについて
ミキサーについて少し紹介します。
下の画像は少しだけミキサー内でDSPバスを編集してみたものです。
![A_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/56b31769-214d-2439-2408-a5619a77412a.png)
一番左にあるのが「MasterOut」で、それ以外はエフェクトをかけるための「バス」という単位です。
「Reverb」「Flanger」「MixA」のバスはそれぞれエフェクトをかけた音を「MasterOut」に送り、最終的にそれらが合わさったものが「MasterOut」から鳴って音声を形作ります。
![A_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/01b70d65-e263-cb61-509b-5ae5cfa20299.png)

エフェクトをかけた音を、さらに別のバスに送って合成することも可能です。
![A_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a29b9c3c-6eae-c106-629d-c6717514a882.png)
それでは、実際にDSPバスでエフェクトをかけてみましょう。


### DSPバスの編集
ミキサーの空いている場所で右クリックし、「DSPバスの追加」をします。
![A_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/812a1a72-ab30-797c-6859-49e4dfc0355d.png)
バスが追加されました。
![A_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ec2c3d2c-f6c2-ab0b-e3b8-e222a897da4f.png)
「エフェクト」の横にある＋ボタンを押してエフェクトを追加します。今回は試しに「リバーブ（反響）」を追加しました。
![A_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a4859095-6d07-da58-4dcf-4749c9071e66.png)
「センド」の横の＋ボタンを押し、「MasterOut」を選んで「MasterOut」へと音を送ります。
![A_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5961602d-bdfc-993a-d62c-706d941012f3.png)
下の画像のようになっていれば大丈夫です。
**「MasterOut」へ音の通り道を作ってあげなければ、エフェクトのかかった音は鳴らない**ようになっています。
![A_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d49c999b-9168-9944-4014-f10229d2ebf6.png)
バスを選択していれば、インスペクターで名前を変更できます。
![A_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8f6c9dec-4c54-dd6f-c3fc-2996d6a30934.png)
エフェクトを選択すると、インスペクターでエフェクトのかかり具合やパラメータが編集可能です。
![A_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/da90f6c0-f016-68d4-d441-937cb7be73e3.png)
![A_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1e324ca7-4d8f-e334-d637-dc46360282e6.png)
現時点ではまだエフェクトがどうかかっているかをプレビューすることができません。次の項で、とりあえずエフェクトのプレビューを可能にしてしまいましょう。


### バスマップの作成
キューに対してDSPバスを適用するためには、「バスマップ」が必要になります。
プロジェクトツリーの「バスマップ」内の「キュー設定用バスマップ」を右クリックし、「新規オブジェクト」→「バスマップの作成」をクリックします。
![A_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/779222bb-b188-f7fb-2f9f-4baf4f4182a3.png)
新規にバスマップが作られますので、リネームしておきます。
![A_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/346df36a-5b5c-26d8-dd99-c8c7694a7f6f.png)
作成したバスマップを選択した状態で、インスペクターの「バスセンド」の項目内の「バス名1」に先ほど作ったバスを指定します。
![A_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/01fce67d-636e-9a06-9ea7-e4d353468660.png)
![A_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2aca462c-94d3-1872-2948-8db0d763a0af.png)


### キューへのDSPバス設定の適用
ワークユニットツリーで、任意のキューを選択します。
![A_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d55d13ec-c421-1005-c5c4-dd6b0235b971.png)
インスペクターで「バスマップ」に、作成したバスマップを指定します。
![A_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ce03c237-7ad0-2eb8-178d-2144ec3be412.png)
「バスセンド1」にチェックを入れます。
![A_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ec63e5d1-56b5-1941-f297-f174031bc5d1.png)
これでプレビューが可能になりました！再生ボタンを押して聞いてみましょう。
![A_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3f7026b4-8257-714c-f79d-1630802fdd20.png)
インスペクターの下の「バスセンド」ボタンを押すと、エフェクトのかかり具合を設定できます。
![A_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/24e74a8b-724f-3068-b162-d3541097c5a5.png)
「MasterOut」のボリュームを低くすることで、エフェクトのかかった音のみをプレビューすることもできます。
![A_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c8eb0470-2816-1287-3df3-548b029676a4.png)


### エフェクトを追加する場合
プレビューして気に入らなかったらミキサーに戻ってエフェクトを編集したり、新しく追加するのもいいでしょう。

エフェクトを追加した場合、以下の項目を確認してください。
**センドをMasterOutに繋がるように設定する**
![A_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/efcae3d3-452e-f344-aa85-9d3f828321b9.png)
**バスマップのインスペクターで、追加したバスを登録する**
![A_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/23d0833a-5b76-3afb-a989-88d2cc2e611a.png)
**キューのインスペクターで、追加したバスセンドにチェックを入れる**
![A_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9b948eb5-2f2d-bec2-f31c-7a72b0c2e3e5.png)


### キューシートのビルド
納得いくものができたら、ビルドします。
![A_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c395c2b8-8307-ed9b-836d-1ef7461ab2ec.png)




## UE4での実装
### キューシートのインポート
acfファイル、afbファイルをドラッグアンドドロップしてインポートします。
![B_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6dec19d8-ec03-cea5-3104-c3ba1bf08442.png)
Atom Configファイルも今回使用するものに差し替えておきます。
![B_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/204bc45d-e6ed-4081-50d2-6ba795092bc5.png)


### キュー、リファレンスの配置
レベルにキューを配置します。
![B_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8b833c46-2a85-e68c-5dd7-c76a1519fa39.png)
レベルブループリントを開きます。
![B_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/35388875-1f6e-7dab-71a3-817b7fa65b85.png)
イベントグラフの空いている場所で右クリックし、「Create a Reference to (アクター名)」を選択します。
![B_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7dd1639c-fc89-cdac-e4c8-8ebf5d83f456.png)
リファレンスノードが配置されます。
![B_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fd3739dc-3bd2-b3c6-a8b4-da48ba467035.png)


### ブループリントノードによるDSPバス操作
UE4内でエフェクトのかかり具合を変動させるには、「Set Bus Send Level」や「Set Bus Send Level Offset」ノードを使用します。
![B_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b84e8aa2-17d6-9ec2-6482-186a7914e263.png)
![B_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d746c599-c815-c62d-e319-f1b00de46a42.png)
「Set Bus Send Level」は元のバスの音量に乗算するかたちで、「Set Bus Send Level Offset」では元のバスの音量に加算して操作します。

もしエフェクトがかかっているように聞こえない場合、後述する「DSPバス設定の上書き」を試してエフェクトを有効にしてください。


### DSPバス設定を上書きする
DSPバス設定をまるごと適用するには、「Attach Dsp Bus Setting」ノードに任意のバス設定名を入力します。
![B_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fb7323a8-dc7f-072f-aca2-b8af5e259dc6.png)
プロジェクトツリー内の「DSPバス設定」名がそのまま使えます。
![B_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/22b7d529-5f13-1b6e-e3f7-cce542d35eff.png)
これを使用することで、DSPバスを設定していないキューに対してもエフェクトをかけることができます。


### 実装例
以下のグラフ例では、「0」キーを押すごとにバスID0（つまり元の音量）をON/OFFし、
「1」キーを押すごとにバス「Reverb」の音量をON/OFFします。
![B_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1bb5b987-4664-1959-faae-9f299cacacce.png)
「Set Bus Send Level by Name」「Set Bus Send Level Offset by Name」ノードでは、AtomCraftのミキサーでつけたバス名を入力します。
![B_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9418a6e6-b94a-9cfc-3c3f-73a9b2344ba8.png)
特別な処理がない限り、バス名を指定して音量を変動させるのが楽で確実だと思います。