• Больше 20 патчей собрано языковой моделью без обучения и датасета, проверены на железе
  • Прошивка падает тремя разными способами; валидатор ловит все три до отправки MIDI
  • Один разобранный реальный пресет сдвинул дефолты модели сильнее любых промптов

Задача

Аппаратный гитарный multi-FX-процессор хранит пространство параметров низкой сложности (несколько сотен значений по девяти блокам цепи), но с высокой семантической трудностью. Просьба «сделай звук как у Фрушанте на Californication» соответствует конкретной комбинации типов эффектов и положений ручек, которую ни одно меню устройства не документирует. Сообщество относится к этому как к ремеслу: патчи ходят файлами, туториалы разбирают по одному тону, общего алгоритма от текста к патчу нет.

Гипотеза узкая и проверяемая: достаточно сильная языковая модель, получив структурированное и валидированное пространство параметров, выдаёт музыкально связные патчи из описания на обычном языке. Без обученной модели, без датасета, без выученного отображения. Приоры модели по жанрам, артистам и звукорежиссуре заменяют обучение; валидатор не даёт ей отправить значения, которые устройство не примет; человек с гитарой подтверждает или отклоняет результат на слух. Три дня с железом в петле, Valeton GP-100 по USB-MIDI.

Метод

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

  1. LLM: текст → PatchSpec JSON.
  2. Типизированный API: PatchSpec, класс устройства, таблица эффектов.
  3. Транспорт: mido, сырой SysEx / CC / PC → процессор.
flowchart LR
    L[LLM:<br/>текст → PatchSpec] --> A[Типизированный<br/>API]
    A --> T[Транспорт mido:<br/>SysEx, CC, PC]
    T --> P[(Valeton<br/>GP-100)]
    A -.-> E[(146 типов<br/>эффектов)]

Таблица параметров реверсом. Ground truth для 146 типов эффектов собрана из работ сообщества реверс-инженеров, и источники пришлось сверять между собой. Один редактор оказался снят с более поздней прошивки: кабинеты сдвинуты, две модели гейта перепутаны, шесть моделей дисторшна вовсе не существуют на нашей версии. Другой проект дал XML с метаданными каждой ручки (индекс, тип, минимум, максимум, шаг) и стал авторитетным источником. Третий подтвердил заголовок SysEx по перехвату трафика официального приложения. Декодер файлов пресетов добавил один реальный пресет в качестве эталона.

Таблица парсится в типизированную структуру на этапе сборки. Каждый публичный метод класса устройства (set_block_type, set_param, set_bpm) сверяет входы с этой таблицей до того, как байты уйдут в MIDI.

Спецификация патча. Pydantic-схема на блок: включён, тип, параметры. Валидаторы отклоняют имя модели не из белого списка блока, число параметров больше числа ручек, значения вне 0.0–10.0. Функция apply_patch проходит блоки в порядке цепи. Порядок записи внутри блока найден эмпирически и неочевиден:

flowchart LR
    A[CC-enable] --> B[set_block_type:<br/>priming, body, enable]
    B --> C[set_param<br/>на ручку]
    C --> D[CC-enable<br/>повторно]
    classDef key stroke:#FF3600,stroke-width:2px
    class D key

Хвостовой enable внутри set_block_type не переключает CC-состояние блока. Запись параметров в выключенный блок принимается, но молчит: значения хранятся, звука нет. Это был самый долгий цикл отладки за три дня: многоблочные патчи выдавали почти сухой сигнал, пока порядок не перевернули.

Валидатор с тремя классами крашей. Прошивка падает на записи вне диапазона тремя разными способами, каждый воспроизводим и найден бисекцией на физическом устройстве.

ОшибкаПричинаЧто делает валидатор
algorprefxconstdataЗапись в ручку, которой нет у активного типа, или значение вне диапазона этой ручкиСверяет число ручек и диапазон с таблицей до отправки
algorcabsonstdata line 398Параметры кабинета используют другой формат SysExМолча пропускает параметры CAB, тип и enable уважает
audio.c getparamaxvalLUT-значение на биполярную или дробную ручку (Rate в Hz, Time в ms, EQ в dB)Бросает NotImplementedError на ручках с диапазоном не 0–99
flowchart TD
    S[Запись в процессор] --> Q1{CAB?}
    Q1 -->|да| C1[Тип и enable да,<br/>параметры пропуск]
    Q1 -->|нет| Q2{Ручка<br/>0–99?}
    Q2 -->|нет| C2[NotImplementedError]
    Q2 -->|да| Q3{Есть в<br/>таблице?}
    Q3 -->|нет| C3[Отклонить<br/>до отправки]
    Q3 -->|да| OK[MIDI уходит<br/>в процессор]

