トップページに戻る / GCCページに戻る / SDL目次


19 音楽をなんとかする

ゲームにBGMをつけるにはSDL_mixerライブラリを使います。扱えるフォーマットはwaveやmp3、oggなど様々です。

手順は

  1. Mix_OpenAudio() : 初期化
  2. Mix_OpenMUS() : 音楽ファイルのオープン
  3. Mix_PlayMusic() : 音楽ファイルの再生
  4. Mix_HaltMusic() : 音楽の停止
  5. Mix_FreeMusic() : 音楽データの解放
  6. Mix_CloseAudio() : 終了

となります。

Mix_OpenAudio

環境の初期化処理です。

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_LoadMUS()

音楽ファイルの読み込み処理です。

Mix_Music *Mix_LoadMUS(const char *file)

音楽ファイルを読み込み、Mix_Music*を返します。読み込めるファイルはWAVE, MOD, MIDI, OGG, MP3, FLACなどです。

失敗したらNULLポインタが返ります。

Mix_PlayMusic()

音楽の再生処理です。

int Mix_PlayMusic(Mix_Music *music, int loops)

musicにはMix_LoadMUS()で読み込んだポインタを指定し、loopsにはループ回数を指定します。loopsに-1を指定すると、無限ループになり、停止するまで流れつづけます。

この関数の返り値は成功すれば0、失敗すれば-1です。

Mix_HaltMusic()

再生中の音楽を停止します。

int Mix_HaltMusic()

0が返ります。

Mix_FreeMusic()

読み込んだ音楽データを解放します。

void Mix_FreeMusic(Mix_Music *music)

Mix_CloseAudio()

環境をクローズします。

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系の関数については別の機会に扱います。


/

indexに戻る