В мире цифрового искусства и программирования демо-сцена всегда служит полигоном для экспериментов и демонстрации мастерства разработчиков. Одним из ярких и самых технологически удивительных примеров является Kaleidoscopico — демо для Raspberry Pi Pico 2, которое заняло второе место на Revision 2025 в категории Wild. Эта работа впечатляет не только художественной составляющей, но и невероятной глубиной технической реализации, учитывая ограничения микроконтроллера и уникальную архитектуру устройства. Raspberry Pi Pico 2 — это плата на базе современного микроконтроллера RP2350, который оснащён двумя процессорными ядрами с возможностью работы как на ARM Cortex-M33, так и на архитектуре RISC-V. В случае Kaleidoscopico использовались именно RISC-V ядра — открытой и свободной архитектуры процессора, что отражает стремление автора проекта к прозрачности и образовательной ценности.
При этом частота работы CPU была снижена до 130 МГц в целях синхронизации с видеосигналом VGA в режиме 1024×768 при 60 кадрах в секунду, хотя дисплей фактически работает на половинном разрешении 512×384 благодаря особенностям генерации картинки. Одной из главных задач было создание живого, насыщенного графического вывода, при этом не имея достаточного объёма памяти для классического полноцветного буфера. Классический фреймбуфер требует много оперативной памяти, чего на Raspberry Pi Pico 2 физически недостаточно. Поэтому автор отказывается от использования стандартных приёмов и прибегает к сложным методам генерации изображения на лету, используя технологию «racing the beam», или гонки с электронным лучом. Такой подход исторически напоминает архитектуру легендарного Amiga, в котором разнообразные аппаратные блоки совместно формировали видеосигнал.
Аппаратная реализация Kaleidoscopico включает кастомную плату с наборами резисторных лестниц для формирования VGA сигналов с четырьмя битами на каждый цветовой канал (красный, зелёный, синий), что даёт 4096 цветов — насыщенность, аналогичную оригинальному Amiga. Видео вывод реализован посредством четырех программируемых блоков PIO (Programmable Input/Output) микроконтроллера. Три из них генерируют цветовые слои, а четвёртый управляет общим таймингом горизонтальной синхронизации и границами экрана. Такая модульность позволяет создавать трёхслойные эффекты с прозрачностью и сложными наложениями. Интересна особенность метода передачи пикселей: вместо классического хранения каждого пикселя с истинными цветовыми значениями используется 4-битное индекстирование в палитру из шести цветов на слой.
Это частично вызвано ограничениями PIO, которые не умеют делать произвольные арифметические операции или доступ к внешней памяти для выборки цветов в рантайме. Для реализации lookup таблиц цветов автора находится гениальное решение: инструкция скачка внутри программы PIO фактически исполняет роль таблицы переходов (computed goto) по входящим 4-битным значениям пикселей. Благодаря битовой реверсии внутри регистров и умелому расположению команд можно передавать цвета и прозрачность, а также команду повторения последнего пикселя, что помогает растягивать пиксели горизонтально и создавать нужные визуальные эффекты. Управление видеосигналом реализовано и на уровне синхронизации. Горизонтальный сигнал синхронизации (hsync) создаётся с помощью широтно-импульсной модуляции (PWM), а вертикальный синхросигнал (vsync) — более хитро: GPIO выводы динамически переключаются из режима ввода-вывода в режим программируемого вывода PIO по необходимости, позволяя точно выставить временные интервалы сигнала вертикальной синхронизации.
Главный программный движок видео располагается на втором ядре процессора (Core 1), выполняющем постоянный цикл из задач по управлению «чипсетными регистрами» демо-драйвера, имитируя функциональность медленных аппаратных блоков, подобных «copper» в Amiga. Такой «софтверный медиа-контроллер» синхронизирует состояние эффектов с линиями растера, строит списки команд (copperlist) для заданий на изменение параметров слоёв и переменных, сортирует DMA-потоки для питания PIO блоков, а также записывает данные для текущего кадра. Использование специального подхода «двух медных» — двух независимых списков copperlist — повышает гибкость и позволяет эффективно совмещать несколько визуальных слоёв с разной динамикой. Потоки DMA используются для передачи пиксельных данных в PIO в строго отлаженной последовательности. За счёт кольцевых буферов и возможности сдвига пикселей реализуется плавный скроллинг и повторение текстур без прерываний и резких артефактов.
Таким образом, демо показывает широкий спектр эффектов с плавной анимацией и лепестковыми, симметричными узорами, от которых и появилось название Kaleidoscopico. Звуковая часть демо — отдельный шедевр алгоритмической обработки звука. Частота строки растера VGA составляет примерно 48.36 кГц, что совпадает с профессиональной аудиочастотой сэмплирования. Стереозвуковые каналы реализованы через два PWM-канала, синхронизированных с синхронизацией видеоряда.
Звук строится методом фазовой модуляции с 12 каналами, каждый из которых содержит четыре операторных синтезатора и резонансный фильтр. Подсистема обладает возможностью добавлять эхо и стереопанораму, рассчитывая новый аудиосэмпл на каждый проход по горизонтальному распознаванию скана. Музыкальные данные демо хранятся в сжатом виде в прошивке, проигрываются и декодируются специальной музыкотекой во время вертикальной синхронизации. Создание трекера для написания музыки побочной стороной отражает профессионализм и стремление автора к комплексному подходу. Создание и отладка собственной звуковой подсистемы позволили получить качественное звучание, неизбежно органично вплетающееся в визуальный ряд.
Организация проекта также уникальна. Ядро 0 выполняет роль центрального процессора, который последовательно отрабатывает демо-эффекты, переключается между частями ролика и синхронизируется с музыкальной композицией. Для каждого эффекта предусмотрены четыре callback-функции, выполняющиеся либо по прерыванию вертикальной синхронизации, либо в основном потоке выполнения. Такой подход облегчает плавные переходы между сценами и позволяет динамически загружать необходимые данные, избегая конфликтов в памяти. Автор разделил память на логические области, управляя тем, каким образом эффект использует оперативную память.
Это нужно для экономии ресурсов и избегания перезаписей. Кроме того, множество активностей построены на компрессии данных с помощью пользовательского LZ-алгоритма, благодаря чему размеры активов в памяти и на флеш оптимизированы без ущерба качеству. Кроме технических новшеств, заслуживают внимания сами визуальные части работы. Например, сцена приветствия («greetings») построена на roto-zoom эффекте, где изображение вращается и масштабируется с помощью аппаратного интерполяторного блока RP2350. Это даёт плавные и реалистичные трансформации двуярусного фона с текстовым слоем наверху.
Ещё одна впечатляющая часть — «воздушный шар» в 3D-пейзаже, где текстуры тщательно нарезаются и собираются на лету при помощи медных списков, что достигает эффекта плавного изменения масштаба элемента на экране. Проработка заднего плана выполнена с использованием карт высот (height maps) и рэймарчинга в реальном времени на ограниченных ресурсах. Для динамичной полутонировой прорисовки применяется интеллектуальный рандомизированный дезеринг, реализованный через нестандартное использование возможностей DMA и PIO для генерации потоков псевдослучайных чисел. Это впечатляющий пример того, как можно использовать одну подсистему микроконтроллера для получения абсолютно иного результата, минимизируя вычислительную нагрузку CPU. В целом Kaleidoscopico — это не просто демонстрация графики и звука, а системная работа, построенная по классическим демо-сценовым принципам, но с современным подходом и применением передовых разработок.
Автор не использует SDK, всё написано на ассемблере RISC-V, что подчёркивает уровень сложности и усилий, вложенных в оптимизацию под платформу. Отзывы сообщества также подтверждают уникальную ценность проекта. Специалисты отмечают оригинальность решения палитрового вывода через программу PIO, нестандартную работу с аппаратным выводом видеосигнала и звука, а также вдохновение, полученное от классического Amiga-дизайна. Многие пользователи высказывают желание использовать методики и идеи Kaleidoscopico для своих собственных проектов на Raspberry Pi Pico. Этот демо-проект подчёркивает потенциал открытых кристаллов с архитектурой RISC-V в мире микроконтроллеров и мультимедийных приложений.
Разработчики и энтузиасты могут видеть в нем преподавательский пример того, как создавать сложные продукты, расположенные на грани доступных ресурсов. Помимо эстетической составляющей, Kaleidoscopico представляет интерес с точки зрения технических инноваций — нестандартной работы с PIO, синхронизации видео и аудио, расширения возможностей DMA и комплексной организации оперативной памяти. Для всех, кто интересуется программированием на уровне железа, цифровым искусством или музыкой в микроконтроллерах, Kaleidoscopico станет бесценным источником знаний и вдохновения. Затрагиваемые в проекте темы — от архитектуры RISC-V и вывода VGA до создания полутонированных 3D-ландшафтов — дают представление о том, как глубоко можно погрузиться в работу с ограниченными ресурсами без ущерба для качества конечного продукта. В конечном итоге Kaleidoscopico — это не только дань уважения классическим платформам прошлого, но и уверенный шаг в будущее разработки многозадачных и креативных приложений на современных микроконтроллерах.
Raspberry Pi Pico 2 с его инновационным RP2350 демонстрирует, как один недорогой микроконтроллер может стать основой для настоящего произведения цифрового искусства, объединяющего программирование, электронику, графику и звук в единую гармоничную систему.