Как стать автором
Обновить
3120.91
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Звуки музыки Super Nintendo

Уровень сложностиПростой
Время на прочтение23 мин
Количество просмотров3.5K


В прошлый раз мы заглядывали под капот 16-битной игровой консоли Sega Mega Drive и смотрели на бобину устройство звуковой системы. Сегодня повернёмся к Сеге задом, к SNES’у передом, и проделаем то же самое: рассмотрим устройство звуковой системы в изделии конкурирующей организации, Super Nintendo.

И снова ключевое отличие этой публикации от аналогичных в том, что я не просто пересказываю вторичные источники, но пропустил эту информацию через призму личного опыта: в былые времена я разработал несколько любительских игр для этой платформы тоже, а заодно и целую музыкальную систему для озвучивания игр SNES GSS. Поэтому я могу более осознанно рассказать про местную специфику работы со звуком, особенности устройства и устоявшиеся в годах заблуждения, связанные с ним.

▍ Исторический контекст


Про противостояние двух главных консолей четвёртого поколения я уже упоминал в предыдущей статье, поэтому повторяться не буду. Однако, помимо плотной зарубы с Sega, Super Nintendo также оказалась тесно связана с другой знаменитой японской компанией, которая уже в следующем поколении консолей подсидела обоих и подгребла под себя весь рынок консольных игр. Конечно же, речь идёт о Sony.

Сохранившийся прототип Nintendo PlayStation. Фото Mats Lindh

Sony поучаствовала не только в дальнейшем развитии платформы, что привело сначала к созданию полумифической, не вышедшей на рынок Nintendo PlayStation, и к последующей разработке сверх-успешной Sony PlayStation, но сыграла роль и в создании самой оригинальной Super Nintendo, создав для неё звуковую систему на компонентах собственной разработки.

Легенда гласит, что в начале 1980-х годов Кен Кутараги, будущий отец PlayStation, смотрел, как его маленький ребёнок, в разных источниках сын или дочь, играл на Famicom, предыдущей игровой консоли Nintendo. В этом наблюдении Кен увидел потенциал видеоигр, которого не видела компания Sony, считая, что «игрушечный» бизнес не подходит их солидному имиджу. Кутараги в тайне от руководства самолично разработал звуковой чип под названием SPC700 и предложил его Nintendo для их следующей консоли, и хотя боссы были в ярости и чуть не уволили Кена, всё же удалось достичь соглашения, и таким образом чип разработки Sony попал в Super Nintendo. При этом производством чипа занималась сама Sony, сохранив на него права.

Все чипы звуковой системы в американской SNES

Достоверная история неизвестна, и в ней хватает тёмных пятен — и кто к кому с чем пришёл — Sony к Nintendo или наоборот, и кто на самом деле разработал чип, какого калибра фигурой был на момент его разработки Кутараги в Sony, занимался ли он сам технической частью, или уже только организационной, и мог ли он договориться от лица одной компании с другой компанией. Всё это — тайна, покрытая мраком и лежащая за языковым барьером, и наверняка всё было иначе. Неточностей в легендах тоже хватает, начиная с названия SPC700, о чём я расскажу ниже.

Первая оригинальная Sony PlayStation

Впрочем, вполне очевидно, что звуковое решение в Super Nintendo сильно отличается от всех домашних конкурентов, превосходит их технологически, реализовано очень обособленно от остальной аппаратуры консоли, а звуковая система появившейся через пять лет PlayStation концептуально очень похожа на прямое развитие решения в SNES, только с улучшенными характеристиками и без дополнительного управляющего процессора.

Реклама прошлых лет утверждала, что Super Nintendo обладает настоящим, полноценным 16-битным звуком, тогда как у её конкурента, Sega Mega Drive (Genesis), 16 бит не настоящие — дескать, видео и звук там восьмибитные. То есть король-то — восьмибитный! Разумеется, по большей части это была маркетинговая чепуха, хотя и частично построенная на сильно искажённых отзвуках реальных технических деталей. Более подробно я рассматривал этот вопрос в своей статье «Войны битов».

Реклама Super Nintendo в отечественной игровой прессе

Конечно, значительная разница в звучании определялась вовсе не количеством бит, которые ещё неизвестно где и как считать, а принципиально иным подходом к синтезу звука: собственно синтез простых тембров у Sega Genesis и воспроизведение цифровых записей реальных инструментов у Super Nintendo. Реклама упоминала и это, но в весьма своеобразном ключе: качество звука эквивалентно CD-дискам и значительно лучше любых синтезаторов шумов, которые используются в этих ваших Сегах с Дендями.

