Skip to content
ИССЛЕДОВАНИЯ
9 мин. чтенияЧитать на английском

Агентная генерация шаблонов для music-процессора

Агентная генерация шаблонов для music-процессора

LLM-управляемый дизайн патчей для аппаратного гитарного multi-FX, без обучения

Автор: Alex Nix Статус: Рабочий черновик — for public release


Abstract

Эта статья описывает трёхдневное hardware-in-the-loop-исследование того, как давать языковой модели проектировать и применять конкретные multi-effects-патчи для аппаратного гитарного процессора (Valeton GP-100) из plain-English-промптов. Модель не получает никакого обучения и никакого датасета; она опирается на свои общие приоры по жанру, артисту и sound-design, спроецированные на whitelist специфичных для педали effect types и значений ручек, выведенный реверс-инжинирингом firmware-таблицы параметров. Тонкий Python-слой обрабатывает MIDI-транспорт, валидацию и crash-safety. Двадцать с лишним патчей сгенерировано и валидировано на железе — jazz fusion, pop-punk, sci-fi, horror и чистый sound design. Вклады работы: (а) подтверждение, что LLM может это сделать без обучения, если ей дан структурированный, валидированный пространство параметров; (б) crash-таксономия из трёх различных классов out-of-range-ошибок, специфичных для этой firmware, каждый воспроизводимый; (в) эмпирический инсайт, что парсинг одного реального preset'а перекраивает дефолты модели больше, чем любые усилия по prompt-engineering; (г) наблюдение, что интерактивная итерация консистентно превосходит single-shot-автономную генерацию для творческой музыкальной работы. Мы описываем архитектуру, находки и открытые пробелы, требующие дальнейшего реверс-инжиниринга.


1. Мотивация

Аппаратные гитарные multi-FX-процессоры экспонируют пространство параметров низкой внутренней сложности (несколько сотен значений по девяти signal-chain-блокам), но высокой семантической трудности: «сделай как Frusciante на Californication» мэпится на конкретную конфигурацию effect types и значений ручек, которую никакое меню в устройстве напрямую не документирует. Сообщество пользователей трактует это как ремесленный навык — патчи передаются как экспортированные файлы; туториалы проходят по одному тону за раз; никакой общий алгоритм не строит мост от plain-English-описания к рабочему патчу.

Исследуемая здесь гипотеза узкая и проверяемая: достаточно способная LLM, получив структурированное и валидированное пространство параметров, может производить музыкально связные патчи из natural-language-описаний, без обученной модели, датасета или выученного мэппинга. Приоры LLM по музыке, артистам и sound-design заменяют обучение; валидированное пространство параметров предотвращает эмиссию моделью значений, которые устройство не может принять; hardware-in-the-loop-тест подтверждает или отклоняет выход на слух.

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


