
Я часто рассказываю про всевозможные синтезаторы звука и музыкальные процедуры для старых 8-битных компьютеров и игровых приставок. Но помимо музыки в играх есть такая невероятно важная вещь, как звуковые эффекты — если музыка задаёт атмосферу, эффекты создают обратную связь, вовлекая игрока в действие на экране.
Занимаясь разработкой для старых компьютеров и игровых консолей, я часто сталкивался с отсутствием информации и готовых инструментов для решения задачи озвучивания игр, и мне приходилось изобретать свои собственные. Я уделил разработкам в этом направлении немало времени, а также создал многие сотни звуковых эффектов.
Сегодня расскажу, как вообще устроены и реализуются звуковые эффекты в рамках примитивных возможностей 8-битных машин на примере нашего народно любимого ZX Spectrum, для которого я сделал несколько соответствующих редакторов и наборов процедур, для бипера и для звукового чипа AY-3-8910.
Звуки Спектрума
Компьютер ZX Spectrum разработки 1982 года отличается от своих современников и коллег по цеху не только низкой стоимостью, но и крайне примитивным звуковым оборудованием. Впрочем, даже это было огромным шагом вперёд, так как предшествующие модели компьютеров Sinclair, ZX80 и ZX81, вообще не имели никаких звуковых возможностей.
Прежде всего это бипер, присутствующий во всех версиях компьютера ZX Spectrum — простейший динамик, управляемый непосредственно микропроцессором через однобитный порт вывода. Синтез любого звука происходит полностью программно, процессор должен выдерживать все необходимые задержки и переключать выходной бит в 0 или 1 в нужные моменты. Так как в компьютере нет никаких таймеров, выдерживание нужных интервалов происходит самим выполнением операций, каждая из которых выполняется определённое известное время. Пока процессор занят синтезом звука, ничего другого делать он не может, и поэтому действие на экране останавливается.

