【Unity】セガサターンのCD再生画面を再現する - その3

f:id:amayoshitqs:20201112012811g:plain

セガサターンのCD再生画面をUnityで再現する第3回です。
今回はいよいよ再生中のBGMの解析を行います。

セガサターンと言えば、先日パンツァードラグーンを買いました。
Normal通しでは6面が限界、面セレクトの裏技を使ってなんとか一通りクリアできました。
隠し要素が妙に多いので、頑張ってNormalノーコンぐらいは成し遂げたいところです...

前回はこちら。 amayoshitqs.hatenablog.com

BGM再生準備

まずUnity内でBGMを鳴らせる状態にしましょう。
鳴れば何でも良いのですが、折角なので簡単な再生/停止の機能を作ります

f:id:amayoshitqs:20201113022642p:plain

まずはボタンを2つ用意します。
次にメンバ変数でAudioSourceを参照できるようにします。

[SerializeField] AudioSource audioSource = default;

これを使った再生/中断停止の関数を定義します。

public void OnPushPlayButton()
{
    if(audioSource.isPlaying)
    {
        audioSource.Pause();
    }
    else
    {
        audioSource.Play();
    }
}

public void OnPushStopButton()
{
    audioSource.Stop();
}

そしてこれらの関数をそれぞれOnPushButtonイベントに登録しましょう。

f:id:amayoshitqs:20201112013105p:plain

最後にMainCameraなどにAudioSourceコンポーネントをアタッチします。

そしたら実行して適当に動作確認してみてください。
今回はAudioSourceから音が出ればOKなので、再生停止の細かいところは割愛します。

AudioSourceから音のボリュームを解析

このシリーズの趣旨である音の解析の部分に着手していきます。
といってもUnity標準の機能を使うので、専門的な音楽の知識等は必要無いのでご安心を。

f:id:amayoshitqs:20201112015235p:plain

まず解析した音量を表示するためのTextを用意しましょう。
Debug.Logでも良いです。
あとスライダーはもう要らないので削除してしまいましょう。

using System.Linq;
using UnityEngine.UI;

Text用にUnityEngine.UIと、
音の解析で使うSystem.Linqをusingしておきます。

続いてメンバ変数です。

[SerializeField] Text audioVolume = default;
float[] waveArrayData = new float[2048];

Textのインスタンスと、波形データの配列です。 配列数は2の累乗である必要があります。

超絶分かりやすく言うと、今回の場合は配列数が多いほど正確な音量を取ることができると思っておけばOKです。
立方体の動き的にも滑らかになります、でも配列数分だけ処理が嵩むのでスペックと相談してください。

そしてUpdate()メソッドで解析と出力まで行います。

void Update()
{
    audioSource.GetOutputData(waveArrayData, 1);
    var volume = waveArrayData.Select(x => Mathf.Abs(x)).Sum() / waveArrayData.Length;
    audioVolume.text = (volume * 300).ToString("0.00");
    OnChangeValue(volume * 300);
}

まずaudioSource.GetOutputData(waveArrayData, 1)で配列にデータを格納します。
そして全データの絶対値の合計をデータ数で割ります、要は平均ですね。

それでできたvolumeOnChangeValue()に入れたら完成です。
ここで今回は300倍していますが、プロジェクトで使用する楽曲のボリュームによりけりなので上手く調整してください。

完成

www.youtube.com

音楽に合わせて動いているのが分かると思います!

今回は以上になります。
ここまでで最低限は完成しました。

あとはセガサターンのものと同じように左右の音をそれぞれ判別できれば良いと思うのですが、 そもそも左右でちゃんと音が明確に違う曲を用意しないとダメなのでしばらく掛かると思います。
投稿されずに別のシリーズを始めたら察してください。