В реальности SNES не может воспроизводить звук CD качества ни в каком виде, так как верхняя граница частоты дискретизации у неё всего 32 килогерца, и к тому же она даже не способна воспроизводить несжатое аудио без применения нетривиальных трюков. В её звуковую память может поместиться лишь 4 секунды монофонического звука в максимально возможном местном качестве, а самый ёмкий и дорогостоящий картридж в 90-х годах смог бы вместить всего одну трёхминутную стереофоническую дорожку.

И всё же, использование сэмплов реальных инструментов и применение сжатия данных позволило получить звучание, напоминающее лучшие звуковые карты для ПК того периода — Roland MT-32, Gravis Ultrasound и Sound Blaster AWE32, радикально более реалистичное, чем звучание FM-синтезаторов звуковых карт Adlib и SB16. Уровень качества местного звука также примерно сопоставим с классическими моделями компьютера Commodore Amiga, также использовавшего технологию сэмплов, с более глухим звучанием, но большей полифонией.

▍ Архитектура


Как и в Sega Genesis, звуковая система Super Nintendo представляет собой целый отдельный микрокомпьютер с собственным процессором, памятью и синтезатором звука.

Официальная блок-схема звуковой системы

Впрочем, выделена она гораздо сильнее, чем в Sega Genesis, где шина дополнительного процессора Z80 и звуковых устройств связана с общей системной шиной через арбитр шин, и основной процессор 68000 имеет прямой доступ к ОЗУ Z80, может перезапускать его, а также может сам управлять звуковыми устройствами — всё это было нужно для двойного назначения, не только для звука, но и для обеспечения обратной совместимости с Master System.

В SNES же звуковая система — практически чёрный ящик: полностью автономная, связанная с внешним миром, то есть остальной консолью, только посредством четырёх двунаправленных 8-битных портов ввода-вывода. Центральный процессор не может обратиться к её памяти, не может сам проиграть звук, или даже остановить или перезапустить звуковой процессор.

Во многих источниках звуковая система Super Nintendo в целом часто называется SPC700 или просто SPC. Точное происхождение этого наименования неизвестно — официальная документация лишь однажды упоминает, что в системе используется процессорное ядро серии Sony SPC700. Но называть так всю систему некорректно: SPC700 представляет собой именно ядро, систему команд процессора, которое является лишь частью всей системы, и само по себе не имеет отношения к звуку и не уникально для SNES: оно только управляет синтезатором звука.

Обзор характеристик звуковой системы в официальной документации

Система состоит из нескольких компонентов: 8-битного процессора S-SMP с архитектурой SPC700, аппаратного декодера и проигрывателя сжатых оцифрованных звуков S-DSP, общего ОЗУ объёмом 64 килобайта, а также ПЗУ объёмом 64 байта с начальным загрузчиком, так называемым IPL ROM.

При включении или перезапуске консоли процессор S-SMP начинает исполнять код загрузчика из собственного встроенного ПЗУ. Этот код обеспечивает связь с основным процессором через порты. С его помощью центральный процессор может передать звуковой системе код звукового «драйвера» в память звуковой системы и запустить его выполнение. Также в память по мере необходимости загружаются оцифрованные звуки. Как правило, это происходит при смене уровней.

Единственная точка синхронизации между системами — включение питания или сброс, коммуникация же между подсистемами чисто программная, и если что-то пойдёт не по плану, код звуковой системы зависнет, поможет только сброс — у центрального процессора нет средств возобновить его работу.

Код загруженного драйвера интерпретирует музыкальные данные, загруженные в звуковое ОЗУ и управляет S-DSP, который воспроизводит находящиеся там же сэмплы с нужной скоростью и громкостью, а также применяет характерный эффект реверберации, который является визитной карточкой игр на Super Nintendo.

Судя по всему, подобная связка из собственного стандартного ядра с архитектурой SPC500 (4-битной) или SPC700 (8-битной) и уникального для конкретной задачи DSP являлась стандартным решением для аппаратуры Sony. В частности, она использовалась в CD-проигрывателях их производства.

Чип S-APU, содержащий все компоненты звуковой системы

В оригинальной версии консоли S-SMP, S-DSP и их общее ОЗУ были представлены отдельными чипами, причём в американской версии они были смонтированы на отдельной дочерней плате. В последующих ревизиях эти компоненты были интегрированы в один чип под названием S-APU, а ещё позже вся аппаратура Super Nintendo была собрана в одном большом ASIC.

Столь обособленная архитектура звуковой системы позволила реализовать файловый формат SPC, используемый в эмуляторах Super Nintendo. Он содержит просто «снапшот» системы, содержимое звукового ОЗУ и текущее состояние регистров процессора S-SMP, которое может в любой момент сохранить эмулятор и воспроизвести отдельно стоящий проигрыватель. В один файл сохраняется одна композиция: содержимое сохранённой памяти системы настраивается таким образом, чтобы проиграть нужный трек с начала.