Чуть позже арсенал звуковых возможностей Спектрума дополнился популярным звуковым чипом AY-3-8912, о котором я подробно рассказывал в одной из статей. Появился на платформе он практически сразу, уже в 1983 году, в составе версии компьютера для США, Timex Sinclair 2068, а также в формате разнообразных дополнений для классической 48K модели. Однако, эти реализации не были совместимы друг с другом и поэтому оказались слабо поддержаны в играх. Окончательно AY-3-8912 устаканился в 1986 году, модели ZX Spectrum 128K, став её стандартным звуковым устройством. При этом бипер в составе компьютера также сохранился, и в старых играх оба устройства часто используются одновременно — звуковой чип для музыки и бипер для звуковых эффектов.
Использование чипа AY-3-8912 вывело звучание компьютера на один уровень с более продвинутыми компьютерами, многие из которых также использовали этот чип: Amstrad CPC, MSX-совместимые машины, и даже 16-битный Atari ST. В умелых руках этот чип способен на весьма впечатляющие результаты.
Также в истории ZX Spectrum существовали и другие дополнительные звуковые устройства, включая другие звуковые чипы, различные ЦАП и даже аппаратные синтезаторы речи. Но всё это богатство я оставлю за рамками сегодняшней статьи и поведаю о нём отдельно, как-нибудь в другой раз.
Виды эффектов
Хотя штатных звуковых устройств на платформе всего два, и ,соответственно, звуковые эффекты по большому счёту делятся на биперные и для AY, в играх можно услышать аж четыре вида эффектов, обладающих характерными особенностями. Три из них относятся к биперу. Связано это с особенностями архитектуры первой модели компьютера, выпускавшегося в вариантах с 16 и 48 килобайтами оперативной памяти, а также особенностям устройства игр.
Первая категория звуков характерна для ранних игр 1982-1984 годов, большая часть которых создавалась с расчётом на 16-килобайтную версию компьютера. В ней всё ОЗУ компьютера подвержено «торможению» — периодическим кратковременным остановкам работы процессора, когда видеоконтроллер обращается к оперативной памяти для формирования изображения. Паттерн этих остановок довольно сложный, его непросто учесть, и это не позволяет обеспечить точные временные задержки, необходимые для синтеза звука со стабильной частотой. Поэтому тональные эффекты на 16К звучит грязно, с примесью шума от торможения.
Торможения процессора нет только в ПЗУ, где находятся процедуры работы с лентой, также нуждающиеся в точных задержках, и простейшая звуковая процедура, используемая оператором BEEP в Бейсике. Именно на её использование и приходилось рассчитывать 16-килобайтным играм, если требовалось воспроизвести чисто звучащий тон. Поэтому звуковое оформление ранних игр нередко состояло из простейших пощёлкиваний и гудков, а музыка в них всегда одноголосная. Хороший пример довольно богатого звучания, которого можно добиться в таких ограничениях — игра Cookie.
Следующие две категории возникли, когда ОЗУ подешевело, и разработчики игр переориентировались на 48-килобайтную версию компьютера. В ней большая часть ОЗУ уже не подвержена торможению, что открыло возможности для программного синтеза звука нужной высоты, в том числе мелодий, в том числе полифонических, а также для значительно более сложных звуковых эффектов.
Вторая категория, самая популярная — процедуры, полностью забирающее время процессора, пока звук не проиграет до конца. Они обладают более качественным звучанием, могут быть очень разнообразными по характеру, но полностью останавливают действие на экране. Так как длительные остановки действия для многих типов игр неприемлемы, эффекты такого типа часто делались короткими и относительно редкими. Тем не менее, это самый распространённый тип биперных звуковых эффектов. К сожалению, разработчики редко проявляли фантазию в дизайне звуков, и в результате многие игры на ZX Spectrum звучат очень бедно и однотипно, за редкими исключениями, как, например, в игре Earth Shaker.
Третья категория, более редкая — фоновые биперные эффекты. В этом подходе звук генерируется не всё время, а в оставшееся после отрисовки очередного кадра время, до следующей синхронизации с кадровой развёрткой. С одной стороны это делает быстродействие игры стабильным, не зависящим от количества активных игровых объектов, а с другой, позволяет действию на экране не останавливаться. Но достигается это ценой очень значительного ухудшения качества звука: он звучит прерывисто и небольшими кусочками. По нынешним временам едва ли кто-то посчитал бы подобный компромисс приемлемым, но то были сложные времена, и разработчики выживали как могли. Типичный пример — игра Manic Miner.
Наконец, четвёртая категория — эффекты для звукового чипа AY. Они не прерывают действие на экране, могут быть полифоническими. Но характер их звучания всегда одинаковый, определяемый возможностями чипа. Крайне редко на AY используют и оцифровки, останавливающие действие игры, но так как они останавливают и звучание музыки, их применение ограничено. Например, можно слышать голосовые вставки в игре Chase H.Q. в версии для 128 килобайт.
Готовые рецепты
Главная проблема со звуковыми эффектами в играх 8-16-битной эпохи во все времена заключалась в том, что никто толком не знает, как их делать — ещё не знали раньше, уже не знают сейчас. И нащупать точку во времени, когда кто-то обладал этим сакральным знанием, крайне затруднительно.
В современном мире и для современных платформ процесс вполне очевиден — достаточно просто взять какие-то «сэмплы», то есть записанные в цифровом формате звуковые фрагменты, из готовых библиотек, или записать их самому, потом как-то их обработать различными программами, возможно сохранить в нужном формате, и вставить в игру.
В стародавние же времена, когда компьютеры ещё не умели работать с сэмплами, всё было иначе. Нужно было понимать принципы синтеза звука, либо особенности устройства звукового чипа, придумать способы подготовки данных, написать свои процедуры и утилиты. У разработчиков игр 1980-х годов, в особенности пресловутым «bedroom coders», создающих свои игры для домашних компьютеров после школы или института, до этого редко доходили руки — им бы разработку самой игры осилить — и чаще всего всё ограничивалось типичными процедурами, стянутыми друг у друга.
Вопрос музыкального сопровождения в любительских разработках худо-бедно, но был решён уже в середине 1980-х. Существовали музыкальные редакторы, дававшие возможность сочинить музыку и вставить её в игру. Это, например, программа The Music Box в версиях для бипера и AY-3-8912, а также, в более поздние времена, в начале 1990-х, музыкальные редакторы Sound Tracker и Pro Tracker, ставшие стандартным, широко применяемым решением для создания музыкального сопровождения для AY-3-8912. Достаточно было сочинить музыку в редакторе, экспортировать бинарный файл, содержащий в том числе код проигрывателя, и вставить его в свою программу.
Со звуковыми эффектами же дело обстояло значительно хуже. Конечно, эта тема не была оставлена совсем уж без внимания. Ей посвящались редкие публикации в прессе, существовали некоторые программы, позволяющие создавать и воспроизводить различные звуки. Всё это позволяло разработчикам-энтузиастам худо-бедно озвучивать свои творения.
Программы, посвящённые звуковым эффектам, делились на две категории.

