あなたはＵＥ４でハイレゾを体感する

#背景
自分はUnrealEngineを使っているが、そこまで積極的にQiitaを書いてるわけではない。
しかし、4.18のリリースノートに、このようなことが書いてあった。

>**新規:Media Framework の改善**
>オーディオ再生は新しいAudioMixerAPIに統合されることになり、新しいMediaSoundコンポーネントを[^1]使用するようになりました。MediaSoundコンポーネントは、レベルのアクタ・UMGのウィジェットで使用することができる、Synthコンポーネントの上に構築されます。
>サンプルレートコンバータは[^2]、最高８個のオーディオ入力チャンネルと、１・２個の出力チャンネルを持ち、int8・int16・int32・float・doubleの入力サンプルと任意のサンプルレート[^3]をサポートするようになりました 。
>*（UE4.18リリースノートより、一部抜粋・編集）*

今まで、アンリアルエンジンでハイレゾを再生することは不可能だった。オーディオシステムが16bitしか対応していなかったからである。

だが、新しいオーディオシステムは違う。16bitのみならず、integerなら24bit・32bit、floatなら32bit・64bit浮動小数点に対応したのだ。
サウンドミドルウェアでも、24bit・96000Hzまでは対応しているものの、それ以上のbit数・周波数には対応していないのである。
この事実を知れば、如何に新しいオーディオシステムの『スゴサ』が理解できるであろう。

なので、この記事を書いて、新しいUnrealEngine4のサウンド機能の素晴らしさを知ってもらうことにした。

#環境
##ハードウェア
####ヘッドフォン：Pioneer製（約２万円）
e-Onkyo年末キャンペーン賞品。もちろんハイレゾ対応である。
####ＤＳＰ：SoundBlasterE5
外付けのUSBDSP。24bit96khzまで対応している。
本記事では、「ソースから直接ピュアなオーディオを提供」とかいうダイレクトモードを使用し、イヤホンジャックからの出力を入力に繋いで録音している。
##ソフトウェア
####エンジン：UE4.19
UE4.18だと、新しいオーディオシステムを使用するとメモリリークが発生して話にならない。
####音楽再生：foobar2000　
UE4と音質を比較するために使用した。プラグインにて排他モード(ASIO・WASAPI)に対応。
####変換：TAudioConverter
UE4がFlacの再生に対応していないため、Wavなどの再生できる形式に変換するために使用した。
##音源
####24bit：Beautiful Sentence
トリニティセブンＥＤ１　~~オタクアニメで悪かったな~~
言わずと知れた名曲。テクノボーイズによるアナログシンセが響き渡る。[^1]

[^1]: shavadava in amazingでも良かったけど、さらにオタクアニメ的な曲だし、中毒性が高すぎる。

以下に、foobar2000で再生したときの波形を示す。
![FB1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/d59592ab-d458-43d7-37a5-f629cd38d60f.jpeg)

![FB2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/593019c7-833a-11c1-4ef8-131851ae22b2.jpeg)
実際の選択理由としては、間奏にてシンセサイザーを高音で鳴らすので、このような特徴的な波形が観測できるからである。

####32bit：A page of my story
プリンセスプリンシパルＥＤ　~~これまたオタクアニメで悪かったな~~
今回の検証のために（買っていなかったものを）わざわざ購入してきた。[^2]

[^2]: 実際32bitを再生する機会なんてほとんどないしね。ほとんど24bit96kHzを購入している。

#実証
##bitについて
**ちゃんと24bit・32bitに対応している**　音質についても、16bitに圧縮されていない音が聞こえた事を確認している。

##AudioMixerSampleRateについて
以下に、AudioMixerSampleRateを48000Hzとしたときの波形を示す。
![L48_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/0b581a5a-0697-e607-aff8-1a34bba6389d.jpeg)

![L48_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/1295d048-ecb3-ca58-e8be-1bec69bcfc44.jpeg)
96000Hzの音源を再生しているものの、24000Hz以上の範囲の波形が目立たなくなっており、きちんと48000Hzに制限されていることがわかるだろう。

AudioMixerSampleRateには問題がある。処理が遅く、バッファが足らないと、音割れが発生するのだ。[^3]
[^3]: 筆者だって、高負荷時のフォートナイトでの音割れに悩まされている。そこまで良いパソコンでやっているわけではない。
96000Hzまでだったら、バッファはデフォルトの1024でも十分である。
しかし、192000Hzだと、1024だとバッファが足らず、音割れが発生する。
なので、バッファを2048に増やすと、音割れが発生しなくなった。
このままAudioMixerSampleRateを増やしていけば、より高周波数でも対応できると考え、384000Hzに増やしたところ、確実にエディタが落ちるのである。
詳しく検証してみたところ、AudioMixerSampleRateを200000hz以上に設定すると、確実にエディタが落ちることが分かった。
なので、現在再生できるのは、192000Hzが限界である。

