CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
レベルメーター

サンプル内容

概要

再生音量をリアルタイムに取得するスクリプトのサンプルです。
本サンプルでは、取得した音量をキューブの大きさに反映させて視覚化しています。

cri4u_samples_criatom_script05_main.png

操作方法

操作できる箇所はありません。

シーン情報


ミドルウェア CRI ADX (CRI Atom)
サンプル Scriptサンプル:レベルメーター
格納場所 /cri/unity/samples/UnityProject/Assets/Scenes/criatom/script/ScriptSample05_LevelMeter/Scenes
シーンファイル ScriptSample05_scene_LevelMeter.unity
ADXデータのオリジナル データ:音楽の簡易クロスフェード


プログラムの解説

サウンドの再生音量をリアルタイムに取得するスクリプトのサンプルです。
ステレオ音楽の音量にあわせて二つのキューブの大きさを変化させています。
再生している音楽はキューブ "LevelMeterCube L" に CriAtomSource として貼り付けてあり、"Play On Start"のチェックが入っているためシーン実行と同時に再生が始まります。

音量取得スクリプトについて

音量の取得はキュー(音)単位ではなく、ADXのDSPバス出力ごとに行うことが出来ます。
本サンプルではDSPバス0番の音量を取得します。
DSPバス0番はマスターバスと言われる出力で、全てのサウンドがこのバスから最終出力されます。
また、Debug.Log 関数を使ってコンソールに音量の値も随時出力しています。

スクリプトファイル: Scripts/LevelMeter.cs
using System.Collections;
public class LevelMeter : MonoBehaviour {
public int monitoredChannelId = 0;
private int analyzedDspBusId = 0;
private float objScaleBaseVal = 2.0f;
/* This "Start()" method is called before "Update()".*/
void Start () {
CriAtom.AttachDspBusSetting("DspBusSetting_0");
/* Set Bus Analayzer to use "BusAnalyzeInfo" */
CriAtom.SetBusAnalyzer(true);
}
/* Update the local scale value of GameObject */
void Update(){
/* Get BusAnalyzerInfo from a DSP Buss verifyed by mDspBusId*/
CriAtomExAsr.BusAnalyzerInfo lBusInfo = CriAtom.GetBusAnalyzerInfo(analyzedDspBusId);
/* calculate new value of GameObject scale */
float lObjScaleNewVal = 0.1f + objScaleBaseVal * lBusInfo.peakLevels[monitoredChannelId];
Debug.Log("Channel_" + monitoredChannelId + " : " + lBusInfo.peakLevels[monitoredChannelId]);
/* update local scale of 'this' game object */
this.transform.localScale = new Vector3(lObjScaleNewVal, lObjScaleNewVal, lObjScaleNewVal);
}
}

Start関数内で行っている CriAtom.AttachDspBusSetting と CriAtom.SetBusAnalyzer は、SoundManagerのような全体管理スクリプトがあるプロジェクトの場合はそちらで一度だけ設定しておけば大丈夫です。
音量取得にはバス情報取得のための関数 CriAtom.GetBusAnalyzerInfo を使用します。
引数はDSPバスの番号で、今回はマスターバスである0番を指定しています。
実際の音量は取得したバス情報 CriAtomExAsr.BusAnalyzerInfo の中の peakLevels[] という配列に格納されています。
peakLevels[0] がステレオの左チャンネル、peakLevels[1] がステレオの右チャンネルです。

バス音量の値について

バス情報で取得できるレベル値には、RMSレベル(音圧)、ピークレベル(最大振幅)、ピークホールドレベルなどがあります。
例えば peakLevels[] に実際に格納されている値は 0以上のfloat値です。
聞こえるような音量でも 0.1 以下の事もあり、あまり大きな値にはなりません。
ゲーム内でレベルメーターを実装したり、音量の値を何らかの変数として利用する場合は、実際に使用するサウンドの音量に あわせて適当にスケールするなどして使用してください。
[詳細]
各レベル値は音声データの振幅に対する倍率です(単位はデシベルではありません)。
以下の計算式でデシベル表記に変換することができます。
dB = 10.0f * log10f(level);


DSPバスの番号について

CriAtom.GetBusAnalyzerInfo で指定するDSPバス出力の番号は、サウンドツール CRI Atom Craft のDSPバス設定情報のバス番号に対応します。

cri4u_samples_criatom_script05_dsp_setting.png

DSPバス0番はマスターバスと呼ばれ、最終出力段です。通常は全てのサウンドはここに出力されます。

特定のキューの音量だけとりたい場合

DSPバス0番の音量を取得するということは、音楽も環境音もセリフも全てミキシングした結果の音量を取得することになります。
音楽の音量だけ調べたいとか、セリフの音量だけ調べたいという場合はデータ側で0番以外にも出力するように設定することで可能になります。
例えば、音量を調べたいキューはバスセンドの0番と5番に出力するようにCRI Atom Craftで設定しておいて、ゲーム側ではDSPバス5番の音量を調べます。

cri4u_samples_criatom_script05_dsp_5.png

DSPバスの音量変化は、CRI Atom Craft で再生している時にもDSPバス設定のウインドウで確認することが出来ます。

cri4u_samples_criatom_script05_dsp_level.png

DSPバス0番以外の音量が取得できない場合

トラブルシュート的なTIPSとなりますが、アプリでDSPバス0番以外の音量が取得できない場合は、スクリプト側でDSPバス設定およびバス解析用の設定をしているかを確認してください。
具体的には次のコードです。本サンプルでは LevelMeter.cs の Start関数で実行しています。
DSPバス設定の名称 "DspBusSetting_0" はツール側で変更することも出来るので、名称が一致しているかも注意してください。

CriAtom.AttachDspBusSetting("DspBusSetting_0");
CriAtom.SetBusAnalyzer(true);