вернуться на beanet.ru вернуться к списку проектов вернуться на главную страницу сборника

Тема: Саундскейпы


Ключевые слова: окружающий звуковой фон, фоновые звуки окружения, звуковая атмосфера

См. также: env_sounscape, Список предопределенных саундскейпов из Half-Life 2, Список предопределенных саундскейпов из Half-Life 2: Episode One, Список предопределенных саундскейпов из Half-Life 2: Episode Two
Список используемых понятий, сокращений и обозначений

перейти к общему списку

Содержание



Саундскейпом называется определенное звуковое окружение - случайные звуки, как правило, передающие атмосферу определенной области игры. Если Вам нужно проигрывать набор звуков в случайном порядке - саундскейп подойдет идеально.
Саундскейпы в Half-Life 2 позволяют использовать несколько DSP-эффектов (цифровая обработка сигналов) в реальном времени (например, эхо), которые изменяют стандартное звучание всех используемых в нем звуков.
В одно и то же время в игре может быть активным только один саундскейп. При изменении активного саундскейпа происходит плавный переход между предыдущим и новым саундскейпами.
В основном, для саундскейпов используется энтити env_soundscape, которая активируется, если:
  • она находится в пределах прямой видимости (т.е. между центром энтити и игроком нет преград из обычных брашей)
  • игрок находится внутри радиуса ее действия
  • она находится ближе остальных (env_soundscape) к игроку

Пример срабатывания саундскейпов
Здесь черными кружками обозначены саундскейпы S1 и S2, черными стрелками - путь следования игрока, буквой P и белыми кружками - ключевые точки на этом пути, прямоугольник - обычный браш (блокирует прямую видимость), зелеными и синими стрелками обозначены направления прямой видимости в каждой точке относительно саундскейпов (пунктир - если нет прямой видимости). Большие окружности обозначают радиусы действия саундскейпов.

Пример расположения и обработки саундскейпов Пояснение к примеру

Игрок начинает путь из точки P. В точке 1 он попадает в радиус действия саундскейпа S1 - теперь саундскейп S1 слышен игроку.
В точке 2 саундскейп S1 находится за пределами прямой видимости, но по-прежнему слышен игроку.
В точке 3 игрок попадает в радиус действия саундскейпа S2. Теперь саундскейп S1 не слышен игроку, слышен только S2.
В точке 4 игрок выходит из радиуса действия саундскейпа S2, но по-прежнему слышит только его, т.к. саундскейп S1 находится за пределами прямой видимости.
В точке 5 игрок снова слышит саундскейп S1, т.к. он находится в пределах прямой видимости. Саундскейп S2 не слышен.


Энтити env_soundscape ищет любой указанный саундскейп в специальном файле soundscapes.txt, который находится в каталоге /scripts Вашего мода, либо в другом файле, зависящем от карты (soundscapes_*.txt).
Полный список готовых (заданных Valve) саундскейпов из Half-Life 2 и ее продолжений см. в разделах Список предопределенных саундскейпов из Half-Life 2, Список предопределенных саундскейпов из Half-Life 2: Episode One и Список предопределенных саундскейпов из Half-Life 2: Episode Two.



Энтити для определения саундскейпов

env_soundscape - точечная энтити. Как уже говорилось ранее, основная для использования саундскейпов;

env_soundscape_proxy - точечная энтити. Дублирует свойства уже существующей на карте env_soundscape (через атрибут Soundscape Entity), позволяя изменить лишь радиус срабатывания. Другими словами, вместо создания копий одного и того же саундскейпа экономнее пользоваться данной энтити. Возможность включения/выключения отсутствует;

trigger_soundscape - брашевая энтити. Специальный триггер, который автоматически запускает заданный саундскейп, когда проверяемый объект (например, игрок) попадает в область его действия. Доступны и некоторые другие атрибуты, флаги, команды и события, стандартные для триггеров. Целесообразно использовать данную энтити в сочетании со следующей;

env_soundscape_triggerable - точечная энтити. Работает аналогично env_soundscape, за исключением того, что для проверки момента запуска используется trigger_soundscape (т.е. работает совместно с предыдущей энтити). Атрибуты, управляющие команды и события те же самые, что и у env_soundscape.
В частности, полезна для карт Team Fortress 2, т.к. в данной игре вода блокирует видимость саундскейпа.


Структура описания саундскейпа