Такое решение не очень оптимально по расходу дискового пространства и совместимо не со всеми играми, так как некоторые из них общаются со звуковой системой в процессе игры и подгружают туда фрагменты данных музыкального трека. Тем не менее, оно до сих пор имеет большую популярность, и вот уже четверть века существует целый сайт snesmusic.org с архивами музыки, извлечённой в таком формате из множества игр для SNES.

▍ S-SMP


Микросхема S-SMP

В официальной документации для Super Nintendo процессорное ядро звуковой системы называется Sound-CPU, но на самой микросхеме написано S-SMP. Это скорее микроконтроллер, чем процессор, так как на его кристалле помимо процессорного ядра присутствуют и периферийные устройства.

Процессор является представителем архитектуры SPC700. Насколько мне известно, это проприетарная архитектура компании Sony, применявшаяся в разнообразной аппаратуре её производства. Рискну предположить, что буквы SPC означают что-то наподобие Sony Processor Core, но это лишь мои сомнительные догадки.

Страницы каталога микроэлектронной продукции Sony за 1996 год

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

У звуковой системы свой собственный генератор тактовой частоты, реализованный внутри S-DSP, а его кварцевый резонатор имеет частоту 24.576 МГц. Тактовая частота S-SMP составляет всего 1024 килогерц (1 мегагерц с копейками). Формирует её S-DSP, на нём есть соответствующий выход. Самые короткие операции (NOP и операции с регистром A) выполняются за два такта.

Опкоды SPC700 в мнемониках Sony

На первый взгляд ядро SPC700 выглядит чем-то совершенно кастомным, в основном из-за предложенной Sony системы мнемоник. Но стоит копнуть чуть-чуть глубже, и становится ясно, что это прямое развитие классического процессора MOS 6502, хотя и не совместимое на уровне бинарного кода — совпадает лишь часть опкодов.

Опкоды SPC700 в мнемониках 6502

Если записать мнемоники SPC700 в стиле 6502, архитектура становится гораздо понятнее. Она представляет собой нечто среднее между 6502 и 65816, с разнообразными полезными дополнительными операциями.

В частности, у SPC700 есть режимы 16-разрядной индексации регистровыми парами X:A и Y:A. Я бы сказал, что это расширение возможностей сделано даже лучше, чем в 65816, хотя не могу сказать ничего плохого и про него.

Регистры процессора SPC700

Вместо «Zero Page», как у 6502, тут есть аналогичная по назначению так называемая «Direct Page», которая может располагаться в нулевой или первой 256-байтной странице памяти, то есть в адресах $0000..$00FF или $0100..$01FF. Многие инструкции могут обращаться к памяти по сокращённому однобайтовому адресу внутри Direct Page, что уменьшает объём кода и работает быстрее полноценной адресации, как и у 6502.

Обе страницы ОЗУ, доступные в качестве Direct Page, частично заняты под другие нужды. По адресам $F0-FF в нулевой странице ОЗУ находятся регистры S-DSP и порты коммуникации, а в первой странице всегда располагается страница стека, как и у 6502.

Способы адресации памяти на SPC700

S-SMP подключается к ОЗУ не напрямую, а через S-DSP, который разделяет время доступа к памяти: ведь ему нужно читать из того же ОЗУ данные сэмплов для восьми каналов, не мешая работать процессору.

Физически память звуковой системы представлена двумя микросхемами PSRAM (псевдо-статическая оперативная память) объёмом 32 килобайта каждая, с организацией 32Kx8. Можно предположить, что две отдельных микросхемы памяти нужны для какого-то для разделения времени доступа. Тем не менее, их шины данных D0..D7 и адреса A0..A14 включены параллельно, раздельные только сигналы выборки чипа, для которых предусмотрены специальные линии S-DSP. Возможно на момент разработки память нужного объёма и быстродействия просто не производилась, а может быть, какое-то чередование всё же реализовано.

С объёмом памяти звуковой системы могут встречаться некоторые разночтения. Официальная документация упоминает объём 512K, подразумевая килобиты, а не килобайты — это 64 килобайта. Некоторые старые любительские исследования утверждают, что объём памяти всего 32 килобайта, или что вторые 32 килобайта зарезервированы только под буфер реверберации — всё это неверно. Дополнительную смуту вносит наличие у S-DSP незадействованной линии A15, что намекает на теоретически возможный объём звуковой памяти до 128 килобайт. Но у S-SMP дополнительных линий нет, только A0..A15.

