今回では
サウンドのエフェクトでは、基本的に3D空間を想定していると思っています。
そのため、公式のリファレンスでは、3Dゲームであり、XAudio2を使用したものを基本として扱っています。
ですが、今回は、距離とかの分かりやすさを優先して、3Dではありますが2Dのような形で表現してやっています。
まぁ、3D空間を上空から見たような感じとも言えますが・・・。
公式リファレンスのプリセット
サウンドのエフェクトのパラメータは多く、少し大変なので、とりあえず取っ掛かりとして公式リファレンスにプリセットが用意されているので、まずそれに甘えて遊んでみます。
DXライブラリ置き場 リファレンスページ(Set3DPresetReverbParamSoundMem)
それで、そのページを見ながら力業でいろいろ見れるようにしたコードがこんな感じです。
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int SoundHandle;
VECTOR ListenerPos;
VECTOR ListenerDir;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre(16.0f);
ChangeWindowMode(TRUE);
SetEnableXAudioFlag(TRUE);
// DXライブラリの初期化
if (DxLib_Init() < 0) return -1;
// 描画先を裏画面にする
SetDrawScreen(DX_SCREEN_BACK);
// リスナーの位置を初期化
ListenerPos = VGet(0.0f, 0.0f, 0.0f);
// リスナーの向きを初期化
ListenerDir.x = 0.0f;
ListenerDir.y = 0.0f;
ListenerDir.z = 1.0f;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY(ListenerPos, VAdd(ListenerPos, ListenerDir));
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag(TRUE);
SoundHandle = LoadSoundMem("test.wav");
SetCreate3DSoundFlag(FALSE);
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem(256.0f, SoundHandle);
float x = 0.0f, y = 0.0f;
// リバーブエフェクトパラメータをプリセット「講堂」を使用して設定
Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_ALLEY, SoundHandle);
PlaySoundMem(SoundHandle, DX_PLAYTYPE_LOOP);
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen())
{
// 音を鳴らす位置を設定する
Set3DPositionSoundMem(VGet(x, y, 1.0f), SoundHandle);
DrawCircle(320 + x, 240 + y, 2.0f, GetColor(255, 255, 255));
DrawCircle(320, 240, 256, GetColor(255, 0, 0), false);
if (CheckHitKey(KEY_INPUT_RIGHT)) x += 5.0f;
if (CheckHitKey(KEY_INPUT_LEFT)) x -= 5.0f;
if (CheckHitKey(KEY_INPUT_UP)) y -= 5.0f;
if (CheckHitKey(KEY_INPUT_DOWN)) y += 5.0f;
if (CheckHitKey(KEY_INPUT_ESCAPE)) x = 0.0f, y = 0.0f;
if (CheckHitKey(KEY_INPUT_Q)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_DEFAULT , SoundHandle);// デフォルト
if (CheckHitKey(KEY_INPUT_W)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_GENERIC , SoundHandle);// 一般的な空間
if (CheckHitKey(KEY_INPUT_E)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_PADDEDCELL , SoundHandle);// 精神病患者室
if (CheckHitKey(KEY_INPUT_R)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_ROOM , SoundHandle);// 部屋
if (CheckHitKey(KEY_INPUT_T)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_BATHROOM , SoundHandle);// バスルーム
if (CheckHitKey(KEY_INPUT_Y)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_LIVINGROOM , SoundHandle);// リビングルーム
if (CheckHitKey(KEY_INPUT_U)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_STONEROOM , SoundHandle);// 石の部屋
if (CheckHitKey(KEY_INPUT_I)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_AUDITORIUM , SoundHandle);// 講堂
if (CheckHitKey(KEY_INPUT_O)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_CONCERTHALL , SoundHandle);// コンサートホール
if (CheckHitKey(KEY_INPUT_P)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_CAVE , SoundHandle);// 洞穴
if (CheckHitKey(KEY_INPUT_A)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_ARENA , SoundHandle);// 舞台
if (CheckHitKey(KEY_INPUT_S)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_HANGAR , SoundHandle);// 格納庫
if (CheckHitKey(KEY_INPUT_D)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_CARPETEDHALLWAY , SoundHandle);// カーペットが敷かれた玄関
if (CheckHitKey(KEY_INPUT_F)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_HALLWAY , SoundHandle);// 玄関
if (CheckHitKey(KEY_INPUT_G)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_STONECORRIDOR , SoundHandle);// 石の廊下
if (CheckHitKey(KEY_INPUT_H)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_ALLEY , SoundHandle);// 裏通り
if (CheckHitKey(KEY_INPUT_J)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_FOREST , SoundHandle);// 森
if (CheckHitKey(KEY_INPUT_K)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_CITY , SoundHandle);// 都市
if (CheckHitKey(KEY_INPUT_L)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_MOUNTAINS , SoundHandle);// 山
if (CheckHitKey(KEY_INPUT_Z)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_QUARRY , SoundHandle);// 採石場
if (CheckHitKey(KEY_INPUT_X)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_PLAIN , SoundHandle);// 平原
if (CheckHitKey(KEY_INPUT_C)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_PARKINGLOT , SoundHandle);// 駐車場
if (CheckHitKey(KEY_INPUT_V)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_SEWERPIPE , SoundHandle);// 下水管
if (CheckHitKey(KEY_INPUT_B)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_UNDERWATER , SoundHandle);// 水面下
if (CheckHitKey(KEY_INPUT_N)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_SMALLROOM , SoundHandle);// 小部屋
if (CheckHitKey(KEY_INPUT_M)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_MEDIUMROOM , SoundHandle);// 中部屋
if (CheckHitKey(KEY_INPUT_1)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_LARGEROOM , SoundHandle);// 大部屋
if (CheckHitKey(KEY_INPUT_2)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_MEDIUMHALL , SoundHandle);// 中ホール
if (CheckHitKey(KEY_INPUT_3)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_LARGEHALL , SoundHandle);// 大ホール
if (CheckHitKey(KEY_INPUT_4)) Set3DPresetReverbParamSoundMem(DX_REVERB_PRESET_PLATE , SoundHandle);// 板
}
// サウンドハンドルの削除
DeleteSoundMem(SoundHandle);
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
パラメータ調整
上記のプリセットではなく、パラメータを一つずつ扱う場合はこのリファレンスに細かく書いてあるのでそれを参考にすればいいかなって思っています。(投げやり)
じゃあ、XAudio2の方だとどうなってるかと思えば、DxLibのものと全く一緒でした。
なので、XAudio2の練習としても通用するのかもしれませんね。分からないけど。
XAUDIO2FX_REVERB_PARAMETERS (xaudio2fx.h) - Win32 apps | Microsoft Docs