Структура файла soundscapes.txt простая и наглядная - в основном в виде пар "переменная-значение" или "команда-параметр" (см. пример ниже), каждая в отдельной строке. Секции ограничиваются фигурными скобками.

  "example"
  {
    "key1" "value1"
    "key2" "value2"
    "subexample"
    {
      "key3" "value3"
    }
    "key4" "value4"
  }
  // Вся эта строка - комментарий (пропускается движком)
  "example2" // Возможен и такой комментарий - от // до конца строки
  {
  }

Каждая секция верхнего уровня (не входящая в другие секции) определяет отдельный саундскейп. В энтити env_soundscape задаются как раз имена этих секций (для приведенного примера это example и example2).



Добавление нового саундскейпа

С целью оптимизации выполнения необходимо заранее сообщить движку о том, где находятся описания используемых в игре саундскейпов. В этом случае произойдёт кэширование необходимых звуков в оперативную память (как следствие - в игре не будет задержек из-за подгрузки звуков).

Имена всех загружаемых файлов с определениями саундскейпов содержатся в файле soundscapes_manifest.txt в каталоге /scripts Вашего мода. Добавьте в него имя файла с описанием новых саундскейпов (после комментария // List additional soundscape files here) по образцу:
"file" "scripts/<имя_файла_с_саундскейпами>.txt"
Затем создайте файл в каталоге /scripts мода с именем <имя_файла_с_саундскейпами>.txt и в него внесите определения новых саундскейпов.
Есть еще один способ добавления саундскейпов (если нельзя менять содержимое файла soundscapes_manifest.txt), но он будет работать только для отдельно взятой карты. В этом случае для карты <имя карты> нужно создать файл soundscapes_<имя карты>.txt и в нем определить новые саундскейпы (этот файл будет обрабатываться при загрузке карты <имя карты>.bsp).



Команды, используемые в определении саундскейпа

"dsp" "<параметр>"
задает эффект обработки звука. Обычно <параметр> равен 1 - автоматическая обработка звуков, исходя из окружающей геометрии (эхо, ревербация). Параметр 0 отключает обработку звуков (проигрываются без изменений).
Другие значения параметра рекомендуются только в особых случаях и описываются в файле …/hl2/scripts/dsp_preset.txt; названия эффектов по номерам есть в начале файла soundscapes.txt.

Пример:
    // Саундскейп - полная тишина без обработки звука
    "Nothing"
    {
      "dsp"   "0"
    }



"playlooping" {}
циклически проигрывает звук до тех пор, пока активен саундскейп.
В скобках задаются дополнительные команды-спецификации:
"wave" "<путь>"
имя звукового файла с указанием пути. Если звук из стандартных, то <путь> задается так же, как в просмотрщике звуков. Для новых звуков, добавленных в каталог /sound Вашего мода, <путь> задается относительно этого каталога.
"volume" "<число с п.точкой от 0 до 1>"
задает громкость звука.
"pitch" "<число от 1 до 255>"
задает темп воспроизведения звука (с изменением высоты). Нормальное значение - 100 (оригинальное звучание).
"position" "<число>"
если секция playlooping используется для позиционного звучания (в игре определяется его положение), данная команда задает номер позиции (<число> - от 0 до 7). Позиции задаются затем в энтити env_soundscape.
Замечание: позиционные звуки имеет смысл использовать только вместе с attenuation или soundlevel


"attenuation" "<число с п.т.>"
скорость затухания звука по мере удаления от источника. Имеет смысл использовать только для позиционных звуков (если задана position).
"soundlevel" "<предопределенное значение>"
сопоставимый уровень громкости, определяющий скорость затухания звука по мере удаления от источника. Имеет смысл использовать только для позиционных звуков (если задана position).
Список предопределенных уровней см. далее.
Пример:
    // Циклическое проигрывание отдельного звука с ревербацией (1 тип комнаты)
    "GenericIndoor"
    {
      "dsp"   "1"
      "playlooping"
      {
        "volume"    "1"
        "pitch" "100"
        "wave"  "ambient/atmosphere/indoor2.wav"
      }
    }

Замечание: для того, чтобы зациклить звук, необходимо добавить в него специальные метки цикла (в звуковом редакторе установить на начало маркер с именем loop). Эти метки позволяют звуковому движку определить, какую часть звука нужно проигрывать циклически (обычно звук целиком).


"playrandom" {}
постоянно проигрывает набор звуков случайным образом (пока активен саундскейп).
В скобках задаются дополнительные команды-спецификации:
"time" "tmin,tmax"
временной интервал между звуками. Здесь tmin и tmax - минимальное и максимальное значение времени (т.е. между началом текущего и следующего звуков пройдет tmin…tmax секунд).
"volume" "vmin,vmax"
громкость звуков; задается значениями от 0 до 1 (1 - максимальная (оригинальная) громкость звука). Здесь vmin и vmax - минимальная и максимальная громкость (т.е. громкость очередного звука будет случайной в интервале от vmin до vmax).
"pitch" "pmin,pmax"
ускорение/замедление воспроизведения; задается значениями в процентах от 50 до 250 (100 - нормальная скорость). Здесь pmin и pmax - минимальное и максимальное значения (т.е. ускорение/замедление воспроизведения колеблется в интервале от pmin до pmax).
"rndwave" {}
список звуков, которые будут проигрываться в случайном порядке. Каждый звук задается в виде строки "wave" "<путь>" (имя звукового файла с указанием пути). Если звук из стандартных, то <путь> задается так же, как и в просмотрщике звуков. Для новых звуков, добавленных в каталог /sound Вашего мода, <путь> задается относительно этого каталога.
"position" "<число>"
если секция playrandom используется для позиционного звучания (в игре определяется конкретное положение источника звуков), данная команда задает номер позиции (<число> - от 0 до 7). Позиции задаются затем в энтити env_soundscape.
"position" "random"
если звуки секции playrandom в игре должны идти случайным образом со всех сторон, вместо номера конкретной позиции ставится ключевое слово random.
Замечание: позиционные звуки имеет смысл использовать только вместе с attenuation или soundlevel


"attenuation" "<число>"
скорость затухания звука по мере удаления от источника. Имеет смысл использовать только для позиционных звуков (если задана position).
"soundlevel" "<предопределенное значение>"
сопоставимый уровень громкости, определяющий скорость затухания звука по мере удаления от источника. Имеет смысл использовать только для позиционных звуков (если задана position).
Список предопределенных уровней см. далее.
Пример:
    "ExampleSoundscape"
    {
      "dsp"   "1"

      "playrandom"
      {
        // Проигрывать звуки каждые 0.1…1.5 секунд
        "time" "0.1,1.5"

        // Громкость звуков от 0.5 до 1
        "volume" "0.5,1"

        // Проигрывать от ускорения 50% до замедления 120%
        "pitch" "50,120"

        // Ослабление звучания 0.7
        "attenuation" "0.7"

        // Для энтити, определенной в позиции 1
        "position"  "1"

        // Случайным образом проигрывать звуки из следующего списка
        "rndwave"
        {
          "wave" "ambient/creatures/pigeon_idle1.wav"
          "wave" "ambient/creatures/pigeon_idle2.wav"
          "wave" "ambient/creatures/pigeon_idle3.wav"
        }
      }
    }



"playsoundscape" {}
проигрывает ранее определенный саундскейп, включенный в данный. Таким образом можно задавать набор саундскейпов, которые будут проигрываться в составе данного.
В скобках задаются дополнительные команды-спецификации:
"name" "<имя саундскейпа>"
имя проигрываемого саундскейпа.
"volume" "<число с п.точкой от 0 до 1>"
громкость проигрываемого саундскейпа (1 - максимальная (оригинальная)).
"position" "<число>"
если секция playsoundscape используется для позиционного звучания (в игре определяется его положение), данная команда задает номер позиции (<число> - от 0 до 7). Позиции задаются затем в энтити env_soundscape.
"positionoverride" "<число>"
даже если проигрываемый саундскейп использует несколько позиций для звуков, данная команда вынуждает проигрывать его звуки только из одной позиции. Здесь <число> равно номеру позиции от 0 до 7.
"ambientpositionoverride" "<число>"
все фоновые звуки заданного саундскейпа будут располагаться в указанной позиции. Таким образом, можно задавать звуки фонового "окружения", идущие с определенной стороны. Здесь <число> равно номеру позиции от 0 до 7.
Замечание: позиционные звуки имеет смысл использовать только вместе с attenuation или soundlevel


"attenuation" "<число>"
скорость затухания звука по мере удаления от источника. Имеет смысл использовать только для позиционных звуков (если заданы position, positionoverride или ambientpositionoverride).
"soundlevel" "<предопределенное значение>"
сопоставимый уровень громкости, определяющий скорость затухания звука по мере удаления от источника. Имеет смысл использовать только для позиционных звуков (если заданы position, positionoverride или ambientpositionoverride).
Список предопределенных уровней см. далее.
Замечание: саундскейпы, включенные таким образом в состав данного, не влияют на обработку звука (DSP).

Пример:
    "SubSoundscape"
    {
      "dsp"   "1"

      "playsoundscape"
      {
        // Саундскейп, который проигрывается в составе данного саундскейпа
        "name" "GenericIndoor"

        // Громкость указанного саундскейпа уменьшить наполовину
        "volume" "0.5"

        // Все позиционные звуки указанного саундскейпа идут из одной позиции
        "positionoverride" "0"      // из позиции 0

        // Все фоновые звуки указанного саундскейпа идут из одной позиции
        "ambientpositionoverride" "1"   // из позиции 1
      }
    }



"SOUNDMIXER" "<имя микшера>"
задает звуковое микширование (смешивание) для саундскейпа. Микширование звука используют, чтобы задать громкость для разных категорий звуков, называемых группами микширования. При этом проигрывание категорий может происходить одновременно (смешивается).
Имена микшеров заданы в файле soundmixers.txt в каталоге /scripts Вашего мода. Если необходимо определить собственный микшер, добавьте его в конец этого файла (после строки // add new sound mixers here...).

Замечание: определяя новый микшер, всегда используйте в качестве шаблона микшер Default_Mix. Об этом предупреждает комментарий в файле soundmixers.txt.

Пример:
    "automatic"
    {
      "dsp" "1"
      "dsp_volume" "1.0"
      "SOUNDMIXER" "Default_Mix"
    }

В примере определяется саундскейп automatic с микшером Default_Mix.

Определение микшера Default_Mix (в файле soundmixers.txt):
    "Default_Mix"
    {

      // имя группы           значение при смешивании
      // --------             ---------
      "Explosions"            "0.90"
      "Player_Weapons_Loud"   "1.0"
      "Player_Suit"           "0.56"
      "Weapons"               "0.79"

      "AHELI_WEAPON"          "0.85"
      "GUNSHIP_WEAPON"        "0.85"
      "STRIDER_WEAPON"        "0.85"
      "bullethit"             "0.67"

      "Music"                 "0.81"

      "All"                   "0.72"
    }




Предопределенные уровни звука

Если в саундскейпе есть позиционные звуки, для них необходимо определить затухание по мере удаления источника звука. Только в этом случае уровень звука будет меняться в зависимости от положения игрока.
Один из методов - указать уровень, которому соответствуют звуки данной секции (соотвественно меняется скорость затухания). Для этого используется команда-спецификация soundlevel с предопределенным именем. Список предопределенных имен уровней звука в Source:

Имя Значение attenuation Примерное соответствие громкости звука или области в реальном мире
SNDLVL_NONE 0 Полная тишина (затухание не используется)
SNDLVL_20dB ... Шелест листьев
SNDLVL_25dB ... Шепот
SNDLVL_30dB ... Библиотека
SNDLVL_35dB ... ...
SNDLVL_40dB ... ...
SNDLVL_45dB ... Холодильник
SNDLVL_50dB 3.9 Квартира
SNDLVL_55dB 3.0 ...
SNDLVL_IDLE 2.0 Обычный разговор, сушилка для одежды
SNDLVL_65dB 1.5 Стиральная или посудомоечная машина
SNDLVL_STATIC 1.25 ...
SNDLVL_70dB 1.0 Легковой автомобиль, пылесос, миксер, электрическая швейная машина
SNDLVL_NORM 0.8 Интенсивное дорожное движение
SNDLVL_80dB 0.7 Мопед, будильник, шумный ресторан
SNDLVL_TALKING 0.7 Диалог
SNDLVL_85dB 0.6 Средний завод, электробритва
SNDLVL_90dB 0.5 Крик ребенка, проезжающий мотоцикл, поездка по автостраде
SNDLVL_95dB ... ...
SNDLVL_100dB 0.4 Поезд метро, двигатель грузовика, лесопилка, пневматическая дрель (перфоратор), отбойный молоток
SNDLVL_105dB ... Вертолет, мощная газонокосилка
SNDLVL_110dB ... Снегоход (уровень шума на месте водителя), машинное отделение теплохода, пескодувка
SNDLVL_120dB ... Гудок автомобиля, пропеллер самолета
SNDLVL_130dB ... Сирена воздушной тревоги
SNDLVL_GUNFIRE 0.27 Болевой порог, выстрел, реактивный двигатель
SNDLVL_140dB 0.2 ...
SNDLVL_150dB 0.2 ...
SNDLVL_180dB ... Запуск ракеты





Статьи (рус): Звуковой кэш
Статьи (eng): http://developer.valvesoftware.com/wiki/Soundscapes , http://developer.valvesoftware.com/wiki/Env_soundscape

перейти к общему списку

Номер статьи: 10

Сборник полезной информации по созданию модификаций на движке Valve Source Engine (игры Half-Life 2, Episode One, Episode Two)