К первой категории можно отнести сборники готовых звуковых процедур, играющих строго определённые эффекты. По большей части это пакеты серии Supercode и New Supercode, где помимо разнообразных визуальных эффектов были и звуковые подпрограммы.
Другая категория программ была ориентирована именно на создание звуковых эффектов. Однако, это не были какие-то продвинутые редакторы, а скорее сборники процедур, подобные тем, что можно было найти в Supercode, только снабжённые интерфейсом для выбора параметров и подстройки характера звучан��я.

Так, можно отметить программу Spec-Sound 1983 года. Она позволяет создать биперный звуковой эффект путём ввода нескольких значений: начальная высота звука, скорость изменения высоты, количество повторений и так далее. Делается это в дико неудобной программе на Бейсике, после чего можно услышать получившийся звук. Процедура задействует упомянутый выше метод с использованием стандартной звуковой процедуры в ПЗУ, что с одной стороны обеспечивает совместимость с 16-килобайтной моделью компьютера, а с другой, ограничивает возможности звучания.

Другой пример — Sound Editor 1986 года, также для бипера. Он содержит четыре типа эффектов разного характера, два тональных и два шумовых, и позволяет настроить их параметры в более удобном, но всё равно очень тормозном редакторе на Бейсике. Тональные эффекты также реализованы через процедуру в ПЗУ, а шумовые — уже отдельным кодом в ОЗУ.
Стоит отметить и довольно знаменитую программу SpeakEasy 1982 года, позволяющую записать фрагмент цифрового звука через магнитофонный вход, забив этим всю память компьютера, а потом воспроизвести этот звук с ужасающим качеством. Забавно, но едва ли полезно для практических применений.
Отдельная проблема — совмещение музыки и звуковых эффектов. Для бипера это не особо актуально, так как музыка и эффекты не играют одновременно, но для музыки на AY-3-8912 это типовая задача, требующаяся в любой игре. И она совершенно никак нигде не решалась. В популярных процедурах проигрывания музыки просто не предусматривалась поддержка звуковых эффектов, и всем страждущим приходилось изобретать велосипеды.

