EN
shiru8bit
shiru8bit
22 subscribers

В глубинах Super Nintendo #3: звуки музыки

Одно из самых заметных различий между конкурирующими организациями, Super Nintendo и Sega Genesis, заключается в звуке.
Всем известно, что у этих консолей принципиально разные звуковые синтезаторы, выдающие сильно отличающееся звучание. Можно сколько угодно спорить, какой из них хуже или лучше, но по сути это дело вкуса, или же соответствия конкретной задаче. Например, более реалистичный симфонический оркестр скорее всего получится на Super Nintendo, но и Sega Genesis может изобразить его неплохую синтетическую версию (см. Rocket Knight Adventures). С другой стороны, музыка в жанре техно отлично удаётся на Genesis, что показывают многочисленные работы Jesper Kyd’а, но и SNES тоже кой-чего может (Disco Train в DKC2).
Но есть сторона, которую слушатель не видит и не слышит: техническая подоплека, а именно, система управления звуковым синтезатором. Сам по себе синтезатор, будь это YM2612 или S-DSP, не играет музыку. Он, собственно говоря, только синтезирует заданные звуки. Руководит же синтезом тех или иных звуков иная сущность: микропроцессор, выполняющий программу по преобразованию закодированной нотной партитуры (отдалённого подобия MIDI) в команды управления синтезатором звука. И здесь между Genesis и SNES наблюдаются довольно большие различия.
В целом концепция у этих двух платформ, как и у иных современных им решений, схожа: звуковая система состоит из синтезатора, отдельного микропроцессора и отдельного же ОЗУ. Она может работать независимо от основного процессора и игры, в режиме «чёрного ящика»: игра только запрашивает у звуковой подсистемы запуск нужной мелодии и звукового эффекта, а загруженный в звуковую подсистему код (так называемый «звуковой драйвер») делает всё, что нужно сделать. Но есть и принципиальные различия в реализации этой идеи.
У Sega Genesis есть и отдельный процессор Z80, и его собственное ОЗУ объёмом 8 килобайт. Основной процессор может остановить работу Z80, загрузить непосредственного в его ОЗУ, которое видно в общем адресном пространстве, нужный код, и запустить Z80 заново. Код Z80 может управлять звуковыми синтезаторами, которых целых два: продвинутый FM-синтезатор YM2612 и классический 8-битный PSG SN76489. Сам Z80 может обращаться к ПЗУ картриджа через окно в 32 килобайта, с переключением банков (медленным и странным, но всё же).
Дело в том, что Z80, его ОЗУ, SN76489 и к тому же некоторые режимы видеоконтроллера в Genesis присутствуют не для звука, а для обеспечения аппаратной обратной совместимости с предыдущей 8-битной Sega Master System. Можно вставить её картридж через переходник Power Base (или запустить на Flash-картридже Everdrive), и приставка перейдёт в конфигурацию Master System.
Таким образом, Z80 в Genesis не предназначен именно для управления звуковой системой. Основной процессор без проблем может работать с синтезаторами звука напрямую, и некоторые игры, в основном ранние, именно так и делают. Но в применении Z80 есть бонус в виде освобождения основного процессора от части нагрузки, поэтому многие игры всё-таки его задействуют. Дело в том, что YM2612 из-за особенностей своей внутренней архитектуры (мультиплексирования каналов) не может принимать команды сразу же, сначала нужно подождать готовности чипа, и на это тратится довольно много времени впустую.
У SNES же всё иначе. Звуковая система состоит из синтезатора S-DSP, который умеет играть сжатые сэмплы с нужной скоростью, ОЗУ объёмом 64 килобайта (не верьте другим цифрам) и процессора S-CPU (он же SPC700). Процессор здесь изначально предназначен исключительно для задачи управления синтезатором. Если Z80 в Sega Genesis при желании легко можно задействовать как сопроцессор для решения любых задач, с SPC700 такой трюк провернуть гораздо сложнее.
С точки зрения разработки homebrew это один из тех нетривиальных моментов «как не у всех», повышающих порог вхождения.
Для начала, процессор звуковой системы SNES очень необычный, Sony SPC700. На самом деле это продвинутый клон классического 6502, но в официальных мнемониках его код крайне трудно опознать. Ассемблеров, умеющих собирать код под этот процессор, мало, но к счастью, среди них есть один, поддерживающий мнемоники в стиле MOS — старый bass.
Знание ассемблера же и архитектуры этого процессора очень даже может пригодиться, так как почти нет готовых решений для добавления звука в игры. Есть решения, ориентированные только на музыку, типа XMSNES и IT2SPC, но из-за архитектуры системы просто так добавить поддержку звуковых эффектов в них не выйдет, она должна быть заложена глубоко в основе. Именно для игр вроде бы до сих пор есть только мой SNESGSS, разработанный для Hind Strike, но этот проект не очень-то совершенен.
Звуковая система SNES гораздо более обособлена. Она общается с внешним миром всего через четыре двунаправленных 8-битных регистра, а не через память. Прямого доступа к звуковой памяти у центрального процессора SNES вообще нет, загрузка данных в эту память идёт через очень медленный и печальный протокол программного загрузчика, так называемого IPL, который хранится в 64-байтовом ПЗУ SPC700. Можете назвать этот код своего рода звуковым BIOS, а заодно сказать ему спасибо за долгие паузы при смене экранов в играх — это загружается музыка.
Основная сложность озвучивания игр на SNES заключается в том, что в 64 килобайта звуковой памяти должны как-то умещаться и код драйвера, и данные и сэмплы для звуковых эффектов, причём экстремально компактные, а также сэмплы и данные для музыки, а возможно и буфер местной реверберации. И нельзя просто так взять и дозагружать или стримить сэмплы для эффектов из ПЗУ картриджа по мере надобности, так как загрузка даже эффективной заменой кода из IPL не особо быстрая.
Дополнительно есть хитрость с самими сэмплами. Синтезатор SNES умеет играть исключительно сжатые методом ADPCM 16-битные сэмплы и ничего другого. Местная схема ADPCM, называемая BRR, сжимает звук пакетами по 16 отсчётов. А значит, нельзя зациклить сэмпл на произвольную точку — только на кратную 16-ти. Нельзя и проиграть его в обратном направлении. До кучи, сжатие пропускает звук через фильтры, что придаёт ему характерную глуховатую окраску. Инструменты прошлых лет не имели возможности компенсировать эту проблему. В SNESGSS я добавил эквалайзер в пред-обработку, чтобы можно было задрать верх и убавить низ, и таким образом получать более-менее яркое звучание.
Помимо прочего, 8 каналов для цифрового звука — вроде бы много в сравнительных цифрах, но не так уж много на практике. Стандартные для 8-битных игр трюки с маскировкой более важных звуков менее важными не работают для цифрового звука. Необходимо очень хорошо планировать использование имеющихся ресурсов. Например, отдать 6 каналов для музыки и 2 канала для звуковых эффектов, но тогда звуки будут часто мешать друг другу. Лучше бы сделать 4 канала на эффекты, но тогда остаётся только 4 канала на музыку, и сделать хорошо звучащую музыку становится труднее. Можно смешать часть сэмплов для музыки в пары (типа одновременно звучащей бочки и хэта), как часто делали на Амиге, но тогда надо больше ОЗУ для сэмплов. Сплошные компромиссы.
Тем не менее, будущее показало перспективность общего направления, выбранного в SNES. В консолях последующих поколений FM-синтезаторы, к моему сожалению, ушли в прошлое, а вместо них использовались использовались аналогичные SNES, но более развитые решения. Например, в той же Sony PlayStation. Но это уже совсем другая история.
avatar
Братан, крутая тема. Надеюсь - доживу до такой же статьи на пце.
avatar
Как ты считаешь, учитывая что направление развития звуковой системы в SNES оказалось более перспективным, подход инженеров Sega тоже имеет право на существование?
Show more replies
avatar
shiru8bit, интересно! Пожалуй именно по этому саундтреки к Сеговским играм навсегда в моём сердце!
avatar
Санёк Сушка | Саня, Тащи!, мне тоже очень нравится то, что по звуку можно практически однозначно сказать, что это саундтрек именно с Сеги. И тот же Comix Zone мне очень нравится именно в этом грязном синтетическом звучании, а живые версии с CD OST как-то совсем не заходят. Или музыка в Rock'n'Roll Racing - оригиналы этих хитов мне не особо интересны, а местные каверы я даже когда-то записывал на кассету, чтобы переслушивать.

Subscription levels

No subscription levels
Go up