Есть отдельная категория энтузиастов, которых завораживает идея проигрывать полноценный звук через однобитный бипер. Один из них уже проделал этот трюк на Apple II и IBM PC, а теперь взялся за ZX Spectrum — машину, особенно близкую пользователям из СНГ, где её клоны вроде «Ленинграда» и «Пентагона» стояли едва ли не в каждом втором доме.

Компьютер ZX Spectrum, на котором воспроизводится однобитный звук через встроенный биперОднобитный звук на ZX Spectrum: весь синтез ложится на процессор. Источник изображения — hackaday.com

Почему результат оказался скромнее ожиданий

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

реклама кормит Уточку 🦆

PCM против PWM

Вся затея опирается на импульсно-кодовую (PCM) или широтно-импульсную (PWM) модуляцию. Из двух техник более качественный результат должна давать PWM, но именно её пока запустить не удалось. Причина архитектурная: на ряде целевых машин пищалку дёргает отдельный аппаратный таймер, а у Spectrum всё держится исключительно на программном коде.

Из этого следует жёсткое ограничение: процессор Z80 на 3,5 МГц должен успевать переключать бит порта строго по расписанию, и любая лишняя инструкция в цикле смещает фронт импульса, добавляя в звук слышимый шум. Отсюда фирменный приём демосцены — развёрнутые в линейную последовательность циклы, где такты считаются вручную.

реклама кормит Уточку 🦆

Отдельная сложность Spectrum, которую хорошо знают все, кто писал под него, — контеншн памяти: обращения к нижним 16 килобайтам ОЗУ притормаживаются видеоконтроллером, и тайминги плывут. Поэтому звуковой код и его данные приходится держать в верхних банках памяти.

Многоканальная музыка на одном бите

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

реклама кормит Уточку 🦆

PCM, разумеется, не новость. Но между современным ЦАП и пищалкой на 1 бит лежит целая эпоха инженерных ухищрений, и наблюдать, как эти ухищрения переоткрывают заново, — отдельное удовольствие. Работа продолжается, так что имеет смысл следить за следующими выпусками.

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