Assembler
Demoscene
Sound
Abnormal programming
Old hardware
February 1

На что способен PC Speaker

Известный теперь как «системный динамик», а то и просто «пищалка», PC Speaker появился на свет в 1981 году вместе с первым персональным компьютером IBM. Наследник нескольких поколений больших компьютеров для серьёзных дел, он с рождения был предназначен лишь для подачи простейших системных сигналов, и не мог достойно проявить себя в озвучивании главенствующих на домашнем рынке развлекательных программ. Сильно уступая звуковым чипам специализированных игровых систем, пропадая в тени вскоре появившихся продвинутых звуковых карт, он поддерживался многими разработчиками по остаточному принципу — как опция, выдающая хоть какой-нибудь звук при отсутствии лучших альтернатив. За нечастыми исключениями, через спикер проигрывались грубо упрощённые, полностью одноголосые версии мелодий, изначально сочинённых для гораздо более мощных устройств.

Музыкальный альбом «System Beeps» написан для PC Speaker с использованием той же базовой техники из старых игр, и согласно типичной формуле ретро-компьютерного около-демосценового творчества призван раскрыть многие годы оставшийся неисследованным потенциал этого простейшего звукового устройства. Собственно послушать результат и составить своё мнение об успешности данного мероприятия можно на Bandcamp или в видео ниже, а дальнейший текст углубляется в устройство спикера, историю проекта и способы достижения подобного результата для тех, кто хочет знать больше.


Устройство PC Speaker


Технически спикер представляет собой небольшой динамик или пьезоизлучатель, напрямую управляемый один из каналов системного таймера 8253, делящего входную тактовую частоту 1.19 МГц на задаваемое программой 16-битное значение. Для получения звука используется режим счёта, при котором таймер выдаёт меандр, то есть квадратную волну. Это небольшой, но всё же шаг вперёд по сравнению со звуком более ранних или бюджетных компьютеров типа Apple II и ZX Spectrum, где динамик подключался просто к однобитному порту ввода-вывода, а генерацией звука обязан был заниматься процессор. Использование канала таймера позволяет процессору просто выбрать нужную высоту звука и продолжать заниматься другими делами. Однако, процессор может программно синтезировать разнообразные по характеру звуки и настоящее многоголосие. PC Speaker же не может звучать громче или тише, мягче или ярче. Всё, на что он способен без постоянного вмешательства процессора — пищать или не пищать с заданной высотой звука одним и тем же неизменным тембром.

При проигрывании звуковых эффектов или музыки процессор обновляет состояние спикера — включает-выключает звук и изменяет его высоту — через некоторые промежутки времени. Как правило, эти изменения происходят в прерывании от нулевого канала того же системного таймера. Стандартно это 18.2 Гц, но игры нередко меняют это значение в сторону увеличения, в диапазоне от 30 до 200 гц, в зависимости от игры.

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

Одноголосое многоголосие


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

В первом подходе спикер генерирует звук как обычно, проигрыватель музыки обновляет частоту звука по таймеру с некоторой частотой и почти не нагружает процессор. Но при этом одновременно проигрываются два-три виртуальных канала с разными партиями, а значения частоты и включения-выключения звука по очереди выводятся с них на реальный спикер в каждом обновлении. Например, при двух каналах в первом обновлении выводится звук с первого виртуального канала, а в следующем — со второго. Подобным образом реализована полифония в играх Lotus III и Xenon 2. Так как зачастую один виртуальный канал играет партию баса, а другой мелодию, и эти партии имеют паузы, получается чередование либо далеко отстоящих друг от друга нот, либо чередование ноты и тишины, что приводит к постоянному треску, неприятному для уха. Уменьшить его можно за счёт отказа от пауз в партиях, как в Golden Axe, что существенно ухудшает выразительные средства (паузы в музыке важны настолько же, насколько важны ноты), либо за счёт отключения чередования каналов в моменты, когда в одном из них пауза, что даёт более чистое звучание одиночных нот, как в Stunts.