Карта памяти звуковой системы

Из дополнительной аппаратуры на кристалле S-SMP есть три таймера и четыре порта коммуникации.

Таймеры функционально полностью одинаковы, но два из них тактируются частотой 8 кГц, а один — частотой 64 кГц. Их можно запускать и останавливать. Для каждого таймера задаётся 8-битный делитель его входной частоты, а переполнение счётчика циклически инкрементирует 4-битный регистр состояния таймера. Читать можно только эти 4-битные регистры. При чтении и переполнении регистр обнуляется, и таким образом чтением можно узнать, сколько раз переполнился счётчик за время между чтениями.

Порты устройств S-SMP

Коммуникация с основной системой происходит через четыре двунаправленных 8-битных порта. Это довольно плохо задокументированная часть системы с непонятными пограничными случаями, поэтому эмуляторы реализуют её по разному. Центральный процессор 65816 может писать 8-битные значения в четыре 8-битных регистра, а SPC700 может их читать из своих соответствующих портов. Также можно и наоборот, записывать в порты со стороны SPC700, а читать со стороны 65186.

При этом записанное одним процессором становится доступным другому, но не ему самому, и код коммуникации часто записывает только что считанный байт обратно в тот же регистр в качестве способа подтверждения получения байта. Если же оба процессора выполняют запись одновременно, возникнет конфликт с неопределённым результатом, и нужно предусматривать такую ситуацию в коде.

У SPC700 совсем нет никаких прерываний, поэтому состояние таймеров можно отслеживать только циклическим опросом. Таким же образом реализуется и коммуникация через двунаправленные порты.

▍ IPL


Полное содержание IPL ROM

IPL — важнейшая часть, необходимая для использования звуковой системы. Это ПЗУ с кодом начального загрузчика объёмом всего 64 байта, физически расположенное внутри микросхемы S-SMP.

Код IPL ROM при включении или сбросе располагается в самых верхних адресах адресного пространства S-SMP, замещая фрагмент ОЗУ, и процессор начинает работу с его выполнения. Впрочем, есть возможность получить доступ к этим 64 байтам ОЗУ, отключив IPL программно. после старта кода.

Коммуникационные порты

Код загрузчика очищает младшие 256 байт ОЗУ звуковой системы, устанавливает стек, выдаёт в коммуникационные порты сигнатуру готовности, и ожидает получения команд от центрального процессора.

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

Официальное описание протокола

Протокол загрузки выглядит следующим образом:

  • IPL выполняет инициализацию и выставляет в коммуникационных портах 0..3 сигнатуру $AA BB ?? ?? (последние два байта не определены). Основной процессор 65816, далее именуемый S-CPU, ждёт в цикле, пока в портах не появится эта сигнатура.
  • Когда сигнатура получена, S-CPU передаёт команду, записывая в порты 0..3 байты $CC XX YY ZZ, где последние три значения являются кодом команды и параметрами, а байт $CC является признаком команды. Записываются байты команды задом наперёд, то есть сначала адрес в порты 2-3, потом код команды в порт 1, и только потом признак $CC в порт 0.
  • Команд всего две: загрузить блок или запустить выполнение кода. YY и ZZ — это всегда 16-битный адрес в памяти S-SMP, а XX может быть равен 0 для запуска по этому адресу, или не 0 для загрузки блока. После этого S-CPU ждёт подтверждения команды — появления признака $CC в том же порте 0 (IPL запишет его назад).
  • Если передана команда пересылки блока, IPL входит в цикл приёма данных блока. Это наиболее критичная часть процесса.
  • S-CPU пишет первый передаваемый байт в порт 1 и значение 8-битного счётчика, который на старте передачи равен 0, в порт 0, а потом ожидает, пока значение, читаемое из порта 0, станет равно только что записанному. Первый байт передан. Далее S-CPU должен максимально быстро записать второй байт в порт 1, увеличить счётчик на 1, записать его значение в порт 0, и подождать появления такого же значения в порте 0.

Процесс продолжается циклически до передачи всех байт. Если записать в порт 0 байт меньшего значения, чем предыдущий, или выполнить передачу следующего байта чуть позже, процесс передачи прекращается. IPL снова переходит в режим ожидания признака команды. Таким образом можно передать один большой блок или много блоков разного размера по разным адресам, после чего запустить исполнение загруженного кода с нужного адреса.

Далее загруженный код реализует собственную коммуникацию с S-CPU и систему команд — запустить музыку, проиграть эффект. и так далее. У кода есть возможность снова запустить IPL и процесс передачи блоков, он может сделать это по приёму специальной команды.

