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

Интерфейс midi, предназначенный в первую очередь для информационного обмена между музыкальными устройствами (компонентами) априори не предусматривает обязательного наличия ПК в роли одного из узлов ... Но когда музыкальных миди-гаджетов не так уж и много, а один из них нужно протестировать или заюзать - то применение эмуляции недостающих в виде софта на ПК весьма кстати (будь то клавиатура, синтезатор, или еще что-нибудь ... файл к примеру).

Непосредственно в электрическом виде интерфейс миди присутствовал лишь на звуковых картах начала 2000-х. А теперь нужен адаптер, реализующий функцию "моста" - чтоб в системе он был "виден" миди входом/выходом, а в физическом представлении имел классические DIN-5 (например). В расчете на технически неграмотных, в большинстве своем, музыкантов подобные устройства с широко известными в узких кругах брендами могут стоить дико-дорого (типа музыкант по определению богатый, капусты с него состричь можно и нужно не мало). Есть и ультра-дешевые миди-мосты от китайских благодетелей (баксов так за 5) - но тут речь может идти даже не об уровне качества, а о работоспособности так-таковой, а вернее о совместимости с учетом экономии на спичках и поспешной небрежной сборке таких адаптеров. А что остается? Правильно - собрать свой! Да даже не собрать - а запрограммировать. Да что уж там - программировать не придется ... скомпиллировать и прошить ;-))

А все на самом деле не просто, а очень просто! И в первую очередь из-за того что "электрическим" транспортом для миди является обычный UART. Фактически COM-порт, только работающий на "нестандартной" для классических ком-портов скорости - 31250 бод. Этим транспортом передаются "миди-сообщения", генерация и парсинг которых - задача миди-оборудования (не рассматриваем здесь) - а транспорт в свою очередь не обеспечивает не только гарантии доставки данных, но и не имеет возможности проверки их целостности: "трехпроводный ком-порт" - что тут еще добавить? А так как музыкальное оборудование в "промышленном применении" (т.е. на сцене) зачастую используют разнообразное (в электротехнической части), соединительный кабель может быть и десяток (а то и не один) метров длинны, валяться среди силовой проводки (или вообще скручен вместе с ней), еще по нему может быть будут прыгать ... при этом байты данных терять или принимать в искаженном виде не хотелось бы ... Вот и напридумывали "стандартизаторы" всяческих там гальванических развязок на опто-парах, требований к разъемам и кабелям и в том же духе. В лабораторных же условиях, при длинах соединений устройств меньше метра (где и помех-то нет) для обмена нативными миди-командами с той самой "волшебной" скоростью 31250 достаточно прямого соединения обычным проводом (с учетом величин уровней сигналов - т.е. ТТЛ к примеру). Проще говоря - для реализации миди-моста нам нужен обычный преобразователь USB<->COM (настроенный на "миди-скорость"), которым запросто может выступить любая Ардуина, а с аппаратной реализацией USB - и подавно. Т.е. если вообще грубо-говоря: миди-мост - это преобразователь COM<->COM. А какже софтовая часть со стороны ПК? Для этого есть также программное решение: Hairless MIDI<->Serial Bridge - пересылает данные с миди-устройств в выбранный ком-порт (или в обратку). Наклепать же фиктивных миди-устройств, выполняющих роль хэнделров, за которые цепляться - может программа loopMIDI.

Но хочется более изящного решения, а не просто Ардуину (со скетчем в пару строк без библиотек) перекладывающую пакеты из ком-порта связи с ПК в ком-порт к миди-девайсине на нужной скорости (в связке с двумя софтинами приведенными выше) - вот еще бы Ардуина сразу "виделась" компом как миди-устройство и софта дополнительно не требовала (как готовые решения, хоть за 5 баксов хоть за ...). Самое интересное что и в этом случае можно не фантазировать - все уже придумано до нас. Причем в таком количестве, что на разобраться и протестировать все это может уйти немало времени. Дабы сэкономить его читателю, именно систематизации и описанию различных имеющихся программных решений, превращающих ту или иную Ардуину в миди-мост посвящена эта статься. Перейдем к наконец к сути.

Конвертер-мост USB ⇔ Midi на базе Ардуино

Вариантов много на исчерпываемость предложенный перечень ни в коем случае не претендует :-) Рекомендуемые пометил "птичкой" - "".

USBMIDI

https://github.com/BlokasLabs/USBMIDI

Предусматривает работу как с аппаратной реализацией USB в mega32u4 (который работает как "составное устройство" и сохраняет функционал связи с ПК при эмуляции дополнительных устройств), так и с программной через библиотеку V-USB и контроллером mega328p, например. Синтаксис тривиальный, есть примеры. В т.ч. сразу готовая реализация usb<->midi моста в виде примера (UsbMidiConverter), которая будучи зашитой в "Pro Micro" работает почти прямо "из коробки" - нужно удалить обе процедуры *.flush() из кода, они мешают стабильной работе (проверенно, рекомендую).

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

HIDuino

https://github.com/ddiakopoulos/hiduino

