usb midi class的拓扑逻辑

这部分内容在《USB声卡驱动(二)USB音频设备描述符》中有过详细介绍,此处在简单介绍一下:一个usb 音频设备,含有多个功能(audio function)。其中之一就是,midi 功能。

在midi 功能中,包含有一个或多个的jack口。这个jack口是一个抽象概念。usb midi 设备的功能之一,就是将usb的端点和这些jack口连接在一起。

举个例子,你往usb的某个端点发送数据,就相当于往某个jack口发送数据。至于这个jack口里面的数据,会流向usb设备内部的哪一个模块,或者外部的哪一个模块,我们可以不用关心。

除此之外,一个usb midi设备的jack口,可能不只一个,而一个usb端点可以代表多个jack口。举个例子,如果一个usb设备有3个jack口。某个usb端点想要向其中的第一个jack口发送数据。格式如下:

第一个字节 第二个字节 第三个字节 第四个字节
jack号+消息索引号 midi_0 midi_1 midi_2

消息索引号,如下表格

消息索引号 消息字节数 描述
0x0 1,2或者3 保留
0x1 1,2或者3 保留
0x2 2 两字节系统通用消息,如MTC,SongSelect
0x3 3 三字节系统通用消息,如SPP
0x4 3 SysEx消息的开始,或者延续
0x5 1 单字节系统通用消息,或者SysEx消息的带有一个字节的结束标志
0x6 2 带有两个字节的SysEx消息
0x7 3 带有三个字节的SysEx消息
0x8 3 note off
0x9 3 note on
0xa 3 Poley-key press
0xb 3 Control change
0xc 2 Programe change
0xd 2 Channel pressure
0xe 3 PitchBend change
0xf 1 单字节

jack的数据来源或者数据目的地

在usb midi中,jack口只是一种抽象的数据流通通道。那么数据的来源或者数据的处理,该怎么表示呢?

在usb midi 设备的内部,用Elements来表示一个处理单元。这个单元既可以是jack口的输入,也可以是jack口的输出。

usb midi usb的描述符

显然跟其它USB设备一样,它具有如下的描述符:

  1. USB 设备描述符,详细的参数说明,已经在《USB声卡驱动(二):USB音频设备描述符》中详细给出,usb midi 设备完全一模一样

  2. USB 配置描述符,跟《USB声卡驱动(二):USB音频设备描述符》一模一样,没有特殊之处

  3. USB 接口描述符,USB接口描述符分成两部分,前一部分跟《USB声卡驱动(二):USB音频设备描述符》的一模一样,剩下一部分,为USB midi特有。剩下一部分用来描述整个USB midi设备中用的所有东西。

正如上面介绍的一样,肯定需要描述符来描述上面的,jack口,和elemnt单元。同时在这些描述符前面还加上了一个header 描述符。
详细如下:

offset Field size value Description
0 bLength 1 整数 这个描述符的长度
1 bDescriptorType 1 常量 只能为CS_INTERFACE这个值
2 bDescriptorSubtype 1 常量 只能为MS_HEADER
3 bcdMSC 2 BCD值 表示该midi设备使用的是那个版本的USB midi规范
5 wTotalLength 2 整数 总体长度,包括接下来的jack口的描述符和Element的描述符
  1. 接下来就是jack的描述符,和element的描述符。先来看看输入jack的描述符,如下
offset Field size value Description
0 bLength 1 整数 本描述符的大小
1 bDescriptorType 常量 只能为CS_INTERFACE
2 bDescriptorSubtype 常量 只能为MIDI_IN_JACK
3 bJackType 1 常量 EMBEDDED or EXTERNAL前者表示内置,后者表示外接
4 bJackID 1 常量 该jack口的ID
5 iJack 1 索引值 字符串描述符的索引值,用来描述该jack口

再来看看,输出jack口的描述符,如下:

