▼XNA Game Studioメモ▼
サウンドの再生


サウンドを再生するためのライブラリ「Playerクラス」を作成し、それを利用するプログラムを作成する。

キー 説明
A BGM0の再生
B BGM1の再生
X SE0の再生
Y SE1の再生
デジタルパッド上 ボリュームアップ
デジタルパッド下 ボリュームダウン
START ポーズ/再開
BACK 終了





サウンドリソースの作成
XNAで利用可能なサウンドファイル形式はwav、aif、aiffの3種類。
これらファイルをXACTでXNA用のサウンドファイルに変換して利用する。
  1. スタートメニューから「Microsoft Cross-Platform Audio Creation Tool(XACT)」を選択して起動。
  2. メニュー「File→New Project」を選択し、新規プロジェクトを作成。
  3. ファイル名は「sound.xap」と指定。
  4. 「XACT」の右側のツリーの「Wave Banks」を右クリックし、「New Wave Bank」を選択。
    「Wave Bank」はサウンドファイルを格納するもの。
  5. Wave Bankウィンドウにwaveファイルをドラッグ&ドロップ。
    今回はbgm0.wav、bgm1.wav、se0.wav、se1.wavの4つをドロップ。
  6. 「XACT」の右側のツリーの「Sound Banks」を右クリックし、「New Sound Bank」を選択。
  7. Wave Bankウィンドウからwavファイルを選択し、Sound Bankウィンドウの「Cue Name」にドラッグ&ドロップ。
    Sound Bankウィンドウに表示されている「Cue Name」はプログラムから操作対象を指定する時に利用。
    複数の操作対象を指定する時は「Category Name」を利用。
  8. XACTのメニュー「File→Save Project」を選択し、XACTプロジェクトを保存。
  9. XACTのメニュー「File→Build」を選択し、Finishボタンを押す。
成功するとプロジェクトの保存先に「Winフォルダ」と「Xboxフォルダ」が生成され、
フォルダの中にはXNAでサウンドを再生する際に使用する が生成されている。


リソースの追加
  1. はじめてのXNAアプリの作成」で作成したフォントプロセッサ「DefaultFont.spritefont」をソリューションエクスプローラのContentに追加する。
  2. グラフィックスの描画」で作成した「Graphics.cs」をプロジェクトに追加する。
  3. ゲームパッドの利用」で作成した「KeyManager.cs」をプロジェクトに追加する。
  4. サウンドファイル「sound.xap」をソリューションエクスプローラのContentに追加する。
  5. bgm0.wav,bgm1.wav,se0.wav,se1.wavをソリューションエクスプローラのContentに追加し、プロパティのビルドアクションを「なし」と指定。


Playerクラスの機能
種類 メソッド 説明
初期化 Player(String name) コンストラクタ
void Update() 更新
カテゴリ void SetVolume(float volume) ボリュームの指定
float GetVolume() ボリュームの取得
void Stop() 全BGM・SEの停止
void Pause() 全BGM・SEの一時停止
void Resume() 全BGM・SEの再開
BGM void PlayBGM(String name) BGMの再生
void StopBGM() BGMの停止
void PauseBGM() BGMの一時停止
void ResumeBGM() BGMの再開
SE Cue PlaySE(String name) SEの再生


ソースコードの編集

