ＵＥ４でオーディオプレイヤーを制作したときのTips

![11.png](https://qiita-image-store.s3.amazonaws.com/0/239082/29b89a21-116f-7df0-30d3-4924e4c1b79c.png)
本記事では、[この記事を書くためにオーディオプレイヤーを制作した](https://qiita.com/Polaris1080/items/13f874ed9e04841e1a3b)ときの技術・知見について書いていく。



#技術１　VirtualPlaylist
##本来
メディアプレイヤーから音楽・動画を再生するときは、「FileMediaSourceにファイルを登録してから、MediaPlaylistにまとめる」とされている。
だが、この方法では、**「音楽・動画ファイルを大量に差し替えるとき、手作業で行わなければならず、非常にめんどくさい」**という欠点を抱えている。
##仮想的にプレイリストを作る
![31.png](https://qiita-image-store.s3.amazonaws.com/0/239082/b23f1e62-86c4-5701-bda3-133a99577d38.png)
上図のように、Byte・Mameのマップ一個から成る構造体より生成されたデータテーブルを制作するだけで、
(列名［マップエレメント］= MediaPlaylist・Byte = 曲の順番・Name = ファイルの場所)
![32.png](https://qiita-image-store.s3.amazonaws.com/0/239082/59ee746a-9476-ee2e-6e3e-5341973af311.png)
空の仮想プレイリストからでも、通常通りメディアプレイヤーから音楽・動画を再生出来るのである。

この方法では、**「音楽・動画ファイルを大量に差し替えるとき、Jsonを編集するだけ」**となり、誰でも編集可能でめんどくさくもない。

##使用方法
###MediaPlaylistの名前が必要な場合
![33.png](https://qiita-image-store.s3.amazonaws.com/0/239082/3cf732a7-76b2-82a1-8284-a49a1a5fd3e7.png)
このようにすれば、列名［マップエレメント］を読み出せる。
![34.png](https://qiita-image-store.s3.amazonaws.com/0/239082/e89cd634-6f30-8212-5aa9-91dec47fabc8.png)
###MediaPlaylistを呼び出す場合
![35.png](https://qiita-image-store.s3.amazonaws.com/0/239082/ad7c57cf-23f5-3166-81bb-dbf7f0036434.png)
仮想プレイリストの中身を全てクリアしてから、
![36.png](https://qiita-image-store.s3.amazonaws.com/0/239082/e85e96c2-595c-18c5-3cb0-a93edc1272c6.png)
データテーブルから仮想プレイリストに追加する。
![37.png](https://qiita-image-store.s3.amazonaws.com/0/239082/9d74c630-4b4c-4430-10fa-16d83272c7e1.png)
###MediaPlaylist内にあるMediaの名前が必要な場合
![38.png](https://qiita-image-store.s3.amazonaws.com/0/239082/f6654346-f429-0322-731a-f81035ee8f47.png)
余計な文字(_XXX)が付いてくるが、それを外せば、メディア本来の名前が得られる。



#技術２　プレイヤーに直接サウンドを届ける方法
##不正解 ： Pawn・CharacterにMediaPlayer（音源）を設置する
この方法だと、空間上に音源が配置されてしまうので、減衰などの設定を全てオフにしていても、定位がハッキリしなくなる。
##正解 ： PlayerControllerにMediaPlayer（音源）を設置する
この方法だと、空間上に音源が配置される事も無いので、音源からプレイヤーに直接サウンドが伝わり、ハッキリとした定位となる。



#Ｔｉｐｓ１　音声再生における、MediaPlayerの操作の制限
##Loop
使用できそうだと思うものの、実際は使用できない。
もしも機能を再現しようとするのなら、以下の方法になるだろう。~~goto的なアプローチではある~~

1. ある曲を再生中、ボタンを押したら、フラグが立つようにしておく。
1. その曲が終わった時に、フラグが立っているのなら、再度その曲を最初から再生する。

##Pause(NativeAudioOut Only)
Directmodeにおいては、Pauseが使用できない
もしも機能を再現しようとするのなら、以下の方法になるだろう。

1. Reopenなら使用できるので、ボタンを押したら、フラグが立つようにして、再生時間も記憶しておく。
1. 再生するとき、フラグが立っているのなら、記憶していた再生時間から再生を始める。

しかし、「GetNativeAudioOut」が実質動作しておらず、NativeAudioOutかどうかを判別出来ない。
そのため、NativeAudioOutが可変する条件においては、切り分けられないために、上記の方法は使えない。
現状では、NativeAudioOut時におけるPauseの使用はあきらめるしかないだろう。



#Ｔｉｐｓ２　Widgetの分割について
このウィジェットの３／４は、
![21.png](https://qiita-image-store.s3.amazonaws.com/0/239082/d4f4b6b7-e326-4876-d2d8-a7ff00b90fd9.png) 
このようなパーツから構成されている
![22.png](https://qiita-image-store.s3.amazonaws.com/0/239082/7025c078-24d7-39ba-3f1a-8b20ffc9fbcc.png)

##Blueprintの実装
###本体
![23.png](https://qiita-image-store.s3.amazonaws.com/0/239082/55c3afec-4df5-aad4-1b33-f8622059efde.png)

1. 本体上に配置されているパーツのリファレンスを配列にまとめておく。
2. パーツごとに（配列の順に）インデックスを設定。
3. このパーツが扱うフィルターのリファレンスを設定。
4. パーツの（ボーダー）色を設定する。（エディタ上では設定不能）

###パーツ側
<dl>
  <dt>上部の（赤色の）スイッチが押されたとき</dt>
  <dd>このパーツに関連付けられた（インデックスから分かる）フィルターのPass設定（有効／無効）が切り替わる。</dd>
  <dt>コンボボックス・スライダーが操作されたとき</dt>
  <dd>このパーツが扱うフィルターの設定が変更される。</dd>
</dl>

##どれだけの規模になったら、分割を考えるべきか
このように、パーツ化されたウィジェットを扱うには、結構手間がかかるので、やみくもに分割して再利用する方が良いと言うわけでもない。
同じような（機能を共通化できる）パーツが、３箇所以上になった時に考えれば良いだろう。

#Ｔｉｐｓ３　BitCrasherについて
##設定変更時の留意点
BitCrasherの設定には、以下の二つのパラメーターが存在する。

* Crashed Sample Rate
* Crashed Bits

「Crashed Bits」の値だけを変更した時は、変更が適用されているが、「Crashed Sample Rate」の値だけを変更したときは、変更が適用されていない。
確実にパラメーターの変更を適用させるには、片方の値だけを変更する時でも、両方の値だけを変更する必要がある。

##BitCrasherの限界
###Crashed Bits : 0~30
「Crashed Bits」の値を32(Bit)としたとき、高音質となるばかりか、逆にノイズが発生してしまった。
32(Bit)から1づつ引いて行って、ノイズが出なくなる値を検証していった結果、30(Bit)にてノイズの発生が収まることが判明した。
ちなみに、0(Bit)でも、何故か再生が可能である。~~もちろんノイズはひどい~~
###Crashed Sample Rate : 恐らく無限大
[前の記事](https://qiita.com/Polaris1080/items/13f874ed9e04841e1a3b)でも書いたが、UnrealEngine4のサウンド周波数の限界は、192000Hzとなっている。
しかし、「Crashed Sample Rate」に384000(HZ)を設定しても、エディターは落ちることなく動作するのである。
おそらく（性能が許す限り）、どんなに高い周波数を設定したとしても、エディターは落ちることは無いだろう。
~~BitCrasherはReSamplerに改名するべきである~~



#Ｔｉｐｓ４　Fontについて
**フォントのサイズは意外と大きい**
今回制作したオーディオプレイヤーの総サイズは7.2MBである。
しかし、たった２個のフォントファイルだけで、1.85MB*2=3.7MB、およそ半分を占めているのだ。
容量が大きいコンソールならまだしも、モバイル・WEBなどでは出来るだけサイズは小さくしたい。
対処法としては、フォントを使いまわすなどして、**出来るだけ使用するフォントは絞るほうがいい**。