Второй подход можно наблюдать в играх Lucas Art, в которых качеству спикерных версий музыкального сопровождения традиционно уделялось больше внимания. Как правило в них звучит преимущественно одноголосая мелодия с редкими вставками разнесённых по времени басовых и ритмических элементов, прерываемая очень короткими и отрывистыми звуками партии второго, вспомогательного канала, например арпеджио или ударными. Иначе говоря, каналы чередуются не постоянно, а только в короткие моменты времени, когда второй голос заглушает первый. Примеры можно слышать в играх Monkey Island, Loom, Indiana Jones, и пожалуй самый продвинутый вариант аранжировки в Zak McKracken and the Alien Mindbenders. Это создаёт более убедительную и приятную для слуха иллюзию полифонии, хотя и довольно ограниченную.

В третьем подходе спикер не генерирует звук сам по себе, а используется как ЦАП, через который воспроизводится программно синтезируемый процессором звук или оцифровки. Этот процесс требует значительных вычислительных ресурсов, практически полностью загружая работой обычный 8086, поэтому метод обрёл популярность с распространением 80386. Качество проигрываемого таким образом звука невысоко и объективно уступает даже простейшему самодельному Covox из горсти резисторов, но на тот момент это было впечатляющим достижением, на одну из реализаций которого, RealSound, даже был оформлен патент и велось сублицензирование технологии.

Превращение спикера в ЦАП может быть выполнено простым включением-выключением звука при запрещённом счёте, что даёт простейший 1-битный ЦАП, либо использованием звукового канала таймера для генерации коротких импульсов различной длины на задаваемой системным таймером частоте (ШИМ), что превращает его в более качественный 6-битный ЦАП. Первый вариант можно слышать в многоканальной музыке в играх Fantasy World Dizzy и Hard Drivin', второй чаще применялся для воспроизведения музыки на основе сэмплов, например, в Pinball Dreams. Также он использовался в таких занимательных проектах прошлого, как TEMU и VSB — программных эмуляторах трёхканального звукового чипа Tandy и цифровой части Sound Blaster, позволяющих в отсутствие этих устройств выводить предназначенный им звук через спикер (требуется 386SX и выше).

Альбом и история создания


Изначально плана делать именно музыкальный альбом у меня не было. Был творческий поиск аудиовизуального образа для проекта игры со стилизацией под псевдографические игры эпохи XT, и для максимального аутентичного образа возникла идея написать не просто стилизацию, а музыку, действительно возможную на PC Speaker, следующую классической музыкальной формуле 8-битных игр — зацикленные треки продолжительностью около минуты. Использовать цифровой звук или программный синтез мне не хотелось, так как результат едва ли соответствовал бы духу эпохи, и не обладал бы особым характером. Одноголосые же мелодии были предметом моего интереса со времён ZX Spectrum и знакомства с играми Ping Pong, Stardust, Score 3020. И раз уж выдался такой случай, захотелось попробовать написать именно одноголосую музыку, но получить какой-то необычный результат за счёт аранжировки — заманчивый вызов для композитора.

Работа над музыкой увлекла даже больше, чем работа над игрой. В процессе горения идеей был разработан и опубликован VSTi плагин PCSPE, сделано несколько набросков мелодий и пробных кавер-версий старых треков, чтобы развить технику работы с одноголосыми аранжировками и найти общие решения по звуку. Позже стало ясно, что результат всё же не соответствует видению игрового проекта, да и сам проект постепенно ушёл в стол. Но музыкальный материал остался, а услышанный потенциал наводил на мысль, что было бы неплохо по-быстрому оформить его в виде небольшого отдельного сборника мелодий для MS-DOS, хотя бы в качестве демонстрации возможностей плагина.

По-быстрому не получилось, дело затянулось, несколько треков переросло в несколько десятков, сборник случайных мелодий эволюционировал в тематический альбом, планы менялись, сроки сдвигались. В итоге завершение задумки заняло полтора года, с июля 2017 до января 2019 года. За это время я успел сделать AONDEMO и написать для него трек (звуковое железо АОН практически повторяет PC Speaker), а также поучаствовать в разработке звукового кода и утилит для игры Planet X3, куда в качестве титульного трека также вошёл самый первый написанный для сборника трек.

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

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

Сторона B включила 6 треков, предположительно менее удачных, которые являлись кавер-версиями моих старых работ для других платформ, или были основаны на более-менее проработанном старом материале, изначально предполагавшем совсем другие форматы — от XM-модуля до поп-панк песни. Сюда же был включён трек, уже засветившийся в Planet X3.

Сторона X включила трек из AONDEMO с минимальными изменениями. Такое отделение сделано в качестве шутки юмора.

