Проблемы с передачей SysEx сообщений через USB MIDI

Теория по электронике

Модератор: Модераторы

andriano
Пользователь
Сообщения: 49
Зарегистрирован: 09 авг 2020, 22:50
Местоположение: Сергиев Посад

Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение andriano » 11 авг 2020, 23:42

В принципе, проблема обычно озвучивается примерно так:
"Многие китайские устройства USB-MIDI, передавая "регулярные" MIDI сообщения, не могут передавать SysEx".
Из моей практики: при передачи от USB (ПК Windows) к MIDI (аппаратное MIDI устройство) из всего SysEx сообщения проходят только первые 3 байта, а остальные безвозвратно теряются. При этом никак не контролируется, что это именно SysEx, т.е. что начинается с F0. Т.е. теоретически никто не мешает передавать SysEx сообщение порциями по 3 байта.
Спецификация https://usb.org/sites/default/files/midi10.pdf в главе 4 явно описывает, как следует передавать MIDI SysEx сообщения, подразделяя их на:
- начало или середина сообщения (всегда 3 байта),
- конец сообщения - 3 байта,
- конец сообщения - 2 байта,
- конец сообщения - 1 байт.
Другими словами, еще ДО передачи необходимо осуществить элементарный разбор сообщения. Что как бы делает сомнительной передачу фрагмента, не начинающегося с F0. Ибо если сообщение изначально неправильно разобрано и передано, то собрать его "на той стороне" уже оказывается принципиально невозможно.
Вопроса, как всегда, два: кто виноват и что делать.
Т.е. а так ли уж виноваты китайцы в неработоспособности своих изделий? Может, это Майкрософт не умеет читать документацию?
Ну и соответственно, насколько надежен способ передачи SysEx сообщений порциями по 3 байта?
А заодно интересно было бы узнать, вообще существует ли какая-либо статистика по передаче SysEx сообщений через USB посредством устройств различных производителей (включая европейских, американских и японских), а также в других ОС, в частности, в Линуксе.
Опять же, существует ли софт, умеющий передавать SysEx через "неправильные" китайские кабели?

Аватара пользователя
Dmitry Dubrovenko
Администратор
Сообщения: 2017
Зарегистрирован: 12 окт 2014, 20:20
Местоположение: Санкт-Ленинград
Контактная информация:

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение Dmitry Dubrovenko » 12 авг 2020, 20:06

andriano писал(а):Многие китайские устройства USB-MIDI, передавая "регулярные" MIDI сообщения, не могут передавать SysEx

Да они вообще любят чудить, иногда по непонятным причинам. :roll:
Кстати, здесь много говорили про USB-MIDI.
А я всегда говорил, что USB - зло. :-)

andriano писал(а):Т.е. теоретически никто не мешает передавать SysEx сообщение порциями по 3 байта
Когда делал программу (так и не доделанную, кстати) для тестирования миди-интерфейса (а вообще изначально, для расшифровки СисЕксов), малость изучал виндовый API для МИДИ (вот статья на вскидку). СисЕксы там выделяются, как отдельные длинные сообщения и передаются порциями через буфер.
Т.е. Вы просто определяете буфер и суёте туда свой СисЕкс порциями, по мере опустошения буфера. Это уже проблема драйвера, разобрать его на трёх-байтовые пакеты с соответствующими CIN.
Не думаю, что Мелкомягкие не научили Винду это делать (хотя, конечно, всё возможно). Так что проблема скорее всего в китайских чипах (см. в/у ссылку).

andriano писал(а):в Линуксе
Линукс, это - вообще отдельная "песня".
Мне так и не удалось разобраться как там всё-таки с МИДИ работать?

andriano писал(а):существует ли софт, умеющий передавать SysEx через "неправильные" китайские кабели?
"Меня терзают смутные сомнения".
Что может сделать софт, если железяка вносит свои коррективы в поток данных?
Да и что-либо сделать, надо писАть на самом низком уровне (включая драйвер), а современные программисты этого жутко не любят, а от слова Ассемблер у них начинается изжога. :-))

