UE4+ADX2でサウンドエフェクターを作ってみる（発展編）

# はじめに
アンリアルエンジン4とサウンドミドルウェア「ADX2 for UE4」を連携させ、
BGMに自由に変化をかけられるサウンドエフェクターを作り、さらに多くのエフェクトを負荷できるように改良します。
次の記事の続きになります。
https://qiita.com/SigRem/items/fa0601b44f13ce86eff4

実装したサウンドエフェクターはこんな感じ↓
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">UE4アドカレ2の担当日なので、UE4+ADX2（サウンドミドルウェア）で作るオーディオエフェクターの実装について書きました。<br>動作例はこんな感じ↓<br>BGMにフィルターやピッチ、リバーブなどといったエフェクトをマウス操作でかけて遊べます。<a href="https://t.co/DLT3ElUZim">https://t.co/DLT3ElUZim</a> <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://twitter.com/hashtag/ADX2?src=hash&amp;ref_src=twsrc%5Etfw">#ADX2</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/ua9ucZr7tr">pic.twitter.com/ua9ucZr7tr</a></p>&mdash; Sig @ゲーム開発 (@sleepyslowsheep) <a href="https://twitter.com/sleepyslowsheep/status/1340412300386160641?ref_src=twsrc%5Etfw">December 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


当記事ではUE4.23+「ADX2 LE v2.10.05」を使用します。基本的にブループリントのみでの実装を想定しています。
ADX2はインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx2-le/

# 前提
ADX2 for UE4の導入や基本的な使い方は以下の記事にあります。当記事だけでも実装はできるかと思いますが、必要に応じて参照してください。
ADX2 for UE4の導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX2 for UE4の導入で、一歩上のサウンド表現を（実践編）
https://qiita.com/SigRem/items/c089b71c42e898980a46

# 実装

## 追加のバスマップをBGMに適用する

### AtomCraftでバス設定を作成する
AtomCraftで追加したいバス設定を作っていきます。
プロジェクトツリーの「DSPバス設定」を右クリックし、「新規オブジェクト」→「DSPバス設定の作成」を選びます。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9cdfb1ae-da5c-93da-9134-732e06d68b55.png)
新規にバス設定が作成されます。必要に応じてリネームしましょう。
![A01B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/fda0f804-20c2-56b3-f455-b571354847e8.png)
前回使わなかったエフェクトをミキサーに追加してみました。エコー、ディレイ、ビットクラッシャーの3つです。ひとつのバスに複数のエフェクトを入れることも可能です。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/959b0427-a63b-18ec-fab6-5715af2d96e7.png)

### キューシートのビルド
これだけで準備は完了です。キューシートをビルドします。
そのままUE4を起動し、ビルドしたキューシートをインポートし直します。
キューは変更していないため、acfファイルとキューシートだけが更新されることになります。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9df314eb-6d45-d45e-4f51-5e8f0f65fe11.png)


### UIにバス設定の切り替えボタンを追加する
前回使用したUIに、簡単ではありますがDSPバス設定を切り替えるためのボタンを追加してみました。
![A04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c7dc2a0c-fb86-b46a-edaa-7d02e7975440.png)
上がデフォルトの「DspBusSetting_0」に、下が今回追加した「DspBusSetting_1」に切り替えるボタンです。
ボタンを選択した状態で、Detailsパネルの「On Released」の「+」ボタンを押して、このボタンがクリックされた場合のイベントを追加します。
![A05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3dcd8571-db2f-cf36-b2a9-9aaa0850d978.png)
ふたつのボタンに対してイベントを追加しました。
![A06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9e63ea8e-2607-a4af-bcc1-e080fa03f622.png)


### バス設定の切り替え処理
DSPバス設定を切り替えるためには、まず準備として「AtomAsrラック」を取得する必要があります。これは**Get Default Asr Rack**ノードだけで取得可能です。
![A07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2b187bb1-0f58-8a3d-b698-622893066a74.png)
**Get Default Asr Rack**ノードの青いアウトプットピンから線を伸ばし、**Attach Dsp Bus Setting**ノードでバス設定を指定し切り替えます。
![A08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f003ccf2-c8f6-bb6d-a814-f991b677042f.png)
ボタンに対応したバス設定の名前を入力します。
![A09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a0c140b3-b6ad-30be-e602-6800a6cb1bf3.png)