offset Field size value Description
0 bLength 1 整数 本描述符的大小
1 bDescriptorType 常量 只能为CS_INTERFACE
2 bDescriptorSubtype 常量 只能为MIDI_OUT_JACK
3 bJackType 1 常量 EMBEDDED or EXTERNAL前者表示内置,后者表示外接
4 bJackID 1 常量 该jack口的ID
5 bNrInputPins 1 整数 inputpin表示的是Element的引脚,每一个引脚就代表了一个midi数据流。bNrInputPins该字段就表示总共有多少个midi数据流,流进这个jack口
6 baSourceID(1) 1 整数 这个jack口链接的第一个输入引脚,对应的单元id(可能是一个Element单元,也可以是另外一个jack口)
7 BaSourcePin(1) 1 整数 这个jack口链接的第一个输入引脚对应的单元,所对应的输出引脚号
6+2*(p-1) baSourceID § 1 整数 这个jack口链接的第p个输入引脚,对应的单元的id
6+2*(p-1)+1 BaSourcePin§ 1 整数 这个jack口链接的第p个输入引脚对应的单元,所对应的输出引脚号
5+2*p iJack 1 索引值 字符描述符的索引值,用来描述该jack

接下来看看Elements的描述符:

offset Field size value Description
0 bLength 1 整数 本描述符的大小
1 bDescriptorType 常量 只能为CS_INTERFACE
2 bDescriptorSubtype 常量 只能为ELEMENT
3 bElementID 1 常量 Element的ID
4 bNrInputPins 1 整数 该Element对应的输入引脚数
5 baSourceID(1) 1 整数 该Element链接的第一个输入引脚所对应的单元的id
6 BaSourcePin(1) 1 整数 该Element链接的第一个输入引脚所对应的单元的输出引脚号
5+2*(p-1) baSourceID § 1 整数 该Element链接的第p个输入引脚所对应的单元的id
5+2*(p-1)+1 BaSourcePin§ 1 整数 该Element链接的第p个输入引脚所对应的单元的输出引脚号
5+2*p bNrOutputPins 1 整数 该Element输出引脚个数
6+2*p bInTerminalLink 1 常量 该Element链接的输入终端的id(终端的含义在《USB声卡驱动(二):USB音频设备描述符》中有介绍)
7+2*p bOutTerminalLink 1 常量 该Element链接的输出终端的id
8+2*p bElCapsSize 1 整数 bmElementCaps字段的字节大小
9+2*p bmElementCaps n 位映射关系 表格未能完全展示,见后文
9+2*p+n iElement 1 索引值 字符描述符的索引,用来描述该Element

接下来说明bmElementCaps字段的含义

  • D0: CUSTOM UNDEFINED 。设备生厂商自己定义,比如可以用来标记该Element是一个唯一的,独有的处理单元,比如一个恐怖音效处理器
  • D1: MIDI CLOCK。 支持MIDI CLOCK
  • D2: MIDI TIME CODE (MTC)。 支持同步功能
  • D3: MIDI MACHINE CONTROL (MMC)。支持MMC消息
  • D4: GM1。支持GM1
  • D5: GM2。 支持GM2
  • D6: GS。支持GS格式
  • D7: XG。支持XG
  • D8: EFX。支持USB控制音效处理器
  • D9: MIDI Patch Bay。 支持内部的MIDI patcher和路由
  • D10: DLS1。支持DLS1
  • D11: DLS2.支持DLS2
  • D12 and higher。 表示未来可能用到的一些功能和类型
  1. USB端点描述符。USB端点描述符也分成两部分。第一部分跟《USB声卡驱动(二):USB音频设备描述符》一样。剩下的部分,就是跟MIDI相关的。如下:
    |offset|Field|size|value|Description|
    |—|—|—|—|—|
    |0|bLength|1|整数|本描述符的大小|
    |1|bDescriptorType|常量|只能为CS_ENDPOINT|
    |2|bDescriptorSubtype|常量|只能为MS_GENERAL|
    |3|bNumEmbMIDIJack|1|整数|该端点链接到的内置jack的数量|
    |4|baAssocJackID(1)|1|常量|第一个jack的id|
    |…|…|…|…|…|
    |4+(n-1)|baAssocJackID(n)|1|常量|第n个jack的id|

本文章只能提供一些基本的理论支持,虽然很想把代码上传上去,但是由于保密原因,只能留下我所知道的基本理论知识,如果有错误请指正

