В 2015 году демогруппы CRTC и Hornet изменили представление о возможностях PC XT и CGA, создав нашумевшее демо 8088 MPH (публикация на Хабре). Годы спустя они собрались с силами и наконец-то выпустили своё свежайшее творение на ту же тему — Area 5150. Оно было выставлено на демопати Evoke 2022 и заняло там первое место в категории демо для альтернативных платформ (куда было свалено в кучу всё, что не современный PC), обойдя даже весьма креативную работу 420 Years Of Teletext.
Демо работает на IBM PC Model 5150 образца 1981 года, самой первой персоналке от IBM, в конфигурации, более известной как PC XT: 16-битный процессор Intel 8088 на частоте 4.77 МГц, 640 килобайт ОЗУ, графический адаптер CGA, жёсткий диск и PC Speaker. Эта платформа была печально знаменита своими бедными графическими и звуковыми возможностями, в частности, 4-цветной графикой в вырвиглазной, обычно чёрно-бело-фиолетово-голубой палитре. Это то, что лежит на поверхности и чем ограничивалось ПО тех лет, но, как оказалось, видеоадаптер CGA таит в себе немало сюрпризов, и Area 5150 снова меняет представление о его реальных возможностях.
Мне посчастливилось присоединиться к авторам демо в качестве приглашённого музыканта, призванного обуздать несчастный PC Speaker, одноканальная квадратно-волновая музыка для которого играет на протяжении основной части демо. В финальной части с кредитами также звучит крутой одноканальный MOD-подобный цифровой трек от cTrix.
Графика высокого разрешения
Я не был вовлечён в разработку эффектов, а авторы всё ещё не выкатили обещанный полноценный making of, поэтому о многих технических деталях я могу только догадываться наравне со зрителями. Тем не менее, авторы объяснили основные моменты в комментариях на различных форумах, и нужно хотя бы кратко ответить на вопрос, возникающий у зрителей в первую очередь — как же удалось совместить на CGA графику высокого разрешения и 16-цветную палитру.
Первая часть идеи: 16-цветная палитра на CGA доступна только в текстовом режиме, и в текстовом режиме 80x25 итоговая картинка как раз имеет высокое пиксельное разрешение 640x200. Казалось бы, решение лежит на поверхности: просто загружаем вместо шрифта элементы своей графики, и получаем хотя бы ограниченную, но графику высокого разрешения. Такой трюк иногда применялся на EGA. Однако, на CGA возможность программной загрузки пользовательских шрифтов полностью отсутствует, можно использовать только прошитый в ПЗУ стандартный шрифт.
Вторая часть идеи: можно использовать символы псевдографики, в которых закрашена левая или правая часть знакоместа, а также уменьшить высоту символов в регистрах видеоконтроллера до двух или одного пикселя, и таким образом создать псевдографический режим 160 на 100 пикселей с 16-цветной палитрой, в котором каждый псевдо-пиксель может отображаться своим цветом. Эта техника продемонстрирована в 2011 году в клоне Pac-Man'а под названием Paku Paku для DOS/CGA. Такой режим требует 16000 байт видеопамяти для хранения пиксельного изображения: 80 символов в строке, 100 строк, два байта на символ (код и цвет символа), что исчерпывает все доступные на CGA 16 килобайт видеопамяти.
И теперь главный ингридиент, как же получить и 16 цветов, и пиксели человеческого размера, а не огромные кубики. Если мы уменьшим высоту символа до двух пикселей, и будем выводить на экран разные символы, а не только блоки псевдографики, от них, что логично, будет видно по две пиксельных строки, с каким-то содержанием, зависящим от очертаний символа (верхние кусочки букв, цифр и других символов). Если мы возьмём картинку высокого разрешения, разобъём её на блоки 8x2 пикселя, и для каждого подберём визуально наиболее похожий из 256 кусочков символов, у нас получится слегка зашумленная, но всё-таки картинка высокого разрешения. Именно это повсеместно и происходит в Area 5150, и этим объяняется несколько специфический вид графики в демо.
Разумеется, этот трюк не позволяет каждому пикселю иметь свой цвет, ограничения на раскраску, свойственные текстовым режимам — два цвета на блок 8x2 — сохраняются, но они получаются очень похожими на цветовые ограничения компьютеров тех лет (ZX Spectrum, семейство MSX), а значит, можно применять весь накопленный за годы опыт эффективной работы с ними.
Расход видеопамяти получается таким же, как для псевдографического режима 160x100, что не оставляет места даже для двойной буферизации. В финальной части демо, где звучит цифровая музыка, также реализован "невозможный" режим 160x200. Для полного экрана он потребовал бы 32 килобайта видеопамяти, которых нет, но креативный дизайн этой сцены, содержащей отражение верхней половины по вертикали, позволил уложиться в стандартные 16 килобайт, а также реализовать интересный эффект с волнами на воде.
Музыка и моё участие
Несколько исторических эпох назад, а именно в 2017 году, я разработал VST-плагин под названием PCSPE, в котором реализовал идею смешивания нескольких виртуальных музыкальных каналов в один посредством системы приоритетов, аналогичной основному способу реализации звуковых эффектов в 8-битных играх — более важный эффект заглушает менее важные — что позволило создавать псевдо-полифоническую музыку для PC Speaker довольно удобным образом в любых современных цифровых студиях. Не помню точно, что именно тогда послужило толчком для этой затеи, вероятно один из нереализованных игровых проектов, но думаю, что демо 8088 MPH также оказало определённое внимание.
В 2019 году я разрабатывал звуковой код для MS-DOS игры Planet X3 от The 8-bit Guy (Дэвид Мюррей), где аналогичная концепция была реализована в виде отдельного трекера также под MS-DOS. Примерно в то же время я выпустил музыкальный альбом System Beeps, написанный с помощью PCSPE. Так случилось, что один из авторов 8088 MPH, Джим Леонард (trixter) тоже участовал в разработке этой игры, и Дэвид с Джимом оказались среди первых слушателей моего свежего альбома.
В январе 2020 года Джим написал мне с предложением поучаствовать в новом проекте демки для XT в качестве музыканта, уже хорошо знакомого с PC Speaker'ом. На тот момент демка ещё не имела названия, ожидалось, что разработка займёт несколько месяцев, и релиз состоится на одной из крупных демопати с личным присутствием авторов — это было важным моментом, авторы изначально не хотели публиковать работу в формате онлайн-конкурса. Но случился, собственно, 2020, и живые демопати отложились надолго. Также отложилась и демка.
Я успел подзабыть об этом проекте, но в 2022 году Джим напомнил о себе, работы наконец возобновились, и к 18 июля авторы подготовили видеозапись черновой сборки демки, которую я мог бы использовать в качестве референса. Проблема заключалась в крайне сжатых сроках, у меня было всего шесть дней для подготовки чернового варианта музыки, чтобы оставить ещё немного времени для интеграции саундтрека с самой демкой и внесения соответствующих правок в демо и в музыку. Пришлось бросать всё и срочно браться за дело.
Музыка для PC Speaker
Саундтрек должен был звучать целых семь минут, и это тоже было проблемой, потому что типичная длина моих композиций составляет 2-3 минуты, я редко превышаю эту длительность. Также типично я пишу около минуты музыки за день. Поначалу я не представлял себе, как я смогу осилить такой большой объём за имеющееся время. Однако, я вспомнил свой опыт с The Board (2011) от Alone Coder'а — если не ошибаюсь, исторически это была первая демка с моей музыкой. При работе над ней мы были также очень ограничены по времени, и тогда Alone Coder предложил просто взять мои старые наброски и соединить их в трек. Так я и поступил: взял три совершенно разных трека, написал переходы между ними, и результат вполне себе сработал, хотя по моим тогдашним критериям я не посчитал бы это готовым треком.
Также, несколько лет назад я узнал о концепции театральной, или событийной музыки, которую описал в своих видео широко известный в узких кругах любителей музыки Преподоподобный Саша "Нескучный Sound" Зилков — подходе к сочинению, где музыка структурируется по событиям другого произведения и может состоять из довольно музыкально-странных, не самых логичных и теоретически-правильных идей, подчёркивающих определённые моменты. Это является альтернативной к классическому подходу, где в основе лежит продуманная композиция с определёнными гармоническими эволюциями. Такой альтернативный подход едва ли впишет композицию в вечность, но тем не менее, музыка будет звучать интересно и разнообразно в контексте сопутствующего произведения.
Так как в гармонические эволюции я всё равно не умею, я решил использовать событийный подход. Набросков в запасе у меня не было, поэтому я начал с их создания — набросал фрагменты для тех сцен демо, где у меня было представление о том, что могло бы там звучать. Я использовал самый быстрый подход: писал партию баса и ударных вручную, после чего наигрывал относительно длинную импровизацию под этот фрагмент на MIDI-клавиатуре, а запись нарезал по кусочкам в более-менее внятную мелодию и дорабатывал руками. В демке есть несколько отсылок видеоигрового характера, в частности это Какодемон из Дума и игра Marble Madness, и я добавил соответствующие музыкальные фрагменты из этих игр. Далее все части были более-менее усреднены в одинаковую тональность. Темп был изначально усреднён до 119 BPM на всю длительность (не ровно 120, чтобы получилась почти незаметная пульсация темпа из-за квантизации на 1/120 секунды), потому что при нарезке фрагментов в итоговую композицию смены темпа определённо добавили бы проблем, и на их решение потребовалось бы дополнительное время.
Когда части для определённых сцен и звуковые эффекты в начале и конце демо приобрели достаточно чёткую форму, я заполнил пробелы, дописав переходы и партии между уже расставленными по таймлайну фрагментами, и добавил детализации в разных местах, в частности, чтобы подчернуть действие — дополнительные ударные перебивки, звуковые эффекты. Таким образом мне удалось подготовить почти окончательную версию саундтрека к 23 июля, и это дало авторам демо дополнительное время на интеграцию. Согласно всеобщей старой доброй демосценовой традиции пилить всё до самой последней минуты, синхронизацию со сценами авторы успели сделать очень приблизительно. Совпадает только три сцены, а музыка от части сцен вообще заползла в другие, хотя в моей первоначальной нарезке были продуманы и чётко оформлены в композиции все переходы между сценами. Финальная версия, где в том числе будет улучшена синхронизация музыки со сценами, пока всё ещё находится в стадии обещаний.
С технической точки зрения процесс работы над музыкой был таким же, как для System Beeps — трек писался в Reaper'е, с использованием плагина PCSPE, в режиме 120 Герц. В данном случае использование именно Reaper'а очень сильно помогло оптимизации рабочего процесса. В нём есть базовые возможности редактирования видео, поэтому я мог видеть действие сразу во время сочинения фрагментов композиции, с хорошей синхронизацией. Я также слегка нарезал черновое видео, подогнав длительности некоторых сцен под музыкальные фрагменты для более гладких переходов, и авторы использовали эту нарезку как ориентир для синхронизации. Для улучшения синхронизации было также предусмотрено применение системы маркеров событий PCSPE, но в патийной версии она, видимо, толком не задействована.
![Area 5150 soundtrack in Reaper](https://habrastorage.org/getpro/habr/upload_files/0f6/6e4/c8b/0f66e4c8bccc97ddf33735de785ea362.png)
Музыка в финальной части
Пара слов о круто звучащей музыке в части с кредитами. Её написал cTrix для движка, написанного Andrew. Этот уникальный движок выдаёт всего один канал 6-битного PCM с частотой около 15 килогерц, с обновлением музыки на 60 герц. В нём нет ни мишкирования, ни громкости, ни ресемплинга — все сэмплы на всех нотах и громкостях нужно подготавливать отдельно, и они должны умещаться в 64-килобайтном сегменте памяти. Но зато это даёт возможность делать что-то ещё, помимо проигрывания музыки, даже на скромнейшем 8088 на 4.77 МГц.
Послесловие
Остальное, как говорится, уже история. Я рад, что мне выпала возможность поучастовать в создании великолепной демки. Не мог и мечтать об этом, когда смотрел 8088 MPH в 2015 году.
Сразу после выхода Area 5150 прочили в демо года, и действительно, год спустя она попала в списки Meteoriks 2023 — это такой демосценовый микро-Оскар, отмечающий лучшие работы года во множестве категорий. Area 5150 была номинирована сразу в двух категориях: Best Oldschool Production (лучшее демо для ретро-платформ) и Outstanding Technical Achievement (выдающееся техническое достижение), и победила в последней. Так сложилось, что в первой категории ему пришлось пободаться за первое место с моей собственной работой (спойлер: она тоже не победила). Но об этом я расскажу в другой раз.