CRIWARE Unity Plugin Manual  Last Updated: 2024-12-05
[CriAtom]リアルタイムパラメータコントロール

サンプル内容

概要

cri4u_samples_criatom_scene04_game_mini.png

サウンド再生中に、ボリュームやピッチなどの再生パラメータをリアルタイムにコントロールするデモです。

操作方法

画面上のCubeをクリックするとナレーションが始まります。

スライダーを動かすと再生パラメータをコントロールすることができます。
スライダーと再生パラメータは次表のように対応しています。

スライダーと再生パラメータの対応
スライダー 再生パラメータ
Volume Control ボリューム
Pitch Control ピッチ
Bus Send 00 バスセンド0: マスタバス
Bus Send 01 バスセンド1: リバーブ
Bus Send 02 バスセンド2: ピッチシフタ
Bus Send 03 バスセンド3: エコー、サラウンダ
Bus Send 04 バスセンド4: コンプレッサ
Bus Send 05 バスセンド5: コーラス
Bus Send 06 バスセンド6: BiQuadローパスフィルタ
Bus Send 07 バスセンド7: ディストーション

[Reset]ボタンをクリックすると、初期状態に戻すことができます。

シーン情報


ミドルウェア CRI ADX (CRI Atom)
サンプル Basicサンプル
格納場所 /cri/unity/samples/UnityProject/Assets/Scenes/criatom/basic/
シーンファイル Scene_04_ControlParameter.unity


プログラムの解説

CRI Atom Craftでサウンドデータをオーサリングする時、キュー、トラック、ウェーブフォームそれぞれに再生パラメータを設定することができます。
スクリプトでキュー再生を行うと、あらかじめキューに設定されている再生パラメータを使って再生することになります。
それだけではなく、再生を開始してから、これらの再生パラメータをリアルタイムに変更しつつ再生することができます。
  • 再生パラメータ
    • ボリューム
    • ピッチ (再生速度が変わる)
    • バンドパスフィルタ
    • イコライジングフィルタ
    • パンニング
    • ピッチシフト (再生速度を維持)
    • コンプレッサ
    • ディストーション
    • リバーブ
    • バスセンドレベル

ボリュームコントロールとピッチコントロールについて

/* ボリューム */
private float volumeValue = 1.0f;
/* ピッチ */
private float pitchValue = 0.0f;
/* PitchコントロールGUI */
GUI.Label (new Rect(20, 18 * (gui_i++), 200, 24), "Pitch Control Value " + this.pitchValue.ToString("0.00"));
this.pitchValue = GUI.HorizontalSlider(new Rect(20, 18 * (gui_i++), 200, 12), pitchValue, -1200.0f, 1200.0f);
if (GUI.changed || on_reset == true) {
CriAtomSource atom_source = gameObject.GetComponent<CriAtomSource>();
/* Inspector側にパラメータがある場合はInspector側をコントロールする */
atom_source.volume = volumeValue;
atom_source.pitch = pitchValue;
}

DSPバス設定のアタッチについて

DSPバス関連の設定はCRI Atom Craft側で設定してあります。
DSPバスでは主にDSPエフェクト(バス単位でのリバーブやディレイ、ディストーション、ピッチシフトなど)のエフェクト設定になります。

この設定を呼び出すにはAttachDspBusSetting()関数を使用しアタッチしておく必要があります。
このサンプルでは[CRIWARE]オブジェクトのCRIコンポーネントの初期化(ACFロード時)時にDSPバス設定も自動でアタッチしています。

バスセンドレベルについて

バスセンドは、主にDSPエフェクトの効果を有効にする目的で使用します。
バスセンドパラメータはデータとの掛け合わせになるため、データ側があらかじめ1.0(開いた状態)になっている必要があります。
データ側で、センドした先のDSPバスセッティングにて、ルーティングにDSPエフェクトや、最終出力まで繋がっている必要があります。

/* Bus send 0-7 */
private float[] busSendlevelValue = new float[maxBus];
...
GUILayout.BeginVertical();
for (int i = 0; i < maxBus / 2; i++) {
GUILayout.Label ("[" + i.ToString() + "] " + this.busSendlevelValue[i].ToString("0.00") + busEffectType[i]);
this.busSendlevelValue[i] = Scene_00_GUI.HorizontalSlider(busSendlevelValue[i], 0.0f, 1.0f);
}
GUILayout.EndVertical();
GUILayout.BeginVertical();
GUILayout.Space(12);
GUILayout.EndVertical();
GUILayout.BeginVertical();
for (int i = maxBus / 2; i < maxBus; i++) {
GUILayout.Label ("[" + i.ToString() + "] " + this.busSendlevelValue[i].ToString("0.00") + busEffectType[i]);
this.busSendlevelValue[i] = Scene_00_GUI.HorizontalSlider(busSendlevelValue[i], 0.0f, 1.0f);
}
GUILayout.EndVertical();
...
/* Update the bus send level. */
/* A parameter that does not exist on the Inspector side, control it by functions. */
/* Bus 0 is 1.0f by default, and multiplication is applied. */
atom_source.SetBusSendLevel(0, this.busSendlevelValue[0]);
for (int i = 1; i < maxBus; i++) {
/* Bus 1-7 is 0.0f by default, and addition is applied.(specifying offset) */
atom_source.SetBusSendLevelOffset(i, this.busSendlevelValue[i]);
}