Сам альбом выполнен в виде программы-проигрывателя для MS-DOS 3.3 и выше, которая запустится на IBM PC XT при наличии хотя бы 256КБ ОЗУ и видеоадаптера CGA. Так как оригинальная карта CGA подвержена так называемому «снегу», визуальному артефакту при попытке обновления экрана во время хода луча по растру, программа представлена в двух версиях — sbx.com без эффекта анализатора спектра, но и без снега, и sb.com с таковым эффектом. Для более плавной отрисовки анализатора желательно иметь процессор помощнее. Разумеется, боле современные компьютеры также сгодятся, например, с загрузкой FreeDOS с USB, равно как и эмуляция DosBox.

Музыкальная составляющая


В альбоме не применяется никаких программных трюков, типа синтеза звука силами процессора и использования спикера в качестве ЦАП. Технология самая традиционная — генерируемая системным таймером строго монофоническая квадратная волна, с обновлением высоты звука с относительно большой, но не из ряда вон выходящей частотой 120 Гц, что вполне по силам классическому XT и оставляет достаточно процессорного времени для выполнения других задач, помимо проигрывания музыки.

Весь секрет в особом подходе к написанию мелодий и аранжировок. Здесь очень помог предшествующий опыт в разных смежных областях — опыт написания классического чиптюна для звуковых чипов прошлого, в котором часто приходится совмещать несколько партий в одном канале методом чередования и наложения; опыт разработки звуковых движков для игр на старых компьютерах, где звуковые эффекты заимствуют каналы у музыки, заглушая её; а также опыт сочинения оригинальной музыки для дисковода. Как выяснилось позже, по сути я развивал подход к спикерной музыке, применявшийся Lucas Art, хотя на момент начала работы слышал только тему из Monkey Island.

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

Бас-бочка и томы неплохо получаются и без шума, в виде простых слайдов вниз с разной скоростью и длительностью — бочка побыстрее и покороче от низкой ноты, томы помедленнее и подлиннее от более высоких нот. А вот главный ударный инструмент, малый (рабочий) барабан, в виде простого слайда звучит неубедительно и не прорезает загруженный другими элементами микс. Здесь сработал трюк, часто встречающийся в имитации рабочего барабана на SID и AY-3-8910 — кратковременное выключение звука в начале слайда, создающее эффект дроби. Это вносит в звучание достаточное отличие от других перкуссионных инструментов, а также улучшает заметность барабана в миксе. Особенно это проявляется в связке со свойственными реальному спикеру резонансами.

По причине отсутствия шума пришлось отказаться от любых хэтов. Для более разнообразного и интересного звучания инструменты ударных различаются между треками. Где-то они протяжённее, где-то отрывистее, звучат выше или ниже, иногда присутствуют дополнительные элементы.

В процессе работы над музыкой были выработаны универсальные приёмы, пригодные для написания одноголосых аранжировок для любых монофонических устройств, не имеющих управления громкостью, будь то музыкальная открытка, ЧПУ станок или катушка Тесла. Среди них:

  • Особенность человеческого слуха, когда предположительно более громкий звук маскирует более тихие звуки. Например, удар барабана или нота центральной мелодии — они отвлекают на себя внимание и делают малозаметным кратковременное пропадание остальных партий.
  • Аранжировка, в которой присутствует достаточно пауз между нотами. В особенности это касается вступительных частей. В эти моменты составляющие хорошо слышны по отдельности и получают возможность запомниться, чтобы по ходу развития трека, когда аранжировка станет плотнее, мозг продолжал опознавать наличие этих элементов, даже если они стали едва слышны в миксе.
  • Сочинение мелодий, в которых значительная часть нот приходится на слабую долю, а также смещение начала нот относительно сетки метра. Это позволяет нотам мелодии занимать места пауз в аккомпанименте, таким образом уменьшая наложение партий. В частности, это позволяет выиграть немного места для нот басовых партий, которым важно попадать в сильную долю. Это придаёт мелодиям сильное синкопирование, создаёт ощущение фанковости, что идёт на пользу их интересности.
  • Обычные чиптюновые арпеджио на разной скорости, включая очень быстрые арпеджио из двух нот на частоте чередования 120 гц. Вариации в скорости позволяют создавать элементы аранжировки с различным звучанием, что очень помогает при отсутствии тембральных выразительных средств — ведь все ноты имеют звучание одной и той же квадратной волны.
  • Повторяющиеся паузы в протяжённых звуках, например в солирующем инструменте, в которых слышны другие виртуальные каналы. Как правило такие инструменты начинаются с непрерывного звука, затем появляются паузы и их частота и длина постепенно увеличиваются, что является своего рода имитацией спадающей громкости.
  • Вариации длительности нот, включая очень короткие, для имитации разницы в громкости. Используется для подчёркивания пульсации в басовых партиях, где ноты, приходящиеся на сильную долю имеют увеличенную длительность, а также для создания эффекта эхо — когда партия с нотами одной длительности вторит себе, но с нотами существенно меньшей длительности.



