Volume の設定

XNA でサウンドの Volume を設定します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. XNA でサウンドの Volume を設定します。
    Sound を鳴らすには XACT(Microsoft Cross-Platform Audio Creation Tool) を使います。
    プロジェクトの生成は、基本的に BackMusic を演奏 と同じですが、 全く同じでは面白くないので、少し変えてみましょう。
  2. 最初にメニューから [ファイル][新規作成][プロジェクト] で新しいプロジェクトを作成して実行を確認して下さい。
    ソリューションエクスプローラの Content の下位に \Audio を作成します。
    Content フォルダーを右クリックして、[新しいフォルダー]から作成して下さい。
    前回は \Waves フォルダーを作成したのですが、今回は使いません。

    この段階で XNA のプロジェクトを閉じてください。
  3. Windows エクスプローラで Wave File を先ほど作成した Content\Audio\ に格納します。
    今回はネットからバックに流せる適当な WAV ファイルを探し出して back.wav の名前で格納しました。
    その場合、全ての wave file が演奏できるとは限らないことを留意して下さい。
  4. XACT プロジェクトを起動します。
    XACT は XNA とは独立したプロジェクトになっていて、連携してゲームプログラムを作成します。
    1. [スタート] [すべてのプログラム] から [Microsoft XNA Game Studio 3.0][ツール]をクリックして、 [Microsoft Cross-Platform Audio Creation Tool](XACT) を起動します。
    2. メニューから[File][New Project]で新しいプロジェクトを作成します。
      保存する場所に先ほど作成したプロジェクトの Content\Audio\ を指定します。
      プロジェクト名に MySound とタイプします。
    3. この段階で Content\Audio\ のフォルダーに MySound.xap のファイルと Win, Xbox のフォルダーが作成されます。
      次回からは MySound.xap をダブルクリックして XCAT を起動することが出来ます。
    4. 最初に Wave バンクを作成します。
      ツリーから[Wave Banks]をクリックして、メニューの[Wave Banks]から[New Wave Bank]をクリックします。
      次に Sound バンクを作成します。
      ツリーから[Sound Banks]をクリックして、メニューの[Sound Bank]から[New Sound Bank]をクリックします。
    5. wave file を挿入します。
      ツリーから[Wave Bank]をクリックして、メニューから[Wave Banks][Insert Wave File(s)]を選択して、 プロジェクトに格納した back.wav を選択すると、Wave バンクに back.wav が表示されます。
      メニューから[Window][Tile Horizontally]を選択すると Wave Bank と Sound Bank が上下に並べて表示されます。
    6. Wave Bank に表示された wave を Cue Name のウインドウに Drag & Drop します。
      下記の画像では back が Theme(BackMusic を演奏の画像を流用)と表示されているので注意して下さい。

    7. back.wav はゲームの間、繰り返し演奏されます。
      繰り返し演奏する場合は、次の設定をして下さい。
      Sound Bank の back をクリックすると、サウンドバンクの右上のパネルにツリー構造が表示されます。
      サウンド バンクの右上のパネルで、[Play Wave]をクリックします。
      XACT ウィンドウの左下にプロパティのセットが一覧表示されます。
      Looping の Infinite をチェックします。
      下記の画像では back が Theme(BackMusic を演奏の画像を流用)と表示されているので注意して下さい。

    8. XACT のプロジェクトを保存して終了します。
  5. Visual C# 2008 Express Edition に戻り、プロジェクトを開きます。
    ソリューション エクスプローラで Content\Audio フォルダーを右クリックします。
    [追加][既存の項目]から MySound.xap を選択すると XACT で設定した WAVE と関連付けられます。
    MySound.xap は XACT プロジェクトで保存した名前です。
  6. Game1.cs を修正します。
    graphics の次の行に、Sound 関係の領域を定義します。
    spriteBatch は必要ないので削除しました。
    musicVolume は Volume のレベルで 0.0f 〜 2.0f の範囲で設定します。
            GraphicsDeviceManager graphics;
    
            // Audio objects
            AudioEngine engine;
            SoundBank soundBank;
            WaveBank waveBank;
            AudioCategory musicCategory;
    
            // Music volume.
            float musicVolume = 1.0f;
    
  7. Initialize() 関数で Sound の初期化を行います。
    MySound.xgs は XACT プロジェクトで保存した名前です。
    soundBank, waveBank は、そのまま記述して下さい。
    engine.GetCategory() でカテゴリを取得します。
    このとき XACT が規定値のままなら "Default" を指定します。
    soundBank.PlayCue() で演奏を開始します。
            protected override void Initialize()
            {
                base.Initialize();
    
                // Initialize audio objects.
                engine = new AudioEngine("Content\\Audio\\MySound.xgs");
                soundBank = new SoundBank(engine, "Content\\Audio\\Sound Bank.xsb");
                waveBank = new WaveBank(engine, "Content\\Audio\\Wave Bank.xwb");
    
                // Get the category.
                musicCategory = engine.GetCategory("Default");
    
                // Play the sound.
                soundBank.PlayCue("back");
            }
    
  8. LoadContent() 関数では何も行いません。
            protected override void LoadContent()
            {
            }
    
  9. Update() 関数で上下キーを検出して Volume を設定します。
    Keys.Up で musicVolume を上げます。
    Keys.Down で musicVolume を下げます。
    musicVolume は Clamp() で 0.0f 〜 2.0f の範囲に調整しています。
    musicCategory.SetVolume(musicVolume); で Volume を設定します。
    VerMsg(); で現在の musicVolume の値をタイトルバーに表示します。
    engine.Update(); でアップデートして下さい。
            protected override void Update(GameTime gameTime)
            {
                // ゲームを終了する
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed  ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                // TODO: Add your update logic here
                if (Keyboard.GetState().IsKeyDown(Keys.Up))
                {
                    musicVolume = MathHelper.Clamp(musicVolume + 0.01f, 0.0f, 2.0f);
                }
                if (Keyboard.GetState().IsKeyDown(Keys.Down))
                {
                    musicVolume = MathHelper.Clamp(musicVolume - 0.01f, 0.0f, 2.0f);
                }
    
                // Set the category volume.
                musicCategory.SetVolume(musicVolume);
                VerMsg();
    
                // Update the audio engine.
                engine.Update();
    
                base.Update(gameTime);
            }
    
  10. タイトルバーに musicVolume の値を表示する VerMsg() メソッドです。
            public void VerMsg()
            {
                string wstr;
                wstr = "Volume=" + musicVolume.ToString();
                base.Window.Title = wstr;
            }
    

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(XNA(C#) game program)