Весьма древний проект. Предполагает использование интерфейсного контроллера mega8u2 или mega16u2 (в UNO или Mega - платах, где таковой мог быть вместо непосредственно usb<->com микросхем-конвертеров). Альтернативная прошивка интерфейсного контроллера может "заставить" его изобразить почти любое устройство (клавиатура, мышь, джойстик, миди ...), а также обеспечить протокол взаимодействия вновь созданного функционала с создаваемой программой для основного контроллера ардуины. Нюанс тут в том, что для отладки/заливки программ в основной контроллер может понадобиться внешний программатор на постоянной основе, т.к. постоянно менять прошивку интерфейсного по крайней мере обременительно и неудобно. При желании можно повозиться ...

Внизу данного проекта есть полезные ссылки, которые я конечно оценил тоже - двигаемся дальше ;-)

HID

https://github.com/NicoHood/HID

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

arcore

https://github.com/rkistner/arcore

Древний проект - в виде пакета расширения среды разработки в "дореволюционном стиле", а именно под версию 1.5.7 Навскидку вроде как более подходит под нашу задачу, поддерживает по заявлению автора только Леонарду. Доваляет именно миди-функционал. По заливке скетча в системе так и остается ком-порт ардуины для мониторинга и дальнейшей работы, но появляется еще и миди-устройство (причем аж два, на одно из которых драйвер поставить не судьба почему-то). В зависимости от ... вобщем с драйверами трабл или еще с чем, но составное устройство вместо ком-порта появляется не на всех ПК и через раз. Сырая и устаревшая вещь короче, но по синтаксису похожа на первый предложенный и рекомендуемый мной вариант.

Arduino-USBMIDI

https://github.com/lathoub/Arduino-USBMIDI

Мудреный проект (в части синтаксических наворотов), использует две другие библиотеки: почти "штатно-ардуиновскую" Arduino MIDI Library и еще MIDIUSB, содержит в качестве примера (MIDI_DIN2USB) казалось бы решение нашей задачи ... Ан, нет! Пример компиллится успешно (в разных версиях среды), зашивается и даже корректно отображается в системе как одно аудио-устройство ... Но данные не идут или уходят непонятно куда. Сишные изыски в коде дичайшие, учитывая еще такую большую цепочку зависимостей - копаться в нем никакого желания: ффтопку вобщем!

Упомянутая тутже библиотека MIDIUSB также нетривиальна в синтаксисе и даже не имеет намеков в виде примеров для реализации нашей задачи. Вся эта хрень парсит мидишный поток данных и рассовывает его по структурам, отсылать его обратно в порт на выход - дополнительная замута. Рассчитаны все они на аппаратный USB (mega32u4) и обработку миди-данных средствами ардуины.

mocoLUFA

https://github.com/kuwatay/mocolufa

Еще один проект для реализации USB-миди устройства на двухконтроллерных ардуинах (Уно, Мега) - переключение между ком-портом и миди-мостом при помощи перемычки (и сброса). Разумное решение, тем более если нет ардуины с аппаратным USB под рукой.

От части для нашей задачи данный вариант можно считать даже более простым, чем первый (особенно если миди-интерфейс для тестирования нужен не часто). Только правильно использовать его нужно - т.е. основной контроллер ардуины должен бездействовать ;-) Да, в сравнении со всеми предыдущими примерами (особенно с аппаратным USB), где код ардуино-контроллера тупо перекладывает данные из одного порта (связь с ПК: программный миди) в другой "физический" миди (соединенный с музыкальным устройством), тут навскидку может показаться что UART-портов на ардуине не хватает: ведь миди поток мы получаем от интерфейсного контроллера в единственный ком-порт (в случае Уно-платы) ардуины - а транслировать на выход куда? - в еще один программно создаваемый порт? Так а зачем? В этом варианте вся прелесть именно в двухконтроллерном исполнении и возможности подконнектиться к линиям связи между этими контроллерами! RX/TX ноги (контакт 0 и 1 разъема ардуино-щита) и будут нашими миди выходом/входом соответственно (именно так) - формально прошивка основного контроллера ардуины не должна использовать ком-порт связи с ПК для корректной работы моста на вход (на выход - без разницы). Ну а вообще можно скетчем на основном ардуино контроллере "наколдовать" миди-инструмент ввода данных (клавиатуру), или изобразить подобие синтезатора ... что имхо странная затея. А вот USB-Midi-адаптер мне пригодился ;-)

Так что данное решение могу смело рекомендовать, а с учетом его независимости от основного функционала ардуины - можно его считать дежурным вариантом: перемычка стоит - обычная ардуина, снимаем - и у нас миди-мост! Исходники легко собираются, там можно выбрать не только модель контроллера (mega8u2 или mega16u2), но и строчку идентификации (UNO/Mega) для режима USB-COM (чтоб по красоте было), ну и опцию "с перемычкой/без" тоже инвертировать можно.

С DFU возиться имхо сложнее - проще единожды программатором обновить прошивку.

MiGeRA (май 2022)

Заглавная » Радиоэлектроника » Arduino - Высокоуровневая платформа устройств на микроконтроллерах » Конвертер-мост USB ⇔ Midi