##ダイレクトモードについて
以下に、AudioMixerSampleRateを48000Hzとして、ダイレクトモードを使用したときの波形を示す。
![D48_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/a419f5fa-b22e-1596-a4bf-d7b0447cf929.jpeg)

![D48_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/90602aee-67c3-bf36-f2c4-2816cf435d72.jpeg)
24000Hz以上の範囲の波形もはっきりとしており、AudioMixerを通さずに96000Hzの音源を再生していることがわかる。

ダイレクトモードを使用すると、AudioMixerSampleRate・エフェクトは無視されるものの、排他モードになるわけではない。
foobar2000が排他モードで再生すれば、もちろんfoobar2000のほうが優先される。
UE4が排他モードにならない理由として、「Discordなど、他に音楽を発するソフトウェアに影響が出るから」だと思われる。

##対応ファイルについて
**はっきり言って少ない**
mp3・ALAC・wma・wavは再生出来たものの、ogg・opus・flacは再生出来なかった。
対応しているはずのAACであっても、コーデック次第では再生できないこともあった。
可逆圧縮については、flacは使えないのが難点だが、wmaがLosslessに対応しているのが救いであろう。

そこで、wmaに変換した音源を使用して、非可逆圧縮・可逆圧縮・非圧縮の違いを検証した。
####非可逆圧縮(389kbps)
![LL1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/0961bf6a-5c54-8aec-b40e-d803f6b1d49a.jpeg)

![LL2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/e50decd8-0a6c-ac18-a342-a5d2cff41966.jpeg)

####可逆圧縮(3937kbps)
![LS1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/30474871-41c9-4402-3057-58724d3dbbc9.jpeg)

![LS2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/5949d258-ed26-a0cf-30a9-bda5d3cd188e.jpeg)

####非圧縮(4608kbps)
![UC1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/96e6bd2d-03fd-ab17-151c-d2fde3afd76d.jpeg)

![UC2.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/2847fb8e-c23c-f33f-be25-40c837727029.jpeg)

比較して分かったのだが、圧縮による音質の差と言うものは、オカルトに近いようなレベルであると形容できる。
このレベルだと、他に音が鳴っている状況だと、非圧縮音源と非可逆圧縮音源のＡＢテストをされても、判別できないかもしれない。

##音質
**foobar2000と変わらない**
他にもいろいろな曲で試したものの、低音～高音において、音質に違いはなかった。
強いて言えば、「UnrealEngineは、ミキサーにて音量が-3dbされている」という点だろう。

#評価
***改良の余地あり***
96kHzはすんなり対応できるものの、192kHzは（初見ではわからない）パラメータの変更が必要であり、384kHzは現在再生できない。[^4]
[^4]: かといって、ファルコムや5pbでも配信は96kHz止まりなので、しばらくは気にしなくても良いかもしれない。
また、高音質を出力するためにも、排他モード(ASIO・WASAPI)を使えるほうがありがたい。
そして、対応ファイルも少ない。Flacを使えるようにするか、wmaをwindows以外でもサポートして欲しい。
欲を言えば、MQAのソフトウェアデコードも出来るようになったらありがたい。

でも、普通に音質は良いし、32bitInteger・32bitFroat・64bitFroatに対応しているのは魅力的である。
そして、意外とwmaが万能で、非圧縮の1/12のデータサイズで、ほとんど変わらない音質であった。
さらに、オーディオミドルウェアと違って、システムとの親和性が高く、Blueprintでも扱えるので、利便性・応用性にも優れている。
アーティストとエンジニアが組んでビジュアライザーを制作したり、ゲームデザイナーだけで音楽を使用した仕組みを作れるのだ。

UnrealEngineのオーディオ機能が、オーディオミドルウェアを凌駕するとき[^5]は、もしかしたら来るのかもしれない。
[^5]: オーディオミドルウェアも、サウンドだけで作業できるものの、0.5~1.0%のロイヤリティが必要である。UE4だって、サウンドだけで組み込みまで出来るものの、5%は（どこかの30%よりかはマシだが）結構良い値段である。かといって、Unityだと、ミドルウェアを使わなければ、サウンドが最悪C#を触る羽目になるし（辛い）、ただでさえシングルコアでしか動作していないらしいAndroidに、ミドルウェアを使っていれば別コアで処理できていた処理がのしかかってくるのは非常に辛い。