BackMusic を演奏

XNA でゲームの BackMusic を演奏します。

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

プログラムの説明

  1. XNA でゲームの BackMusic を演奏します。
    Sound を鳴らすには XACT(Microsoft Cross-Platform Audio Creation Tool) を使います。
  2. 最初に XACT で使用するフォルダーを作成します。
    メニューから [ファイル][新規作成][プロジェクト] で新しいプロジェクトを作成して実行を確認して下さい。
    ソリューションエクスプローラの Content の下位に \Audio を、その下位に \Waves フォルダーを作成します。
    Content フォルダーを右クリックして、[新しいフォルダー]から作成して下さい。

    この段階で XNA のプロジェクトを閉じてください。
  3. Windows エクスプローラで Wave File を先ほど作成した Content\Audio\Waves\ にコピーします。
    XNA Game Studio 2.0 のサンプルプログラム Spacewar を作成すると、そのプロジェクトに沢山のコンテンツが格納されます。
    今回は Spacewar のプロジェクトから、次のファイルをコピーして使用することにします。
    \MySpacewarWin1\Content\Audio\Waves\Music\Theme.wav
    Spacewar を作成することが出来ない場合は、適当な wave file を調達してきて下さい。
    その場合、全ての 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)]を選択して、 プロジェクトに格納した wave file を選択すると、Wave バンクに wave file が表示されます。
      メニューから[Window][Tile Horizontally]を選択すると Wave Bank と Sound Bank が上下に並べて表示されます。

    6. Wave Bank に表示された wave を Cue Name のウインドウに Drag & Drop します。

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

    8. XACT のプロジェクトを保存して終了します。
  5. Visual C# 2008 Express Edition に戻り、プロジェクトを開きます。
    ソリューション エクスプローラで Content\Audio フォルダーを右クリックします。
    [追加][既存の項目]から MySound.xap を選択すると XACT で設定した WAVE と関連付けられます。
    MySound.xap は XACT プロジェクトで保存した名前です。

  6. Game1.cs を修正します。
    spriteBatch の次の行に、Sound 関係の領域を定義します。
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
    
            AudioEngine audioEngine;
            WaveBank waveBank;
            SoundBank soundBank;
            Cue engineSound = null; 
        
  7. Initialize() 関数で Sound の初期化を行います。
    MySound.xgs は XACT プロジェクトで保存した名前です。
    waveBank, soundBank は、そのまま記述して下さい。
            protected override void Initialize()
            {
                // TODO: Add your initialization logic here
                base.Window.Title = "XNA Game Studio";
                audioEngine = new AudioEngine( "Content\\Audio\\MySound.xgs" ); 
                waveBank = new WaveBank( audioEngine, "Content\\Audio\\Wave Bank.xwb" ); 
                soundBank = new SoundBank( audioEngine, "Content\\Audio\\Sound Bank.xsb" ); 
    
                base.Initialize();
            }
        
  8. Update() 関数で演奏の開始と停止を行います。
    Space キーで Theme.wav の演奏を開始します。
    Enter キーで Theme.wav の演奏を停止します。
            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
                //Space キーで Theme.wav の演奏を開始します。
                if (Keyboard.GetState().IsKeyDown(Keys.Space))
                {
                    if (engineSound == null)
                    {
                        engineSound = soundBank.GetCue("Theme");
                        engineSound.Play();
                    }
                    else if (engineSound.IsPaused)
                    {
                        engineSound.Resume();
                    }
                }
                //Enter キーを押すと演奏を停止します。
                if (Keyboard.GetState().IsKeyDown(Keys.Enter))
                {
                    if (engineSound != null && engineSound.IsPlaying)
                    {
                        engineSound.Pause();
                    }
                }
     
                base.Update(gameTime);
            }
        
  9. 手順は長いのですが、実際に操作すればすぐ要領をつかめます。
    音声の無いゲームプログラムなんて「気のぬけたビール」みたいなものです。 (^_^;)
    頑張って音声を組み込んで下さい。

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

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