7.4 実行時パラメータ制御
7.4.1 動的なサウンドの変化
XACT では、サウンドデザイナがサウンドバンクで再生するキューの構成をデザインできます。複数のトラックに分けて異なるいくつかの音源を同時に再生することもできますし、サウンドの再生タイミングや停止タイミングを設定することもできます。また、サウンドのボリュームやピッチの変更も可能です。
このようなサウンドの効果を実行時に動的に行う必要がある場合、XACT プロジェクトのビルド時に決定できません。しかし XNA Framework では、音源となっている波形データを直接編集することはできません。そこで、RPC (Runtime Parameter Control) と呼ばれる機能を通して、実行時にサウンドのピッチや音量といったパラメータを操作する方法が提供されています。
まず最初に、キューの実体に関連付ける新しい変数を XACT で作成しなければなりません。これを Cue Instance Variable と呼び、プログラムからは、この変数を通してサウンドのパラメータを制御します。Cue Instance Variable を作成するには「Global Settings」メニューの「New Cue Instance Variable」項目を選択してください。
新しい変数が作成され、図2のような「Variable Settings」ダイアログが表示されます。表の Name 列には、現在作られている変数の名前が表示されています。今回は、新しく作成した変数の名前を Pitch に変更してください。Init Val 列に変数の初期値、Min 列に最小値、Max 列に最大値をそれぞれ設定します。これらの値は、変数の目的に応じて任意に設定してください。作成した Pitch 変数にの初期値を 0、最小値を -1、最大値を 1 に設定します。
次に、作成した変数とサウンドのパラメータを関連付けるために、新しい RPC Preset を作成しなければなりません。新しい RPC Preset を作成するには「Global Settings」メニューの「New RPC Preset」項目を選択してください。すると、ツリー項目内の「RPC Presets」内に新しい RPC Preset が生成されます。
新しい RPC Preset を作成すると図4のような「RPC Preset」ダイアログが表示されます。ダイアログ上部の「Variable」というラベルの直下にあるコンボボックスを開き「Pitch」を選択してください。これが、先ほど作成した変数を表します。Variable のすぐ右にある Value テキストボックスには変数の値を指定します。
Object コンボボックスには、特定のトラックにのパラメータを対象とするのか、またはサウンド全体のパラメータを対象とするのかを設定します。この場では Sound を選択してください。
Parameter には、この変数の変更に対応するサウンドまたはトラックのパラメータを指定します。今回は、Pitch 変数の値に比例してピッチが変更されるように Pitch パラメータを選択してください。これで、Pitch 変数と Pitch パラメータが関連付けられます。
画面左下の方眼紙のようなコントロールは、水平軸が変数の値、垂直軸がパラメータの値となります。ここで Pitch 変数と Pitch パラメータの関係を設定できます。この場では Pitch 変数の値が -1 のとき、サウンドのピッチを -10 まで下げ、変数の値が 1 のとき、ピッチを 10 まで上げるように設定します。Pitch 変数の値が 0 であれば、サウンドはオリジナルのピッチで再生され、変数の値に比例してピッチが変化します。
RPC Preset の設定ができれば、作成した RPC Preset をサウンドにアタッチして関連付けます。RPC Preset をサウンドにアタッチするには、対象のサウンドを選択した状態で右クリックし、表示されたポップアップメニューから「Attach/Detach RPC(s) ...」項目を選択してください。
すると、図6のような「RPC Preset Selection」ダイアログが表示されるので、左側のリスト内にある PRC Preset を選択して「Attach >」ボタンを押してください。項目が右側のリストに移動したら、サウンドに RPC Preset がアタッチされたことを表します。逆に、設定した RPC Preset を解除するには「< Detach」ボタンでデタッチしてください。
以上で作業は終了です。これで、XACT で作成した Pitch 変数がサウンドに関連付けられ、プログラムからサウンドのピッチを実行時に制御できるようになります。この場では、RPC を使って実行時にサウンドのピッチを変更するための変数を用意しましたが、同じように音量などの調整が可能です。
サウンドにアタッチされている変数にアクセスするには Cue クラスの SetVariable() メソッドを使います。
public void SetVariable ( string name, float value )
name パラメータには XACT 側で RPC Preset に設定した変数の名前を指定します。上記の XACT プロジェクトを使用している場合は Pitch という文字列になります。value には、指定した変数に設定する値を指定します。変数の値が変更されると、サウンドのピッチが変更されるでしょう。
現在の変数の値を取得するには GetVariable() メソッドを使います。
public float GetVariable (string name)
name パラメータには、取得する変数の名前を指定します。
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Input; public class Test : Game { public static void Main(string[] args) { using (Game game = new Test()) game.Run(); } private AudioEngine audio; private WaveBank wave; private SoundBank sound; private Cue cue; protected override void Initialize() { audio = new AudioEngine("Content/TestAudio.xgs"); wave = new WaveBank(audio, "Content/TestWave.xwb", 0, 16); sound = new SoundBank(audio, "Content/TestSound.xsb"); audio.Update(); cue = sound.GetCue("Test"); cue.Play(); base.Initialize(); } protected override void Update(GameTime gameTime) { GamePadState state = GamePad.GetState(PlayerIndex.One); cue.SetVariable("Pitch", state.ThumbSticks.Left.X); cue.SetVariable("Volume", state.ThumbSticks.Left.Y); audio.Update(); base.Update(gameTime); } }
コード1は、コントローラの左スティックを傾けるとピッチやボリュームが変更されるというプログラムです。スティックを左に傾けるとピッチが下がり、右に傾けるとピッチが上がります。同様に、スティックを上に傾けると音量が上がり、下に傾けると音量が下がります。