Нестандартное применение Scatterer Sound в FMOD Studio

Иван Осипенко Статья 0 Comments

Так получилось, что в нашем стане я оказался единственным практикующим FMOD’овцем которому, в придачу, есть, что рассказать. Этой статьей я хочу открыть цикл материалов которые будут посвящены фишкам работы в FMOD Studio. В них я буду рассказывать то, о чём не написано в мануале.

Звук автоматического огнестрельного оружия в играх

Звуки огнестрельного оружия достаточно весомая область саунддизайна, освещение которой заслуживает отдельной статьи. Я же коснусь лишь малой части дизайна этих звуков, а именно расскажу как правильно и неправильно делать звуки автоматического оружия в FMOD Studio. Прежде чем рассказать о том как это делаю я “правильно”, мы, сперва, рассмотрим “неправильные” альтернативы.

Готовый Луп

Первое, что приходит на ум при дизайне автоматического оружия — это использовать полностью отстрелянную очередь (или несколько) в виде лупа, которая проигрывается каждый раз, когда игрок нажимает на «спусковой крючок». Плюсом такого подхода является то, что вы неплохо сэкономите время при подготовке ассетов. Достаточно тупо обрезать запись полностью отстрелянного магазина и засунуть все это в FMOD (или куда вы там любите это засовывать?).

Готовый луп в Fmod Studio.

Готовый луп в Fmod Studio - нижнее поле.

Но из этой простоты вылезают и массивные минусы. Первый — это заметная на слух репетативность: одна и та же очередь повторяется снова и снова. Конечно, мы можем пойти по классическому сценарию и добавить модуляцию высоты тона (pitch) каждый раз, когда вызывается воспроизведение звука, тем самым добавив вариативности.

Готовый луп в Fmod Studio - модуляция высоты тона.

Только вот беда: поскольку луп монолитный, одновременно с вариативностью тона у нас начнет плавать скорострельность.

Кроме того, если луп изначально не «подружился» со скорострельностью оружия в игре, придется либо крутить высоту тона, подгоняя звук под визуальные эффекты, либо нарезать и перерендерить луп в ущерб времени (особенно с учётом техник, приведенных ниже).

Готовый луп в Fmod Studio.

Готовый луп в Fmod Studio - подгонка скорострельности.

Готовый луп в Fmod Studio - подгонка скорострельности.

«Вишенкой» на этом торте является производительность, а конкретно —  взаимодействие с памятью. Большой луп будет каждый раз “отжирать” соответствующий кусок оперативной памяти, или же вообще будет воспроизводиться с жесткого диска.

Готовый луп в Fmod Studio - файл который стримится.

Короче говоря, монолитный луп не наш метод.

RND Set

Второй альтернативой решения проблемы статичного лупа для нас будет фиксированный луп, созданный из набора одиночных сэмплов — ваншотов (oneshot), воспроизводимых в случайном порядке (RnD set). Для этого мы можем использовать одиночные выстрелы, что позволяет сделать автоматическое оружие даже не из автоматического.

RND SET Fmod Studio.

RND SET Fmod Studio - нижнее поле.

И все вроде бы ничего, можно добавить (немного!) рандомизации на высоту и задать скорострельность размером лупа.

RND SET Fmod Studio - рандомизация тона.

RND SET Fmod Studio - скорострельность в зависимости от размера лупа.

Но на этом веселье и заканчивается. Например, если мы делаем фиксированный луп с помощью loop region, то можем забыть про «хвосты». Дело в том, что при этом подходе велика вероятность того, что между последним выстрелом и «хвостом» появятся куски тишины, зависящие от скорострельности. Кроме этого, нам придется тащить параметр, управляющий «открытием/закрытием» лупа, ввиду того что для воспроизведения хвоста луп должен быть отключен, в то время как для воспроизведения очереди он наоборот должен быть выключен.

RND SET Fmod Studio - дырявый хвост.

Проблемы с «хвостом» уходят в небытие, если делать луп с помощью точки сустейна, но при этом появляются суровые требования к временной продолжительности выстрелов. Эта суровость заключается в том, что для чёткой, не “плавающей”, очереди продолжительность ассетов должна быть одинаковой и строго соответствовать скорострельности оружия в игре. В противном случае скорострельность начнет «плавать», так как каждый сэмпл будет проигрываться до конца.

