読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

MonoGameWindowsRuntimeゲームプログラミング入門vol5:サウンドを再生する

C# MonoGame

コンテンツパイプライン

XNAでは画像ファイルやサウンドファイルなどの読み込みを高速化するためにあらかじめコンテンツをコンパイルしておくコンテンツパイプラインという仕組みがあります。

サウンドファイルであるwavファイルはこのコンテンツパイプラインを通して一度xnbファイルに変換しなければなりません。

 

XNAGameStudio4.0

すでに廃止されたXNAGameStudioですがVisualStudio2013には対応しています。

MonoGameのコンテンツプロジェクトがVisualStudio2013に対応していないため、しばらくはこちらのXNAGameStudio4.0のプロジェクトテンプレートを使います。

 

こちらのサイトからXNA GameStudio4.0.4をダウンロードし、インストールします。

 

WAVファイルをコンパイルする

インストールできたら、MonoGameのプロジェクトを置いているソリューションを右クリックし、追加→新しい項目を押しましょう。

69

 

 

 

XNA GameStudioのテンプレートの中から、Windows Game(4.0)を選択し、プロジェクト名は「DummyProject」とし、OKを押しましょう。

70

 

 

DummyProjectとDummyProjectContentの2つのプロジェクトができました。

71

 

続いてDummyProjectContentの方のプロジェクトを右クリックして、追加→既存の項目から再生したいサウンド(wavファイル)を選択しましょう。

72

 

 

wavファイルを追加することができたら、ソリューションエクスプローラからソリューション全体をビルドしましょう。

73

 

これでxnbファイルを作成することができました。DummyProjectの出力ファイルをみて、xnbファイルを取得しましょう。

DummyProjectを右クリックして、「エクスプローラでフォルダーを開く」を押します。

74

 

 

エクスプローラでDummyProjectを開くと、 bin/x86/Debug/Contentディレクトリにxnbファイルが作成できています。

これをデスクトップにコピーしておきましょう。

75

 

 

WAVファイルを再生する

xnbファイルを作成することはできたのでこれをMonoGameのプロジェクトに追加しましょう。

MonoGameのプロジェクトのContentフォルダを右クリック→追加→既存の項目で先ほどのxnbファイルを追加しましょう。

76

 

 

xnbファイルを追加することができました。

 

 

77

 

 

次に、追加したxnbファイルのプロパティを見ます。

78

ビルドアクションを「なし」から「コンテンツ」に変更しましょう。

79

 

ではサウンドファイルを再生してみましょう。

Game1.csファイルに名前空間を追加します。

using Microsoft.Xna.Framework.Audio;

 

サウンド自体はSoundEffectというインスタンスに読み込まれます。

SoundEffectから複数のSoundEffectInstanceを作成することができ、SoundEffectInstanceが再生を担当します。

なお、SoundEffect自体もサウンドを再生することができます。

Game1クラスのメンバーにSoundEffectとSoundEffectInstanceを定義しましょう。

//サウンドそのもののインスタンス
SoundEffect soundEffect;
//サウンドを再生するインスタンス
SoundEffectInstance soundInstance;

 

LoadContentでサウンドファイルの読み込みを行います。

ContentManagerのLoadメソッドでサウンドを読み込み、CreateInstanceメソッドでSoundEffectInstanceを作成します。

このとき、SoundEffectInstanceのIsLoopedプロパティをtrueにすることによってループ再生をすることができます。

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);

    //サウンドの読み込み
    soundEffect = Content.Load<SoundEffect>("SampleSound");

    //インスタンスの生成
    soundInstance = soundEffect.CreateInstance();
    soundInstance.IsLooped = false; //ループする場合はtrue
    soundInstance.Volume = 0.7f;    //音量
    soundInstance.Pitch = 0.2f;     //ピッチ

 

}

 

あとは再生したいときにSoundEffectInstanceのPlayメソッドでサウンド再生が可能となります。

//再生
soundInstance.Play();   

 

 

全体的なコードはこのようになります。

public class Game1 : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    
    //サウンドそのもののインスタンス
    SoundEffect soundEffect;
    //サウンドを再生するインスタンス
    SoundEffectInstance soundInstance;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }


    protected override void Initialize()
    {

        base.Initialize();
    }


    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        //サウンドの読み込み
        soundEffect = Content.Load<SoundEffect>("SampleSound");

        //インスタンスの生成
        soundInstance = soundEffect.CreateInstance();
        soundInstance.IsLooped = false; //ループする場合はtrue
        soundInstance.Volume = 0.7f;    //音量
        soundInstance.Pitch = 0.2f;     //ピッチ

        //再生
        soundInstance.Play();   
  
    }

    protected override void UnloadContent()
    {
        soundEffect.Dispose();
        soundInstance.Dispose();
        
    }


    protected override void Update(GameTime gameTime)
    {
        

        base.Update(gameTime);
    }


    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

 

サンプルコード

SampleGameMono_3_SoundPlay.zip

 

サウンドを再生する | garicchi.com

目次