Побочный эффект таксономии важнее самой таблицы: у модели появляется структурированная поверхность, на которой безопасно ошибаться. Модель говорит в схему, схема отклоняет невалидное, педаль не просят падать. Именно это делает LLM допустимым участником цикла: её ошибки ловятся на слое валидации, а не на слое железа.

Один реальный пресет сильнее промптинга. До разбора эталона ручки в патчах модели кластеровались около 50, и всё звучало как заводская заготовка. После парсинга одного пресета (рок-тон Фрушанте из экспорта официального приложения) дефолты сдвинулись сразу: асимметричные значения вроде Gain 15 при Master 99, низкий Mix у временных эффектов (реверб 19, дилей 30), эффекты, определённые, но выключенные, потому что игрок включает их вживую. Модель откалибровалась по одному авторитетному примеру без дообучения. В этом домене сдвиг референса бьёт сдвиг промпта.

flowchart TB
    subgraph B[До эталона]
        direction LR
        B1[Промпты] --> B2[Ручки<br/>около 50] --> B3[Звук заводской<br/>заготовки]
    end
    subgraph A[После одного пресета]
        direction LR
        A1[Разобранный<br/>пресет Фрушанте] --> A2[Gain 15<br/>при Master 99]
        A1 --> A3[Mix: реверб 19,<br/>дилей 30]
        A1 --> A4[Эффекты заданы,<br/>но выключены]
    end
    B ~~~ A

Режим работы. Основной путь — интерактивный: пользователь описывает звук, ассистент пишет JSON по схеме, скрипт заливает его в устройство, цикл занимает секунды. Реакция на «больше реверба», «тяжелее», «как у Таканаки, но ярче» быстрее и музыкальнее, чем одиночный вызов текст → патч. Автономный путь через tool-use с принудительной схемой заскаффолжен, но отложен.

flowchart LR
    U([Описание звука]) --> A[Ассистент:<br/>JSON по схеме]
    A --> S[Скрипт заливает<br/>в устройство]
    S --> H[Гитарист<br/>слушает]
    H -->|больше реверба| A

Обновление, сентябрь 2026. Автономный путь дошёл до рабочего состояния в упрощённом виде. Мост к педали пересобрали и подключили к чат-агенту как скилл: агент пишет PatchSpec JSON по описанию звука, скрипт заливает его по USB-MIDI. Живой смоук-тест на педали прошёл, SysEx, CC и PC дошли, экран устройства переключился. Три предупреждения смоука были не про протокол, а про имена: агент писал Gain и Master в модель усилителя J-120 CL, у которой ручки называются VOL, Bass, Middle, Treble и Bright. Лечение: полный каталог ручек по каждому эффекту прямо в инструкции скилла, чтобы агент брал имена из таблицы устройства, а не из общих знаний о гитарных усилителях. Биполярные ручки, сохранение пресета в слот и чтение состояния по-прежнему не закрыты.

Результат: больше двадцати патчей, проверенных на железе. Джаз-фьюжн, поп-панк, шугейз-стена, соборный орган, acid 303, пять вариантов синт-лида, а также звуковые эффекты: лазер, терменвокс, световой меч, музыкальная шкатулка, телефон. У каждого патча поле notes с замыслом: логика цепи, техника игры, референс. Эти заметки — уже датасет для следующей версии системного промпта.

Где ломается

  • Физика. Гитарный multi-FX не синтезирует духовые и язычковые: атака щипка наследуется от входного сигнала, огибающую дыхания не сформировать. Патчи «саксофон» и «аккордеон» оставлены в библиотеке как честные провалы. Четвертитоновые интервалы тоже недостижимы без модификации инструмента.
  • Слепые зоны протокола. Кодирование ручек кабинета, переключатели и комбобоксы, биполярные и специальные диапазоны (EQ ±50 dB, Rate 0.1–10 Hz, Time 20–4000 ms) не записываются. Чтение состояния и сохранение пресета в слот не реализованы: первое не наблюдалось в трафике, второе — рискует испортить флеш. Всё это требует дальнейшего сниффинга официального приложения.
  • Референсы редки. 99 заводских пресетов живут во флеше устройства и свободно не скачиваются, поэтому калибровка по эталонам пока опирается на один файл.
  • Техника игры — часть патча. Многие патчи звучат только при правильной руке: приглушённое стаккато, медленные свеллы громкости. Сейчас это живёт в заметках; следующая версия должна выдавать подсказки по игре отдельным полем.

Итог

  • Обучение не нужно; нужна схема и страховочная сетка между приорами модели и таблицей параметров устройства.
  • Три класса крашей превращаются в три правила валидатора, и модель получает право ошибаться.
  • Вложение в один эталонный пресет окупается быстрее, чем вложение в промпт.
  • Паттерн переносится на любое железо с документируемой таблицей параметров и человеком, слушающим результат: синтезаторы, драм-машины, модульные системы.

© Александр Никулин. Цитирование — с указанием автора и ссылкой · Версия для LLM