Usb Midi Class相关推荐

  1. 用树莓派(等)为 USB Midi 键盘增添连接方式

    我在去年买了一个 M-Audio 的 Midi 键盘,用来连接电脑或者 iPad 弹琴.但是由于琴摆放的位置没有办法拉充电线,所以我能弹琴多久很大程度上取决于设备还有多少电.前一阵子从朋友手里白嫖了个 ...

  2. Android 手机的USB midi测试方法

    USB midi测试方法 注:如下介绍android 手机中usb midi的测试方法.文中提到的相关apk均可以在线下载获取. 1.测试机作为device模式,电脑为host端. 手机端安装Midi ...

  3. USB-IF发布MIDI设备2.0版USB设备类规范

    最新更新对USB设备类进行了定义,以支持下一代MIDI设备 俄勒冈州比弗顿--(美国商业资讯)--USB技术发展和普及的支持组织USB实施者论坛(USB Implementers Forum, USB ...

  4. midi接口 stm32_万利的STM32板实现的USB MIDI键盘

    万利的STM32板实现的USB MIDI键盘 我是拿原来的USB摇杆的那个程序来改的,所以里面还有很多 原来的摇杆方面的东东,懒得去改它了,能用就行了. 源代码包下载: 地址1: 地址2:http:/ ...

  5. USB入门系列之一:USB概述

    USB是什么呢?一说USB是You SB的意思,即"你傻B"的意思.另一种说法是USB其实是美国的弟弟,因为美国叫USA,USB当然是他的弟弟了. 那么USB到底是什么呢?其实US ...

  6. java midi 解析_Java从MIDI键盘获取输入

    我已经用Java设计了自己的合成器,现在我想将其与Midi键盘连接.我在下面的课程搜索所有带有发射器的Midi设备.它成功找到了我的Midi键盘.我将自己的接收器添加到每个设备的每个发送器中,以便它可 ...

  7. 全新的 XMOS USB Audio 方案主控 XU316-1024-QF60B-PP24

    2021 年底,知名的音频芯片制造厂商 XMOS 正式发布了最新的 XCORE.AI 系列的芯片 XU316-1024-QF60B-PP24 ,这款芯片能够实现高达 768KHz PCM 和 DSD ...

  8. pos 机 gd32f103 midi设备

    1/芯片本身有usb 直接 初始化成 usb midi 设备,然后将 io 数据传输到串口就ok 引用连接:https://blog.csdn.net/weixin_41082557/article/ ...

  9. WDF开发USB设备驱动教程(1)

    PDF下载地址(1.2版):链接地址 CY001开发板讨论帖:链接地址 注:本文档新版本已出,请在博客中查找,或下载PDF全文文档. 链接地址WDF开发USB设备驱动教程 by 张佩 文档说明 作者写 ...

最新文章

  1. super(Student,self).__init__()初始化的是什么东西?
  2. cpc无法获取系统office信息_智能云信息发布系统解锁信息获取新方式
  3. leetcode221 Maximal Square
  4. (最小生成树) Networking -- POJ -- 1287
  5. Day6: Linux基础片:文件压缩、Vim用法
  6. java converter转换器_springboot 自定义转换器(converter)
  7. js图表报表html5图表,介绍一个!非常简单非常方便!制作图表报表的js库 —— ichartjs 【详细操作】...
  8. 数据--第52课 - 哈希表及其实现
  9. linux、mysql、nginx、tomcat 环境下压力测试的主要调试参数
  10. SHA256 算法 加密文件、防文件篡改、文件校验
  11. 分享个短视频竞品分析报告
  12. 微信公众号网页jsapi授权
  13. 全球及中国燃气轮机行业产量规模预测及发展态势研究报告2021-2027年版
  14. update(更新) 和 upgrade(升级)
  15. shell 统计单词频率
  16. 使用老毛桃制作U盘启动盘
  17. 万字干货:教新手从0到1搭建完整的增长数据体系
  18. SpringBoot+vue+jpa+mysql前后台分离实现增删改查分页和三级联动(附源码)(一)
  19. IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置
  20. AD18.1.9和AD18.1.7的安装步骤

热门文章

  1. [附源码]Java计算机毕业设计SSM大数据与智能工程系教师档案管理系统
  2. FTP服务器主动被动模式详解
  3. OpenGL自制游戏引擎-HelloTriangle
  4. mblock编程思维开发,自制糖豆人小游戏
  5. TKDE 2023 | 交叉学科项目申请书学科代码生成
  6. 安装opensips时创建MySQL表_opensips在创建数据库时报错
  7. java实现日历功能
  8. 【优化选址】遗传算法求解物流配送中心选址【含Matlab源码 1917期】
  9. 投资理财-普通投资的策略
  10. 大型报告厅,会议中心解决方案