Repository navigation
MIDI
Путь в меню: Options → Audio → MIDI · Платы: только RP2350 (на RP2040 MIDI нет) · Требуется: для программного синтезатора ничего; для аппаратных режимов — MIDI-устройство на пине MIDI_TX платы; для GM.DLS-wavetable — банк инструментов на SD (
.dlsконвертируется прямо на устройстве)
Эмулятор может превращать MIDI-вывод ZX-Spectrum-программы в реальные ноты. ZX-софт управляет MIDI двумя разными способами, и pico-spec эмулирует оба, плюс два встроенных синтезатора, которым не нужно внешнее железо:
-
AY — битбэнг-MIDI плееров вроде
zx-midiplayer. Программа дёргает бит 2 регистра 14 AY как линию TX; эмулятор декодирует этот битбэнг-кадр UART на 31250 бод и пересылает каждый байт. -
ShamaZX — интерфейс ShamaZX, доступ через порты
#A0CF(данные) /#A1CF(статус). Программа пишет MIDI-байты в порт данных и опрашивает бит «передатчик занят». -
Software — небольшой внутренний процедурный синтезатор (
SoftSynth): голоса square/saw/triangle/noise с ADSR и 8 пресетами. Без сэмплов и банка — работает «из коробки». -
GM.DLS Wavetable — целочисленный волновой синтезатор General MIDI, играющий
настоящий GM-банк (гораздо реалистичнее процедурного). Банк (
gm_bank.bin, собранный изgm.dls/ GUS) предоставляешь ты — см. ниже.
В режимах AY и ShamaZX декодированный поток MIDI-байтов выводится на GPIO MIDI_TX как стандартный сигнал 31250 бод, 8-N-1 (аппаратный стандарт MIDI) — к нему можно подключить синтезатор, MIDI-модуль (например SAM2695) или Raspberry Pi с программным синтезатором. Режимы Software и GM.DLS пин не используют — они подмешивают свой звук прямо в аудио эмулятора.
На платах RP2040 MIDI нет совсем — вся функция вырезается при компиляции (
#if !PICO_RP2040). Строки MIDI в меню Audio на платах ZERO и MURM (RP2040) нет.
Options → Audio → MIDI(Ext:P<pin>) ▸
├── OFF
├── AY декод битбэнга AY рег.14 бит 2 → пин MIDI_TX
├── ShamaZX порты #A0CF/#A1CF → пин MIDI_TX
├── Software MIDI ▸ внутренний процедурный синтез (без железа)
│ └── Synth Preset ▸ GM / Piano / Chiptune / Strings / Rock / Organ / Music Box / Synth
└── GM.DLS Wavetable GM-wavetable из gm_bank.bin на SD (без железа)
В заголовке меню показан активный внешний TX-пин платы, например MIDI(Ext:P22).
Выбор Software MIDI открывает подменю Synth Preset; выбор GM.DLS Wavetable
загружает/устанавливает банк (см. ниже).
| Пункт | Значения | По умолч. | Описание |
|---|---|---|---|
| MIDI | OFF / AY / ShamaZX / Software MIDI / GM.DLS Wavetable | OFF | Режим MIDI. Сохраняется в NVS (midi) |
| Synth Preset | GM / Piano / Chiptune / Strings / Rock / Organ / Music Box / Synth | GM | Набор тембров только для синтезатора Software. NVS (midipreset) |
- Режим —
Config::midi(0=OFF,1=AY,2=ShamaZX,3=Software,4=GM.DLS); пресет Software —Config::midi_synth_preset(0=GM …7=Synth). Сохраняются сразу. - Смена режима выгружает прежний (
Midi::deinit()) и поднимает новый (Midi::init()) на лету — без перезагрузки (но первая установка GM.DLS делает ребут, см. ниже). - Текущее состояние MIDI также выводится на экране Emulator Info
(Hardware → Emulator Info):
Off,AY bitbang,ShamaZX,Software (<пресет>)илиGM.DLS (bank OK / no bank).
| AY | ShamaZX | Software | GM.DLS Wavetable | |
|---|---|---|---|---|
| ZX-интерфейс | AY рег.14, бит 2 |
#A0CF/#A1CF
|
#A0CF/#A1CF (+AY битбэнг) |
#A0CF/#A1CF (+AY битбэнг) |
| Использует пин MIDI_TX | да (31250 8-N-1) | да | нет | нет |
| Нужно внешнее железо | да | да | нет | нет |
| Нужен банк на SD | нет | нет | нет |
да (gm_bank.bin) |
| Звук | внешнее устройство | внешнее устройство | процедурный (чип-стиль) | настоящие GM-сэмплы |
Аппаратный UART работает на стандартных для MIDI 31250 бод, 8-N-1. Отправка
неблокирующая: байт отбрасывается, если TX-FIFO полон (драйвер ShamaZX сначала опрашивает
бит занятости в #A1CF, так что на практике этого быть не должно).
Режим GM.DLS Wavetable играет настоящий GM-банк. Банк не входит в комплект — его нужно подготовить один раз. Два способа:
-
На самом устройстве (проще всего): скопируй сырой файл
.dlsна SD и либо открой его из файлового браузера F5, либо выбери «[+] Convert a .dls...» в выборе набора инструментов — устройство сконвертирует его само (см. ниже). ПК не нужен. -
На ПК: собери из
.dlsбанк.binутилитойtools/dls_pack.pyи скопируй результат на SD.
Движок wavetable и утилиты конвертации
dls_pack/gus_packвзяты из xrip/embedded-midi-synth — спасибо @xrip. См. Благодарности и помощь.
- GM-банк формата DLS — например
gm.dlsот Microsoft (поставляется с Windows по путиC:\Windows\System32\drivers\gm.dls, ~3.4 МБ) или открытый набор патчей GUS (freepats). - Плата RP2350 с флешем ≥ 4 МБ — упакованный банк живёт в отдельном разделе флеша ~1.6 МБ (а на платах с PSRAM грузится прямо в PSRAM). На RP2040 MIDI нет вовсе.
- ПК с Python 3 — только если предпочитаешь офлайн-упаковщик; конвертеру на устройстве ничего не нужно.
Лицензия.
gm.dlsот Microsoft защищён авторским правом и не подлежит распространению. Собрать свой банк из своей копии Windows для личного использования на своём устройстве — нормально, но не коммитьgm.dls/gm_bank.binв репозиторий и не распространяй прошивку с ним внутри. Для свободно распространяемого банка используй freepats (открытая лицензия).
Движок играет компактный упакованный банк .bin, а не сырой .dls — но конвертация
может выполняться на самом устройстве. Скопируй .dls на SD и затем либо:
-
открой
.dlsиз файлового браузера F5 — он сконвертируется, и режим GM.DLS включится за один шаг; либо - в Options → Audio → MIDI → GM.DLS Wavetable выбери первую строку выбора набора инструментов — «[+] Convert a .dls...» — и укажи файл.
Конвертер читает файл потоково (показывается процент прогресса), пишет <имя>.bin в
/.config/pico-spec/ и выбирает его. Слишком большой для флеш-раздела банк
отвергается с сообщением о размере.
Как вариант — конвертируй офлайн утилитой tools/dls_pack.py, на частоте 31250 Гц
(это аудиочастота pico-spec — движок не ресемплит, частота должна совпадать):
python3 tools/dls_pack.py gm.dls gm_bank.bin 31250
Результат ~1.6 МБ (PCM в 8-битном µ-law). Для набора GUS / freepats используй
tools/gus_pack.py, указав ему TiMidity-конфиг:
python3 tools/gus_pack.py timidity.cfg gm_bank.bin 31250
Оба упаковщика — чистый Python (без зависимостей) и дают одинаковый формат gm_bank.bin.
Положи упакованный банк на SD-карту: в корень (например /gm_bank.bin) или в
/.config/pico-spec/.
Выбор набора инструментов. Выбор GM.DLS Wavetable теперь всегда открывает пикер «Instrument set»: первая строка — «[+] Convert a .dls...» (конвертация на устройстве, см. 1а), дальше — все упакованные банки с SD, активный помечен
[*]. Отказ от установки откатывает выбор — ничего не меняется, пока не подтвердишь.
Options → Audio → MIDI → GM.DLS Wavetable, затем выбери банк:
- Платы с PSRAM грузят банк на лету — звук работает сразу, без перезагрузки.
-
Без PSRAM банк должен попасть во флеш, а это происходит только на раннем бусте:
подтверди «Install this bank? (reboots)» — устройство перезагрузится и запишет
банк на следующем бусте: экран погашен, LED мигает ~20-30 с (питание не
выключать). После этого поднимется со звуком. Так как банк лежит в отдельном разделе
флеша, последующие загрузки мгновенные (SD не нужна), и банк переживает
обновление прошивки (раздел не входит в
.uf2).
-
Новый банк: скопируй другой
gm_bank.binна SD и снова выбери GM.DLS — если он отличается от записанного во флеше, он переустановится на следующем бусте. - Принудительная переустановка (например, чтобы починить плохой банк): выбери GM.DLS Wavetable, когда он уже загружен, и ответь Yes на «Reinstall DLS bank from SD?» — устройство перезагрузится и перезапишет банк с SD.
- Запись во флеш идёт только на раннем бусте, на одном ядре (до старта видео) — поэтому экран погашен; это исключает зависание HDMI/видео на core 1.
- Обрыв записи безопасен: заголовок банка коммитится последним, поэтому частичная/ прерванная запись просто отвергается на бусте — можно переустановить.
- Инструменты берутся из банка, поэтому подменю Synth Preset к GM.DLS не относится — оно только для синтезатора Software.
- Если
gm_bank.binотсутствует/битый, режим GM.DLS молчит, а в инфо-строке —GM.DLS (no bank). -
Картриджи ALF больше не конфликтуют. Картриджи ALF TV Game теперь стримятся
с SD, а не занимают флеш-раздел банка, так что GM.DLS и загруженный картридж
сосуществуют — без предложения выгрузить. Только специальные ALF-сборки прошивки,
забирающие раздел банка под саму прошивку (
NO_GM_DLS), убирают строку GM.DLS из меню совсем.
Внешний TX-пин фиксируется для каждой платы на этапе сборки (MIDI_TX_PIN). На RP2350
только чётный GPIO может быть UART TX (нечётные — только RX); код сам выбирает экземпляр
UART и funcsel по номеру пина. (Касается только аппаратных режимов AY / ShamaZX —
Software и GM.DLS пин не используют.)
| Плата | MCU | MIDI_TX GPIO | UART | Статус |
|---|---|---|---|---|
| MURM2 | RP2350A | 22 | UART1 | OK — но делит пин с Real sound-in (WAV): взаимоисключающе (см. ниже) |
| PICO_PC | RP2350A | 26 | UART1 | OK |
| ZERO2 | RP2350B | 22 | UART1 | OK |
| MURM-1 (RP2350 / MURM_P2) | RP2350 | 22 | UART1 | OK — но делит пин с Real sound-in (WAV): взаимоисключающе (см. ниже) |
| PICO_DV | RP2350 | 21 | — |
СЛОМАНО — GPIO 21 нечётный (только RX), поэтому не может быть UART TX. Аппаратный MIDI на PICO_DV не работает. (При включённом отладочном UART пин устанавливается в 255 = отключён.) |
| ZERO | RP2040 | — | — | MIDI нет (RP2040 — функция вырезана) |
| MURM (RP2040) | RP2040 | — | — | MIDI нет (RP2040 — функция вырезана) |
На PICO_DV синтезаторы Software и GM.DLS всё равно работают (они не используют TX-пин); баг с нечётным пином затрагивает только аппаратные режимы AY и ShamaZX.
Полные карты GPIO — в Платы и распиновка.
На MURM2 и MURM-1 (RP2350) пин MIDI_TX (GPIO 22) — это тот же пин, что и LOAD_WAV_PIO — GPIO для Real sound-in (Storage → Tape → Real sound-in). Они взаимоисключающи: пин может использовать только один. Если включить аппаратный режим MIDI (AY или ShamaZX) при включённом Real sound-in, появится предупреждение:
MIDI and Real sound-in share GPIO 22. Disable one of them.
(Синтезаторы Software и GM.DLS пин не используют, поэтому не конфликтуют.)
MIDI использует стандартную сигнализацию 31250 бод (последовательная / токовая петля). Соедините GPIO MIDI_TX платы с MIDI IN вашего устройства. И Pico, и большинство 3,3-В MIDI-модулей работают на 3,3-В логике; классический 5-контактный DIN MIDI использует оптоизолированную схему токовой петли, а небольшие UART-MIDI синтезаторные модули (например платы на SAM2695) принимают линию TX напрямую. Распространённая схема — Raspberry Pi с программным синтезатором, на вход которого подаётся TX-пин Pico. Полные распиновки: Платы и распиновка.
- Программный синтезатор (без железа): установите MIDI → Software MIDI, выберите пресет, запустите ZX MIDI-плеер. Должен звучать процедурный синтез в аудио эмулятора.
-
GM.DLS-wavetable: скопируйте
.dlsна SD, установите MIDI → GM.DLS Wavetable и используйте «[+] Convert a .dls...» (или заранее соберите банк на ПК). На платах с PSRAM звук появляется сразу; иначе дождитесь разовой установки во флеш (LED мигает ~20-30 с после ребута). Запустите MIDI-плеер — должны звучать настоящие GM-инструменты. - Аппаратный вывод: на рабочей плате (MURM2 / PICO_PC / ZERO2 / MURM-1) установите MIDI → AY или ShamaZX, подключите MIDI_TX к MIDI IN синтезатора и запустите тот же плеер.
- Интерфейс ShamaZX MIDI: https://zxpress.ru/article.php?id=9979
- General MIDI: https://en.wikipedia.org/wiki/General_MIDI
- freepats (открытый GM-набор): https://freepats.zenvoid.org/
- Платы и распиновка: Платы и распиновка
- Заметки разработчика (ограничение UART TX для MIDI, пины по платам): CLAUDE.md
Движок синтезатора GM.DLS Wavetable и утилиты конвертации банка (dls_pack /
gus_pack) основаны на xrip/embedded-midi-synth —
большое спасибо @xrip за движок и разрешение использовать его
в pico-spec.
Нужна помощь? Пишите в Telegram-чат Murmulator: https://t.me/ZX_MURMULATOR/241767
Меню (RU)
Сквозные темы
Для разработчиков