今回、ブロック崩しを作る際にSEやBGMを入れたかったので,
SDL(Simple DirectMedia Layer)を導入してみました。
これは音や画像といった、C++やGLUTだけでは難しい処理を比較的簡単に書けるAPIを追加するものです。
音を入れたかったので音声関係のAPIを追加するSDL_mixerのみ導入します。
とりあえず、音を鳴らすだけのプログラムです。
#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
//SDL_mixerの初期化
if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY,MIX_DEFAULT_FORMAT,2,1024)<0) {
// 初期化に失敗した時の処理
fprintf(stderr,"failed to initialize SDL_mixer.\n");
SDL_Quit();
exit(-1);
}
Mix_Music *music; // BGM格納用のポインタ
Mix_Chunk *se1, *se2, *se3; // SE格納用のポインタ
int channel1, channel2, channel3; // SEを再生するための変数
/* ファイルから読み込む */
music = Mix_LoadMUS("pi2_001.wav");
if(!music) {
cout << "failed to load music: " << Mix_GetError() << endl;
}
se1 = Mix_LoadWAV("se_sac01.wav");
if(!se1) {
cout << "failed to load music: " << Mix_GetError() << endl;
}
se2 = Mix_LoadWAV("se_sab04.wav");
if(!se1) {
cout << "failed to load music: " << Mix_GetError() << endl;
}
se3 = Mix_LoadWAV("se_sab05.wav");
if(!se1) {
cout << "failed to load music: " << Mix_GetError() << endl;
}
Mix_PlayMusic(music, -1);
// SE再生
channel1 = Mix_PlayChannel(-1, se1, 0);
channel2 = Mix_PlayChannel(-1, se2, 0);
channel3 = Mix_PlayChannel(-1, se3, 0);
// BGM再生
Mix_PlayMusic(music, -1);
//ちゃんと終了させるなら…
SDL_Delay(4000); // 引数のミリ秒処理を遅らせる
Mix_HaltMusic(); // BGMの停止
//曲の解放
Mix_FreeMusic(music);
//SDL_mixerの終了
Mix_CloseAudio();
return 0;
}
##BGMやSEを読み込んでいる部分について
music = Mix_LoadMUS("pi2_001.wav");
if(!music) {
cout << "failed to load music: " << Mix_GetError() << endl;
}
se1 = Mix_LoadWAV("se_sac01.wav");
if(!se1) {
cout << "failed to load music: " << Mix_GetError() << endl;
}
まず、Mix_LoadMUSはBGMなどの再生時間の長い音楽を取り込む時に使います。webで調べ、対応している拡張子はWAV,AIFF,MOD,MIDI,MP3,Ogg,Vorbisと紹介させているものが多かったのですが、WAV(多分AIFFも)以外、自分でライブラリをリンクしてコンパイルしないといけないので、面倒な方は素直にWAVを使った方がいいと思います。
Mix_LoadWAVは効果音などの短い音を取り込む時に使います。こちらもwavのほうが無難だと思います...
音声ファイルのロードが失敗してしまった場合は変数にNULLが入ります。 if文の中にある、Mix_GetErrorはエラーの内容を詳しく表示するものです。
##再生時の引数について
Mix_PlayMusic(music, -1);
BGM再生時に使うMix_PlayMusic第一引数は、音声データを読み込んだポインタを指定します。第二引数は、何回ループするかの設定をします。-1とした場合は無限ループになります。
channel1 = Mix_PlayChannel(-1, se1, 0);
SE再生時に使うMix_PlayChannel 第一引数には、どのチャンネルに設定するかを指定します。設定したchannelを使って音を鳴らすので、効果音を重ねて再生することも可能です。第二引数は音声データのポインタ、第三引数はループ回数の設定になります。
#注意!
再生に使う音楽ファイルは、.mp3 -> .wav 等、拡張子を変換しただけのものだと認識されないので、ファイル変換ソフトを使うか、元々WAVのものを使ってください。
開発環境
Mac_os version 10.10.3
GLUT OpenGL
New! SDL
ターミナルコマンドは
g++ -o sdltest.out sdltest.cpp -lSDL2 -lSDL2_mixer
-lSDL2 -lSDL2_mixer のつけ忘れに要注意!
SDLのダウンロードサイト 左下のDownloadからどうぞ
https://www.libsdl.org/index.php
SDL_mixerのダウンロードサイト
https://www.libsdl.org/projects/SDL_mixer/
日本語版のリファレンス
http://sdl2referencejp.osdn.jp/index.html#SDL_mixer
参考にさせていただいたサイト様
http://d.hatena.ne.jp/programer_hoshimi/20080819
コードの説明
http://hyakuren-soft.sakura.ne.jp/dame_rbo_html/mingw_install_page.html
SDLとmixerのインストール説明 Win版の説明なのでMacの方は読み解いてください
http://www.tsg.ne.jp/text/2002/sdl-opengl/4.html
SDL_mixerのインストール説明サイト
###SDL環境設定
SDLの環境設定を簡単に紹介したいと思います。
上のサイト様でも紹介されているのである程度の参考にしていただくと嬉しいです。
SDLダウンロードサイトの SourceCodeの SDL2-2.0.3.zip
と Runtime Binariesの SDL2-2.0.3.dmgを落とします。
-
zipファイルを開き、ターミナル上で cd SDL2-2.0.3 に入ります。
ターミナルで ./configure を実行してください。
configure はインストール対象となるシステムの機能や情報をチェックし、その環境情報を記述したMakefile を作成します。 -
終わったらターミナルで make と入力してください。
インストールするファイルの本体が生成されます。
これは少し時間がかかります。 -
それまで終わったらターミナルで sudo make install と入力してください。このコマンドでファイルがPCにインストールされます。
-
インストールしたあと、usr/local/include と usr/local/libの中にSDLとついたファイルがあるか確認してください。あったら設定成功です! usr はターミナルで、 open /usr で開けます。
-
dmgファイルを開き、中にあるFrameworkのファイルをコピーして抜き取ってください。そのFrameworkのファイルを ライブラリ/Frameworks の中に入れるだけでOKです。
SDL_mixerも同じようにインストールしてください。
これで環境設定は終了です。
まだまだ資料が足りないと思いますが、他にもいろいろ分かりやすく解説をしてくれている方がいるので、自分で検索してみてください!
音をつけれるようになり、やっとゲームらしくなってきました...!