MIDI-интерфейсочная (цифровая кладовка)

вер. 260722

  1. О чём это?
  2. Стандарт
  3. DB-15 на звуковой карте (а также Wavetable Upgrage)
  4. COM-to-MIDI на 80С51 (но есть нюанс)
  5. COM-to-MIDI на ардуине (но есть нюанс)
  6. COM-to-MIDI без ардуины (но есть нюанс)
  7. MIDI-вывод со Спектрума (базовый минимум)
  8. MIDI на MSX (с точки зрения Ямахи)
  9. MIDI для самоиграйки
  10. USB MIDI на ардуине
  11. Примеры из разных проектов
  1. О чём это?

Статья содержит некоторое обобщение опыта нашей лаборатории бесполезных вещей в области соединения по MIDI различных устройств. Главным образом внимание уделено физическому уровню MIDI версии 1.0, а модель данных и программный протокол MIDI затрагивается лишь вскользь, где это необходимо. Формат статьи «цифровая кладовка» — сборище разных данных, которое может изредка дополняться, переделываться и т. д. Как цифровой огород, только ничего не растёт =)

Напомним, MIDI (Musical Instrument Digital Interface) — это стандарт связи цифровых музыкальных инструментов, выпущенный в 1983 г. и позволяющий обмениваться информацией устройствам разных производителей. Кроме того, MIDI стал частью зарождавшихся тогда мультимедийных технологий на ПК и в этом качестве интересен не только музыкантам, но и любителям ретрокомпьютеров. Физический интерфейс представляет собой токовую петлю (~5 мА) с гальванической развязкой, передающую данные в последовательной форме со скоростью 31250 бит/с. Типичный соединитель DIN 41524 (5 контактов), иногда может применяться TRS («джек»).

Собственно, обеспечение нужного битрейта и преобразование (LV)TTL в токовую петлю и являются основными задачами при конструировании MIDI-интерфейсов для различной цифровой техники. Ниже рассмотрено несколько ситуаций.

Кстати, абзац отказа от ответственности. Если что-либо делать, можно что-нибудь сломать. Мы не виноваты, если что. Со своей стороны уточняем, что почти всё написанное проверено на практике, и в написании не помогала никакая искусственная нервная сеть.

2. Стандарт

В спецификации стандарта MIDI 1.0 физический уровень выглядит так:

Типичные компоненты: оптрон Sharp PC-900 (или 6N138 или любой другой достаточно быстрый (важно для длинных цепочек инструментов) с соответствующими изменениями в обвязке, см. примеры и ссылку); буферы или пара TTL инверторов в качестве формирователей; резисторы 220 Ом (точность 5%), которые и дают с указанным оптроном при напряжении питания 5В ток в петле около 5 мА (при другом напряжении или отличающемся по падению напряжения оптроне, величина сопротивления требует корректировки). Диод D1 защищает сравнительно нежный светодиод оптрона от случайного включения с обратной полярностью (типичное предельное обратное напряжение светодиода там ~5В).

На устройстве, в зависимости от его возможностей, может быть до трех MIDI-портов: IN — вход, OUT — выход, THRU — сквозной (без логической обработки) повторитель входа. При подключении кабелем соединяются порт IN одного устройства и OUT (или THRU) — другого. Для осуществления двунаправленного обмена нужна пара кабелей. Длина кабеля — до 15 метров, внутри — экранированная витая пара, подключенная к контактам 4 и 5 DIN-вилки. Экран подключается только со стороны OUT или THRU портов для исключения гальванической связи.

3. DB-15 на звуковой карте (а также Wavetable Upgrage)

Большинство звуковых карт, которые производитель явно не позиционировал как (полу)профессиональные, не имели стандартных DIN разъемов под MIDI, но соответствующие TTL-сигналы присутствовали на разъеме DB-15F, основное предназначение которого — подключение джойстика (или двух) к мультимедийному компьютеру (он становился таковым при установке звуковой карты). Эта славная традиция соблюдалась более десятилетия и сошла на нет с повсеместным утверждением USB-портов и соответствующей периферии (джойстиков и USB MIDI-адаптеров). В середине же 1990-х для того, чтобы подключить MIDI-синтезатор к компьютеру требовался специальный адаптер. Его начинка фактически повторяла картинку из стандарта выше (за минусом секции THRU), при этом цена была неадекватной (сколько?) этой начинке (когда автору этой статьи в 2017 г. в местном магазинчике попались эти адаптеры по 110 рублей, он купил два, не имея планов даже на один, таковы последствия травм юности).

Впрочем, адаптер несложно изготавливался самостоятельно, например, по такой схеме:

Источник: https://fr.audiofanzine.com/dossiers_v3/intermidi/cablemidi.htm

