Так получилось, что в нашем стане я оказался единственным практикующим FMOD’овцем которому, в придачу, есть, что рассказать. Этой статьей я хочу открыть цикл материалов которые будут посвящены фишкам работы в FMOD Studio. В них я буду рассказывать то, о чём не написано в мануале.
Звук автоматического огнестрельного оружия в играх
Звуки огнестрельного оружия — достаточно весомая область саунд—дизайна, освещение которой заслуживает отдельной статьи. Я же коснусь лишь малой части дизайна этих звуков, а именно расскажу как правильно и неправильно делать звуки автоматического оружия в FMOD Studio. Прежде чем рассказать о том как это делаю я “правильно”, мы, сперва, рассмотрим “неправильные” альтернативы.
Готовый Луп
Первое, что приходит на ум при дизайне автоматического оружия — это использовать полностью отстрелянную очередь (или несколько) в виде лупа, которая проигрывается каждый раз, когда игрок нажимает на «спусковой крючок». Плюсом такого подхода является то, что вы неплохо сэкономите время при подготовке ассетов. Достаточно тупо обрезать запись полностью отстрелянного магазина и засунуть все это в FMOD (или куда вы там любите это засовывать?).
Но из этой простоты вылезают и массивные минусы. Первый — это заметная на слух репетативность: одна и та же очередь повторяется снова и снова. Конечно, мы можем пойти по классическому сценарию и добавить модуляцию высоты тона (pitch) каждый раз, когда вызывается воспроизведение звука, тем самым добавив вариативности.
Только вот беда: поскольку луп монолитный, одновременно с вариативностью тона у нас начнет плавать скорострельность.
Кроме того, если луп изначально не «подружился» со скорострельностью оружия в игре, придется либо крутить высоту тона, подгоняя звук под визуальные эффекты, либо нарезать и перерендерить луп в ущерб времени (особенно с учётом техник, приведенных ниже).
«Вишенкой» на этом торте является производительность, а конкретно — взаимодействие с памятью. Большой луп будет каждый раз “отжирать” соответствующий кусок оперативной памяти, или же вообще будет воспроизводиться с жесткого диска.
Короче говоря, монолитный луп — не наш метод.
RND Set
Второй альтернативой решения проблемы статичного лупа для нас будет фиксированный луп, созданный из набора одиночных сэмплов — ваншотов (oneshot), воспроизводимых в случайном порядке (RnD set). Для этого мы можем использовать одиночные выстрелы, что позволяет сделать автоматическое оружие даже не из автоматического.
И все вроде бы ничего, можно добавить (немного!) рандомизации на высоту и задать скорострельность размером лупа.
Но на этом веселье и заканчивается. Например, если мы делаем фиксированный луп с помощью loop region, то можем забыть про «хвосты». Дело в том, что при этом подходе велика вероятность того, что между последним выстрелом и «хвостом» появятся куски тишины, зависящие от скорострельности. Кроме этого, нам придется тащить параметр, управляющий «открытием/закрытием» лупа, ввиду того что для воспроизведения хвоста луп должен быть отключен, в то время как для воспроизведения очереди он наоборот должен быть выключен.
Проблемы с «хвостом» уходят в небытие, если делать луп с помощью точки сустейна, но при этом появляются суровые требования к временной продолжительности выстрелов. Эта суровость заключается в том, что для чёткой, не “плавающей”, очереди продолжительность ассетов должна быть одинаковой и строго соответствовать скорострельности оружия в игре. В противном случае скорострельность начнет «плавать», так как каждый сэмпл будет проигрываться до конца.
Важный момент о рандомизации высоты тона: даже при правильной реализации sustain point (все ассеты одинаковой продолжительности), высота тона и модуляция лупа будут меняться на всех сэмплах в пачке при каждом запуске лупа. Это говорит нам о том, что продолжительность между звуками также изменится. Проще говоря, скорострельность у нас начнет «плавать» аналогично тому, как это было при использовании целого лупа.
Подвидом вышеописанной методики можно назвать метод с использованием «чистых» ваншотов. Суть его заключается в том, что вместо лупа, воспроизводящего ваншоты внутри ивента (event), мы, с периодичностью, соответствующей скорострельности, вызываем ваншотный ивент. Этот способ лишён всех вышеперечисленных недостатков, но, к сожалению, очень прожорлив относительно CPU.
Scatterer Sound
Тот самый scatterer, ради которого и затевалась данная статья. Здесь я вынужден сделать небольшую ремарку о том, что Firelight явно создавали scatterer sound не для моделирования звуков оружия. Блок в первую очередь предназначен для имитации скопления звуков в каком-то определенном радиусе, например группы птиц на кроне дерева. Стоя под деревом мы слышим птиц то слева то справа, то ближе то дальше. При этом как таковых источников звука не создается — происходит лишь имитация трехмерного панорамирования. Поэтому методику, описанную ниже, можно считать, своего рода, хаком.
Способ берёт лучшее от описанных методов с использованием зацикленных ваншотов. Под лучшим, в данном случае, я подразумеваю возможность использовать ассеты различной продолжительности не имея проблем со склейкой «хвостов».
Перейдём к практике и шаг за шагом реализуем простенький 2d автомат со скорострельностью 600 выстрелов в минуту. У вас мог возникнуть вопрос: «почему 600?» Да потому что я ленивый, а при 600 проще всего рассчитать промежуток между выстрелами.
Создадим ивент и добавим пустой scatterer sound.
По умолчанию настройки явно ориентированы на «птичек». Поэтому кое-что нам придётся подкрутить.
Убираем разброс по дистанции в 0: нам не нужно, чтобы выстрелы водили хороводы вокруг головы стреляющего.
Выставляем фиксированный временной промежуток, соответствующий скорострельности (в нашем случае — 100мс).
Также можно сделать небольшой разброс в районе 20мс (90 — 110 мс) чтобы реализовать небольшие временные отклонения. В дополнение к разбросу по времени можно добавить небольшую тональную рандомизацию.
В качестве финального штриха уменьшим полифонию до 1, дабы не превращать микс в кашу.
На этом основа для нашего автомата готова. Осталось только импортировать ассеты и добавить в ивент вторую дорожку с «хвостом».
Заключение
Подводя итог, хочется сказать, что способ не лишён недостатков. Впрочем, только один действительно портит жизнь. Он заключается в том, что одновременно с изменением тона меняется скорострельность. Например, при повышении тона на октаву, скорострельность повышается в два раза и, соответственно, интервал между выстрелами нужно пропорционально увеличивать.
На этом, пожалуй, все. Буду рад, если в комментариях появятся мысли о том чего еще такого—этакого вам хотелось бы узнать про FMOD Studio.
Всегда ваш, «Больной» Иван.