UE5 MetaSoundで音を鳴らすテスト

# 概要
UnrealEngine5の新機能 MetaSound で単純にサウンドデータを再生してみるテストです。
イントロ付きループサウンドの再生テストもしてみます。


## 更新履歴
| 日付 | 内容 |
|:-----|:----|
|2023/03/23| 初版 |


## 参考
以下の記事を参考にいたしました、ありがとうございます。
[UE公式：MetaSound:次世代の音源](https://docs.unrealengine.com/5.1/ja/metasounds-the-next-generation-sound-sources-in-unreal-engine/)
[UE公式：オーディオファイル](https://docs.unrealengine.com/5.0/ja/audio-files-in-unreal-engine/)
[UE5 「Meta Sound」で音声（Sound Wave）を再生する（Wave Player、Sound Wave）](http://kagring.blog.fc2.com/blog-entry-798.html)
[音源(Sound Wave)を再生する](https://zenn.dev/posita33/books/ue5_metasound_createsound/viewer/chapter01_play_soundwave)

## 関連する過去記事
[UE4 サウンドデータ再生とAudioComponentについて](https://qiita.com/unknown_ds/items/0d230f5472cf9a1cee57)
[UE4 サウンドキュー作成例](https://qiita.com/unknown_ds/items/a029a578418ce95cf091)


## 環境
Windows10
Visual Studio 2022
UnrealEngine 5.1.1


## 関連ソース
"Engine\Source\Runtime\Engine\Classes\Components\AudioComponent.h"
"Engine\Plugins\Runtime\Metasound\Source\MetasoundEngine\Public\Metasound.h"

# 準備
## wavファイルをコンバート
素材となるwav形式のサウンドファイルをコンテンツブラウザにドロップしてコンバートします。ちなみにUE4.22の時は対応していなかった（はず）の 16bit/48kHz のwavファイルもコンバートできました。

![WavSound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/dc46797f-cc5d-fd59-e81b-93ec8363a1d0.png)

:::note info
推奨は44.1kHz か 22.05kHzのようです。
:::

## MetaSoundソースアセットの作成
右クリックから[サウンド]->[MetaSoundソース]を選択します。
![CreateMetaSoundSource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/045ac124-a5f1-b8e1-7ea0-ad063660f9c7.png)

メタサウンドエディタから`ウェーブプレイヤー(ステレオ)`を選択し、入力と出力をつなぎます。
![MetaSoundEdit1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/e3683650-a1c4-b17b-50a0-c993758805a9.png)

出力をステレオ等に切り替えるにはエディタの左上`メタサウンド`から`Output Format`設定を変更します。
![MetaSoundEdit2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/8804b367-78bf-e5fe-bd2e-e1dcbde1f6b3.png)

ウェーブプレイヤーの引数 `ウェーブアセット`にコンバートしたサウンドアセットを設定し、以下のようにつなげます。これでエディタ上で再生テストができます。
![MetaSoundEdit3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/dfb0bcdb-15e5-6400-415e-90a6622bdbf1.png)


# ゲーム上で鳴らす
## レベル上に直接置く
レベル上にメタサウンドソースアセットをドラッグ＆ドロップします。
ゲーム開始時勝手になる場合は、アウトライナーからオーディオコンポーネントの[詳細]->[アクティベーション]->[Auto Activate]のチェックを外します。
![Play0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/52b68dfa-6d67-f8cc-7e3b-aecdb27a7b63.png)

置かれてあるメタサウンドソースに対して以下のようなBPコードで再生もできます。
![Play1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/6ec8eb91-00ab-d8fa-259b-74c71258e11a.png)

## スポーンして再生
メタサウンドを `Spawn Sound at Location` でスポーンし、何かのトリガーで`Activate`させることで再生もできます。（停止の場合は `Deactivate`）
![Play_example00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/db8910f4-59fd-be95-cb8a-eeb5d886bbde.png)

:::note warn
レベルブループリントでやっていますが、本来は音の発生源のアクターが行うべきだと思います。
:::


# イントロ付きループサウンドの再生テスト
UE4のサウンドキューでは怪しかったイントロ付きループサウンドができるようになったらしいのでテストしてみます。

## 1ファイルでループ位置を指定する
ウェーブプレイヤーの `ループ開始` `ループ持続時間` での設定でできるようです。
例えば、再生時間の72.0秒の位置から3.42秒の位置へ戻るデータの場合、ループ開始は3.42、ループ持続時間は72.0-3.42=68.58 を指定する必要があります。
![loop1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/e398a283-0683-702d-8dc1-f08be237f4db.png)

つなぎ目も問題なくループできていることを確認できました。
再生位置の秒数指定のため浮動小数が半端になるケースがあるのがちょっと気になります。


## イントロ、ループの2ファイルで分割
イントロ部とループ部に分割して再生することもできるようです。イントロ部のウェーブプレイヤーの終了時にループ部のウェーブプレイヤーを再生し、出力を2つを合成します。
![loop2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/06711f05-aea1-5ba5-1a91-7c623febcc8b.png)

こちらの方法もちゃんと繋がっていることを確認しました。


# まとめ
インタラクティブな機能はまだ触れていませんが単純なサウンド再生ができることは確認できました。
また、入力データは `Audio Parameter Controller Interface` の `Set XXX Parameter` で設定できるのですが、出力データ（再生位置など）の取得の方法がわかりませんでした。