ゲームを作りたい!

プログラミングをしているからには、いつかはゲームを作ってみたい。勉強したことを備忘録的に綴るBLOG。

SDL2で音を鳴らす

前回はウィンドウ上に画像を表示する方法を調べた。
今回はSDL2を使用して音を鳴らす方法を調べて行きたい。

音楽ファイルの準備

今回は、.oggファイルと.wavの2種類の音源を用意した。
.oggは、.mp3のような圧縮ファイルらしいが同じビットレートだと.mp3より音質がいいらしい。
.wavファイルは音を非常に高音質に録音できる形式で、音を録音する際の「原音」の形式としてよく使われてるとのこと。 詳細はググって見てもらえればと思う。
今回用意したファイルは-> 魔王魂というフリー素材を扱っているサイトからダウロードさせてもらった。
いずれは音楽も作りたいので調べたところ、フリーのDTMソフトである-> LMMS というソフトが良さそうだった。 今回を皮切りにしてDTMも少しずつ学んでいこうと思う。
LMMSを使用しての音源ファイルの作成については別記事でまとめながら覚えてていきたい。

音を鳴らす

では、さっそく、音を鳴らすためのコードを書いていこう。
ファイルの階層はこんな感じにしてある。

sdl2_test/
  |--sdl2_mixer.c
  |--jingle.wav
  |--piano.ogg

調べて書いたところ以下のようなソースになった。
音楽関連の用語の知識がないためにマニュアルを見てもいまいちピンと来なかったりするが
以下のソースでひとまず音を鳴らすことはできた。

#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>

#define WAV_PATH "jingle.wav"
#define MUS_PATH "piano.ogg"

Mix_Chunk *wave = NULL;
Mix_Music *music = NULL;


int main(int argc, char* argv[]){

        // Initialize SDL.
        if (SDL_Init(SDL_INIT_AUDIO) < 0)
                return -1;

        // Initialize SDL_mixer 
        if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 )
                return -1;

        // 効果音のロード 
        wave = Mix_LoadWAV(WAV_PATH);
        if (wave == NULL)
                return -1;

        // 音楽ファイルのロード
        music = Mix_LoadMUS(MUS_PATH);
        if (music == NULL)
                return -1;

        // 効果音を一度だけ再生
        if ( Mix_PlayChannel(-1, wave, 0) == -1 )
                return -1;

        // 音楽を無限ループで再生
        if ( Mix_PlayMusic( music, -1) == -1 )
                return -1;

        while ( Mix_PlayingMusic() ) ;

        Mix_FreeChunk(wave);
        Mix_FreeMusic(music);

        // quit SDL_mixer
        Mix_CloseAudio();

        return 0;
}

使用した関数のメモ。
-> Mix_Chunk
-> Mix_Music
-> Mix_OpenAudio
-> Mix_LoadWAV
-> Mix_LoadMUS
-> Mix_PlayChannel
-> Mix_PlayMusic
-> Mix_PlayingMusic
-> Mix_FreeChunk
-> Mix_FreeMusic
-> Mix_CloseAudio

コンパイル

gcc -g -o sdl2_mixer sdl2_mixer.c `sdl2-config --cflags --libs` -lSDL2_mixer

このような形でコンパイルを行う。
文字は-lSDL2_ttfを追加、画像の場合は-lSDL2_imageを追加、 音源の場合は-lSDL2_mixerを使用する。

実行結果

./sdl2_mixerで実行する。
無事に音を鳴らすことができた。

終わりに

わからない部分がまだ多いがひとまず音を鳴らすことができた。
次回は画像に戻ってアニメーションの表示を行ってみようと思う。