ゲームにBGMをつけるにはSDL_mixerライブラリを使います。扱えるフォーマットはwaveやmp3、oggなど様々です。
手順は
となります。
環境の初期化処理です。
int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)
frequencyは周波数。Hz(ヘルツ)単位で設定します。デフォルト値(MIX_DEFAULT_FREQUENCY)は22050です。
formatは音楽ファイルのサンプリングフォーマット。以下の値のいずれかを指定します。
なお、デフォルト値(MIX_DEFAULT_FORMAT)はAUDIO_S16SYSとなっています。
channelsは1(モノラル)、2(ステレオ)のどちらかをセットします。
chunksizeは音楽再生に使うメモリサイズを指定します。あまりに小さい値にすると、音飛びします。Wikiの例では1024になっています。
この関数の返り値は成功すれば0、失敗すれば-1です。
音楽ファイルの読み込み処理です。
Mix_Music *Mix_LoadMUS(const char *file)
音楽ファイルを読み込み、Mix_Music*を返します。読み込めるファイルはWAVE, MOD, MIDI, OGG, MP3, FLACなどです。
失敗したらNULLポインタが返ります。
音楽の再生処理です。
int Mix_PlayMusic(Mix_Music *music, int loops)
musicにはMix_LoadMUS()で読み込んだポインタを指定し、loopsにはループ回数を指定します。loopsに-1を指定すると、無限ループになり、停止するまで流れつづけます。
この関数の返り値は成功すれば0、失敗すれば-1です。
再生中の音楽を停止します。
int Mix_HaltMusic()
0が返ります。
読み込んだ音楽データを解放します。
void Mix_FreeMusic(Mix_Music *music)
環境をクローズします。
void Mix_CloseAudio()
一部ですが紹介します。
int Mix_VolumeMusic(int volume)
音量調節関数です。volumeには0から128までの数字を指定します。
-1を指定すると、現在の音量を返します。
void Mix_PauseMusic()
音楽を一時停止します。
void Mix_ResumeMusic()
音楽の一時停止を解除します。
void Mix_RewindMusic()
音楽を最初に巻き戻しします。
int Mix_PlayingMusic()
音楽が再生しているかどうかチェックします。再生中であれば1が返ります。
int Mix_PausedMusic()
音楽が一時停止中であるかどうかチェックします。一時停止中であれば1が返ります。
前回まで作成していたバトル画面の開始でMix_OpenAudio()からMix_PlayMusic()までを実行し、戦闘終了後にMixHaltMusic()からMix_CloseAudio()までを実行すれば、戦闘中の音楽を流すことができます。
(適当な音楽がなかったため、私のところではメルトが流れていますが・・・。)
なお、SDL_mixerにはMix_LoadMUS()、Mix_PlayMusic()などのMusic系の関数以外に、Mix_LoadWAV()、Mix_PlayChannel()といったChannel系の関数もありますが、これは音楽データをあらかじめメモリ上に読み込んでおくかどうかの違いで、Music系はすべて読み込まず、デコードしながら再生するのに対し、Channel系はすべてのデータを読み込んでおいてから再生するという形をとります。したがって、容量の大きい音楽ファイルをMix_LoadWAV()で読み込むと、そのサイズ分メモリを消費します。(例えば、メルトのmp3ファイルは7.8MBなので、読み込むと使用メモリが7.8MB増えます。)サイズの大きいBGMはMusic系、サイズの小さい効果音はChannel系と、使い分けるといいでしょう。Channel系の関数については別の機会に扱います。