Большинство игр используют стандартный протокол загрузки IPL и для подгрузки сэмплов и музыки между уровнями. Игры Super Nintendo отличается довольно медленной сменой локаций, иногда они «загружаются» удивительно долго для картриджной системы — в версии игры Batman Forever для SNES даже есть надпись «HOLD ON» при смене локаций. И скорость загрузки данных в звуковую память является одной из причин этой медлительности.

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

Также IPL позволяет реализовать трюк, позволяющий вообще не изучать архитектуру S-SMP и работать с S-DSP только с помощью основного процессора, несмотря на то, что регистры S-DSP недоступны напрямую: можно передавать с помощью IPL двухбайтовые блоки прямо в адреса регистров S-DSP для записи каждого регистра. Это далеко не самый оптимальный, но вполне рабочий вариант.

▍ S-DSP


Микросхема S-DSP

Наконец, самая главная часть звуковой системы Super Nintendo, то, чем она издаёт звук — S-DSP. Так написано на чипе, а в документации он именуется просто DSP. Вероятно, это тот самый компонент, который разработал Кен Кутараги лично, либо инженеры Sony под его руководством.

S-DSP не является синтезатором в том смысле, что он не создаёт звук из ничего, из набора параметров, как FM или PSG-синтезаторы в Sega Genesis. Вместо этого он воспроизводит заранее записанные фрагменты звука. Это могут быть любые реальные инструменты и синтезаторы, в том числе даже FM — в некоторых играх даже можно встретить точно такие же тембры, какие можно услышать на Genesis.

Самым главным ограничением этой системы является объём звуковой памяти: всего 64 килобайта. При обычном подходе это всего полторы секунды звучания в наилучшем качестве или восемь секунд в совершенно ужасном. Чтобы экономить драгоценную память, у S-DSP есть целый арсенал возможностей.

График из документации, иллюстрирующий ADPCM-сжатие

Прежде всего, это аппаратное сжатие сэмплов с потерями. Они хранятся в местной версии формата ADPCM, называемого в официальной документации BRR, Bit Rate Reduction. Сжатие работает пакетами по 16 монофонических 16-битных отсчётов, кодируя их в блоки размером 9 байт. Коэффициент сжатия получается фиксированным, 3.56:1. Кодировка сэмплов производилась программными средствами разработки Sony, так как эта компания долгое время, до широкого внедрения MP3, была пропонентом вариаций формата APDCM.

Максимальная частота дискретизации сэмплов, поддерживаемая S-DSP — 32 килогерца. В реальности игры использовали меньшие частоты, отличающиеся для каждого сэмпла в зависимости от характера его содержания. Это также делалось для оптимизации расхода памяти.

Устройство одного канала S-DSP

Чтобы не хранить сэмплы каждой нужной для мелодии ноты и каждого инструмента, S-DSP позволяет получать их из одного и того же сэмпла, меняя скорость воспроизведения: чем быстрее воспроизводится звук, тем выше он звучит, а чем медленнее — тем ниже. Градаций возможных скоростей очень много, что позволяет точно попадать в довольно широкий диапазон нот.

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

S-DSP умеет воспроизводить звук только вперёд, а также зацикливать часть сэмпла, но только по границам пакетов, что вносит определённые сложности в подготовку зацикленных сэмплов: позиции обеих точек цикла должны быть кратны 16 отсчётам.

ADSR-огибающая S-DSP

Также S-DSP поддерживает стандартную амплитудную огибающую формата ADSR: можно выбрать 16 скоростей нарастания до максимума, затухания до указанного уровня и полного затухания сэмпла, а также скорость затухания при досрочной остановке. Это позволяет делать более интересно звучащие инструменты с коротким циклом, то есть занимающие мало памяти.

С учётом ограниченной памяти возможности звуковой системы Super Nintendo хорошо подходят для имитации реалистичных аранжировок, оркестровок, музыки с отрывистым звучанием. Не очень хорошо работают протяжённые во времени тембры, память не позволяет хранить длинные звуки, а S-DSP не позволяет использовать двунаправленный цикл, лучше маскирующий точку зацикливания.


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

Карта регистров S-DSP

S-DSP управляется примерно сотней регистров, организованных довольно логичным и удобным образом. В памяти S-SMP для доступа к ним отведены всего два адреса: в один записывается номер регистра S-DSP, в другой — значение для выбранного регистра.

Каждому из восьми голосов отведено по 9 регистров: громкость левая и правая, 14-битная скорость воспроизведения (высота звука), номер сэмпла в таблице, 4-битные параметры ADSR-огибающей.