この状態でテスト再生すると、ボタンでバス設定を切り替えられるようになっています。**バス設定とAISACは共存可能**なため、ハイパス・ローパスフィルターやピッチシフト機能はそのまま使えます。
下のスライダーがそれぞれエコー、ディレイ、ビットクラッシャーを調整するスライダーに変化します。
![A10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/36e14c3f-b2e8-5719-ae58-86ab6dba88a6.png)
このままではエフェクト名が変わっていないので、バス設定の切替時にエフェクトの表示名を変更する処理を作ります。

### エフェクト名を変更する
UIのデザイナーエディタで該当のテキストを選択し、DetailsパネルのText欄で「Bind」→「Create Binding」でバインドを作成します。
バインドを割り当てると、変数に変化が起きた際にテキストを変化させることができます。
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d974275b-f29a-42b1-568f-3ac5a5026e5e.png)
グラフエディタに移るので、「Return Value」のピンクのインプットピンを右クリックして「Promote to Variable」をクリックし変数を作成します。
![A12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e17b4d1c-c2bc-423c-f2f0-be5900b41d17.png)
変数はリネームし、Default Valueにはデフォルトのバス設定のエフェクト名、つまり「Reverb」を入れておきます。
![A15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8350f5ed-8057-ef8c-caa8-d4a3a5e99e97.png)
3つのエフェクト名に対してバインドを作成したら、バス設定の切り替え処理に名前を代入する処理を追加します。
![A13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a1e8d9b9-68a2-e7c2-3b3f-56178325cded.png)
バス設定をボタンで切り替えると、エフェクト名が変わるようになりました。
![A14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5137886b-4ca7-4d77-101d-318322f3b97c.png)
多くのバス設定を切り替えたい場合、データテーブルなどで名前やパラメータを管理しておき代入する方がスマートになるかと思います。

稀にですがバス設定の切替時に再生が止まってしまう（ボリュームレベルが0になってしまう）ことがあります。その場合はバス設定切替時に**Set Bus Send Level**ノードを走らせ、ボリュームを調整してあげてください。

## 「スナップショット」でエフェクトをさらに変化させる

ADX2には「DSPバス設定スナップショット」という機能があり、作成したDSPバス設定のパラメータが変化したバリエーションを作ることができます。これを適用し、リバーブなどのエフェクトに変化をつけてみることにします。

### スナップショットの作成、編集
プロジェクトツリーの「DSPバス設定」にある既存のDSPバスを右クリックし、「新規オブジェクト」→「スナップショットの作成」を選択します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e63ef653-8cc7-bfc1-2920-9479e4b0e849.png)
新しく「スナップショット」が作られます。必要に応じてリネームしてください。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3208b7ec-eab9-8605-1dd3-bd0e74c112e1.png)
**スナップショットを選択した状態で**バス内のエフェクトをクリックし、インスペクターでルームサイズなどのパラメータを細かく変更します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a2deb137-f761-8877-60ea-16b0a085e8db.png)
こういったスナップショットを用途に合わせて作っていきます。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/dff71742-b4fc-244b-30f6-4ad1df0d0359.png)
完了したらビルドします。

### ブループリントでスナップショットを適用する
ブループリントからスナップショットを適用する実装はとてもシンプルで、**Apply Dsp Bus Snapshot**ノードを使うだけです。
前提として**Get Default Asr Rack**ノードを使用します。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c5f3f403-4f0a-a288-3dde-88856ca3c225.png)
上の実装例では、キーボードの「5」キーを押すとスナップショットの設定が適用され、リバーブの広がりが大きくなります。
また、「Miliseconds」のインプットに入力した時間をかけてスナップショット設定に繊維していきます。