パスワードを忘れた? アカウント作成
453102 journal

fslashtの日記: [SDL] SDL_Mixerって楽ちんすぎ 2

日記 by fslasht
STATUS: 故障中

 ゲームのBGM・効果音をどうしようかと思ったんだけど、SDL_Mixer使ってみたらとても簡単でびっくり。
 効果音の同時再生も何も考えずにサポートされる。(同時再生数は指定可能)
 BGMのフェードイン・フェードアウトも簡単。コールバックを書けば独自エフェクトもかけられるみたい。
 サウンド関連だけのためにSDL使ってもいいな。

【はまり中】
 再生用の音楽ファイルとして、mp3とかも使えるみたいだけどよくわからなかった。mp3の読み込みにはsmpegを使えばいいみたいだけど、コンパイル済みのDLLって無いの?

● Windows + VisualC++6.0で使うときのメモ

【必要なライブラリ】
・SDL
http://www.libsdl.org/release/SDL-devel-1.2.7-VC6.zip
(http://www.libsdl.org/download-1.2.php)

・SDL_Mixer
http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-devel-1.2.5a-VC6.zip
(http://www.libsdl.org/projects/SDL_mixer/)

ドキュメント:http://jcatki.no-ip.org/SDL_mixer/SDL_mixer_frame.html

【ディレクトリ構成例】
MyProject/                このソース
sdk/SDL-1.2.7/            SDL
sdk/SDL_mixer-1.2.5/    SDL_Mixer

【リンクするライブラリの指定】
..\sdk\SDL-1.2.7\lib\SDL.lib ..\sdk\SDL_mixer-1.2.5\lib\SDL_mixer.lib

【ソース例】
※ C Magazine 2002/2 P.41のソースをパク^h^h参考にしました

#include "../sdk/SDL-1.2.7/include/SDL.h"
#include "../sdk/SDL_mixer-1.2.5/include/SDL_mixer.h"

// 以下ソースの適当なところに書く

Mix_Music    *music;
Mix_Chunk    *chunk,*chunk2;

SDL_Init(SDL_INIT_AUDIO  );                // SDL初期化

Mix_OpenAudio(22050,AUDIO_S16,2,4096);    // SDL_Mixerオープン

music = Mix_LoadMUS("music.wav");        // 曲ファイルをロード
chunk = Mix_LoadWAV("se1.wav");            // 効果音ファイル1をロード
chunk2 = Mix_LoadWAV("se2.wav");        // 効果音ファイル2をロード

Mix_AllocateChannels(16);                // 同時発声数を設定

Mix_PlayMusic(music,-1);                // 曲の再生スタート(無限ループ)
SDL_Delay(2000);
Mix_PlayChannel( -1,chunk,0 );            // 効果音1再生
SDL_Delay(500);
Mix_PlayChannel( -1,chunk2,0 );            // 効果音2再生 (ちゃんと音が重なる)
SDL_Delay(1000);
Mix_FadeOutMusic(4000);                    // フェードアウト(4000ms)
SDL_Delay(4000);
Mix_HaltMusic();                        // 曲の再生停止

Mix_FreeMusic(music);                    // ロードした曲を開放
Mix_FreeChunk(chunk);                    // ロードした効果音1を開放
Mix_FreeChunk(chunk2);                    // ロードした効果音2を開放
Mix_CloseAudio();                        // SDL_Mixerクローズ

SDL_Quit();                                // SDL使用終了
   
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • #if !defined(AFX_FTEZSDLSOUND_H__8232A97C_E7A2_4391_B5B5_5BC07CE909CA__INCLUDED_)
    #define AFX_FTEZSDLSOUND_H__8232A97C_E7A2_4391_B5B5_5BC07CE909CA__INCLUDED_

    #include "../sdk/SDL-1.2.7/include/SDL.h"
    #include "../sdk/SDL_mixer-1.2.5/include/SDL_mixer.h"

    class FTEzSDLSound 
    {
    private:
        CMapWordToPtr    m_mapMusic;
        CMapWordToPtr    m_mapSound;

        int m_nMusicVolume;        // 0-255
        int m_nSoundVolume;        // 0-255

        enum { VOL_MAX=255 };

        bool    m_fOpenAudio;
        bool    m_fAutoSDLQuit;

    public:
        // 生成・消滅
        FTEzSDLSound();
        virtual ~FTEzSDLSound();

    public:
        // 初期化・開放 (通常は直接は使用しない)
        bool Init();
        bool Release();

        // インスタンス消滅時に自動的にSDLQuitを呼ぶ
        void SetAutoSDLQuit() { m_fAutoSDLQuit = true; }

        // オープン・クローズ (オープン処理は必須)
        bool OpenAudio( int nFreq = 44100 , WORD wFormat=AUDIO_S16 , int nChannnel=2 , int nChunksize=4096 );
        bool CloseAudio();

        // 曲・サウンドのロード、開放
        bool LoadMusic( WORD wID , LPCSTR lpszFilename );    // ID,ファイル名 (IDは演奏時に使用)
        bool LoadSound( WORD wID , LPCSTR lpszFilename );
        bool ReleaseMusic( WORD wID );
        bool ReleaseSound( WORD wID );

        // 曲・サウンドの音量設定(0-255)
        bool SetMusicVolume( int nVolume = 255);
        bool SetSoundVolume( int nVolume = 255);

        // 曲の演奏、停止、演奏中チェック
        bool PlayMusic( WORD wID , int nLoops = 1 );
        bool FadeInMusic( WORD wID , int nLoops = 1  , int nTime = 2000);
        bool FadeOutMusic( int nTime = 2000);
        bool StopMusic();
        bool IsPlayingMusic();

        // サウンドの再生、停止、生成中チェック
        bool PlaySound( WORD wID , int nLoops = 0, int nVolume = 255);
        bool StopSound();
        bool IsPlayingSound();

        // 内部使用メソッド
        Mix_Music* GetMusicPtr( WORD wID );
        Mix_Chunk* GetSoundPtr( WORD wID );

        // Static
        static bool SDLInit( DWORD dwFlags = SDL_INIT_AUDIO );
        static void SDLDelay( int nTime );
        static void SDLQuit();
    };

    #endif
  • by fslasht (3370) on 2004年05月07日 18時08分 (#542670) ホームページ 日記
        FTEzSDLSound::SDLInit();                // SDLを初期化

        FTEzSDLSound sound;
        sound.Open();                            // open (必須)

        sound.LoadMusic( 1 , "bmg.wav" );        // BGM曲1ロード
        sound.LoadSound( 1 , "se1.wav" );        // 効果音1ロード
        sound.LoadSound( 2 , "se2.wav" );        // 効果音2ロード

        sound.SetMusicVolume( 200 );            // BMG音量設定(0-255)
        sound.PlayMusic( 1 );                    // BGM曲1再生 (第2引数で再生回数指定可能)
        while ( sound.IsPlayingMusic() ) {        // BGM演奏中はwhileループ
            FTEzSDLSound::SDLDelay( 1000 );        // 1000msウェイト
            sound.PlaySound(1);                    // 効果音1を再生
            FTEzSDLSound::SDLDelay( 1000 );        // 1000msウェイト
            sound.PlaySound(2,0,128);            // 効果音2を再生 (音量Volume=128と指定)
        }
        sound.StopSound();                        // 効果音再生を停止

        FTEzSDLSound::SDLQuit();                // SDL使用を終了
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...