Также есть общие настройки S-DSP: глобальная громкость (левый и правый каналы), громкость эффекта реверберации, запуск и остановка каналов, настройки реверберации (расположение буфера, параметры фильтра), указатель на список сэмплов, и некоторые другие

Ещё у S-DSP есть пара интересных, но преступно редко используемых возможностей: генератор белого шума и эффекты модуляции одного канала другим, что создаёт некоторое подобие FM-синтеза.

Генератор шума один, общий для всех каналов. Он имеет 32 варианта «высоты» шума (аналогично PSG). Шум может быть включён в любом из восьми каналов вместо сэмпла-источника, и к нему также можно применять модуляцию. Его использование можно слышать в играх Capcom, Squaresoft и других компаний. В F-Zero это шум двигателя, в Super Mario RPG — звук водопада, а в Donkey Kong Country — шипение змей.

Работу эффекта модуляции можно услышать ушами в играх Secret of Mana и Waterworld. Модуляция использует пару каналов, и её можно включить для любого из для семи каналов. Когда она включена, предыдущий канал становится модулятором. При этом можно выставить его громкость в 0, чтобы не слышать модулирующий звук, а можно оставить слышимым. В зависимости от громкости канала-модулятора меняется скорость проигрывания другого. Чем выше громкость, тем сильнее влияние. Таким образом, сэмпл синусоиды в одном канале позволяет создать эффект вибрато для любого произвольного сэмпла в другом канала, а скорость проигрывания сэмпла в канале с синусоидой будет определять скорость вибрато.

Наконец, S-DSP реализует весьма узнаваемый, характерный эффект звучания игр на Super Nintendo — реверберацию. Её можно слышать во множестве игр с разными настройками. Фактически это скорее не реверберация, а подвид эхо, «дилея» — эффект задержки с циклической записью обратно в монофонический буфер с применением 8-точечного FIR-фильтра. Громкость сигнала, поступающего из буфера на выход, регулируется отдельно.

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

Также возможно сделать трюк и применить фильтр реверберации к основному выходу звука. Для этого нужно установить сверх-короткий буфер длиной в один отсчёт (фильтр имеет свой буфер вне ОЗУ), убрать громкость основного выхода, установить полную громкость выхода реверберации. Этот же трюк позволяет воспроизводить несжатое аудио, например, синтезируемое на S-SMP или получаемое из картриджа сверх-большого объёма: 16-битные стерео отсчёты можно записывать прямо в буфер реверберации, откуда их подхватит S-DSP и отправит на выход.

Комбинация всех доступных S-DSP эффектов и возможностей сильно обогащает звучание коротких сэмплов в играх, создавая характерное узнаваемое звучание Super Nintendo.

Звуковая система PlayStation хотя и отличается в деталях реализации, но концептуально представляет собой развитый количественно (число каналов, объём памяти) вариант S-DSP. Главным её отличием является отсутствие аналога S-SMP, его роль там играет центральный процессор.

▍ Драйверы


Как и на Sega Genesis, и на других консолях, сама по себе звуковая система не умеет воспроизводить музыку, и просто ничего не знает о такой высокоуровневой концепции — она оперирует отдельными звуками. Превращает набор сэмплов и поток музыкальных данных в музыку так называемый «драйвер», загружаемая в звуковую память программа, выполняемая S-SMP и управляющая S-DSP.

На Sega Genesis драйверы сильно отличались по возможностям и качеству звука: драйвер мог поддерживать или не поддерживать часть возможностей железа, в том числе приличную часть каналов синтезатора.

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

И тем не менее, разных звуковых драйверов на Super Nintendo существуют сотни. Энтузиасты составили огромный их список, прочитать который можно здесь.

Одним из самых главных и часто используемых драйверов является так называемый N-SPC. Название это, вероятно, было изобретено энтузиастами. Драйвер был частью пакета разработки самой Nintendo, включавшей ПО для создания звуков и музыки на компьютерах Sony NEWS (рабочая Unix-станция на процессоре 68030).

По обрывочной информации, в пакет входили программы Tako Sample для записи и Ika Listen для прослушивания получившихся сэмплов на железе. Музыкальный текст готовился в секвенсоре «Kankichi-kun», позволяющем записывать партии с MIDI-входа и оптимизировать их для использования в играх, или в формате текстового MML-скрипта. Более точных сведений или самого ПО энтузиастами пока обнаружено не было.

Ответственен за создание драйвера предположительно Юкио Канэока, композитор и разработчик компании Nintendo, сочинивший немало музыки для игр на Famicom, а последний раз его имя упоминается в игре F-Zero 1990 года для SNES, в которой он вероятно делал именно код, но не сочинял музыку.