P.S.: Кстати, там сказано, что не определены только F4 и F5, а FD уже определено?
Подпись

andriano
Пользователь
Сообщения: 49
Зарегистрирован: 09 авг 2020, 22:50
Местоположение: Сергиев Посад

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение andriano » 12 авг 2020, 23:52

Спасибо за многочисленные ссылки - посмотрю.
Тему про USB-MIDI, кстати, сам не обнаружил, т.к. искал вместе с SysEx.
Да, я в курсе, как Винда [должна] работать с MIDI-сообщениями. Так вот, через имеющийся у меня шнурок, который не поддерживает SysEx'ы, я все-таки научился их передавать - кусочками по 3 байта. Вот только не уверен, что этот способ можно считать универсальным. (у меня в программе, кстати, даже галка есть: как передавать - целиком или по 3 байта). Это по поводу того "если железяка вносит свои коррективы". Т.е. с этими "коррективами" тоже можно жить. Вот только надо быть уверенным, что эти "коррективы" воспроизводятся у других "железяк". Ибо если у каждой свои "коррективы", то программных заплаток не напасешься.

Мне ничего не известно об FD.
Правда, в одном из просмотренных мною документов в начале утверждалось, что F9 - не используемый код, а в конце того же документа - что это MIDI Tick. Так что, как показывает практика, противоречия в документах вещь весьма обыденная.

PS. А на Ассемблере я не пишу уже, как минимум, 15-20 лет. Более того, нередко можно читать (как правило, от людей, понятия об Ассемблере не имеющих), что некоторую задачу без Ассемблера не осилить никак. Но практика показывает, что верить таким утверждениям нельзя. Последний раз, когда я сталкивался с чем-то, что "без Ассемблера - никак" относилось к 16-разрядным процессорам.

Аватара пользователя
Dmitry Dubrovenko
Администратор
Сообщения: 2017
Зарегистрирован: 12 окт 2014, 20:20
Местоположение: Санкт-Ленинград
Контактная информация:

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение Dmitry Dubrovenko » 13 авг 2020, 19:11

andriano писал(а):кусочками по 3 байта
Т.е. короткими сообщениями?
А как это воспринимает нормальный MPU-401?

andriano писал(а):это MIDI Tick
Да, есть такое дело. :yes:
Но я в в/у программе сделал именно Tick.

andriano писал(а):задачу без Ассемблера не осилить никак
Ну, вообще-то, можно Ассемблер и на Си писАть (ну, или по крайней мере очень близко).
Ассемблер необходим для задач, критичных по времени.
Беда современного тренда не в языке программирования, а в нежелании вникать в алгоритм работы и отдачу всего на откуп "дяде" (компилятору т.е.), в результате чего всё сводится к постоянному поиску либов.
Либористы, короче.
Подпись

andriano
Пользователь
Сообщения: 49
Зарегистрирован: 09 авг 2020, 22:50
Местоположение: Сергиев Посад

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение andriano » 13 авг 2020, 20:30

Dmitry Dubrovenko писал(а):Т.е. короткими сообщениями?
Как раз наоборот - "длинными", но кусочками по 3 байта.
А как это воспринимает нормальный MPU-401?
Не зря я на форум написал!
Надо будет проверить (а то сам я как-то не догадался).
Но я в в/у программе сделал именно Tick.
Я что-то упустил, "в/у программа" - это что?
Ассемблер необходим для задач, критичных по времени.
Беда современного тренда не в языке программирования, а в нежелании вникать в алгоритм работы и отдачу всего на откуп "дяде" (компилятору т.е.), в результате чего всё сводится к постоянному поиску либов.
Либористы, короче.

Практика показывает, что компилятор Си справляется даже с DSP инструкциями. Ну, например, что-то вроде a += ((long long)b*c)>>32; вполне компилирует в единственную инструкцию.
А вообще - да, то, что раньше говорили про Делфи-программистов, теперь относится уже практически ко всем.

