Skip to content
drew.po28@gmail.com edited this page Jul 6, 2026 · 7 revisions

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-банк — как загрузить инструменты

Режим 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 (открытая лицензия).

1а — Конвертация на устройстве (без ПК)

Движок играет компактный упакованный банк .bin, а не сырой .dls — но конвертация может выполняться на самом устройстве. Скопируй .dls на SD и затем либо:

  • открой .dls из файлового браузера F5 — он сконвертируется, и режим GM.DLS включится за один шаг; либо
  • в Options → Audio → MIDI → GM.DLS Wavetable выбери первую строку выбора набора инструментов — «[+] Convert a .dls...» — и укажи файл.

Конвертер читает файл потоково (показывается процент прогресса), пишет <имя>.bin в /.config/pico-spec/ и выбирает его. Слишком большой для флеш-раздела банк отвергается с сообщением о размере.

1б — Или собрать банк на ПК

Как вариант — конвертируй офлайн утилитой 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.

2 — Скопировать на SD (только для пути через ПК)

Положи упакованный банк на SD-карту: в корень (например /gm_bank.bin) или в /.config/pico-spec/.

Выбор набора инструментов. Выбор GM.DLS Wavetable теперь всегда открывает пикер «Instrument set»: первая строка — «[+] Convert a .dls...» (конвертация на устройстве, см. 1а), дальше — все упакованные банки с SD, активный помечен [*]. Отказ от установки откатывает выбор — ничего не меняется, пока не подтвердишь.

3 — Выбрать режим

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 из меню совсем.

Пин MIDI_TX по платам

Внешний 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 — в Платы и распиновка.

MIDI_TX общий с Real sound-in (WAV) — MURM2 / MURM-1

На 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. Полные распиновки: Платы и распиновка.

Как проверить

  1. Программный синтезатор (без железа): установите MIDI → Software MIDI, выберите пресет, запустите ZX MIDI-плеер. Должен звучать процедурный синтез в аудио эмулятора.
  2. GM.DLS-wavetable: скопируйте .dls на SD, установите MIDI → GM.DLS Wavetable и используйте «[+] Convert a .dls...» (или заранее соберите банк на ПК). На платах с PSRAM звук появляется сразу; иначе дождитесь разовой установки во флеш (LED мигает ~20-30 с после ребута). Запустите MIDI-плеер — должны звучать настоящие GM-инструменты.
  3. Аппаратный вывод: на рабочей плате (MURM2 / PICO_PC / ZERO2 / MURM-1) установите MIDI → AY или ShamaZX, подключите MIDI_TX к MIDI IN синтезатора и запустите тот же плеер.

Ссылки

Благодарности и помощь

Движок синтезатора GM.DLS Wavetable и утилиты конвертации банка (dls_pack / gus_pack) основаны на xrip/embedded-midi-synth — большое спасибо @xrip за движок и разрешение использовать его в pico-spec.

Нужна помощь? Пишите в Telegram-чат Murmulator: https://t.me/ZX_MURMULATOR/241767

Clone this wiki locally