こんにちは!
ADXアンバサダーのこはとです。
CRI ADXでは、音声にフランジャーやディストーションなどのエフェクトの効果をつけることができるのをご存知でしょうか?
以前の記事で紹介したUnityRoomでのサンプルでも、このバスセンドの機能を使ってエフェクトをかけています。
今回はADXの音声にエフェクトをつける「バスセンド」機能の使い方を紹介します。
この記事は、CRIWAREが提供するサウンドミドルウェア「CRI ADX」の機能について紹介をします。
詳しい操作方法まで解説しますので、「ADXを使ったことないよ!」という方もこの機会に是非、CRI ADXに触れてみてください!
CRI ADXのダウンロード、インストールについてはこちらから
バスセンドって何?
バスセンドは、簡単に言うと音声の「出力」をコントロールする機能です。
「バス」という言葉は、通信用語で「通信線(の束)」を指す言葉で、このバスを作成、操作することで、音声(以下「Cue」)のボリュームなど、音声出力の形態をコントロールすることができます。
複数のCueを1つのバスに流し込むことで、一括で音声ボリュームなどの操作が可能になる他、1つのCueから複数のバスに流し込むこともできます。
CRI ADXには、標準で「MasterOut(ボリューム)」のバスが用意されており、デフォルトではこのバスを通して音声が出力されています。
音声エフェクトを使うには、これとは別にバスを作成し、Cue~出力の間にエフェクターを挟むことで音声にエフェクトの効果をもたらすことができます
音楽経験のある方は、ギタリストが足元で操作しているエフェクターを想像してもらうとわかりやすいと思います。
厳密には「Cue自体にエフェクトを付与する」のではなく「Cueが再生される出力にエフェクトを付与する」という点に注意してください。
AtomCraftで使ってみよう
まずはAtomCraft内で効果を確認してみましょう。
ここで作成した設定は、そのままUnityでも使用できます。
まずは任意の箇所にAtom CraftのProjectを作成し、適当なCueを作成します。
ではバスを作っていきます。
プロジェクトツリータブからデフォルトのミキサーを選択し、新しくバスを作成します。
今回はFlanger効果を適用するバスを作成したいと思います。
「Flanger」という名前のバスを作成しましょう。
ここはゲーム内でも参照される値のため、正確な内容を入力しましょう
作成したエフェクターの効果は「インスペクター」タブから詳細なパラメータを変更できます。
これでバスの作成は完了です。
なお、一本のバスには複数のエフェクターをつけることもできます。
バスの作成が終わったら、Cueがこれらを参照できるように、作成したバスを「バスマップ」に登録していきます。
バスマップは、Cueが実際に参照する「バスのリスト」です。
Cue毎にバスマップを設定することで、例えば
Cueの「バス名☓☓」の「バスセンドレベル(音量)を△△に設定」
という形でバスの効果を使用することができます。
Cueに設定されているバスマップに「バス名☓☓」が存在する場合のみ、そのバスの効果を受けることができます。
今回はデフォルトで用意されているバスマップに、作成した「Flanger」バスを登録していきましょう。
バスマップ自体も作成することができますが、本記事では割愛します。
↓この状態になればOKです。
バスマップの設定ができたら、最後にバスセンドの効果を確認してみましょう。
最初に作成したCueを選択し、「インスペクター」タブから、作成したバスのチェックボックスをONにしましょう。
チェックボックスの横のスライダーを動かすことで、プレビューされるバスセンドレベルを変更することもできます。
Cueを選択した状態でF5キーを押すことでプレビュー再生できます。
エフェクターのパラメーターやバスセンドレベルを調節し、お好みの設定に変更してみましょう。
Unityで動かしてみよう
ではこの効果をUnity上で動的に付与できるようにしていきます。
AtomCraftのバスセンド設定はOFFにしておく
先述したAtomCraft上でONにしたチェックボックスは、このまま書き出すとONにしたバスセンドがデフォルトで適用されてしまうため、チェックボックスはMasterOut以外はOFFにして、CueSheetを書き出しておきましょう。