Что касается прессы, ситуация за рубежом мне неизвестна, а в наших палестинах наибольшее внимание к созданию звуковых процедур — целая глава — было уделено в книге «Как написать игру на ассемблере» 1995 года издательства «Питер». Некоторое внимание, вероятно, уделялось теме и в журнале «ZX-Ревю». Наиболее же фундаментальный тематический труд под названием «Мир звуков Спектрума» был опубликован в электронном журнале ZX Forum в 1997 году. Сейчас в сети можно найти PDF-версию «бумажной» верстки этой книги, датированную 1995 годом, но в реальности она никогда не издавалась.
Таким образом сложилась ситуация, что даже сильно после заката популярности платформы, в конце 1990-х и начале 2000-х годов, нельзя было просто взять готовое решение, чтобы озвучить свою самодельную игру, и даже найти хоть какую-то информацию на эту тему было непросто. И я, делая свои первые шаги в разработке игр на ZX Spectrum, также столкнулся с необходимостью изобретать собственный звуковой велосипед.
Собственные шаги
Свой путь к программированию игр я начал в 1994 году. К сожалению, тогда мне ни перечисленная литература, ни программы, ни пакеты процедур, не попадались. Книжка «Как написать игру на Бейсике» и описания некоторых программ попали в мои руки уже после того, как я освоил эти дела без книжки, методом настырного тыка.
Склонность к созданию звуковых процедур мне пришлось проявить очень рано. Дома случился период, когда долго не было работоспособного телевизора, но была позаимствованная у друзей на время «Дельта-С». Тяга к знаниям и творчеству и наличие простаивающего без дела чуда техники — компьютера — позволяла не обращать внимания на столь несущественные барьеры, и я программировал вслепую, сочиняя программы на Бейсике — последовательности BEEP’ов и различные циклы с ними.
Вскоре я начал изучать ассемблер, внезапно по книжке от Радио 86РК (процессор Z80 бинарно обратно-совместим с КР580ВМ80), программируя непосредственно в машинном коде через POKE в Бейсике. Так как основы были уже заложены, первыми моими успешными шагами стали как раз звуковые процедуры, которые я придумывал на бумаге, и затем вводил в компьютер — разные пищалки, трещалки и шумелки, а также запись и воспроизведение сэмплов с магнитофонного входа.
Через некоторое время я наивным способом изобрёл широтно-импульсную модуляцию, что позволило делать биперные звуки разной громкости, и начал использовать собственноручно созданные звуковые эффекты в своих ранних любительских играх.
Увлечение Спектрумом в юности продлилось и на последующие десятилетия, плавно перейдя из разряда (едва ли) актуального в ретро-хобби, а потом увлечение ретро-разработкой распространилось и на другие платформы, компьютеры и игровые приставки — те, что были в детстве (прежде всего «Денди»), или иные, о которых я узнал уже во времена Интернета (например, Commodore PET).
Чем дальше в лес, тем больше я уделял внимание теме звуковых эффектов. Ведь богатое звуковое оформление — это хороший канал обратной связи с игроком и плюс к интерактивности в игре. Например, для игры Jim Power, о которой я однажды рассказывал, я сделал почти сотню эффектов. Я каждый раз делаю их с нуля, чтобы все игры звучали по-своему, хотя в коммерческой разработке прошлых лет повторное использование эффектов было нормой — это можно слышать во многих 8-битных играх, разработанных Konami, Capcom и Sunsoft.
Спектруму тоже досталось, и в новое время я также продолжил программировать на нём звуковые эффекты вручную, пользуясь накопленным опытом. Так, я сделал биперные звуки для собственной игры Magic Tokens 2010 года (и новый биперный музыкальный движок до кучи) и для игры Zombie Calavera Prologue того же года от испанской команды Mojon Twins. Так случилось, что набор звуковых эффектов из последней перекочевал буквально в десятки других игр, созданных разными авторами на опенсорном движке Churrera авторства Mojon Twins — про большую часть я до сих пор даже не слышал, хотя там всё ещё указывают моё соавторство.
В процессе участия в разработках различных игр для Спектрума возникла потребность создать более универсальное решение, чем вручную запрограммированные эффекты, что и воплотилось в моих проектах AY Sound FX Editor и BeepFX, о которых я расскажу далее. Но сначала — немного кода.
Немного кода
Для лучшего понимания сути продемонстрирую на примерах кода, как работают простейшие звуковые эффекты для AY и бипера. И для начала нужно отметить, что между ними существует принципиальная разница в реализации.
Биперные эффекты чаще реализуются как процедура, маленькая подпрограмма. Один эффект — один фрагмент непосредственно выполняемого процессором кода. Этот код выполняется в основном потоке, прерывания запрещены. Для разных звуков — разный алгоритм синтеза и разный код, хотя часто и очень похожий. Иногда для однотипных звуков может использоваться одна процедура, которая получает разные входные параметры в зависимости от нужного эффекта.
Эффекты для звуковых чипов, в том числе AY-3-8912, напротив, традиционно работают «в фоне»: состояние звукового чипа (высота звука и громкость) обновляется на кадровых прерываниях, раз в 1/50 секунды, а между обновлениями чип генерирует заданный звук, пока процессор занят своими делами. При этом эффекты не программируются непосредственно в коде для процессора. Процедура обновления состояния чипа одна и та же для всех эффектов, между эффектами отличается только набор данных, передаваемый в управляющие регистры чипа. Данные эффекта состоят из «кадров», в каждом из которых задаётся определённое состояние регистров чипа.
Как правило, код биперных эффектов содержит несколько вложенных циклов, от двух и более. Внешний цикл обеспечивает общую продолжительность звучания эффекта, внутренние — генерацию самого звука и изменение его характера (частоты) во времени, и ещё один внешний цикл может использоваться для периодической переустановки нужной высоты звучания.

