第 6 回:サウンド

プロジェクト演習Ⅳ・Ⅵ
インタラクティブゲーム制作
第6回
サウンド
今日の内容
• サウンド
– お待ちかね!
– BGM、SE、3Dサラウンドまで
サウンドを扱うAPI
• DirectSound(3D)
– 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を直接実行する場合とで、
相対パスの基準位置がズレます
• 両方にデータを置くのは面倒なので…
1. EXEを実行する時はプロジェクトの
フォルダにコピーしてくる
2. プロジェクトの設定を変更して、VS上から
実行する場合の基準位置を揃える
今回のクラス構成
• BGM用
– fk_AudioStream
• Ogg形式専用
• SE用(どちらも関数は共通)
– fk_AudioOggBuffer
• Ogg形式用
– fk_AudioWavBuffer
• Wav形式用
BGMと効果音の再生形式の違い
• BGMはファイルサイズが大きい
– 少しずつ読み込みながら再生する
– ストリーミング再生処理と呼ぶ
– 生Waveは大きすぎるのでOggを使うこと
• SEはファイルサイズが小さい
– 一気にメモリ上に読み込んで再生する
– WaveでもOggでも使用可
APIは至極単純
• open
– ファイルを読み込む
• play
– 鳴らす
– 鳴らし続けたい間
呼び続ける必要がある
• pause
– 止める
• seek
– 指定位置へ頭出し
• tell
– 現在再生位置を取得
• end
– 再生を打ち切り、
読み込んだ内容を破棄
• setGain
– 音量調整(0.0~1.0)
• getGain
– 音量取得
ちょっと不安定な機能ども
• setLoopMode
– ループ再生の設定
• setLoopArea
– ループ範囲の指定
– 現状ループ開始地点
のみ有効
• tellで取得できる再生
時間に若干のズレが
生じる
• それに伴ってループ
再生の開始地点も厳
密な位置指定は無理
• そのうち直します
3Dサラウンド
• Buffer再生クラスの方は3次元座標を
与えることでサラウンド表現が可能
– setPosition()で定点指定
– setModel()で与えたモデルの位置に追従
– setReferenceDist()で音の届く距離を設定
– fk_Audio::setListenerModel()でリスナー
(多くの場合はカメラモデル)を設定