Сигналы MIDI выведены на 12 (OUT) и 15 (IN) контакты розетки DB-15F. Питание схемы производится от GAME/MIDI-порта, буферы выхода и входа отсутствуют, что, обычно, не вызывает проблем на коротких кабелях, но на длинных (а также с некоторыми моделями звуковых карт), такой адаптер может работать не стабильно. Чуть более сложный, но безопасный вариант описан, например, здесь. Вот та же схема из книги Петелиных «Персональный оркестр в ПК»:

Помимо внешнего разъема GAME/MIDI многие звуковые карты оснащались внутренним соединителем для дочерней платы wavetable-синтезатора в виде 26 контактной двухрядной гребёнки, обычно подписанной как Wavetable Upgrade (или WaveBlaster, MIDI EFX, и т. д).

На нее также выведен сигнал MIDI OUT в TTL (в редких случаях и MIDI IN (на 8 контакте?). Правда, за малым количеством исключений, программно этот разъем и внешний порт GAME/MIDI не различимы и одновременно их использовать можно, только разделяя функции ввода и вывода или заглушая аудиовывод одного из устройств (если, конечно, за чем-либо не требуется их унисон). Типичная разводка разъема WT Upgrade такова:

На разъем выведено питание +5В аналоговой секции (VCCA; 6, 10, 14), +12В (18) и -12В (22) (не на всех картах), цифровая земля (1, 3, 5, 7, 9, 11), аналоговая земля (15, 17, 19, 21, 23, 25), инвертированная линия сброса (26), стерео аналоговый аудиовход (20 и 24), и MIDI Out (4). На рисунке выше назначение сигналов указано в логике дочерней платы.

Разводка является более-менее стандартной для разных карт, но могут быть исключения, как на некоторых картах ESS, где ввод звука с аналогового переделан на проприетарный цифровой канал (соответственно, требуется дочерняя плата с цифровым выводом).

4. COM-to-MIDI на 80С51 (но есть нюанс)

В некоторых случаях установка звуковой карты (или в общем, MPU-совместимой ISA-платы) затруднена или не возможна (ноутбуки, например). При этом, сам ПК имеет встроенный последовательный порт, а то и два. Почему бы не сделать адаптер, позволяющий обмениваться MIDI-данными через штатный COM-порт? Главной проблемой на этом пути будет даже не преобразование уровней RS-232 в токовую петлю и обратно, а согласование скоростей. Битрейт MIDI 31250 б/с (1 МГц / 32) не совпадает ни с одним стандартным значением скорости, на которых может работать COM-порт ПК. Ближайшие 38400 и 28800 — слишком далеки для асинхронного режима, поэтому адаптер должен не только поддерживать две разные скорости обмена, но и обеспечивать буферизацию и управление потоком данных.

Предлагаемая схема (автор Paul Messick, сайт в Интернете уже не работает) построена на популярнейшем микроконтроллере 80С51, использует один аппаратный последовательный порт МК, второй реализует программно, имеет буфер около 120 байт для данных, поддерживает аппаратное управление потоком и может обходиться «фантомным» питанием от линий порта RS-232. Программная поддержка под DOS не богата, в предположении, с ним мог бы работать softMPU и DOSMID в режиме вывода в COM-порт. Для Win 3.1/95 автор схемы написал драйвер, добавляющий в систему стандартный MIDI-порт.

А нюанс в том, что рассматриваемую схему в нашей лаборатории бесполезных вещей пытались собрать два раза с интервалом в 20 лет (буквально) и оба раза она не заработала ни в досовском тесте петли, ни с драйвером для Windows. Докопаться до причины (пока?) не хватило то ли ума, то ли страсти, но логический анализатор показывает, что какой-то обмен завязывается, и тут же тухнет на этапе опознания адаптера программой. Тем не менее, схема интересна с методической точки зрения. И, конечно, она не является единственной и в интернетах тех лет можно было найти еще несколько вариантов…

5. COM-to-MIDI на ардуине (но есть нюанс)

Что ж, разобраться с чужим не получилось, а что если сделать свое на знакомых DIYщикам железках? Ага, Arduino (UNO/Nano), преобразователь уровней на MAX232 (лучше готовый мини-модуль), оптрон, резисторы, соединители…

Схема проще некуда, прошивка — тоже. Принимаем данные с одного порта, отправляем на другой, и наоборот. Со стороны MIDI скорость 31250, а со стороны ПК — 38400. А нюанс в том, что в таком минимальном варианте не реализовано управление потоком (пока), поэтому при плотном трафике или bulk-пересылках начинаются потери данных. С другой стороны, для типичных применений (озвучка игр, музицирование вручную, прослушивание обычных MIDI-файлов) такой реализации адаптера вполне достаточно. Более того, если применить Arduino на ATmega328PB, у которого есть второй аппаратный UART, то без потерь пересылаются bulkи до 160 байт. Главное неудобство такого адаптера — необходимость питания 5В. Его придется брать или от отдельного блока (зарядка от мобильника) или выводить с порта PS/2 или из БП ПК.

Под DOS адаптер можно использовать с softMPU и DOSMID в режиме вывода в COM-порт. А для Win 3.1 и 95/98 подходит драйвер от Yamaha CBX-T3, добавляющий в систему стандартный MIDI-порт. Этот драйвер ожидает управление выходным потоком по RTS/CTS, поэтому для нормальной работы надо поставить перемычку между 7 и 8 пином DB-9 (или реализовать соответствующую полную логику в контроллере нашего адаптера).

6. COM-to-MIDI без ардуины (но есть нюанс)

Еще один подход к проблеме согласования скоростей заключался в том, чтобы сменить базовую частоту аппаратуры COM-порта. Например, заменой кварцевого резонатора. Этот порт больше нельзя будет использовать с периферией ПК, но адаптер для MIDI теперь сильно упрощается, сводясь к гальванической развязке и согласованию уровней. Впрочем, часто кварц был один на оба канала UARTa или вообще отсутствовал, а частота получалась делением базовой частоты шины. Это требовало уже более серьезной переделки контроллера.

Но встречались и решения, не требовавшие лезть с паяльником в компьютер. Например, во времена 486-х процессоров Winbond выпускал контроллер Multi I/O W83787(I)F. Он обычно устанавливался на материнские платы и приносил с собой два канала IDE, контроллер Floppy-дисковода, порт принтера, джойстика и два UARTа (в W83787IF еще была поддержка ИК-порта). Его можно было найти на матерях Zida 4DPS, Lucky Star LS-486E и многих других. Один или оба UARTа W83787(I)F могли быть в BIOS переключены в режим MIDI. При этом менялся делитель частоты тактового генератора 24 МГц с 13 на 12, что позволяло перестроить ряд скоростей и получить нужные 31250 б/с. Далее, можно прицепить вышеописанную физическую обвязку, взять драйвер от Ямахи и вот вам MIDI-порт. Правда, и здесь не без тонкостей. Необходимая скорость на выходе будет, если сконфигурировать COM-порт «как будто» на 28800 б/с — стандартное, но более редкое значение. При этом, что softMPU, что драйвер Ямахи настраивают порт на 38400. Остается только запускать утилитку, меняющую скорость порта после запуска softMPU и драйвера, пользуясь тем, что Win95/98 не пресекает прямое обращение к аппаратуре.

7. MIDI-вывод со Спектрума (базовый минимум)

Поскольку звук и музыка на Спектруме — поле обширное, максимально сузим тему до возможности послушать на внешнем синтезаторе MIDI-файлы, которые лежат на дискете формата TR-DOS. Надо взять дискету с ZX MIDI player и файлами (в нашей лаборатории TRD-образ на Кворуме-128 не захотел запускаться с DivMMC, пришлось брать BDI и Gotek) и уже в плеере выбрать направление вывода данных. Популярный способ, примененный еще в Spectrum 128K — это вывод MIDI-данных через линию GPIO A2 чипа PSG (19 нога AY-3-8910 или YM2149F). В нашем случае, была плата Турбосаунд+Кемпстон и на неиспользуемый в реальности контакт порта джойстика для третьей кнопки прокидывались данные. Дальше — простейший адаптер из пары резисторов, и вот уже MIDI-guy (SAM2695 внутри) весело запел.

В рамках суженной темы — всё.

8. MIDI на MSX (с точки зрения Ямахи)

С программной точки зрения единого стандарта MIDI на MSX нет, а есть много разных реализаций. Если сузить фокус до Yamaha, которая тащила в 1980-х MSX как музыкальную платформу (см. модули SFG-01 или SFG-05), то та применяла для MIDI I/O собственные навороченные контроллеры (например, YM2148), обычно отображаемые в пространство памяти и традиционно скупо документированные, что отразилось в сравнительно бедном оснащении упомянутых адаптеров программными средствами за пределами Ямаховской «экосистемы». Впрочем, на момент актуальности YM2151, оснащенный фирменным экранным редактором патчей, представлял собой весьма интересный FM-синтезатор (кстати, в нашей лаборатории бесполезных вещей сделали реплику дата-картриджа для SFG-05, которую можно использовать для сохранения патчей). В SFG-05 появилась возможность использовать MIDI-вход для подключения внешней MIDI-клавиатуры, а до этого поиграть в реальном времени можно было только на фирменных клавиатурах (Yamaha YK-01, YK-10, YK-20), подключавшихся через специальный разъем и не передававших динамику клавиш, хотя синтезатор имел средства реагирования на динамику. Стандартная программная оболочка SFG-05 имела также простенький режим «самоиграйки» с автоаккопаниментом, но его забыли научить работать с внешней MIDI-клавиатурой, поэтому переключение тона аккомпанимента (как и индикация нажатых клавиш) работают только с «фирменной» клавиатурой. Не то чтобы в этом была какая-то особая надобность, но слегка обидно. Впрочем, наша лаборатория бесполезных вещей разработала адаптер, позволяющий подключить обычную MIDI-клавиатуру в «фирменный» порт SFG-05.

Полезно в контексте упомянуть проект MAmidiMEmo, который представляет собой программный синтезатор, умеющий эмулировать массу музыкальных ретрочипов, а кроме того, позволяющий подключить любую MSX-машину (и многие другие) через порт джойстика к ПК посредством моста USB-Serial (см. раздел VSIF в документации) и задействовать обычным для ПК с Windows образом установленные на MSX музыкальные средства (PSG, OPM, OPLL и т.д.). Это не относится напрямую к аппаратуре MIDI, но решает схожую задачу по пересылке музыкальной и конфигурационной информации. Чума ваще.

9. MIDI для самоиграйки

Попалась как-то ссылка (в двух словах — на плате синта есть контакты, куда выведены сигналы MIDI). Поскольку имеющийся в лаборатории PSS-F30 построен на той же аппаратной платформе, что и рассмотренный в статье PSS-A50, он был обречен на дооснащение MIDI-портами (тем более, что в отличие от А50, там нет чипа USB MIDI). Это позволило удобно применять его в качестве компактной MIDI-клавиатуры и даже «почти XG» тон-генератора. Схема стандартная — КМОП-буфер, оптронная развязка и DINы на корпус, только питание там 3,3В, что требует уменьшить номинал резисторов на выходе.

Но поскольку сам синтезатор ничего про обретённые порты не знает, обычного управления MIDI-функциями нет, передача идет только по первому каналу, а номера программ не совпадают с GM. Но и так не плохо.

10. USB MIDI на ардуине

С утверждением USB многие стандартные порты ушли со спин компьютеров и периферии. То же стало и с MIDI, который остался только на (полу)профессиональном оборудовании. Адаптеры USB-MIDI пока несложно найти в продаже или даже сделать саму, но они в основном решают задачу подключения MIDI-устройства к компьютеру. А что если есть синтезатор только с USB-портом, но хочется его задействовать для управления обычным MIDI оборудованием? Или заставить его играть музыку из досовских игр с компьютера без USB?

Один из вариантов решения — Arduino UNO/Nano и USB Host Shield на Max3421E. Этот чип работает как корень шины USB и умеет работать с различными функциями, включая MIDI-контроллеры. Соответственно, если задействовать UART МК для MIDI-интерфейса (и прошить стандартный пример библиотеки USB HOST Shield Library 2.0/USBH_MIDI/bidirectional_converter), можно получить мост USB B-MIDI.

Некоторые навороченные ардуины (DUE и некоторые другие) умеют работать USB-хостом сами, без дополнительных контроллеров, но, по крайней мере некоторое время назад, программная поддержка там была слабее и список реально работавших устройств меньше.

11. Примеры из разных проектов

Варианты реализации физического уровня из разных проектов.

  1. Синтезатор Yamaha YS-200 (1988 г.)

IC33 — 6N137, IC6 — 74HC14, D1 — 1SS176. Как и во многих профессиональных инструментах, помимо стандартных элементов добавлены индуктивности на обе линии разъемов, а экран со стороны MIDI IN развязан с землей конденсатором.

2. Синтезатор Alesis Micron (2005 г.)

3. Модуль FM-синтезатора YAMAHA SFG-01 (1983 г.)

IC108 — 74LS04, IC109 — TLP552, D3 — 1SS133

4. MegaMIDI (YM2612 + SN76489) (2021 г.)

5. MIDI-guy (SAM2695) (2024 г.)

Вместо DIN применен TRS (jack 3.5 mm), а для обеспечения совместимости с разными типами разводки введен диодный массив U3. Но автор схемы забыл отразить влияние лишних диодов на ток. Поэтому величина R2 требует корректировки вниз, например, 110 Ом. Также величину R3 рекомендуется увеличить до 390 Ом.

Дополнительная информация

  1. W83787IF datasheet
Запись опубликована в рубрике DIY, Кабели и адаптеры с метками , , , , , . Добавьте в закладки постоянную ссылку.