Что такое 8 битная музыка
8 бит (музыкальный жанр)
8 бит (англ. 8-bit ) — музыкальный жанр, для которого характерен электронный звук, напоминающий тот, что применялся в игровых приставках (Dendy, NES, Sega Master System и др.) или домашних компьютерах на основе восьмиразрядных процессоров (Z80, 6510): ZX Spectrum, Commodore 64 и др. Разновидность электронной музыки.
Особенности стиля
Для музыки этого стиля характерен высокий темп, разнообразные партии ударных в стиле Aphex Twin, полифония, а также часто меняющиеся музыкальные темы.
Обложки альбомов музыки в данном стиле обычно выполнены в ярких красках, в стиле крупнопиксельной графики. Тематика рисунков на них, как правило, связана с роботами, механикой, космосом или восьмибитными играми. Надписи на обложках иногда стилизуются под ASCII-арт.
См. также
Ссылки
Полезное
Смотреть что такое «8 бит (музыкальный жанр)» в других словарях:
Хип-хоп (музыкальный жанр) — Это статья о хип хопе как о музыкальном жанре. Если вы ищете статью о субкультуре, см. Хип хоп (субкультура) Хип хоп Направление: популярная музыка Истоки: фанк, диско, соул, регги, spoken word Место и время возникновения … Википедия
Металл (музыкальный жанр) — Класс химических элементов описывается в статье металлы. Метал Направление: Рок Истоки: Хард рок, Прогрессив рок Место и время возникновения: Начало 1970 х … Википедия
8 бит — Запрос о восьми битах мог относиться к следующим значениям: октет (информатика), он же байт 8 битный цвет 8 бит (компьютерная архитектура) Третье поколение игровых систем о 8 битных приставках. Об эстетике игр для 8 битных приставок… … Википедия
Свинг (жанр) — Предположительно, эта страница или раздел нарушает авторские права. Её содержимое, вероятно, скопировано с www.e reading.org.ua практически бе … Википедия
Чиптюн — MOS 6581 и 8580 звукогенераторы компьютера Commodore 64 Чиптюн (англ. chiptune) музыка, в которой звук синтезируется аудиочипом в реальном времени компьютер … Википедия
Чиптюны — MOS 6581 и 8580 звукогенераторы компьютера Commodore 64 Чиптюн (от англ. Chiptune) музыка, в которой звук синтезируется аудиочипом в реальном времени компьютером или игровой приставкой, обычно ранних поколений, а не набором музыкальных сэмплов,… … Википедия
Covox — Схема Covox Covox Speech Thing (также известное, как Covox plug, обычно называемое просто Covox) внешнее устройство, подключаемое к компьютеру, позволяющее воспроизводить цифровой звук. Технически оно представляло собо … Википедия
Музыка в видеоиграх — Музыка в компьютерных и/или видеоиграх это любые мелодии, композиции или саундтреки видеоигр. Содержание 1 История 1.1 Ранние технологии: музыка на интегральных схемах … Википедия
Рок-музыка — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете … Википедия
История 8-bit музыки
Многие из тех, кто родился на рубеже 80х-90х, наверняка застали популярные компьютеры ZX Spectrum и игровые консоли Dendy и SEGA. Многие помнят характерное звучание музыки из старых видеоигр. Некоторым людям эти звуки полюбились настолько, что на их основе сформировался пласт собственной музыкальной культуры. Сhiptune и 8-bit стали названиями целых музыкальных жанров. Жанров, возникших на базе тех простеньких мелодий, что сопровождали приключения супербратьев Марио или отважных спецназовцев из подразделения «Контра».
В плане музыки чиптюном называется музыка, которая делалась изначально на базе чипа от приставки, с помощью самой приставки или хотя бы эмулятора.
8-бит же — музыка, сделанная уже на компьютере с помощью программного обеспечения, например FL Studio.
Откуда взялись эти звуки?
В конце 80-х началась тихая замена аркадных игровых автоматов на компьютеры (ZX Spectrum, Commodore 64, Atari, Amiga) и приставки – те самые Nintendo, Gameboy, Sega.
Тогда в домашних компьютерах и игровых приставках чаще всего использовались восьмиразрядные процессоры, выдающие, в частности, тот самый резковатый, булькающий, хлопающий и шипящий звук, который складывался в относительно простенькие мелодии. Иногда и в более сложные. «Инструментами» оказывались звуковой чип и специальная программа, на которой выстраивались параметры каждого звука и их последовательность, часто состоящая из четырёх каналов.
Звуковой чип MOS 6581 — микросхема, выполняющая функцию программируемого звукогенератора, использовавшаяся в бытовых компьютерах фирмы Commodore International. Она была одной из первых микросхем подобного типа, предназначенных для использования в бытовых компьютерах, до появления у них возможностей воспроизведения цифрового звука.
Мелодия генерируется звуковым чипом в режиме реального времени. Поскольку чипы тех времён не могут состязаться в мощности с современными звуковыми картами, звук, который они воспроизводят, получается очень специфическим. Старинные чипы выдают тот характерный, скрипучий и прыгающий саунд восьмидесятых и девяностых: все эти «пыщ-пыщ», «дрын-дрын» и «бвоп-бвоп».
Закончим с частью истории происхождения звука, перейдем непосредственно к жанровым исполнителям.
Направления 8-bit музыки:
Исполнители chiptune
Свойство музыкантов, работающих на этой сцене, — даже не специфический звук, а оборудование, которое они используют. Большинство исполнителей старой школы борются за чистоту звучания и потому берут в студию и на концерты настоящую старую электронику. В основном используется устаревшая продукция компании Nintendo: приставки Game Boy и NES. Также в ходу такие компьютерные системы, как Commodore 64.
Использование восьмибитных устройств (приставки, компьютеры), программ-трекеров и специфической четырёхканальной записи. Музыка исключительно инструментальная. В той или иной степени chiptune представляют такие проекты, как Anamanaguchi, Sabrepulse, Goto80, Xinon, 8 Beat Weapon, Nullsleep, Kola Kid. Далеко не все из них являются «чистым чиптюном», но сейчас это довольно не часто встречающаяся разновидность подобной музыки.
Исполнители 8-bit
8-bit — это музыка, родственная chiptune, растущая из тех же корней, но на самом деле это несколько другое явление. Используются возможности современных компьютеров и оборудования, традиционные синтезаторы и сэмплеры. Здесь главное – это воссоздание именно такого звучания из старых компьютеров и приставок. Сам по себе звук.
8-bit — явление более широкое, на самом деле это очень большая среда, которой не так легко дать чёткое определение, поскольку сюда обычно вносят «всё», включая периферийные стили, которые развились из 8-bit, обзаведясь своими характерным приметами и являясь уже несколько «отдельной песней». В чистом виде – полностью электронная музыка с высоким темпом, не очень выделенной ритм-секцией и «высоким» частотным диапазоном, чаще всего – без вокала. Crystal Castles, Bondage Fairies, You Love Her Coz She’s Dead, Dubmood, 777minus111, colonopenbracket, Uoki-Toki, Dasaev, Constructorr, Covox, Desert Planet. Это далеко не полный список.
bitpop — восьмибитный вариант lo-fi pop
Существует здесь и своя, очень специфическая поп-музыка – bitpop. Поп-мелодии, вокал (довольно мягкий), традиционные инструменты (по большей части электронные). При том, что это, в общем-то, поп-музыка, она всё же довольно своеобразная, и её основная аудитория – это отнюдь не широкие массы, которые слушают «обычную» поп-музыку. Всё-таки известная доля сарказма по отношению к 8-bit делает своё дело (автор этих строк не раз выслушивал, если так можно выразиться, отрицательные отзывы, в которых «у меня на приставке в детстве такой звук был» означало именно плохое качество звука), да и звук, наверное, для многих резковат, а местами чуть примитивен. Здесь себя неплохо проявляют She, Welle: Erdball (bitpop, но почти исключительно чиптюновыми методами), YMCK, 50 Hertz, Trash80, Pluxus. Можно было бы назвать эту музыку именно таким «восьмибитным» вариантом lo-fi pop, аналогичным таковому в традиционной инструментовке, но в основе своей имеющий всё же 8-bit и chiptune.
Тяжелый жанр (Гитарные партии плюс 8-bit)
Ну, разумеется, куда уж без «тяжёлого» жанра? Довольно популярные на самом деле Enter Shikari или «создатели стиля» Horse The Band представили на суд слушателя сочетание звуков из старых компьютеров и консолей с утяжелёнными гитарами, агрессивным вокалом и настроем традиционного, в общем-то hardcore / punk / metalcore. Это уже достаточно далеко от танцевальной электроники, да и самой электроники здесь уже не так на самом деле много. Многие могут просто не заметить подобных экспериментов, если сравнивать с 8-bit вообще, поскольку чаще всего здесь большая часть состава по инструментам традиционна. Помимо двух «гигантов жанра» здесь работают 64 Revolt, I See Stars, As The World Fades. И ещё масса других персонажей, конечно же. Стиль на самом деле огромен, если это вообще можно обозначить, как стиль музыки (8-bit вообще кто-то определяет, как этакий «жанровый контейнер»).
Отдельная дисциплина (кавер версии)
Отдельной строкой стоит выделить такое явление, как кавер-версии, когда либо музыка из восьмибитных игр (Super Mario, Sonic The Hedgehog, Commando и тому подобных) переигрывается на традиционных инструментах, либо традиционная по сочинению музыка переводится в 8-bit. Это можно было бы назвать даже некоторой «отдельной дисциплиной». Всё это получило большое распространение, причём, нередко – в среде, которая безгранично далека от «восьмибитных панков», как явления, а то и противостоит им в плане отношения к миру.
Размышления на тему квадратной музыки (8-bit)
Долгое время эта музыка была частью очень специфической культуры (считай – андеграундом), и широким слушательским массам была совершенно неинтересна. Ещё бы: то самое саркастичное отношение к подобному звуку, когда восьмибитная музыка в отношении электронного звука звучало не иначе, как: «Отвратительное качество звучания, современная аппаратура (профессиональная студия) – вот, что тебе необходимо». То, что у этого есть свои поклонники – на то они и фрики. Так многие до сих пор продолжают считать, хотя как раз положительного отношения становится больше, поскольку волна ностальгии в итоге привлекает слушателей к грязному звуку, по большей части состоящему из сочетаний «квадратов», «треугольников» и белого шума, что выливалось во внешне простенькие арпеджио, которые любителю «правильной» музыки будут резать слух. Как выяснилось позже, это весьма интересный звук – особенно, когда его сочетают с традиционными инструментами. Это позволило «подсластить» чистый 8-bit, сделав его достоянием широких масс, благо, принцип «жанрового контейнера» позволил пропускать через этот стиль всё: поп-музыку, хип-хоп, рок, техно, реггей, что угодно на самом деле. И если это «добить» более традиционными звуками, то может получиться вполне неплохая, чуточку своеобразная танцевальная музыка (точно так же в массы проникла и музыка glitch, но это уже совсем другая история). Массы заинтересовались, а кое-кто подумал: послушав уже более оригинальные по стилю композиции: «Ничего себе, оказывается, из старых консолей можно и такой звук извлечь, а я и не знал». Если добавить к этому ещё и некое соприкосновение с юностью для одних (другим просто было любопытно взглянуть на незнакомый мирок). Разумеется, «полное погружение» было уделом меньшинства, но появился некий интерес стороннего наблюдателя, как если бы такой рафинированный представитель «советского застойного общества» попал на неформальную тусовку, причём, не в родном Союзе, а в Лондоне или Манчестере. В данном случае я имею в виду больше положительную или нейтральную реакцию на увиденное и услышанное.
А вообще очень часто 8-bit рассматривается, как ностальгическое течение, что всё-таки не совсем верно, поскольку в своё время это была достаточно актуальная музыка, которую широкие массы, естественно, не оценили, так как на тот момент по-настоящему популярная электронная музыка всё-таки стремилась к высокому качеству звука и его разнообразию, опираясь на абсолютно традиционные методы написания. Сейчас, когда 8-bit стал достоянием широких масс, разумеется, в нём появилось и ностальгическое начало, как и в течениях, вышедших из того самого периода расцвета цифровых носителей (vaporwave / seapunk / webpunk), когда подобные технологии становились открытием, не было засилья «Windows» и компьютера в каждом доме, а аналоговая техника стала рассматриваться, как безнадёжно устаревший хлам. Видимо, поколение подросло и попало в «возраст ностальгии».
Более новое поколение, которое на самом деле ничего этого по понятным причинам не застало, естественно, воспринимает подобные штучки, как новую моду.
История явления не закончена, и пока не совсем понятно, что она нам преподнесёт. Что ещё больше интригует. Поэтому – многоточие…
Как работает музыка в NES
Если тут есть музыканты, которые имеют свой ютуб-канал или паблик вконтакте, ответьте мне на один вопрос: знаком ли вам такой способ набрать популярность, как каверы на музыку из старинных видеоигр? Способ убойный не только из-за ностальгии. Smooth McGroove в одном из своих интервью упоминал, что был удивлён, насколько крутые мелодии делались для старых игр. Дело не только в том, что над старыми играми работали профи, но и в том, какие ограничения им приходилось преодолевать. То, что звучит круто, будучи собранным из ассемблера, спичек и желудей, расцветает ещё больше, если это сыграть на настоящих музыкальных инструментах. Ну, или спеть акапельно.
В этой статье я расскажу о том, как в общих чертах работает звукогенерация в Ricoh 2A03/2A07, которые использовались в NES. Почему именно об этом? Ну, тут не столько я выбираю темы для своих статей, сколько мой pet-project выбирает их для меня.
Во многом данная статья пересказ соответствующей секции nesdev.wiki, которую можно найти тут. Но и переводом это назвать нельзя, так как было добавлено немного информации из иных источников. В основном, это описание того, как формируется итоговый вывод из пяти ЦАП, выкопанное на одном из форумных постов вышеупомянутой вики.
Что создавало звук на вашей старой «восьмибитке»?
Это делал процессор Ricoh 2A03 в регионе NTSC и Ricoh 2A07 в регионе PAL. Отличия между ними сводятся к разнице между соответствующими телевизионными стандартами. Здесь я буду вести речь о NTSC.
Итак, процессор NES работает с таковой частотой 1789773 герц (1662607 в версии PAL). Да, один миллион семьсот восемьдесят девять тысяч семьсот семьдесят три такта в секунду. Чем важно это волшебное число? Это будет видно дальше.
Состоит APU из пяти звукогенераторов, или каналов, каждый из которых управляется четырьмя байтами. То есть, у вас есть четыре байта и вы с помощью местного ассемблера выставляете нужные биты, чтобы указать, как приставка должна генерировать белый шум, например. Ещё один байт включает/выключает каждый из каналов. И ещё один управляет Frame Counter (об этой штуке ниже).
Два канала генерируют сигнал прямоугольной формы. Третий канал выдаёт «треугольный» звук (сигнал в форме эдакой пилы). Ещё один канал выдаёт белый шум. Последний канал позволяет развернуться и, в теории, проиграть любой звук, но с достаточно жёсткими ограничениями. Дополнительную жёсткость им добавляет то, что процессор из железки 1983 года выпуска кроме звука ещё должен целую видеоигру проигрывать.
Общие компоненты
А теперь поговорим о тех вещах, которые используются в нескольких каналах.
Frame counter
Отдельный компонент, который как ни странно, вообще никаким боком не связан с видео. Frame Counter стоит особняком ещё и потому, что не является частью ни одного из пяти наших звукогенераторов. Это, по сути, часы, генерирующие низкочастотные сигналы.
Есть счётчик, который с каждым циклом APU (два цикла CPU) увеличивается. На определённой цифре посылаются сигналы. Ниже табличка, где X.5 означает задержку на один такт CPU.
Но сначала о том, какие сигналы даёт наш Frame Counter. Есть три типа сигналов. Quarter Frame, Half Frame и, внезапно, Frame. «Четверть» и «Половинка» используются другими частями APU. А сам Frame является процессорным прерыванием, работу которых в NES надо разбирать другой статьёй. Запуск процессорного прерывания можно отключить, если оно вам не нужно.
N.B. Вкратце, процессорное прерывание — это событие, которое заставляет процессор выполнить код, его обрабатывающий. У кого в универе были лабы по ассемблеру могут помнить, как нажатие клавиши на клавиатуре выдёргивало вашу программу на определённый кусок кода вопреки всему.
Циклов APU прошло | Что происходит |
---|---|
3728.5 | Отправляется сигнал четверти фрейма. |
7456.5 | Отправляются сигналы половины и четверти фрейма. |
11185.5 | Отправляется сигнал четверти фрейма. |
14914 | Выставляется флаг, запускающий процессорное прерывание |
14914.5 | Выставляется флаг, запускающий процессорное прерываниеб отправляются сигналы половины и четверти фрейма. |
0 (14915) | Выставляется флаг, запускающий процессорное прерывание, обнуляется счётчик циклов |
Чтобы числа из левой колонки нам о чём-то сказали, нужно умножить 14915 на два (получим 29830 циклов CPU), а потом наше «волшебное» число 1789773 герца разделить на полученный результат. Получается 59,99909 процессорных прерываний в секунду. Почти 60 фреймов в секунду. Ну, и соответственно, почти 240 «четвертинок» и 120 «половинок» в секунду.
Стоит упомянуть ещё «замедленный» режим, за переключение в который есть отдельный флажок. Вот табличка:
Циклов APU прошло | Что происходит |
---|---|
3728.5 | Отправляется сигнал четверти фрейма. |
7456.5 | Отправляются сигналы половины и четверти фрейма |
11185.5 | Отправляется сигнал четверти фрейма. |
14914.5 | Ничего |
18640.5 | Отправляются сигналы половины и четверти фрейма |
0 (18641) | Обнуляется счётчик |
Да, всё верно. В замедленном режиме нет процессорного прерывания. 48,00635 циклов в секунду дают нам приблизительно 96 половинок фрейма в секунду и около 192 четвертинок фрейма в секунду.
Отмечу ещё, что Frame Counter он один на весь APU, в отличие от тех компонентов, которые я рассматриваю дальше.
Length Counter (Счётчик длины ноты)
Счётчики длины каждый для своего канала. Он есть у четырёх каналов из пяти: у генераторов прямоугольных, треугольных и шумовых волн.
Состояние этого счётчика описывается флагом «вкл/выкл» (можно записывать туда значение) и, собственно, счётчиком. Когда у нас записано «выкл», этот счётчик принудительно обнуляется и значение, которое там было теряется.
Legend:
( 30
1 1101 (1D) => 28
1 1011 (1B) => 26
1 1001 (19) => 24
1 0111 (17) => 22
1 0101 (15) => 20
1 0011 (13) => 18
1 0001 (11) => 16
0 1111 (0F) => 14
0 1101 (0D) => 12
0 1011 (0B) => 10
0 1001 (09) => 8
0 0111 (07) => 6
0 0101 (05) => 4
0 0011 (03) => 2
0 0001 (01) => 254
Notes with base length 12 (4/4 at 75 bpm):
1 1110 (1E) => 32 (96 times 1/3, quarter note triplet)
1 1100 (1C) => 16 (48 times 1/3, eighth note triplet)
1 1010 (1A) => 72 (48 times 1 1/2, dotted quarter)
1 1000 (18) => 192 (Whole note)
1 0110 (16) => 96 (Half note)
1 0100 (14) => 48 (Quarter note)
1 0010 (12) => 24 (Eighth note)
1 0000 (10) => 12 (Sixteenth)
Notes with base length 10 (4/4 at 90 bpm, with relative durations being the same as above):
0 1110 (0E) => 26 (Approx. 80 times 1/3, quarter note triplet)
0 1100 (0C) => 14 (Approx. 40 times 1/3, eighth note triplet)
0 1010 (0A) => 60 (40 times 1 1/2, dotted quarter)
0 1000 (08) => 160 (Whole note)
0 0110 (06) => 80 (Half note)
0 0100 (04) => 40 (Quarter note)
0 0010 (02) => 20 (Eighth note)
0 0000 (00) => 10 (Sixteenth)
Envelope (огибающая, точнее пародия на неё)
Эта вещь управляет громкостью и её убыванием в трёх каналах из пяти: квадратичных и шумовом. В треугольном канале своя атмосфера. В канале дельта-модуляции совсем своя атмосфера.
Громкость во всех трёх каналах задаётся четырьмя битами, что даёт нам выходные значения от 0 до 15. И у нас есть так называемый «Envelope Parameter» из четырёх бит, который позволяет задать громкость. Но не всё так просто. Сначала дадим общую схему механизма, который выдаёт нам эти значения. Общая схема опять утащена с nesdev wiki.
Видите Quarter Frame Clock? Да, это наш старый знакомый, Frame Counter. И с частотой 240/192 герца (приблизительно) он нам меняет огибающую.
Начнём со стартового флага. Он даёт нам отмашку на то, что можно начинать обратный отсчёт. Он устанавливается, если кто-то меняет длину (см. раздел про Length Counter выше) или частоту ноты. Так сделано потому, что длина и частота ноты расположены рядом и их можно только менять вместе, но об этом позже.
Если стартовый флаг установлен, то мы его сбрасываем, в Decay Level загружаем 15, а в Divider загружаем текущий Envelope Parameter. Такова у нас стартовая расстановка. Если стартовый флаг уже сброшен, мы уменьшаем Divider на один.
Когда Decay Level доходит до 0, в игру вступает Loop Flag. Если он установлен, мы снова заряжаем туда 15, и нота начинает играть заново с переменной громкостью. То есть, убывание громкости от максимума до нуля повторяется. При сброшенном Loop Flag наша убывающая громкость остаётся на нуле.
Рассмотрим ещё один важный флаг, который влияет на конечный результат. Constant Flag. Он отвечает за переключение между «задаём громкость напрямую сами через Envelope Parameter» и «полагаемся на обратный отсчёт». Если этот флаг установлен, Decay Level игнорируется, но продолжает считаться по всё тем же правилам. Это значит, что если вы захотите в пределах одной ноты попереключаться между этими режимами, ваш ждёт много интересного и увлекательного. Видимо, схема на это не рассчитана, но что-то мне подсказывает, что могли найтись психи, которые выставляли полную громкость, а потом посреди ноты сбрасывали флаг Constant, мирясь с тем, что обратный отсчёт громкости по факту стартовал не с 15, а с, например, 10 до которых Decay Level успел опуститься.
Halt/Loop Flag
Да, Halt Flag из Length Counter и Loop Flag из Envelope это один и тот же бит. То есть, у вас есть выбор между конечной нотой и бесконечной нотой. Если вы выбрали конечную ноту, то она будет заглушена тем, кто первый успеет довести отсчёт до нуля. Придётся заняться подсчётами, чтобы предсказать на какой громкости оборвётся нота. А если ваша нота бесконечна, то или громкость задавайте сами, или имейте дело с громкостью, идущей по кругу от 15 до 1. Да, никто не говорил, что будет легко.
Status
Закончим отдельно стоящим однобайтным регистром. Он содержит пять бит на запись/чтение, которые включают/выключают наши пять звукогенераторов. Все, кроме канала дельта-модуляции выключаются сразу с помощью зануления Length Counter. У канала дельта-модуляции зануляется число оставшихся байт.
Чтение работает симметрично в том плане, что мы получим там еденицу, если соответствующий Length Counter (или счётчик оставшихся байт сэмпла) больше нуля. Ещё два бита выставляются прерываниями из Frame Counter и канала дельта-модуляции (до этого ещё дойдём).
Каналы
Теперь, когда мы рассмотрели общие компоненты, давайте рассмотрим каждый звукогенератор по отдельности.
Прямоугольный
Сказать, что эта часть чипа генерирует звук будет не совсем верно. Она генерирует число от 0 до 15, из которого потом складывается звуковая волна определённой громкости. Громкость — это амплитуда, так уж работает звук. Амплитуда — это высота этих самых столбиков, которые вы видите на картинке выше. И это самое число от 0 до 15 определяется с помощью Envelope, который я описал выше.
Теперь рассмотрим ту часть, которая из этого потока в диапозоне «0-15» нарубает ровные столбики прямоугольного сигнала. Для определения формы сигнала есть четыре LUT, из которых можно выбрать нужную с помощью двух бит в регистрах, управляющих прямоугольным сигналом. Выглядят эти таблицы так:
Значение Duty | Соответствующий LUT | Как выглядит выходной сигнал |
---|---|---|
0 | 0 0 0 0 0 0 0 1 | 0 1 0 0 0 0 0 0 (12.5%) |
1 | 0 0 0 0 0 0 1 1 | 0 1 1 0 0 0 0 0 (25%) |
2 | 0 0 0 0 1 1 1 1 | 0 1 1 1 1 0 0 0 (50%) |
3 | 1 1 1 1 1 1 0 0 | 1 0 0 1 1 1 1 1 (25% negated) |
С первыми двумя колонками, думаю, всё должно быть понятно. Третья же касается деталей реализации. Как вы могли уже догадаться, форма выходного сигнала задаётся циклом от 0 до 7. Точнее, от 0 до 1. На старте переменная, отвечающая за текущее значение из LUT инициализирована в 0, но она изменяется в сторону уменьшения. То есть:0, 7, 6, 5, 4, 3, 2, 1.
Теперь рассмотрим вопрос частоты волны. Частота звука будет зависеть от того, как быстро прокручивается этот цикл. И задаётся эта скорость тем способом, который был бы удобен инженерам Nintendo, а не вам.
Выше я уже упоминал, что частота и длина ноты задаются вместе. И задаются они двумя байтами, где 5 бит отведено на длину ноты, а 11 на частоту. У нас есть число от 0 до 2047. Пусть оно будет t. Каждый такт APU переменная, отвечающая за цикл секвенсора, уменьшается на еденицу. Если там ноль, становится t. При этом изменяется в сторону уменьшения текущая фаза звуковой волны (0, 7, 6, 5, 4, 3, 2, 1). Весь цикл колебания нашей квадратной волны занимает тактов CPU. Таким образом, если мы хотим частоту f, нам нужно посчитать t по следующей формуле:
Не забудьте округлить и помните, что если вы выставите t меньше 8, ваш прямоугольный звук превратится в тыкву. Не то, чтобы это изначально отличалось от тыквы. Чем меньше t, тем выше частота, потолок получается около 12,4 килогерц.
Pulse Sweep, или единственное отличие между двумя квадратичными звукогенераторами NES.
Для того, чтобы облегчить жизнь композиторам на NES целый байт был щедро выделен на управление механизмом sweep, позволяющим менять частоту на ходу. Он позволяет менять значение t. У нас есть:
Сначала про P. Там уже типичный для звукового чипа NES цикл P, P-1, P-2… 1, 0, P. Уменьшается он по Half-frame сигналу от Frame Counter (96/120 герц). Соответственно, когда мы переключаемся с 0 на P, раз в P+1 half-frame сигналов, происходит магия.
t меняется не на фиксированное число, а на заданный с помощью S процент. Достигается это следующим образом:
Кстати, помните я говорил, что t меньше 8 ставить нельзя? Вот для защиты от этого механизма оно и было сделано. Цикл завязанный P, чуть что, крутится продолжит, но само t меняться не будет. Именно поэтому, кстати, самую высокую из доступных октав некоторые разработчики предпочитали не использовать вовсе. От греха подальше.
Треугольный
Снова весёлые картинки. Обратите внимание, у нас здесь нет Envelope. Почему? Потому что громкость у треугольного канала одна. А она одна из-за того, что делать вариации было слишком сложно и того не стоило (на дворе начало 80-х, что вы хотели).
На выход идёт текущее значение из следующей LUT:
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Мы имеем всё тоже 11-битное t, которое управляет частотой. На этот раз с каждым циклом мы посылаем на выход новое значение из LUT выше. Но есть нюанс — этот таймер тикает каждый цикл CPU. А частота считается уже по иной формуле:
Напомню/расскажу, что оно из себя представляет. Есть регистр, в котором определённое число бит. В нашем случае — 15, и они пронумерованы так: 14 — 13 — 12 — 11 — 10 — 9 — 8 — 7 — 6 — 5 — 4 — 3 — 2 — 1 — 0. Каждый шаг происходит следующее:
Всё зависит от формулы, конечно, но в итоге получается последовательность псевдослучайных чисел. Формулы у нас две, и за выбор между ними отвечает специальный флажок Mode:
Здесь работает тот же Length Counter, который определяет длину ноты. А вот с переключением на следующий бит, то есть с управлением частотой, тут всё иначе. Местное T берётся из LUT на четыре бита, которая выглядит (в версии для NTSC) так:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
4 | 8 | 16 | 32 | 64 | 96 | 128 | 160 | 202 | 254 | 380 | 508 | 762 | 1016 | 2034 | 4068 |
Эти четыре бита лежат в соседнем байте с конструкцией |LLLLLTTT|TTTTTTTT|, и устанавливаются отдельно. 11 бит, которые регулируют частоту в других каналах, здесь никакой силы не имеют.
Дельта-модуляция
Ох. Тут, что называется, «своя атмосфера». Например, двухбайтной конструкции из длины ноты и таймера частоты здесь нет вообще. Два вида писка и белый шум — этого мало, чтобы делать музыку, как ни крути. Поэтому можно подтаскивать из памяти коротенькие звуки, и играть их через этот канал. Само собой, без горки технических ограничений тут не обходится.
Здесь эта идея выкручена на максимум. Этот звукогенератор даёт вывод в пределах 0-127, вместо 0-15, как в остальных. Мелодия здесь однобитная, где 0 в потоке бит значит , а 1 —
. Если получается меньше 0 или больше 127, то очередной бит игнорируется. Конечно, это сильно ограничивает вас, но другого пути разнообразить музыку или выдать особый звук по случаю прыжка, например, у нас нет.
Теперь рассмотрим, чем это счастье управляется (всё write-only):
Тут LUT частот. Уточняю — это циклы CPU, то есть частота делится на это число напрямую.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
428 | 380 | 340 | 320 | 286 | 254 | 226 | 214 | 190 | 160 | 142 | 128 | 106 | 84 | 72 | 54 |
И как из всё этого создаётся музыка?
Мы имеем пять звукогенераторов. Четыре из них выдают числа от 0 до 15. Один из них от 0 до 127. Остаётся самое главное: составить из этого звуки.
Вывод: Mixer
Если вы думаете, что есть один какой-то чип, который сводит воедино пять чисел, то хрен там. Дальше начинается чистая физика, которая превращает пять чисел в звуки самыми что ни на есть олдскульными методами. Для динамика единый вывод, число, из которого создаётся звуковая волна, — это напряжение, вольтаж. Тут я расскажу о том, как это вольтаж высчитывается. Так как физика не моя сильная сторона, буду рад любым уточнениям и правкам в комментариях.
Канал | Сопротивление, Ом |
---|---|
Квадратичный | 8128 |
Треугольный | 8227 |
Шумовой | 12241 |
Дельта-модуляция. | 22638 |
Квадратичные ЦАП соединены параллельно. Остальные три соединены параллельно в другую группу. Выходное напряжение обеих групп формируется делителем напряжения с резистором в 100 Ом. На вход в этот делитель изнутри чипа подаётся ток в 1,17 вольт.
Наконец, всё это смешивается с помощью двух резисторов в 12 и 20 кОм. Получается, пропорция 3/5, где 3 части отдаётся квадратичны звуками, а 5 всем остальным. Этот вольтаж и подаётся на динамики. Из всего этого была составлена следающая формула для использования в эмуляторах:
Получается диапозон от 0.0 до 1.0, который можно использовать для генерирования звука в любом удобном вам формате.
Самое забавное, что это ещё не конец, и вывод пропускается через несколько фильтров. Но это я оставлю уже тем, кто понимает, что изображено на картинке ниже.
Ввод: 22 волшебных байта
Мы теперь знаем, как именно пять звукогенераторов создают звук. Но чем они управляются? Как заставить их играть музыку? Вот тут уже приходить включать магию программирования на местном ассемблере. Каждый из пяти звукогенераторов имеет четыре write-only регистра по одному байту. Все эти биты, флаги, байты, о которых я говорил выше, рассованы по четырём байтам для каждого звукогенератора. Ещё два байтовых регистра живут отдельно. Один управляет Frame Counter’ом, а второй используется, чтобы определять/изменять состояние вкл/выкл у всех каналов.
Регистры | Часть APU | Примечания |
---|---|---|
$4000-$4003 | Первый квадратичный канал | |
$4004-$4007 | Второй квадратичный канал | |
$4008-$400B | Треугольный канал | |
$400C-$400F | Шумовой канал | |
$4010-$4013 | Канал дельта-модуляции | |
$4015 | Управление другими каналами, см. раздел Status выше | Единственный регистр, который можно читать. |
$4017 | Frame Counter |
Я не специалист по ассемблеру NES, но сумел выкопать тамошний аналог «Hello, world», который зацикливает писк, близкий к ноте «ля» малой октавы (212,79 герца).
А теперь представьте, что вам нужно было, чтобы сыграть, к примеру, простенькую гамму.
Через что продирались сумрачные гении разработки консольных игр тех лет, и на какие компромиссы они шли, даже представить страшновато. Именно поэтому, каверы на музыку из старых видеоигр зачастую звучат так потрясно. Потому что в основе тех саундтреков были вещи, звучащие хорошо на любых инструментах.
Тут должно бысть красивое заключительное слово, но мне, к сожалению, не приходит ничего в голову, кроме «а ну быстро прониклись уважением, мать вашу». А ещё комментарии. Так как я работал с этим на уровне «реализовать что-то похожее, чтобы тоже пищало», жду уточнения и комментарии. Спасибо за прочтение.