RND SET Fmod Studio - луп на сустейн поинте.

Важный момент о рандомизации высоты тона: даже при правильной реализации sustain point (все ассеты одинаковой продолжительности), высота тона и модуляция лупа будут меняться на всех сэмплах в пачке при каждом запуске лупа. Это говорит нам о том, что продолжительность между звуками также изменится. Проще говоря, скорострельность у нас начнет «плавать» аналогично тому, как это было при использовании целого лупа.

Подвидом вышеописанной методики можно назвать метод с использованием «чистых» ваншотов. Суть его заключается в том, что вместо лупа, воспроизводящего ваншоты внутри ивента (event), мы, с периодичностью, соответствующей скорострельности, вызываем ваншотный ивент. Этот способ лишён всех вышеперечисленных недостатков, но, к сожалению, очень прожорлив относительно CPU.

RND SET Fmod Studio - ваншот.

Scatterer Sound

Тот самый scatterer, ради которого и затевалась данная статья. Здесь я вынужден сделать небольшую ремарку о том, что Firelight явно создавали scatterer sound не для моделирования звуков оружия. Блок в первую очередь предназначен для имитации скопления звуков в каком-то определенном радиусе, например группы птиц на кроне дерева. Стоя под деревом мы слышим птиц то слева то справа, то ближе то дальше. При этом как таковых источников звука не создается — происходит лишь имитация трехмерного панорамирования. Поэтому методику, описанную ниже, можно считать, своего рода, хаком.

Способ берёт лучшее от описанных методов с использованием зацикленных ваншотов. Под лучшим, в данном случае, я подразумеваю возможность использовать ассеты различной продолжительности не имея проблем со склейкой «хвостов».

RND SET Fmod Studio - ваншот с беспроблемной склейкой хвоста.

Перейдём к практике и шаг за шагом реализуем простенький 2d автомат со скорострельностью 600 выстрелов в минуту. У вас мог возникнуть вопрос: «почему 600?» Да потому что я ленивый, а при 600 проще всего рассчитать промежуток между выстрелами.

Создадим ивент и добавим пустой scatterer sound.

Пустой Scatterer Sound - Fmod Studio.

По умолчанию настройки явно ориентированы на «птичек». Поэтому кое-что нам придётся подкрутить.

Fmod Studio Scatterer Sound - дефолтные настройки.

Убираем разброс по дистанции в 0: нам не нужно, чтобы выстрелы водили хороводы вокруг головы стреляющего.

Fmod Studio Scatterer Sound - минимальный разброс по дистанции.

Выставляем фиксированный временной промежуток, соответствующий скорострельности (в нашем случае — 100мс).

Fmod Studio Scatterer Sound - фиксированный тайминг.

Также можно сделать небольшой разброс в районе 20мс (90 — 110 мс) чтобы реализовать небольшие временные отклонения. В дополнение к разбросу по времени можно добавить небольшую тональную рандомизацию.

Fmod Studio Scatterer Sound - разброс.

В качестве финального штриха уменьшим полифонию до 1, дабы не превращать микс в кашу.

Fmod Studio Scatterer Sound - полифония.

На этом основа для нашего автомата готова. Осталось только импортировать ассеты и добавить в ивент вторую дорожку с «хвостом».

Заключение

Подводя итог, хочется сказать, что способ не лишён недостатков. Впрочем, только один действительно портит жизнь. Он заключается в том, что одновременно с изменением тона меняется скорострельность. Например, при повышении тона на октаву, скорострельность повышается в два раза и, соответственно, интервал между выстрелами нужно пропорционально увеличивать.

Fmod Studio Scatterer Sound - скорострельность и тон.

Fmod Studio Scatterer Sound - скорострельность и тон.

На этом, пожалуй, все. Буду рад, если в комментариях появятся мысли о том чего еще такогоэтакого вам хотелось бы узнать про FMOD Studio.

Всегда ваш, «Больной» Иван.