Аватара пользователя
Dmitry Dubrovenko
Администратор
Сообщения: 2017
Зарегистрирован: 12 окт 2014, 20:20
Местоположение: Санкт-Ленинград
Контактная информация:

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение Dmitry Dubrovenko » 13 авг 2020, 20:59

andriano писал(а):Как раз наоборот - "длинными", но кусочками по 3 байта
Т.е. буфер на три байта плюс ожидание после опустошения?

andriano писал(а):"в/у программа" - это что?
Выше ссылки были.
Среди них на программу.
Подпись

andriano
Пользователь
Сообщения: 49
Зарегистрирован: 09 авг 2020, 22:50
Местоположение: Сергиев Посад

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение andriano » 14 авг 2020, 14:31

Dmitry Dubrovenko писал(а):Т.е. буфер на три байта плюс ожидание после опустошения?
Ну да, подготовка буфера, длинное сообщение, ожидание, и все это в цикле while(length).

Аватара пользователя
Dmitry Dubrovenko
Администратор
Сообщения: 2017
Зарегистрирован: 12 окт 2014, 20:20
Местоположение: Санкт-Ленинград
Контактная информация:

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение Dmitry Dubrovenko » 15 авг 2020, 12:25

andriano писал(а):по поводу того "если железяка вносит свои коррективы"
Тут подумал, может она просто не умеет работать с длинными сообщениями, а Ваши воспринимает как короткие?
Вы анализатором-то ЮСБ смотрели, при передаче-приёме?
Подпись

andriano
Пользователь
Сообщения: 49
Зарегистрирован: 09 авг 2020, 22:50
Местоположение: Сергиев Посад

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение andriano » 16 авг 2020, 14:36

Dmitry Dubrovenko писал(а):Тут подумал, может она просто не умеет работать с длинными сообщениями, а Ваши воспринимает как короткие?
Вы анализатором-то ЮСБ смотрели, при передаче-приёме?

Нет, ну то, что железка не умеет работать с длинными сообщениями, это как бы экспериментальный факт. Также экспериментальный факт, что она умеет работать с регулярными (короткими).
Но вот как она может длинные сообщения воспринимать как короткие?
В первом сообщении темы я выкладывал ссылку на текст стандарта.
Вообще-то USB я никогда не программировал, но из текста по приведенной ссылке понял, что MIDI команды преобразуются в 4-байтовые последовательности. К 1/2/3-байтовым командам добавляется четвертый, часть которого дублирует код команды, по которому и вычисляется реальная длина команды (1, 2 или 3 байта). А SysEx все равно нарезаются кусочками по 3 байта и передаются с добавлением четвертого, который может иметь варианты в зависимости от места в пакете и длины. Т.е. по нему тоже вычисляется действительная длина фрагмента команды.
Вопрос - почему железка берет только первый кусочек из последовательности? Чем он лучше, чем второй/третий/и т.д.?

И, кстати, что такое анализатор USB?

Аватара пользователя
Dmitry Dubrovenko
Администратор
Сообщения: 2017
Зарегистрирован: 12 окт 2014, 20:20
Местоположение: Санкт-Ленинград
Контактная информация:

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение Dmitry Dubrovenko » 17 авг 2020, 19:48

Оффтоп
andriano писал(а):что такое анализатор USB?
Вы неправильно фразу поделили.
Надо было: "анализатором" + "ЮСБ смотрели".
Хотя суть от этого не меняется. :-)
Имелся ввиду, конечно, логический анализатор.
Подпись

andriano
Пользователь
Сообщения: 49
Зарегистрирован: 09 авг 2020, 22:50
Местоположение: Сергиев Посад

Re: Проблемы с передачей SysEx сообщений через USB MIDI

Сообщение andriano » 18 авг 2020, 00:13

Насколько я помню, USB использует 48 МГц.
У меня есть только логический анализатор с максимальной частотой оцифровки 24 МГц, что в 4 раза меньше нужного.
Опять же, там, кажется, дифференциальная пара... В общем не разбирался я с USB на уровне железа. От слова совсем. Так что, даже если бы был подходящий ЛА, вряд ли стал бы смотреть.


Вернуться в «Теория»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя

cron