Soundscapeについて



・そうんどすかぺ?
Soundscapeについて、マップを作ったことのある人は知ってると思いますが、 env_soundscapeエンティティで指定半径内に入ってきたプレイヤーに対して リバーブやディレイ等のDSP FX効果を適用したり、ループやランダムサウンドを 再生したりする目的で定義を記述するスクリプトファイル・・・。

なんつってるけど、Meはリスポーン地点にAutomaticsしか置いたことしかないんじゃ〜。でへへ。

・どうやって読み込まれてんのか?
ゲームフォルダ下のscriptsフォルダの下には soundscapes_*.txtというファイルがたくさんあります。

新規に自作のSoundscapeを作った場合、単純に新しいsoundscapes_×××.txtってファイルを置いときゃ 親切に読んでくれるかというと、そうはいきません。

たくさんあるSoundscapeファイルの中にsoundscapes_manifest.txtが見つかる と思います。実はこのファイルの中に、ゲームへ読み込ませるSoundscapeファイルの一覧が書いてあるんです。 ですから、新しいSoundscapeファイルを追加する場合にはこのファイルへSoundscapeファイル名の登録を1行挿入しなきゃなりません。
ただ、soundscapes_manifest.txtに登録しなくていい例外的なケースもあります。

「何ダラダラ言ってんだてめえぶっ飛ばすぞ」と言う前に、とりあえすSoundscapeファイルが読み込まれる手順 を見てください。

  • soundscapes_manifest.txtを読んで1行目に何かかいてあるか確認します。 ここは何か書いてありゃオールOKみたいですよ。実際、スペル間違ってます「soundscaples_manifest」。
  • "file"のキーに対して指定されているSoundscapeファイルを読み込んで、スクリプトで記述されているSoundscapeの定義からオブジェクトを次々と作成していきます。
  • リスト上の全てのSoundscapeファイルを処理し終えた段階で、まだscripts/soundscapes_[マップ名].txtが未処理の場合は、 そのSoundscapeファイルの読み込み&オブジェクト作成を試みます。


  • そうなんです、scripts/soundscapes_[マップ名].txtsoundscapes_manifest.txtに書いてなくても 読みにいってくれるんですよ〜。

    ・Soundscapeの定義
    書き方は先頭にSoundscapeの定義名(env_soundscapeエンティティで"Soundscape" Keyvalueに指定する名前) を書いて、その下の中括弧で囲った中へ各種設定を記述します。

    "[定義名]"
    dsp DSP FXのプリセット番号を指定する。
    マップに使っていいのは0〜29までのようです。130以上まであるけどやめといたほうがいいんじゃないすか?

    0 : "Normal (off)"
    1 : "Generic(Auto Preset)"
    2 : "Metal Small"
    3 : "Metal Medium"
    4 : "Metal Large"
    5 : "Tunnel Small"
    6 : "Tunnel Medium"
    7 : "Tunnel Large"
    8 : "Chamber Small"
    9 : "Chamber Medium"
    10: "Chamber Large"
    11: "Bright Small"
    12: "Bright Medium"
    13: "Bright Large"
    14: "Water 1"
    15: "Water 2"
    16: "Water 3"
    17: "Concrete Small"
    18: "Concrete Medium"
    19: "Concrete Large"
    20: "Big 1"
    21: "Big 2"
    22: "Big 3"
    23: "Cavern Small"
    24: "Cavern Medium"
    25: "Cavern Large"
    26: "Weirdo 1"
    27: "Weirdo 2"
    28: "Weirdo 3"
    29: "Weirdo 4"
    dsp_player dspと同じくDSP FXのプリセット番号を指定できるようだが、 使用されている形跡なし。使わない方がいい。
    playlooping 単一音声ファイルのループ再生。
    以下のサブ設定値がある。
    volume 原音に対する音量のスケールを指定、0.0で無音、1.0で原音そのままのレベルを意味する。

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には初期設定時に両者の範囲でvolumeの値がランダムに決定する。
    pitch 0〜255の範囲で原音に対する音程の変化量を指定、100でピッチ変更無しのニュートラル。

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には初期設定時に両者の範囲でpitchの値がランダムに決定する。
    wave 音声ファイルの指定を行います。ファイル名はsoundフォルダからの相対パス記述 で拡張子も含めた形で使用(指定できるのはWAV(*.wav)とMP3(*.mp3)形式のファイル)。
    position env_soundscapeエンティティの"Sound Position" Keyvalue の何番目 に指定されたポジションに配置するかを0〜7の範囲で指定。
    指定のない場合はAmbientSoundとして扱われ、位置に関係なくどこでも同じように聞こえるようになる。
    attenuation 音声の減衰率を指定する。働きはsoundlevelと同じ

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には初期設定時に両者の範囲でattenuationの値がランダムに決定する。
    カンマ区切りの指定はsoundlevelでは実現できない。以下の変換式でsoundlevelから算出するとよい。
    ((soundlevel > 50) ? (20.0f / (float)(soundlevel - 50)) : 4.0 )
    soundlevel 音声出力レベル(dB)。大きく指定するほど音圧が上がって音声の減衰率が下がる
    右側に書いてあるのはどれぐらいの音に相当するかの目安です

    SNDLVL_NONE (== 0dB)
    SNDLVL_20dB (== 20dB) カサカサ音
    SNDLVL_25dB (== 25dB) ささやき声
    SNDLVL_30dB (== 30dB) 図書館
    SNDLVL_35dB (== 35dB)
    SNDLVL_40dB (== 40dB)
    SNDLVL_45dB (== 45dB) 冷蔵庫
    SNDLVL_50dB (== 50dB) 家の中
    SNDLVL_55dB (== 55dB)
    SNDLVL_IDLE (== 60dB)
    SNDLVL_60dB (== 60dB) 普通の会話
    SNDLVL_65dB (== 65dB) 洗濯機、食器洗い機
    SNDLVL_STATIC (== 66dB)
    SNDLVL_70dB (== 70dB) 自動車、掃除機、ミキサー、電動ミシン
    SNDLVL_NORM (== 75dB)
    SNDLVL_75dB (== 75dB) 交通渋滞
    SNDLVL_80dB (== 80dB) ミニバイク、目覚まし時計、騒がしいレストラン
    SNDLVL_TALKING (== 80dB)
    SNDLVL_85dB (== 85dB) 工場、髭剃り機
    SNDLVL_90dB (== 90dB) 赤ちゃんの鳴き声、バイクの通過、オープンカー
    SNDLVL_95dB (== 95dB)
    SNDLVL_100dB (== 100dB) 地下鉄、ディーゼルトラック、製材所, ボイラー
    SNDLVL_105dB (== 105dB) ヘリコプター、芝刈り機
    SNDLVL_110dB (== 110dB) スノーモービル、モーターボートに乗ってる時、砂吹き機
    SNDLVL_120dB (== 120dB) 自動車のホーン、プロペラ機
    SNDLVL_130dB (== 130dB) 空襲警報
    SNDLVL_GUNFIRE (== 140dB) 発砲音、ジェットエンジン
    SNDLVL_140dB (== 140dB)
    SNDLVL_150dB (== 150dB)
    SNDLVL_180dB (== 180dB) ロケット打ち上げ
    suppress_on_restore セーブされたゲームをロード中でも音声を再スタートさせない。
    playrandom 複数音声ファイルのランダム再生。
    以下のサブ設定値がある。
    volume 原音に対する音量のスケールを指定、0.0で無音、1.0で原音そのままのレベルを意味する。

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には再生毎に両者の範囲でvolumeの値がランダムに変化する。
    pitch 0〜255の範囲で原音に対する音程の変化量を指定、100でピッチ変更無しのニュートラル。

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には再生毎に両者の範囲でpitchの値がランダムに変化する。
    attenuation 音声の減衰率を指定する。働きはsoundlevelと同じ

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には再生毎に両者の範囲でattenuationの値がランダムに変化する。
    カンマ区切りの指定はsoundlevelでは実現できない。以下の変換式でsoundlevelから算出するとよい。
    ((soundlevel > 50) ? (20.0f / (float)(soundlevel - 50)) : 4.0 )
    soundlevel playloopingのsoundlevel参照。
    time 再生時間を指定。

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には再生毎に両者の範囲でtimeの値がランダムに変化する。
    rndwave 中括弧で囲んだ中へ"wave"キーに対する 音声ファイルの指定を行います(複数指定可)。ファイル名はsoundフォルダからの相対パス記述 で拡張子も含めた形で使用(指定できるのはWAV(*.wav)とMP3(*.mp3)形式のファイル)。

    再生毎に音声ファイルがランダムに選択されます。
    position env_soundscapeエンティティの"Sound Position" Keyvalue の何番目 に指定されたポジションに配置するかを0〜7の範囲で指定。
    指定のない場合はAmbientSoundとして扱われ、位置に関係なくどこでも同じように聞こえるようになる。 また、"random"が指定された場合にはプレイヤーを中心とした
    suppress_on_restore セーブされたゲームをロード中でも音声を再スタートさせない。
    playsoundscape 別のSoundscapeをサブSoundscapeとして組み込む。
    以下のサブ設定値がある。
    volume 原音に対する音量のスケールを指定、0.0で無音、1.0で原音そのままのレベルを意味する。

    値は1個、または2個をカンマ区切りで指定。
    2個指定時には初期設定時に両者の範囲でvolumeの値がランダムに決定する。
    position それぞれのポジションインデックス指定に足すオフセット値を0〜7の範囲で指定。
    positionoverride サブSoundscapeでpositionが指定されている場合、この値へ強制的に変更する
    0〜7の範囲で指定。
    ambientpositionoverride サブSoundscapeでpositionが指定されていない場合(AmbientSoundとして扱われている場合)、この値へ強制的にpositionを設定する
    0〜7の範囲で指定。
    name サブSoundscapeとして組み込むSoundscapeの定義名称。
    Soundmixer サウンドミキサー名を指定する。何も指定しなければ"Default_Mix"を指定した ものとみなされる。
    dsp_volume DSP FX出力のスケールを指定、0.0で無音、1.0で出力レベルそのまま。

    うわ、長っ!!Soundscapeの設定だけでもこれだけなのに、DSPのプリセット設定まで 手を付ける人がいたらたぶんその人、MODは作るヒマ無くなるでしょうね。

    ・Soundmixer?
    Soundscapeの設定中"Soundmixer"に対して指定するミキサーの定義はscripts/soundmixers.txtの中に書いてあります。

    最初に"GROUPRULES"に続く中括弧で囲まれた中へミックス・グループと呼ばれるサウンドカテゴリ名称と 分類の条件、属性が並んでますね。

    ・コメントに書いてあるそれぞれの意味を勝手に推測すると
    group name ミックス・グループ名。
    directory or .wav
    name substring
    ミックス・グループとしてピックアップする条件としてファイル/フォルダ名に 含まれていなければならないキーワード。
    classname
    substring
    ミックス・グループとしてピックアップする条件として音声を発しているエンティティのクラス名に 含まれていなければならないキーワード。
    chan ミックス・グループとしてピックアップする条件として使用していなければならない音声チャンネル。
    sndlvl_min ミックス・グループとしてピックアップする条件として最低限必要なsoundlevel(dB)。
    sndlvl_max ミックス・グループとしてピックアップする条件としてのsoundlevel(dB)の限界。
    priority 音量配分の上での優先度(大きい値程優先的に扱われる)。
    Is Ducked 1に指定されると競合するミックスグループの優先度が自分よりも高く、Causes Ducking==1の属性を持っている場合には。 音声出力レベルをDucker Thresholdに指定したパーセンテージまで抑えます。
    Causes
    Ducking
    1に指定されると競合するミックスグループの優先度が自分よりも低く、Is Ducked==1の属性を持っている場合には。 音声出力レベルをDuck to Percentに指定したパーセンテージまで引っ張り上げます。
    Duck to
    Percent
    優先度の低いミックスグループに対してダッキングを発動する場合、自分に設定する 音声出力レベルのパーセンテージ。
    Ducker
    Threshold
    優先度の高いミックスグループによってダッキングを発動された場合、自分に設定する 音声出力レベルのパーセンテージ。

    Soundscapeへ明示的にSoundmixerが指定されるのは単純にサウンドカテゴリごとに細かく出力レベルを調節したい場合だと思いますが、 指定が省略されてデフォルトの"Default_Mix"が適用された状態でも、主にシングルプレイで登場人物が話している間、 環境音(福本漫画で言えば「ざわざわ・・・ざわざわ・・・」ってとこでしょうかね) が会話音声にカブらないよう、自動的に環境音の出力レベルを抑えるダッキングがここの設定によって働いてるんじゃないでしょうか。

    その下にはそれぞれのSoundmixerの定義名称に続く中括弧で囲まれた中にミックス・グループ名と音量のスケールがツラーっと 並んで、最後に"All"が書いてあります。これね、「上に書いてある奴らはそれぞれに指定されたスケールで音量調節しちゃるけど、 他の奴らは一律このスケールにさせてもらいますよ、悪いけど」っつーことなんだよきっと。


    Soundmixerのこの定義ってHL2本編のエンディング直前で
    (`・ω・´)「よし、Alyx!一緒に脱出だ!」
    「ドガーーン!」
    ( ゚Д゚)「ターイム?」
    (´・ω・`)「ショボーン」
    ・・・のところで使ってると思うんですよ〜だ。
    "Citadel_Dialog_Only"
    {
    //	group name		mix value
    //	--------		---------
    
    	"NPC_Voice"	"0.72"
    	"Dialog"		"0.72"			
    	"Alyx_Dialog"	"0.72"
    	"Gman_Dialog"	"0.72"
    	"Music"		"0.81"
    	"All"		"0.01"
    }
    

    (´・ω・`)つもどる