Пожалуй, самый банальный биперный эффект, который можно слышать в тысячах игр для ZX Spectrum, условно назовём его «щебет» (быстро падающая высота тона, похожая на чириканье птицы), в коде выглядит так:
ld b,100 ;длительность эффекта
ld a,0 ;начальное значение выходного бита
loop1:
out (#fe),a ;выводим выходной бит в порт бипера
xor 16 ;инвертируем выходной бит
push bc ;сохраняем счётчик цикла
loop2:
djnz loop2 ;цикл задержки, количество итераций равно счётчику внешнего цикла
pop bc ;восстанавливаем счётчик
djnz loop1 ;выполняем внешний цикл
Количество итераций внешнего цикла, то есть длительность звучания эффекта, задаётся в регистре B, а внутри цикла происходит уменьшающаяся с каждой итерацией задержка, повышающая тон. Общая высота тона задаётся скоростью выполнения этого кода, и в первую итерацию составляет примерно 2600 Гц, а в последнюю — примерно 58300 Гц.

Простейший шумовой ударный звук, низкий отрывистый гулкий шум, выглядит так:
ld hl,0 ;начальный адрес в ПЗУ
ld b,50 ;длительность эффекта
loop1:
ld a,(hl) ;читаем байт из ПЗУ
inc hl ;увеличиваем указатель
and 16 ;изолируем бит бипера
out (#fe),a ;выводим в порт бипера
push bc ;сохраняем счётчик цикла
ld b,250 ;устанавливаем длительность цикла задержки
loop2:
djnz loop2 ;выполняем цикл задержки
pop bc ;восстанавливаем счётчик
djnz loop1 ;выполняем внешний цикл
Здесь просто читается содержимое ПЗУ, изолируется 4-ый бит, и выводится в порт. Внешний цикл определяет длительность звучания эффекта, а вложенный цикл определяет «высоту» шума. Так как начальный адрес чтения всегда одинаков, характер шума остаётся неизменным при каждом запуске эффекта.
Код более сложных биперных эффектов может содержать несколько циклов и более сложные закономерности изменения задержек для изменения высоты или формы звукового сигнала.
В качестве примера реализации звукового эффекта на чипе AY-3-8910 я приведу очень упрощённый вариант, который, конечно, издаёт звук, но не особо пригоден в реальной жизни, так как не предусматривает наложение эффекта на музыку. По содержанию это чтение потока данных для регистров и вывод их в соответствующие регистры чипа каждое прерывание. При этом количество выводимых значений в регистры в пределах одного обновления может отличаться:
ld hl,sound_data ;начальный адрес данных эффекта
ld (sfx_ptr),hl ;сохраняем указатель в переменную (двухбайтовая)
;код в обработчике кадрового прерывания
ld hl,(sfx_ptr) ;читаем указатель на данные эффекта
loop:
ld a,(hl) ;читаем байт
cp #fe ;проверяем, не конец ли это эффекта
jp z,done ;выходим из цикла чтения, оставив указатель на маркере конца эффекта
inc hl ;продвигаем указатель на следующий байт
cp #ff ;проверяем, не конец ли это кадра
jp z,done ;выходим из цикла чтения, указатель продвинут на данные следующего кадра
ld bc,#fffd ;порт выбора регистра AY
out (c),a ;выводим номер регистра
ld a,(hl) ;читаем следующий байт
inc hl ;продвигаем указатель
ld bc,#bffd ;порт данных регистра AY
out (c),a ;выводим байт
jp loop ;читаем дальше
done:
ld (sfx_ptr),hl ;кадр закончен, сохраняем указатель
Данные эффекта при этом могут выглядеть так:
sound_data:
db #07,#3e ;включаем тон в канале A в микшере
db #08,#0f ;устанавливаем громкость канала A в 15
db #00,#80,#01,#01 ;устанавливаем делитель канала A #180
db #ff,#ff,#ff ;задержка в три кадра
db #00,#00,#01,#01 ;устанавливаем делитель канала A #100
db #ff,#ff,#ff ;задержка в три кадра
db #00,#80,#01,#01 ;устанавливаем делитель канала A #180
db #ff,#ff,#ff ;задержка в три кадра
db #00,#00,#01,#01 ;устанавливаем делитель канала A #100
db #ff,#ff,#ff ;задержка в три кадра
db #08,#08 ;устанавливаем громкость канала A в 9
db #00,#80,#01,#01 ;устанавливаем делитель канала A #180
db #ff,#ff,#ff ;задержка в три кадра
db #00,#00,#01,#01 ;устанавливаем делитель канала A #100
db #ff,#ff,#ff ;задержка в три кадра
db #00,#80,#01,#01 ;устанавливаем делитель канала A #180
db #ff,#ff,#ff ;задержка в три кадра
db #00,#00,#01,#01 ;устанавливаем делитель канала A #100
db #ff,#ff,#ff ;задержка в три кадра
db #07,#3f ;выключаем тон в канале A в микшере
db #fe ;конец эффекта
Стоит отметить, почему звучание эффектов для бипера и AY так легко отличается на слух. Во-первых, это разница в тембре: звуковой чип может генерировать только квадратную волну, а бипер — разные формы сигнала. Во-вторых, это скорость изменений: в эффектах для чипа она не выше 1/50 секунды, а в биперных высота тона может изменяться хоть каждую итерацию цикла генерации звука. Поэтому простейший биперный «щебет», упомянутый выше, просто не получится повторить на AY (если не использовать его ЦАП в роли бипера) — скорость слайда в нём гораздо выше, чем 1/50 секунды.
Редактор AYFX
Хотя я чаще уделяю внимание теме бипера, я, конечно, как и все заядлые спектрумисты, немало времени провёл в обнимку с «музыкалкой» AY-3-8910. И своё первое универсальное решение по звуковым эффектам я сделал именно для этого чипа.

Полное название этой программы AY Sound FX Editor, но так сложилось, что название исполняемого файла, ayfxedit, приклеилось ко всему проекту. В быту применяются разные варианты наименования с буквами AYFX в начале. Создан этот проект был в 2006 году, в связи с разработкой игры Ball Quest для компьютеров стандарта ATM Turbo и MSX.
Пакет представляет собой программу-редактор для Windows и исходник простейшего проигрывателя эффектов на ассемблере Z80. Этот проигрыватель не предусматривает смешивания эффектов с музыкой, но в те же времена был создан вариант музыкального проигрывателя формата Pro Tracker 3 (PT3), к которому был прикручен проигрыватель эффектов.
Эффекты представлены в редакторе в виде набора из 256 одноканальных эффектов, каждый из которых может иметь длину до 4096 кадров, что составляет порядка 80 секунд на эффект. Многоканальные эффекты не поддерживаются, так как на практике в большинстве случаев оказалось достаточно и одноканальных, а если вдруг очень нужно, всегда можно просто запустить пару эффектов одновременно.
Каждый кадр эффекта содержит значение громкости, высоты тона, шума, а также включение и выключение тона и шума, представленные в виде графических линеек. С помощью простого движения мышки довольно просто нарисовать изменение громкости, высоты тона или шума, и таким образом создать нужный эффект, оперативно прослушивая изменения.
В редакторе предусмотрены импорт и экспорт из различных форматов, в частности, из PSG-дампов, сохраняемых в разных эмуляторах, что позволило невозбранно позаимствовать звуковые эффекты из множества игр для компьютеров MSX и не только. Есть импорт и из формата VGM с конверсией данных для другого популярного звукового чипа, SN76489.
Базовая реализация проигрывателя эффектов использует простую систему приоритетов: выбирается любой свободный канал, а если нет, то тот эффект, на котором звучал дольше всего. Задача смешивания эффектов и музыки решается сравнением громкости: если эффект в текущем кадре громче, чем канал музыки, звучит он, иначе музыка.
Помимо Ball Quest, этот движок в различных модификациях использовался во многих играх, а также в проекте Evo SDK, о котором я рассказывал ранее. Со временем он завоевал популярность, и его разработку поддержали другие авторы. Так, существует порт исходников редактора на другой компилятор (древний проект трудно собрать современными средствами), а также веб-версия и библиотека для NextBASIC, вариации Бейсика для ZX Spectrum Next.
Редактор BeepFX
Редактор биперных эффектов BeepFX не получил сравнимой популярности, но им я горжусь больше, так как он раздвинул границы возможного и сильно обогатил звучание бипера, позволив создавать доселе неслыханные на платформе звуки.

Создан BeepFX был в 2011 году, через некоторое время после упомянутых игр Magic Tokens и Zombie Calavera, в которых я запрограммировал эффекты вручную. Этот опыт дал представление о том, какие именно средства наиболее полезны для создания тех или иных звуков, и к какому набору типовых решений сводится код процедур. Особого повода делать этот редактор тогда не было, но так как опыт был получен, да и хотелось услышать на практике, чего же можно добиться, я сделал этот проект в качестве задела на будущее.
Редактор позволяет создать банк из 128 разных эффектов, который затем можно экспортировать в виде бинарного файла или ассемблерного листинга и вставить в игру. Код проигрывателя довольно компактен и состоит из трёх универсальных процедур, применяемых для синтеза тона, шума и проигрывания однобитных сэмплов. Сами эффекты описываются наборами параметров. Это позволяет значительно экономить память.
Эффект состоит из списка блоков, проигрываемых по очереди. Всего есть четыре вида блоков: тональный эффект, шумовой эффект, проигрывание однобитной оцифровки (их можно использовать повторно между эффектами) и просто пауза. В редакторе есть возможности прослушать каждый из блоков в отдельности или эффект целиком двойным щелчком по блоку или эффекту в списке.
Каждый тип блока имеет свои параметры — длительность, высоту тона или шума, изменение высоты во времени. У тона также есть скважность и слайд для скважности, а оцифровки можно проигрывать с разной скоростью и с разного смещения. Зачастую для эффекта достаточно всего одного блока, но возможность соединять блоки позволяет создавать богатые по звучанию, сложносочинённые последовательности звуков, складывающихся в слитные эффекты.
Конечно, ввод числовых параметров не так интуитивно понятен, как в AYFXedit, но тем не менее, освоить создание эффектов вполне можно, просто поиграв с настройками методом тыка и изучив прилагающийся демонстрационный набор, содержащий около 80 разных звуков.
Есть и ограничение: эффекты полностью останавливают действие на экране и не могут работать в режиме прерываний, как в Manic Miner. Впрочем, как показала практика, даже длительное прерывание действия не сильно вредит игровому процессу, если это взамен обеспечивает игре богатую, разнообразную звуковую палитру — то, что нечасто можно услышать на Спектруме.
Сам я применил BeepFX на практике сильно позже, аж в 2021 году, в проекте порта игры Attack of The PETSCII Robots на ZX Spectrum. В нём я заново переозвучил все действия, создав три десятка новых звуков. Вместе с кодом проигрывателя они заняли 1078 байт, то есть около 36 байт на один эффект.
Заключение
Можно подумать, что в первой четверти 21-го века времена изобретения велосипедов прошли, особенно если это касается компьютерных технологий родом из начала 1980-х годов: уж в прошлом-то давно было сделано всё, что нужно. Но оказывается, что повод приложить руки находится чаще, чем кажется.
Это не единственный случай, когда мне пришлось заново изобретать решение в области музыкального и звукового оформления для старых компьютеров и приставок, впоследствии завоевавшее заметную популярность. И ещё об одном таком, библиотеке FamiTone для игровой консоли Famicom (NES, Денди), я расскажу в следующий раз.
© 2025 ООО «МТ ФИНАНС»
Комментарии (4)
Shaman_RSHU
09.09.2025 10:02Помним :)
PLAY "T100O5L8E8E8E8C#8G8L4E8C#8G8L8C#8G8C#8C#8C#8D8D#8L4D#8D#8L8D#8G8G8G8A#8A#8A#8A#8G8L4E8C#8G8E4"
Zara6502
Как обычно - снимаю шляпу.