- Больше 20 патчей собрано языковой моделью без обучения и датасета, проверены на железе
- Прошивка падает тремя разными способами; валидатор ловит все три до отправки MIDI
- Один разобранный реальный пресет сдвинул дефолты модели сильнее любых промптов
Задача
Аппаратный гитарный multi-FX-процессор хранит пространство параметров низкой сложности (несколько сотен значений по девяти блокам цепи), но с высокой семантической трудностью. Просьба «сделай звук как у Фрушанте на Californication» соответствует конкретной комбинации типов эффектов и положений ручек, которую ни одно меню устройства не документирует. Сообщество относится к этому как к ремеслу: патчи ходят файлами, туториалы разбирают по одному тону, общего алгоритма от текста к патчу нет.
Гипотеза узкая и проверяемая: достаточно сильная языковая модель, получив структурированное и валидированное пространство параметров, выдаёт музыкально связные патчи из описания на обычном языке. Без обученной модели, без датасета, без выученного отображения. Приоры модели по жанрам, артистам и звукорежиссуре заменяют обучение; валидатор не даёт ей отправить значения, которые устройство не примет; человек с гитарой подтверждает или отклоняет результат на слух. Три дня с железом в петле, Valeton GP-100 по USB-MIDI.
Метод
Три слоя, каждый заменяется заглушкой. От реверс-инженерной карты SysEx зависят только верхние два; транспорт — это тупая труба.
- LLM: текст → PatchSpec JSON.
- Типизированный API: PatchSpec, класс устройства, таблица эффектов.
- Транспорт: 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 getparamaxval | LUT-значение на биполярную или дробную ручку (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