Изначально это был не готовый драйвер, а просто пример кода, показывающий воспроизведение только музыки. Так как других примеров не было, а задача сложная — освоить целый новый процессор и DSP — многие разработчики, и японские, и западные, брали его за основу и дорабатывали для нужд конкретных игр, добавляя поддержку возможностей и звуковых эффектов.

Девкит от Intelligent Systems, включающий IS-SOUND

Также известно, что вариант драйвера N-SPC, доработанный Кеничи Нишимаки, применялся в девките IS-SOUND разработки Intelligent System, дочерней компании Nintendo, которая разработала специализированные рабочие станции для создания музыки, графики и кода для SNES, и потом в его обновлённой интегрированной версии «Super NES Emulator» (название подразумевает аппаратный эмулятор).

Не у всех разработчиков был доступ к полному комплекту ПО, а только исходник драйвера N-SPC и одиночные сэмплы. Тогда они писали собственные конвертеры из удобных им форматов, или саму музыку прямо в ассемблерном исходнике, в виде множества блоков типа DB, а также дорабатывали драйверы под свои нужды.

Всёэто привело к появлению доброй сотни подвидов одного только этого драйвера. Разбор получившегося хитроумного генеалогического древа — задачка, достойная отдельной статьи.

Трекер Octamed на Amiga

Отдельный интересный случай — опыт Альберто Гонзалеса, который имел доступ к IS-SOUND и Kankichi-kun, но сочинял музыку в более удобном для него трекере Octamed на компьютере Amiga, после чего воспроизводил музыкальные партии из него через MIDI-выход компьютера и таким образом переносил их в секвенсор.

Аппаратная часть системы SLICK/Audio

Также довольно широко использовалась звуковая система SLICK/Audio разработки Bitmasters. Она состояла из программного обеспечения и карты расширения для ПК, кабеля и специального картриджа. Концептуально работа с ней была похожа на GEMS для Sega Genesis: подготавливаемую с помощью MIDI-партий на ПК музыку можно было сразу прослушать на реальной консоли.

Другие разработчики и компании тоже делали свои трекеры, конвертеры, а также полностью оригинальные драйверы, которых существует также довольно много, около сотни. Однако, различить их все на слух гораздо сложнее, чем в случае с Sega Genesis, поэтому отдельного разбора примеров звучания я не привожу.

Отличия драйверов могут заключаться в архитектуре: одни играют музыку самостоятельно, а другие только транслируют команды для передачи S-DSP, которые подаёт центральный процессор. Данные музыки и сэмплы могут загружаться однократно, а могут динамически подгружаться по мере надобности. Некоторые драйверы умеют передавать поток звуковых данных из ПЗУ картриджа — так сделана впечатляющая вокальная партия в начальной заставке игры Tales of Phantasia.

Также отличия касаются реализации звуковых эффектов. Многие драйверы не умеют динамически разделять каналы между звуковыми эффектами и музыкой, выделяя, например, шесть каналов на музыку и два на эффекты. Другие способны прерывать звучание каналов музыки на время проигрывания эффекта. Некоторые драйверы реализуют эффекты чисто сэмплами, а другие используют секвенции и несколько простых сэмплов, подобно звуковым эффектам на 8-битных компьютерах (например, игры Capcom).

Ещё одно заметное отличие касается применения реверберации.Некоторые игры накладывают её на весь звук, другие не используют вовсе, третьи меняют динамически в процессе игры — как в Donkey Kong Country.

▍ Наши дни


Удивительно, но любительская разработка для Super Nintendo взяла старт очень рано, ещё во времена активной коммерческой жизни платформы в начале 90-х годов, даже до появления первых программных эмуляторов. Случилось это благодаря появлению «копировщиков», устройств, позволяющих сохранять образы картриджей на дискеты и загружать их.

С появлением эмуляторов, впрочем, энтузиазм к платформе упал, так как к тому времени она уже перешла в категорию ретро, и к тому же оказалась весьма сложной в освоении. Несмотря на устойчивый интерес энтузиастов к ретро-деву, для Super Nintendo до сих пор появляется очень мало любительских проектов, в частности, из-за отсутствия удобных и надёжных средств разработки. У Sega Genesis с этим гораздо лучше.

Тем не менее, за годы существования homebrew-сцены были созданы разнообразные решения в том числе и для озвучивания игр или создания отдельно прослушиваемой аутентичной музыки в стиле Super Nintendo, и я коротко пройдусь по основным из них.

Начиналось всё с конвертеров из трекерных форматов: XMSNES (2006), IT2SPC и его наследник SNESMOD (2009). Эти конвертеры принимают созданные по определённым правилам 8-канальные трекерные модули, с рядом ограничений, и конвертируют их в SPC-файл. Не самое подходящее для игр решение, так как каждый музыкальный трек использует свой набор сэмплов и отсутствует (развитая) поддержка звуковых эффектов.

