▼XNA Game Studioメモ▼
サウンドの再生
サウンドを再生するためのライブラリ「Playerクラス」を作成し、それを利用するプログラムを作成する。
キー 説明 A BGM0の再生 B BGM1の再生 X SE0の再生 Y SE1の再生 デジタルパッド上 ボリュームアップ デジタルパッド下 ボリュームダウン START ポーズ/再開 BACK 終了
サウンドリソースの作成
XNAで利用可能なサウンドファイル形式はwav、aif、aiffの3種類。
これらファイルをXACTでXNA用のサウンドファイルに変換して利用する。成功するとプロジェクトの保存先に「Winフォルダ」と「Xboxフォルダ」が生成され、
- スタートメニューから「Microsoft Cross-Platform Audio Creation Tool(XACT)」を選択して起動。
![]()
- メニュー「File→New Project」を選択し、新規プロジェクトを作成。
- ファイル名は「sound.xap」と指定。
- 「XACT」の右側のツリーの「Wave Banks」を右クリックし、「New Wave Bank」を選択。
「Wave Bank」はサウンドファイルを格納するもの。- Wave Bankウィンドウにwaveファイルをドラッグ&ドロップ。
今回はbgm0.wav、bgm1.wav、se0.wav、se1.wavの4つをドロップ。- 「XACT」の右側のツリーの「Sound Banks」を右クリックし、「New Sound Bank」を選択。
- Wave Bankウィンドウからwavファイルを選択し、Sound Bankウィンドウの「Cue Name」にドラッグ&ドロップ。
Sound Bankウィンドウに表示されている「Cue Name」はプログラムから操作対象を指定する時に利用。
複数の操作対象を指定する時は「Category Name」を利用。- XACTのメニュー「File→Save Project」を選択し、XACTプロジェクトを保存。
- XACTのメニュー「File→Build」を選択し、Finishボタンを押す。
フォルダの中にはXNAでサウンドを再生する際に使用するが生成されている。
- xgsファイル「sound.xgs」
- xwbファイル「Wave Bank.xwb」
- xsbファイル「Sound Bank.xsb」
リソースの追加
- 「はじめてのXNAアプリの作成」で作成したフォントプロセッサ「DefaultFont.spritefont」をソリューションエクスプローラのContentに追加する。
- 「グラフィックスの描画」で作成した「Graphics.cs」をプロジェクトに追加する。
- 「ゲームパッドの利用」で作成した「KeyManager.cs」をプロジェクトに追加する。
- サウンドファイル「sound.xap」をソリューションエクスプローラのContentに追加する。
- 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; } }