GameMain.cs
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace SoundEx {
    public class GameMain : Microsoft.Xna.Framework.Game {
        private Graphics   g;     //グラフィックス
        private KeyManager km;    //キーマネージャ
        private Player     player;//プレイヤー
        private Boolean    pause; //ポーズ

        //コンストラクタ
        public GameMain() {
            g=new Graphics(this);
            km=new KeyManager(KeyDown,null);
            Content.RootDirectory="Content";
        }

        //初期化
        protected override void Initialize() {
            //プレイヤーの生成
            player=new Player("sound");
            pause=false; 

            //ベースの初期化            
            base.Initialize();
        }

        //グラフィクスコンテントの読み込み
        protected override void LoadContent() {
            g.LoadContent();
        }

        //グラフィクスコンテントの解放
        protected override void UnloadContent() {
        }

        //更新
        protected override void Update(GameTime gameTime) {
            //キーイベントの配信
            km.Update();            

            //プレイヤーの更新
            player.Update();

            //ベースの更新
            base.Update(gameTime);
        }

        //キーダウン
        private  void KeyDown(PlayerIndex index,int keyType) {
            if (index==PlayerIndex.One) {
                //終了
                if (keyType==KeyManager.BACK) Exit();

                //再生
                if (keyType==KeyManager.A) {
                    player.PlayBGM("bgm0");
                } else if (keyType==KeyManager.B) {
                    player.PlayBGM("bgm1");
                } else if (keyType==KeyManager.X) {
                    player.PlaySE("se0");
                } else if (keyType==KeyManager.Y) {
                    player.PlaySE("se1");
                }

                //ボリューム
                if (keyType==KeyManager.DPAD_UP) {
                    player.SetVolume(player.GetVolume()+0.1f);
                } else if (keyType==KeyManager.DPAD_DOWN) {
                    player.SetVolume(player.GetVolume()-0.1f);
                }

                //ポーズ
                if (keyType==KeyManager.START) {
                    if (pause) {
                        pause=false;
                        player.Resume();
                    } else {
                        pause=true;
                        player.Pause();
                    }
                }
            }
        }

        //描画
        protected override void Draw(GameTime gameTime) {
            //背景の描画
            g.SetColor(255,255,255);
            g.Clear();

            //文字列の描画
            g.SetColor(0,0,0);
            g.DrawString("SoundEx",50,50);

            //ベースの描画
            base.Draw(gameTime);
        }
    }
}


Player.cs
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

//プレイヤー
public class Player {
    private AudioEngine   engine;   //エンジン
    private WaveBank      waveBank; //Wave Bank
    private SoundBank     soundBank;//Sound Bank
    private AudioCategory category; //カテゴリ
    private float         volume;   //ボリューム
    private Cue           bgm;      //BGM


//====================
//初期化
//====================
    //コンストラクタ
    public Player(String name) {
        engine   =new AudioEngine("Content\\"+name+".xgs");
        waveBank =new WaveBank(engine,"Content\\Wave Bank.xwb");
        soundBank=new SoundBank(engine,"Content\\Sound Bank.xsb");
        category =engine.GetCategory("Default");
        volume   =1.0f;
    }

    //更新
    public void Update() {
        //BGMのループ
        if (bgm!=null && bgm.IsStopped) {
            bgm=soundBank.GetCue(bgm.Name);
            bgm.Play();
        }

        //エンジンの更新
        engine.Update();
    }


//====================
//カテゴリ
//====================
    //ボリュームの指定
    public void SetVolume(float volume) {
        volume=MathHelper.Clamp(volume,0.0f,2.0f);
        this.volume=volume;
        category.SetVolume(volume);
    }

    //ボリュームの取得
    public float GetVolume() {
        return volume;
    }

    //全BGM・SEの停止
    public void Stop() {
        category.Stop(AudioStopOptions.AsAuthored);
    }

    //全BGM・SEの一時停止
    public void Pause() {
        category.Pause();
    }

    //全BGM・SEの再開
    public void Resume() {
        category.Resume();
    }


//====================
//BGM
//====================
    //BGMの再生
    public void PlayBGM(String name) {
        StopBGM();
        bgm=soundBank.GetCue(name);
        bgm.Play();
    }

    //BGMの停止
    public void StopBGM() {
        if (bgm!=null) {
            bgm.Stop(AudioStopOptions.AsAuthored);
            bgm=null;
        }
    }

    //BGMの一時停止
    public void PauseBGM() {
        if (bgm!=null) bgm.Pause();
    }

    //BGMの再開
    public void ResumeBGM() {
        if (bgm!=null) bgm.Resume();
    }


//====================
//SE
//====================
    //SEの再生
    public Cue PlaySE(String name) {
        Cue se=soundBank.GetCue(name);
        se.Play();
        return se;
    }
}



−戻る−