MIDI设备接口
MIDI
本教程介绍乐器数字接口(MIDI)协议,以及如何使用Audio Toolbox™与MIDI设备交互。这里描述的工具使您能够按照MIDI协议的描述发送和接收所有MIDI消息。如果只对使用MIDI控件面发送和接收控件更改消息感兴趣,请参见MIDI控制面接口.如果您对使用MIDI来控制音频插件感兴趣,请参见音频插件的MIDI控制.要了解更多关于迷笛的信息,请咨询迷笛制造商协会.
MIDI是电子仪器、计算机和相关设备之间通信的技术标准。MIDI携带特定于音频信号(如音调和速度)的事件消息,以及用于参数的控制信号和同步节奏的时钟信号。
MIDI设备
一个MIDI设备是任何能够发送或接收MIDI消息的设备。MIDI设备有输入端口、输出端口或两者都有。MIDI协议将消息定义为单向消息。MIDI设备可以是真实的,也可以是虚拟的。
“音频工具箱”使您可以使用该工具创建到MIDI设备的接口mididevice
.若要创建到特定设备的MIDI接口,请使用mididevinfo
查询系统中可用的设备。然后创建一个mididevice
对象,通过名称或ID指定MIDI设备。
mididevinfo
可用的MIDI设备:ID Direction接口名称0输出MMSystem 'Microsoft MIDI Mapper' 1输入MMSystem 'USB MIDI接口' 2输出MMSystem 'Microsoft GS Wavetable Synth' 3输出MMSystem 'USB MIDI接口'
设备= mididevice(“USB MIDI接口”)
设备= mididevice连接到输入:'USB MIDI接口'(1)输出:'USB MIDI接口' (3)
您可以指定mididevice
对象监听输入消息、发送输出消息或同时监听输入消息。在本例中,mididevice
对象在指定的输入端口接收MIDI消息“USB MIDI接口”
,并从指定的输出端口发送MIDI消息“USB MIDI接口”
.
MIDI消息
一个MIDI消息包含描述与音频相关的操作的信息。例如,当您按下键盘上的某个键时,对应的MIDI消息包含3个字节:
第一个字节描述动作和通道的类型。第一个字节称为状态字节.
第二个字节描述按下哪个键。第二个字节称为a数据字节.
第三个字节描述按键的演奏力度。第三个字节也是一个数据字节。
此消息是一个注意在消息。注意:On指的是消息名称、命令或类型。
在MATLAB®时,MIDI消息被打包为midimsg
对象,可以作为标量或数组进行操作。要创建MIDI消息,请呼叫midimsg
,然后为特定的消息类型指定所需的参数。例如,要创建关于消息的注释,请指定midimsg
类型
作为“NoteOn”
然后指定所需的输入:音道、音符和速度。
通道= 1;注= 60;速度= 64;MSG = midimg (“NoteOn”通道,请注意,速度)
msg = MIDI message: NoteOn Channel: 1 Note: 60 Velocity: 64 Timestamp: 0 [90 3C 40]
为了方便起见,midimsg
以十六进制形式显示消息类型、通道、其他参数、时间戳和构造的消息。十六进制是首选的形式,因为它有一个简单的解释:
发送和接收MIDI消息
要发送和接收MIDI消息,请使用mididevice
对象的功能midisend
而且midireceive
.当你创建mididevice
对象时,它开始在其输入处接收数据并将其放入缓冲区。
要从缓冲区检索MIDI消息,请调用midireceive
.
receivedMessages = midireceive(设备)
receivedMessages = MIDI message: NoteOn Channel: 1 Note: 36 Velocity: 64 Timestamp: 15861.9 [90 24 40] NoteOn Channel: 1 Note: 36 Velocity: 0 Timestamp: 15862.1 [90 24 00]
midimsg
对象。在本例中,按下了MIDI键盘键。
要向MIDI设备发送MIDI消息,请调用midisend
.
midisend(设备,味精)
MIDI消息类型
所创建的MIDI消息类型定义为字符向量或字符串。要创建MIDI消息,请通过其类型和所需的属性值指定它。例如,在命令提示符中输入以下命令创建通道压力MIDI消息:
channelPressureMessage = midimg (“ChannelPressure”1 20)
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 20 Timestamp: 0 [D0 14]
channelPressureMessage。ChannelPressure = 37
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 37 Timestamp: 0 [D0 25]
该表总结了有效的MIDI消息类型。
音频工具箱提供了方便的语法来创建按顺序使用的多个MIDI消息和创建MIDI消息数组。看到midimsg
获取完整的语法列表。
MIDI消息定时
MIDI协议没有定义消息定时,并假设消息立即被执行。许多应用程序需要排队和批处理的定时信息。为了方便起见,音频工具箱将定时信息与MIDI消息打包成一个消息midimsg
对象。所有midimsg
对象具有时间戳
属性,在创建期间或创建之后将其设置为可选的最后一个参数。默认的时间戳
是零。
解释时间戳
属性取决于MIDI消息创建和使用的方式:
接收MIDI消息时使用
midireceive
,底层基础设施在接收MIDI消息时分配一个时间戳。从概念上讲,计时时钟开始于mididevice
对象被创建并作为监听器附加到给定的MIDI输入端口。如果另一个mididevice
连接到相同的输入端口时,它会从与第一个对象相同的计时时钟接收时间戳。发送MIDI消息时使用
midisend
时,时间戳被解释为发送消息的时间。如果最近没有电话打给
midisend
,然后midisend
将时间戳解释为相对于当前真实世界的时间。时间戳为0的消息立即发送。如果最近有人打电话给midisend
,然后midisend
将时间戳解释为相对于上一次调用的最大时间戳midisend
.的时间戳时钟midisend
是具体到MIDI输出端口那mididevice
连接到。考虑一对用于打开和关闭音符的MIDI消息。消息指定在一秒后开始并持续一秒。
创建“开启”和“关闭”消息。要创建“取消通知”消息,请使用
“NoteOn”
MIDI消息类型,并指定零速度。(如果要指定速度,请使用件的NoteOff”
消息类型)。有关更多信息,请参见midimsg
.OnMsg = midimg (“NoteOn”, 1, 59, 64);OffMsg = midimg (“NoteOn”59岁的1 0);
使用单个调用来发送开关消息
midisend
,指定消息相对于相同开始时间的时间戳。OnMsg。时间戳= 1;OffMsg。时间戳= 2;midisend(设备,(OnMsg; OffMsg)))
若要单独发送Note Off消息,请指定Note Off消息的时间戳相对于前一次调用的最大时间戳
midisend
.OnMsg。时间戳= 1;OffMsg。时间戳= 1;OnMsg midisend(设备)midisend(设备,OffMsg)
的“开始”时间,或参考时间
midisend
是绝对时间和最后一次调用的最大时间戳之间的最大值吗midisend
.例如,考虑一下x,任意开始时间,等于当前绝对时间。如果在发送“开启”和“关闭”消息之间有1.5秒的停顿,则生成的笔记持续时间为1.5秒。OnMsg。时间戳= 1;OffMsg。时间戳= 1;midisend(设备,OnMsg)暂停(1.5)midisend(设备,OffMsg)
通常,MIDI消息的发送速度比实时速度快,因此不需要跟踪绝对时间。
对于现场表演或在MIDI流中启用中断,可以将时间戳设置为零,然后调用
midisend
在现实世界中适当的时间间隔。根据您的用例,您可以将MIDI流划分为可重复的小时间块。