Техническая составляющая


Другой ключевой момент в работе над альбомом — применение современных инструментов, делающих её значительно более комфортной и эффективной. Это привычная мне современная цифровая студия Reaper (программа, аналогичная FL Studio, Cubase и подобным) и набор самостоятельно разработанных VST-плагинов.



Подобный подход является экспериментальным, совершенно нетрадиционным для создания «тру-чиптюна», то есть музыки, предназначенной для воспроизведения на настоящем устройстве — обычно для этого применяются специальные программы-трекеры либо ручное набивание музыкальных данных. Разумеется, тот же самый результат можно получить и такими, более классическими средствами (что и было сделано для Planet X3), но это требует больше усилий и регулярного отвлечения от творческого процесса на чисто технические моменты.


Специально для создания спикерной музыки был разработан VSTi плагин PCSPE. Он эмулирует железо PC Speaker, позволяя сразу слышать близкий к реальному результат, а также реализует систему чиптюновых инструментов, подобные тем, что используются в трекерах для различных звуковых чипов. Огибающие виртуальной громкости (приоритета), арпеджио и изменения высоты звука задаются в виде строк текста с очень простым форматом, напоминающим язык музыкального программирования MML (родственник строк букв в операторе PLAY в BASIC). С помощью этих огибающих можно задавать, например, различные звуки ударных инструментов, или солирующий инструмент с постепенно нарастающим вибрато.

Но главной задачей плагина является автоматическое сведение нескольких входных MIDI-дорожек с разными партиями в конечный монофонический трек. Упомянутая виртуальная громкость инструментов является основой системы приоритетов. В один момент времени (период обновления состояния спикера) всегда звучит только инструмент с наибольшей текущей громкостью. Например, инструмент баса имеет громкость 2, мелодии — 6, а инструменты ударных имеют громкость 8 — значит, ноты мелодии будет заглушать ноты баса, а ударные будут заглушать и то и другое. Таким образом несколько одновременно звучащих музыкальных партий сводится в один канал спикера.

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

Типичное чиптюновое арпеджио можно создавать в PCSPE классическим способом, соответствующей огибающей, задающей последовательность смещений в полутонах относительно базовой ноты. Но это требует постоянно переключать инструменты и держать в уме соответствие между инструментами и получаемыми аккордами. Проделывать это в современных DAW довольно неудобно.

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

PCSPE и эмуляторы типа DosBox выдают идеализированную квадратную волну, заметно отличающуюся по звучанию от реального устройства. Крохотные системные динамики подвержены сильным резонансам и искажениям АЧХ, подчёркивающим транзиенты, то есть моменты включения и выключения звука или резкой смены частоты. В частности, это делает ударные на реальном спикере гораздо более выраженными в миксе, т.е. «пробивными». Для контроля и обращения подобной особенности на пользу аранжировке использовался бесплатный плагин NadIR и собственноручно записанные импульсы нескольких маленьких динамиков — аналогично тому, как для цифровой записи гитар используют импульсы реальных гитарных кабинетов.

Материалы


Проект был опубликован под открытой лицензией CC-BY, включая саму музыку, исходники плеера и проекты всех треков для Reaper. Таким образом, любой желающий волен делать любые производные продукты, как относительно музыкальной составляющей, так и кода. Все использовавшиеся при разработке инструменты также доступны вместе с исходниками:

Программа-проигрыватель с музыкой
Исходники программы и проекты для Reaper
Плагин PCSPE с исходниками
Плагин ChipArp с исходниками
Импульсы динамиков
+87
48.2k 113
Support the author
Comments 63
Similar posts
Top of the day