Тема: Трекерная музыка на РАДИО-86РК
Все, кто знаком с ZX-Spectrum и его бессмертной трилогией Savage, наверно не были равнодушны к музыкальным заставкам этих игр.
Так как у меня РАДИО-86РК появился значительно раньше и я успел состояться как программист-дампёр, цветные графические игры на ZX-Spectrum меня впечатляли, но доступ к ресурсам из-под встроенного Бейсика с целью изучения ПК не как игрового автомата, а как архитектуры для разработки, задвигало Спектрум в дальний угол стола: Я грузил в него одну из нескольких игр с потрясающими музыкальными заставками и переключал сигнал Видео на РК.
Тем самым, в телевизоре играла фоном музыка из ZX-Spectrum, а изображение шло от РАДИО-86РК, где я сидел в дампах буквально по уши!
И была мечта перенести эти музыкальные плееры с Z80 на К580ВМ80, чтобы и РАДИО-86РК зазвучал теми же треками.
С тех пор прошло более четверти века. И, ушедшим уже, декабрём 2023 я решил заняться этим вопросом.
Ни о какой-либо доработке РАДИО-86РК речи не шло (типа, установка ВИ53 или даже AY), так как у меня был ZX-Spectrum Ленинград 48 Кб и звук был биперный, средствами процессора Z80.
Тем самым, весь музыкальный код под РАДИО-86РК на частоте 1,777 МГц нужно было разработать с нуля.
Конечно, есть ещё Музыкальная Система на три голоса. Но там используется специфический синтаксис 1970-х (даже писал конвертор в МИДИ давно) и она использует предкомпиляцию партитуры в некую стек-таблицу, что требует время и на длительную композицию просто не хватит памяти стека.
Решил идти трекерным путём и просто конвертировать музыкальные модули ProTracker с ZX-Spectrum или Amiga в формат файла магнитной ленты РАДИО-86РК - *.rk с помощью JavaScript-костыля.
В первую очередь - ковырнул код самой Музыкальной Системы и подсмотрел, что там происходит с командами запрета/разрешения прерывания DI/EI, так как в РАДИО-86РК вывод INTE не управляет контроллером прерываний, а идёт прямо на динамик для формирования звука.
С одной стороны - это очень удобно! Команды DI/EI выполняются ровно за 4 такта, что при частоте в 1,777 МГц может позволить генерировать звук программно с частотой до 222,222.222 Гц!
(Все телевизоры на это реагируют, если от моего КР-03 выводить сигнал звука одной проволокой без экрана.)
За месяц ежедневного напряжённого труда со всеми мысленными опытами с командами DI/EI в области ШИМ мне в конце-концов удалось более-менее приближенных результатов.
Например, оригинальный трек Savage-3 у меня сперва звучал как-то так и к настоящему моменту звучит уже вот так.
Естественно, всё пишу исключительно на ассемблере со строгим подсчётом тактов, так как проигрывание звуков на РАДИО-86РК - задача из области систем реального времени.
За период написания, переписывания и написания с нуля было написано более десятков тысяч строк в поиске наиболее оптимального кода.
Вот ссылка на плейлист, по которому легко проследить, как изменялось звучание по мере доработки кода и применения различных трюков.
(В отличии от ZX-Spectrum, в РАДИО-86РК тактовая частоте несколько ниже и для генерации звука оптимально уложиться в 100 тактов на одну итерацию цикла звукогенерации в настоящее время: Первые попытки еле укладывались в 220 тактов!)