2. Целевое железо

  • Valeton GP-100. Class-compliant USB-MIDI, firmware v1.5.0, внутренний algorprefxconstdata version 1.9.
  • Экспонирует SysEx (редактирование параметров), Program Change (выбор preset'а) и Control Change (включение/выключение блоков, педали, темп, тюнер).
  • 9 FX-блоков в фиксированном signal-chain-порядке: PRE, DST, AMP, NR, CAB, EQ, MOD, DLY, RVB.

Выбор платформы случаен — архитектура переносится на любой MIDI-управляемый multi-FX с документированной таблицей параметров. GP-100 выбран за доступность и за то, что его таблица параметров была частично реверс-инженирована open-source-сообществом.


3. Архитектура системы

Три слоя, каждый тривиально заменим на stub или mock. Только средний и верхний слои зависят от реверс-инженированной SysEx-карты; транспортный слой — это тупая труба.

flowchart TB
    subgraph L3[Layer 3 — LLM]
        LLM[llm.py<br/>Claude tool-use<br/>text → PatchSpec]
    end
    subgraph L2[Layer 2 — typed API]
        PS[patches.py<br/>PatchSpec + apply_patch]
        DEV[device.py<br/>GP100 class<br/>typed, validated]
        EFF[(effects.py<br/>146 effect types<br/>from algorithm.xml)]
    end
    subgraph L1[Layer 1 — transport]
        TR[transport.py<br/>mido wrapper<br/>raw SysEx / CC / PC]
    end
    HW[(Valeton GP-100<br/>USB-MIDI)]

    LLM -->|JSON| PS
    PS -->|typed calls| DEV
    DEV -->|lookup| EFF
    DEV -->|bytes| TR
    TR -->|USB-MIDI| HW

3.1 Выбор источника ground truth

Три reverse-engineering-источника оценены под таблицу параметров:

| Источник | Содержимое | Итог | |---|---|---| | rubberplayer/gp100expressioncc | Восстановлено 2026-04-20 с Codeberg-зеркала. Не дамп параметров (более ранние вторичные ссылки искажали). Узкая Linux/ALSA-утилита, декодирующая expression-pedal SysEx в обычный MIDI CC. | Подтверждает firmware v1.9 (совпадает с нашей версией data-файла algorprefxconstdata). Документирует формат expression-pedal SysEx: 34-байтовое сообщение, позиция упакована как 8 × 4-битных nibbles на offset 25, собранных MSB-first в 32-битное значение (похоже IEEE 754 float). 31 дискретная позиция зафиксирована. Сильная гипотеза: это nibble-packing — кодирование, которое педаль использует для всех special-range-ручек (MOD Rate в Hz, delay Time в ms, pitch в полутонах, EQ bands в dB). Тестируется фокусированной 8-byte-payload-бисекцией в следующей сессии. | | navytuner/gp100-editor | PySide6-редактор на Python, 152 effect-model-кортежа. | Систематически неточный на нашем firmware. Снят с более поздней algorprefxconstdata-версии. Все CAB-кортежи сдвинуты; NR Gate 1/2 поменяны местами; 6 DST-моделей не существуют на v1.9. Сохранён как стартовый скелет, только. | | joseloc300/GP-100-App-Fix v1.2.0 algorithm.xml | 1255-строчный XML, 146 именованных effect types с per-knob-метаданностью (idx, name, control_kind, Type 1/2/3, Dmin, Dmax, default, step). | Авторитативный для firmware v1.5. Использован как source of truth. Парсится в типизированную таблицу EFFECTS на этапе билда. |

Позднее добавлено:

  • mikeliddle/PRSTDecoder — decoder/encoder для Valeton .prst-файлов preset'ов. GP-100 использует plain XML (GP-200 — бинарный). Дал нам один реально распарсенный preset (Frusciante / RHCP rock) для ground-truth-паттернов значений ручек. Роль этого одного preset'а оказалась больше ожидаемой — см. §4.2.
  • Amish-03/Patch-Switcher — независимый pcap-анализ протокола. Byte-level-подтверждение SysEx-заголовка F0 21 25 7F 47 50 2D 64 12 ... F7, плюс альтернативный путь смены preset'а через адрес 00 02 00.

3.2 Транспортный слой

Python 3.13, python-rtmidi + mido. Минимальная обёртка с context-managed открытием/закрытием порта, SysEx-header-prepending'ом, CC/PC-хелперами с проверкой MIDI-диапазона, capture-входа. Без pedal-specific-семантики — это держит wire-level-диффы доказуемыми против captures официального desktop-app.

3.3 Слой устройства

Класс GP100 с типизированными хелперами (load_preset(bank, slot), set_block_enabled, set_block_type, set_param_raw, set_param(value_0_10), set_patch_volume, set_bpm, …). Каждый публичный метод валидирует входы против выведенной из XML таблицы EFFECTS до того, как что-либо попадает в MIDI, потому что firmware педали наблюдалась крашащейся на out-of-range-значениях (см. §5).

3.4 Спецификация патча

Pydantic PatchSpecстрогая схема на блок (enabled, type, params) с валидаторами, которые:

  • Отклоняют имена effect-моделей, не входящих в legal-таблицу для этого блока.
  • Отклоняют params длиннее Type-1-knob-count'а блока.
  • Отклоняют float-значения вне 0.0–10.0.

Функция apply_patch(gp, spec) диспатчит блоки в signal-chain-порядке. Write-формула (эмпирически выведенная на железе) на блок:

CC-enable  →  set_block_type (3 priming SysEx + body + trailing enable)
           →  set_param per knob  →  CC-enable (re-assert)  →  final CC enable/disable

3.5 LLM-интеграция

Два пути:

  1. Интерактивный (основной, использован во всех экспериментах) — ассистент действует как генератор в диалоговом цикле. Пользователь описывает звук на plain language; ассистент пишет PatchSpec JSON, валидирующийся против схемы; apply-скрипт загружает его и пишет на устройство. Цикл итерации — секунды.
  2. Автономный (запланирован, отложен) — LLM-клиент строит системный промпт из живой таблицы EFFECTS и использует tool-use API Anthropic для форсирования JSON, матчащего PatchSpec-схему. Требует API-ключ; в этой сессии не exercised из-за отсутствия deployment-цели.

4. Находки

4.1 LLM может это без обучения

20+ патчей произведено и валидировано на железе — jazz fusion, pop-punk, sci-fi, horror, animal sounds, pastiche (Takanaka / Blink-182 / Sababa 5) и чистый sound-design (UFO, cathedral organ, acid 303). Нулевой датасет. Никакого fine-tuning. Приоры модели по музыке, артистам и истории тонов мэпятся на whitelist effect types и knob-диапазонов достаточно хорошо, чтобы давать музыкально связные результаты с первой-второй попытки.

4.2 Mining реальных preset'ов учит tone-design'у тому, что LLM получала неправильно

Парсинг одного реального preset'а (Frusciante rock-тон из .prst-файла) немедленно изменил дефолты LLM. До: ручки кластеровались около 50, производя «factory-default sound». После: асимметричные значения (паттерн Gain=15 + Master=99, например), производящие реальный характер. Это калибровочная задача, которую LLM решает сама, увидев один авторитативный пример — без переобучения.

Шесть паттернов извлечено из preset'а Frusciante и добавлено в reference-библиотеку проекта:

  1. Асимметричные значения ручек — норма; всё-на-50 звучит как factory default.
  2. Эффекты часто defined-but-disabled в реальных preset'ах (игрок переключает live).
  3. Time-based-эффекты имеют низкий Mix (reverb Mix 19, delay Mix 30).
  4. Special-range-ручки используют реальные единицы в файле: delay Time в ms, MOD Rate в Hz, EQ bands в dB, pitch в полутонах.
  5. Имена эффектов иногда несут trailing whitespace ("COMP ").
  6. Firmware-дрейф виден в инвентаре effect-моделей (CAB Marshall4x12 существует в v1.8, но не в v1.5).

Импликация для более широкого утверждения: один авторитативный референс часто двигает LLM дальше, чем любой объём prompt-engineering. Reference-shifting бьёт prompt-shifting в этом домене.

4.3 LUT[n] ≈ display value n (linear 1:1), внутри safe ceiling

Изначальное предположение — что 100-entry PARAM_VALUE-LUT редактора navytuner был не-монотонным — оказалось неверным. Эмпирический тест (LUT[70] на AMP Tweedy Volume → дисплей педали показывает 70) подтвердил прямой мэппинг. Safe ceiling — SAFE_LUT_MAX = 90 (избегая известного top-of-LUT-краша; LUT[1] также пропущен как вероятный navytuner copy-paste-баг).

4.4 Порядок записи signal-chain имеет значение неочевидным образом

Trailing-enable SysEx у set_block_type не флипает CC-level enable-state блока. Последующие param-writes на CC-off-блоке принимаются, но молчат — блок хранит значения, но не производит звука, пока не пришёл CC-enable. Рабочий порядок:

CC-enable первым (обеспечивает audibility)
  →  set_block_type (3 priming region-unlock SysEx + body + trailing enable)
  →  set_param на ручку
  →  CC-enable (re-assert, belt-and-braces)

Это был один из самых долгих debug-циклов в трёхдневном цикле — multi-block-патчи молча производили near-dry-звук, пока порядок не был инвертирован.

4.5 Физические пределы guitar multi-FX для синтеза

Негативные результаты, намеренно оставленные в patch-библиотеке ради калибровочной честности:

  • sax — guitar multi-FX не может производить убедительные wind-instrument-тона. Pluck-attack наследуется от входного сигнала; можно формировать гармоники и pitch, но нельзя синтезировать reed/breath-envelope. Задокументировано как явный failure mode после многих попыток.
  • russian_accordion — аналогичное ограничение. Reed-based continuous-tone-инструменты вне досягаемости без polyphonic-pitch-синтеза.
  • Микротональные / quarter-tone-тонаневозможны на стандартно-фретовой гитаре без аппаратной модификации. Tone profile можно аппроксимировать, но pitch content — нельзя.

5. Crash-таксономия — три различных класса out-of-range-ошибок, каждый воспроизводимый

Firmware педали наблюдалась крашащейся на трёх различных классах out-of-range-записи, каждый со своей ошибкой и своей митигацией. Эмпирически отображено бисекцией на физическом юните:

| Ошибка | Причина | Митигация | |---|---|---| | algorprefxconstdata на различных строках | Запись на knob idx, не существующий для активного effect type, или param-значение вне firmware-acceptable-диапазона для этой конкретной ручки | Валидировать knob count + диапазон против таблицы EFFECTS до отправки | | algorcabsonstdata line 398 | CAB-param-writes используют другой SysEx-формат, чем все остальные блоки. Стандартный knob-write-payload отклоняется. | apply_patch молча пропускает CAB-params. Type + enable уважаются. | | audio.c line 1804 getparamaxval | Запись LUT-encoded-значения на bipolar/fractional-ручку (MOD Rate, delay Time в ms, EQ bands). Значение декодирует во внутреннее целое > knob's max. | Бросать NotImplementedError на non-0-99-ручки. LUT откалиброван только для continuous-knobs с Dmax=99. |

Decision tree, реализованное валидаторами:

flowchart TD
    Start[About to write to the pedal] --> Q1{Is the block CAB?}
    Q1 -->|yes & writing params| CAB_CRASH[🔥 algorcabsonstdata<br/>line 398]
    Q1 -->|yes & type/enable only| Q2
    Q1 -->|no| Q2
    Q2{Knob Type 1<br/>with Dmax 99 or 100?}
    Q2 -->|no: bipolar / Hz / ms / semitones| RATE_CRASH[🔥 audio.c line 1804<br/>getparamaxval]
    Q2 -->|yes| Q3
    Q3{Knob idx valid<br/>for this effect type?<br/>LUT index &le; 90?}
    Q3 -->|no| PREFX_CRASH[🔥 algorprefxconstdata<br/>line 226+]
    Q3 -->|yes| OK[✅ safe write]

Отдельно полезный side-effect crash-таксономии: она даёт LLM структурированную поверхность, на которой безопасно ошибаться. Модели говорят схему; схема отклоняет invalid-writes; педаль никогда не просят крашиться. Это архитектурная причина, по которой LLM можно доверить место в цикле — её ошибки ловятся на validator-слое, не на hardware-слое.


6. Открытые пробелы — все требуют MIDI-сниффинга официального desktop-app

| Пробел | Почему | Что разблокирует | |---|---|---| | Кодирование CAB-knob | Другая SysEx-команда / адрес, чем стандарт | Programmable CAB-volume на патч | | Type 2 Combox / Type 3 Switch writes | LUT-payload — только continuous-knob | Control-mode-comboxes (AC Sim mode, Flex OD mode) и switches (Bright, Sync, Trail) из патча | | Bipolar и special-range кодирование ручек | Внутреннее представление неизвестно (EQ ±50 dB, MOD Rate 0.1–10 Hz, delay Time 20–4000 ms, pitch 0–24 полутонов) | Programmable tempo-synced-эффекты, EQ-shaping, точные delay-времена, pitch-интервалы | | Read-back state'а preset'а | RQ1 (Roland-style 0x11) не наблюдался | Дамп текущего состояния, верификация патчей, A/B против known-good | | «Save preset» SysEx | Не предпринято (риск порчи flash при плохой гипотезе) | Persist'ить сгенерированные патчи в named user-слоты |


7. Patch-библиотека как артефакт

Двадцать с лишним патчей сгенерировано и валидировано live на железе. Снимок библиотеки по категориям:

  • Музыкальные тоны: ufo, takanaka, takanaka_brazilian_skies, takanaka_tengo_suerte, jazz_fusion, jazz_solo, tele_solo, meow_fusion, shoegaze_wall, cathedral_organ, bells, sababa5_nasnusa, hawaii, blink_182, angine_de_poitrine, brazilian, brazilian_funk, synth_lead (5 вариантов — analog pad, digital FM dream, Moog sub-lead, arp sequencer, tape-saturated dream), acid_303.
  • Character / sound-effect: soviet_scifi, laser_gun, theremin, music_box, lightsaber, female_scream, goblin, robot_guitar, frog, dubstep_wobble, bad_trip, ecstasy, telephone, cowbell, glass_bottle (air-resonance-вариант), sinister_score (happy accident, начавшийся как «toilet flush»), ufo_abduction, balalaika, taina_3_planet, soviet_wave.
  • Reference-библиотека: frusciante_from_prst (распарсенный реальный .prst из экспорта desktop-app firmware v1.8).

Каждый патч несёт notes-поле, документирующее design intent (effect-chain-rationale, play technique, reference-артист/трек). Поле notes дублируется как датасет для следующей итерации системного промпта LLM-слоя.


8. Процесс-наблюдения

  • Интерактивная итерация бьёт автономную генерацию для творческой работы. Ассистент, регенерирующий патч в ответ на «more reverb», «heavier», «not quite right», «like Takanaka's Brazilian Skies album but brighter», быстрее и музыкальнее, чем single-shot natural-language-to-patch-вызов. Туда-сюда — это и есть точка. Это согласуется с более широким наблюдением, что креативные LLM-приложения работают лучше как разговор, а не RPC.
  • Reference-based correction — high-leverage. Один реальный preset перекроил последующие дефолты ассистента больше, чем любые prompt-engineering-усилия. Больше референсов presumably скомпаундит, но это gated на доступность источника (99 factory presets не свободно скачиваемы; они живут в device flash).
  • Play technique — часть патча. Многие патчи приземляются только когда игрок знает играть staccato palm-muted, или делать slow volume swells, или бендить четверть-тон. Поле notes это несёт; будущая версия формализовала бы «play hints»-поле, которое LLM эмитит наряду с патчем.

9. Заключение

Описанная архитектура — маленькая инстанция более общего паттерна: любое железо с документируемым пространством параметров и человеком, слушающим выходы, может быть адресуемо LLM при условии работы по построению типизированного, валидированного моста между natural-language-приорами модели и таблицей параметров устройства. Никакого обучения, никакого датасета, никакого выученного мэппинга не нужно. Работа — в схеме и safety-net'е.

Самый интересный эмпирический результат — не то, что LLM может генерировать патчи, — а то, что один реальный preset перекраивает модель больше, чем десятки prompt-engineering-попыток. Это предполагает, что для аналогичных reverse-engineering-meets-LLM-доменов инвестиция в ground-truth-references компаундится быстрее, чем инвестиция в prompt-дизайн. Мы ожидаем, что этот паттерн держится для смежных классов железа (синтезаторы, drum machines, modular eurorack, даже DAW-plugin-параметр-spaces), где таблицы параметров похожи по форме.

Открытые пробелы все формы «больше SysEx-реверс-инжиниринга разблокирует больше пространства параметров». Они tractable, но требуют продолжающейся protocol-sniffing-работы против официального desktop-приложения.


Цитирование

Nix, A. (2026). Agentic Generation of Music-Processor Templates: LLM-Driven Patch Design for a Hardware Guitar Multi-FX, Without Training. Working paper.