Unity側の設定
Unity側の設定をしていきます。
データの書き出し、プロジェクトのセットアップ、必須コンポーネント郡の作り方については、以下の記事の「作成したデータの出力」以降をご参照ください!
プロジェクトのセットアップができたら、必要なゲームオブジェクトをHierarchyに配置します。
用意するのは
・CRIWARE必須コンポーネント郡(3つ)
・CriAtomSource
・スライダー
・スクリプト用のGameObject
の4つです。
また、CriAtomコンポーネント、ならびにCriAtomSourceコンポーネントには、書き出したCueSheetの内容や再生したいCueをセットしておいてください。
ゲームオブジェクトが作成できたら、スクリプトを作成していきます。
Asset内の任意の場所に新しくスクリプトを作成し、名前を「BusSendSample」とします。
内容は以下のものをコピペすればOKです。
(※以下のサンプルはCRIWAREのAssetSupportAddonを使用しています。デフォルトの場合は「CriAtomSourceForAsset」を「CriAtomSource」に変えてください)
using UnityEngine;
using CriWare;
using CriWare.Assets;//ForAssetを使う場合は記載
using UnityEngine.UI;
public class BusSendSample : MonoBehaviour
{
//音声Source
//サンプルではForAssetのものを使用していますが、通常のCriAtomSourceでもOKです。
[SerializeField]
CriAtomSourceForAsset source;
//状態更新用Update
CriAtomExPlayback playback;
//値変更用Slider
[SerializeField]
Slider slider;
//値変化の監視用キャッシュ値
float sliderValue_old;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
if(slider != null)
{
sliderValue_old = slider.value;
playback = source.Play();
}
}
// Update is called once per frame
void Update()
{
if(slider != null)
{
if (slider.value != sliderValue_old)
{
//エフェクトだけを上げると音量が二倍になるので、Masterは下げる。
source.player.SetBusSendLevel("MasterOut", 1f - slider.value);
source.player.SetBusSendLevel("Flanger", slider.value);
//パラメーター更新
source.player.Update(playback);
//キャッシュ更新
sliderValue_old = slider.value;
}
}
}
}
スクリプトの解説
SetBusSendLevel(string busName,float level)
Cueに設定されたバスマップのうち、busNameに指定したバス名のバスセンドレベルをlevelの値に変更します。
存在しないバス名を指定した場合は動作しないためご注意ください。
また、同じメソッド名で第1引数にidを指定する
SetBusSendLevel(int id,float level)
もありますが、こちらは非推奨メソッド(長期的に削除される予定)のメソッドなのでご注意ください。
スクリプトをアタッチして再生
スクリプトができたら、空のゲームオブジェクトにこれをアタッチし、Sliderを取得させましょう。
再生してSliderを動かした際に楽曲にバスセンドの効果が付与されればOKです!
上級編:動的にエフェクトを付与してみよう
ここからは上級編です。
これまでの例では、新規でバスマップを作成するとCue毎にバスマップの設定が必要になります。
しかし、例えばバスが5個、10個と増えてくると、全てのCueに対応するバスマップの設定をするのは大変です。
この後の内容では、グローバルAISACを使うことで、ゲーム内の任意のCueに動的にバスセンドを付与することができるようになります。
グローバルAISACの詳しい使い方については以下の記事をご参照ください。
AtomCraftでの設定
まずはAtomCraftでグローバルAISACを作成していきます。
今回は記事で作成したFlangerのバスを適用するグローバルAISACを作成します。
新規グローバルAISACを作成し、Flanger、MasterOutのバスセンドレベルが入れ替わるようなグラフを作成しましょう。
作成後、通常通りCueSheetをビルドすることで設定が更新されます。
この際、新しくCueを作成したとしても、バスマップの設定無しにUnity上でバスセンドの効果を適用できます。
Unityでの設定
Unity上では、新たにToggleを作成します。
これはグローバルAisacの適用ON/OFFを切り替えるために使用します。
作成したら、以下のスクリプトをコピペしましょう。
前章で作成したスクリプトに上書きするか、新しくスクリプトを作成してもOKです(クラス名が一致するように注意してください)
using UnityEngine;
using CriWare;
using CriWare.Assets;
using UnityEngine.UI;
public class BusSendSample : MonoBehaviour
{
//音声Source
//サンプルではForAssetのものを使用していますが、通常のCriAtomSourceでもOKです。
[SerializeField]
CriAtomSourceForAsset source;
//状態更新用Update
CriAtomExPlayback playback;
//値変更用Slider
[SerializeField]
Slider slider;
//値変化の監視用キャッシュ値
float sliderValue_old;
//グローバルAISACを多重で掛けないようにするためのキャッシュ値。保険として。
bool isAisacAttached = false;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
if(slider != null)
{
sliderValue_old = slider.value;
playback = source.Play();
}
}
// Update is called once per frame
void Update()
{
if(slider != null)
{
if (slider.value != sliderValue_old)
{
//source.player.SetBusSendLevel("MasterOut", 1f - slider.value);
//source.player.SetBusSendLevel("Flanger", slider.value);
//Aisac
if (isAisacAttached)
{
//Cueに適用したグローバルAISAC「BusSendAisac」に設定されている「AisacControl_00」を操作
source.player.SetAisacControl("AisacControl_00", slider.value);
}
//パラメーター更新
source.player.Update(playback);
//キャッシュ更新
sliderValue_old = slider.value;
}
}
}
/// <summary>
/// Toggleから呼ばれ、ToggleのT/Fの状態に応じてAisacの付与状態を切り替える。
/// </summary>
/// <param name="isSet"></param>
public void SetGlobalBus(bool isSet)
{
if (isSet != isAisacAttached)
{
if (isSet)
{
//指定したAISAC名のグローバルAISACを付与
source.player.AttachAisac("BusSendAisac");
}
else
{
//指定したAISAC名のグローバルAISACを削除
source.player.DetachAisac("BusSendAisac");
}
//キャッシュ値更新
isAisacAttached = isSet;
//パラメーター更新
source.player.Update(playback);
}
}
}
スクリプトをゲームオブジェクトにアタッチしたら、最後にToggleへスクリプトの関数をセットします。
ToggleのOnValueChangedにSetGlobalBusを参照させましょう。
再生して確認
以上で上級編は終わりです!
ToggleをOFFにした時にスライダの反応がなくなり、ToggleをONにした時にスライダに応じて効果が適用されればOKです。
CriAtomSourceが再生するCueの内容を変更するだけで、どのCueにも同様の効果を付与することができます。
おわりに
お疲れ様でした!うまく再生できたでしょうか?
前半で解説した内容は、バスセンドを事前に適用させる機能です。利用頻度が高く、適用する効果が事前にわかっているBGMや背景環境音などのような音声に最適です。
一方、上級編で解説した内容は動的に適用するバスセンドのため、効果音やボイスなど、数が多く、ゲームの状況に応じて違った効果が適用される音声に最適です。
実装ケースやゲームによって得意な方法が異なるため、音声の用途にあわせた機能を使ってみてください!
また、CRI ADXでは、公式のDiscordコミュニティも随時公開されています。
「こんなことはできる?」
「不具合が解消しない!」
「他の人がどんな使い方をしているのか知りたい!」
など、気になることや知りたいことを、開発スタッフに直接質問することもできます。
イベント情報等もこちらで告知しておりますので、ご興味のある方は、ぜひご参加ください!































