プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作 第6回 サウンド
今日の内容 サウンド お待ちかね! BGM、SE、3Dサラウンドまで
サウンドを扱うAPI DirectSound(3D) SDL_mixer OpenAL Windows環境ではスタンダード なんだけど、Vista以降切り捨ての方向に… SDL_mixer 機種非依存で、マルチメディア全般をサポート ライセンスの関係がめんどくさい… OpenAL マルチプラットフォームでライセンスフリー DirectSoundとの互換性も考慮されており、 今後のスタンダードとして有力株
OpenALを使ったプログラミング FKのライブラリパッケージ内にOpenALもセットにしてあります プロジェクトを作る時に「OpenALを使用する」と「Ogg Vorbisを使用する」にチェック 既に作ってあるプロジェクトの設定変更は プロジェクトのプロパティ→リンカ→入力→ 追加の依存ファイル、に対して以下を追加 libvorbisfile.lib libvorbis.lib libogg.lib EFX-Util.lib alut.lib OpenAL32.lib
DLLへの依存が発生します 「OpenAL32.dll」「alut.dll」「libogg.dll」「libvorbis.dll」「libvorbisfile.dll」が必要 「FK_VC08/bin」フォルダ内にある 実行パスの通ったフォルダに配置する Visual Studio上から実行する場合 プロジェクトファイルと同じフォルダ EXEを直接実行する場合 EXEファイルと同じフォルダ
補足:パスについて ファイルを読み込むプログラムの場合、 Visual Studioから実行する場合と、 EXEを直接実行する場合とで、 相対パスの基準位置がズレます 両方にデータを置くのは面倒なので… EXEを実行する時はプロジェクトの フォルダにコピーしてくる プロジェクトの設定を変更して、VS上から実行する場合の基準位置を揃える
今回のクラス構成 BGM用 SE用(どちらも関数は共通) fk_AudioStream fk_AudioOggBuffer fk_AudioWavBuffer Wav形式用
BGMと効果音の再生形式の違い BGMはファイルサイズが大きい SEはファイルサイズが小さい 少しずつ読み込みながら再生する ストリーミング再生処理と呼ぶ 生Waveは大きすぎるのでOggを使うこと SEはファイルサイズが小さい 一気にメモリ上に読み込んで再生する WaveでもOggでも使用可
APIは至極単純 open play pause seek tell end setGain getGain ファイルを読み込む 鳴らす 鳴らし続けたい間 呼び続ける必要がある pause 止める seek 指定位置へ頭出し tell 現在再生位置を取得 end 再生を打ち切り、 読み込んだ内容を破棄 setGain 音量調整(0.0~1.0) getGain 音量取得
ちょっと不安定な機能ども setLoopMode setLoopArea tellで取得できる再生時間に若干のズレが生じる ループ再生の設定 setLoopArea ループ範囲の指定 現状ループ開始地点 のみ有効 tellで取得できる再生時間に若干のズレが生じる それに伴ってループ再生の開始地点も厳密な位置指定は無理 そのうち直します
3Dサラウンド Buffer再生クラスの方は3次元座標を 与えることでサラウンド表現が可能 setPosition()で定点指定 setModel()で与えたモデルの位置に追従 setReferenceDist()で音の届く距離を設定 fk_Audio::setListenerModel()でリスナー (多くの場合はカメラモデル)を設定