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
で実行する。
無事に音を鳴らすことができた。
終わりに
わからない部分がまだ多いがひとまず音を鳴らすことができた。
次回は画像に戻ってアニメーションの表示を行ってみようと思う。