Когда я занялся разработкой для SNES в 2011 году, на первое время я тоже разработал аналогичное решение, с конвертором XM-модулей, но с собственным драйвером, поддержкой мульти-трековых композиций — несколько мелодий в одном файле с общим набором сэмплов, и поддержкой секвенций для звуковых эффектов. Иначе говоря, эффекты тоже представляют собой мелодии, только короткие и одноканальные: это позволяет создавать разнообразные сложные звуки, используя всего несколько коротких сэмплов.

Интерфейс SNES GSS последней версии

Позже, в 2014 году, на основе элементов своего предыдущего драйвера я разработал более продвинутую систему SNES GSS (Game Sound System) для игр, которые делал для BubbleZap. Она имеет свой кросс-трекер, конвертер сэмплов, и поддержку всего, что необходимо для игр. Из недостатков — минималистичный пользовательский интерфейс, в нём есть только то, что действительно необходимо для решения задачи.

Интерфейс snestracker

Была попытка создания кросс-трекера под названием snestracker, велась активная PR-компания с платными бета-версиями, футболками и планами на кампанию на Kickstarter. К сожалению, этот проект развивается крайне медленно. Он был начат десять лет назад, в 2015 году, а последняя демо-версия вышла пару лет назад и показывала не самый убедительный результат — частично функциональный редактор с примитивным полутекстовым интерфейсом.

Интерфейс Furnace и трек для SNES

Конечно, самый развитый на данный момент кросс-трекер с поддержкой SNES — многоплатформенный трекер-комбайн, Furnace. К сожалению, он до сих пор страдает значительной проблемой: хотя в нём поддерживается невероятное количество звуковых чипов и платформ, для большинства из них не реализован экспорт в применимые на реальных устройствах форматы. В том числе не предусмотрен экспорт и для SNES. Впрочем, существует попытка решения этой проблемы в лице конвертера furSPC, но полноценная поддержка возможностей трекера в нём пока не реализована.

Помимо трекеров, есть и отдельные звуковые драйверы. Так, в 2017 году был создан qSPC, компилятор MML-скриптов для SNES, ориентированный на создание просто музыки. А в 2023 году появился аналогичный проект с компилятором MML — Terrific Audio Driver, но уже предусматривающий применение в играх. Здесь также применяется идея с общим набором сэмплов. Для звуковых эффектов доступно только два канала, предусмотрена поддержка 8-канальной музыки с заглушением каналов на время воспроизведения звуковых эффектов.

Редактор EbMusEd

Есть редакторы, предназначенные для замены музыки в отдельных играх, ориентированные на конкретные коммерческие драйверы прошлых лет. Например, EbMusEd — редактор музыки для игры EarthBound, использующей один из подвидов драйвера N-SPC. Но они не подходят для новых разработок по причине существования авторских прав: Nintendo весьма ревностно относится к своей интеллектуальной собственности, даже настолько древней.

Интерфейс VSTi-плагина C700

Также существуют и другие способы создания музыки для реальной SNES. Например, VSTi-плагин C700 для современных цифровых студий. Он эмулирует звуковую систему и загруженные в её память BRR-сэмплы, позволяет управлять ей при помощи MIDI-дорожки, а также захватывать управляющую дорожку, конвертировать в нужный вид, и экспортировать SPC-файл, который далее можно проиграть на самой консоли.

Помимо музыкальных редакторов, несколько слов стоит уделить проекту MSU-1. Это виртуальный «чип расширения», призванный дать SNES возможности, аналогичные тем, которые изначально были заложены в проекте Nintendo PlayStation: поддержку носителя большого объёма (до 4 гигабайт), воспроизведение звука CD-качества и видеороликов. Изначально этот проект был реализован в эмуляторах, и для него было адаптировано несколько игр. В основном они заменяют синтезируемый звуковой системой саундтрек на полноценные аудиотреки высокого качества, но есть также игры с видеовставками. Позже поддержка игр для MSU-1 была реализована и на Flash-картридже SD2SNES, и таким образом их можно запускать даже на реальном железе.

▍ Заключение


Тема звуковых возможностей двух основных 16-битных платформ раскрыта. Но цикл на этом не обязательно завершается. Ведь есть и другие платформы с другим количеством бит, и с по своему интересными звуковыми возможностями. Например, всеми любимый ПК и ранний период становления концепции «звуковой карты». Или отечественные ПК и их своеобразный подход к реализации звука. А значит, есть поводы для продолжения цикла!

© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+73
Комментарии11

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds