
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
これまで何記事かに分けてUnityAudioを触ってきましたが、
第三回、ラストということで最後にオーディオスペクトラムを実装してみようと思います!

【Unity】第一回 UnityAudioを使いこなす 〜サウンド再生処理編〜
2024-01-22

【Unity】第二回 UnityAudioを使いこなす 〜AudioMixer活用編〜
2024-01-22

【Unity】第三回 UnityAudioを使いこなす 〜オーディオスペクトラム描画編〜
2024-01-22

エレキベア
オーディオスペクトラムというと、音の周波数がウネウネしているあれクマね

マイケル
その通り!
今回は下記二種類のオーディオスペクトラムを実装してみました!

▲LineRendererによる描画

▲3DCubeによる描画

エレキベア
3Dオブジェクトで描画できるようになると、ゲーム内で使用したりと幅が広がりそうクマね

マイケル
UnityAudioに元々用意されている関数で、比較的簡単に実装できるので興味がある方は真似して実装しみてください!
ちなみに今回実装するサンプルは下記にGitHubリポジトリとしてあげています!

エレキベア
これまで作ったサンプルも入っているから見てくれクマ〜〜
参考書籍

マイケル
今回、サウンド周りの学習をするにあたり、下記書籍を参考にさせていただきました!


マイケル
Unityでのサウンド処理をまとめた数少ない書籍です!
発売日からそれなりに経過していますが、UnityAudioだけでなくCRIと連携した使い方まで解説されているため、興味を持った方はぜひ一読してみてください!

エレキベア
サウンド専門となると書籍は中々ないクマから持っておく価値はありそうクマね
周波数情報の取得

マイケル
まず、オーディオスペクトラムとして表示するにはサウンドの周波数データが必要になります。
それをどうやって取得するかというと、UnityAudioに元々用意されている AudioSource.GetSpectrumData という関数から取得することができます。
Unityスクリプトリファレンス - AudioSource.GetSpectrumData

マイケル
これを読み込んだAudioSourceから実行するだけで取得することができます。
本来はフーリエ変換という計算を行わないといけないのですが、それを用意してくれているので簡単ですね!
▲今回は上記のような形で取得処理を用意した

エレキベア
これで準備は完了クマ
あとはこのデータを使ってオーディオスペクトラムを描画するクマ
オーディオスペクトラムの描画
オーディオスペクトラム基底処理の実装

マイケル
オーディオスペクトラムを描画するにあたり、基底クラスとしてSpectrumVisualizerというクラスを用意しました。
こちらのパラメータは下記のようになっています。
▲調整可能なパラメータ

マイケル
GetSpectrumDataを実行する際に渡すサンプル数は、2の冪乗かつ64-8192の範囲でないといけないため、その中から選択できるようにしています。
その他、柔軟性を高めるために実際に描画する際の分割数も別途指定できるようにしています。

エレキベア
確かに3Dオブジェクトでの描画も考えると、描画する側の数は制限できるようにしといた方がよさそうクマ

マイケル
初期化処理と更新処理については下記のようになっています。
表示する周波数域を絞るためのフィルタ処理(GetFilteredSpectrumDataArray)と、
取得した周波数配列から描画用の配列データに変換する処理(GetAverageSpectrumDataValue)
も用意しました。
最終的に加工したデータを、描画するためのUpdateRenderer関数に渡すようにしています。
▲周波数データ配列を指定範囲に切り取り、表示用に配列数を調整

エレキベア
InitializeRenderer、UpdateRendererを描画する関数内で記述するクマね
データはこれで用意できたクマね
LineRendererによる描画

マイケル
それでは用意したクラスを使用して、LineRendererとして描画する実装を考えてみます。

▲LineRendererによる描画

マイケル
今回は下記のように実装してみました。
LineRenderer内のpositionCountを表示する分割数に設定し、周波数データから位置を計算して設定しています。
▲LineRendererによる描画

エレキベア
LineRendererの各点の位置の高さを周波数データによって変えてるクマね
データは渡されてくるからシンプルクマね
3DCubeによる描画

マイケル
次は3DCubeによる描画についてです。
これが出来るようになれば、3D空間上でオブジェクトをサウンドに合わせて変形させるといったことも出来そうです。

▲3DCubeによる描画

マイケル
実装に関しては下記の通りで、データによって3DCubeのscaleを変化させているだけです。
位置や大きさの更新と調整パラメータ以外はLineRendererと大きな違いはありません。
▲3DCubeによる描画

エレキベア
これで一通り実装が完了したクマね
オブジェクトの位置を3D空間上にばらけさせると、見た目的に更に面白いものが作れそうクマ
おわりに

マイケル
というわkでオーディオスペクトラムの描画についてでした!
どうだったかな??

エレキベア
周波数データの取得関数が用意されているクマから、案外簡単に実装できたクマね

マイケル
今回は用意された関数を使ったけど、
フーリエ変換も面白いトピックだと思うから、どこかでまた取り上げてみたいね

マイケル
というわけでUnityAudioについて何回かに分けて書いてきました。
今後はCRIやWwiseといったサウンドミドルウェアも触りながら学習してみようかと思っています。
お楽しみに〜〜!!

エレキベア
クマ〜〜〜
【Unity】第三回 UnityAudioを使いこなす 〜オーディオスペクトラム描画編〜 〜完〜

【Unity】第一回 UnityAudioを使いこなす 〜サウンド再生処理編〜
2024-01-22

【Unity】第二回 UnityAudioを使いこなす 〜AudioMixer活用編〜
2024-01-22

【Unity】第三回 UnityAudioを使いこなす 〜オーディオスペクトラム描画編〜
2024-01-22