主要内容

MIDI设备接口

MIDI

本教程介绍乐器数字接口(MIDI)协议以及如何使用Audio Toolbox™与MIDI设备交互。这里描述的工具使您能够按照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方向接口名称0输出MMSystem 'Microsoft MIDI Mapper' 1输入MMSystem 'USB MIDI接口' 2输出MMSystem 'Microsoft GS Wavetable Synth' 3输出MMSystem 'USB MIDI接口'
设备= mididevice (“USB MIDI接口”
输入:'USB MIDI接口'(1)输出:'USB MIDI接口' (3)

您可以指定mididevice对象监听输入消息、发送输出消息或两者同时进行。在本例中,mididevice对象在指定的输入端口接收MIDI消息“USB MIDI接口”,并从命名的输出端口发送MIDI消息“USB MIDI接口”

MIDI消息

一个MIDI消息包含描述与听觉相关动作的信息。例如,当您按下键盘上的一个键时,对应的MIDI消息包含3个字节:

  1. 第一个字节描述动作的类型和通道。第一个字节称为状态字节

  2. 第二个字节描述按下的键。第二个字节称为a数据字节

  3. 第三个字节描述键的弹奏难度。第三个字节也是一个数据字节。

此消息是注意在消息。注On被称为消息名、命令或类型。

在MATLAB®, MIDI消息被打包为midimsg对象,并可作为标量或数组进行操作。要创建MIDI消息,请呼叫midimsg,然后为特定的消息类型指定所需的参数。例如,要创建关于消息的注释,请指定midimsg类型作为“NoteOn”然后指定所需的输入:通道、音符和速度。

频道= 1;注意= 60;速度= 64;味精= midimsg (“NoteOn”通道,请注意,速度)
msg = MIDI message: NoteOn Channel: 1 Note: 60 Velocity: 64 Timestamp: 0 [90 3C 40]

为了方便起见,midimsg以十六进制形式显示消息类型、通道、附加参数、时间戳和构造的消息。十六进制是首选形式,因为它有一个直接的解释:

发送和接收MIDI消息

要发送和接收MIDI消息,请使用mididevice对象的功能midisendmidireceive.当您创建mididevice对象时,它开始在其输入处接收数据并将其放入缓冲区中。

要从缓冲区检索MIDI消息,请调用midireceive

receivedMessages = midireceive(设备)
receivedMessages = MIDI message: NoteOn Channel: 1注:36 Velocity: 64 Timestamp: 15861.9 [90 24 40] NoteOn Channel: 1注:36 Velocity: 0 Timestamp: 15862.1 [90 24 00]
的数组返回MIDI消息midimsg对象。在本例中,按下了一个MIDI键盘键。

若要向MIDI设备发送MIDI消息,请调用midisend

midisend(设备,味精)

MIDI消息类型

创建的MIDI消息类型定义为字符向量或字符串。要创建MIDI消息,请根据其类型和所需的属性值指定它。例如,通过在命令提示符中输入以下命令,创建一个Channel Pressure MIDI消息:

channelPressureMessage = midimsg (“ChannelPressure”1 20)
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 20 Timestamp: 0 [D0 14]
创建MIDI消息后,可以修改属性,但不能修改类型。
channelPressureMessage。ChannelPressure = 37
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 37 Timestamp: 0 [D0 25]

该表总结了有效的MIDI消息类型。

Audio Toolbox提供了方便的语法来创建按顺序使用的多个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消息,它们打开和关闭一个音符。消息指定音符在一秒后开始并持续一秒。

    创建Note On和Note Off消息。要创建Note Off消息,请使用“NoteOn”MIDI消息类型并指定零速度。(如果要指定速度,请使用件的NoteOff”消息类型)。有关更多信息,请参见midimsg

    OnMsg = midimsg (“NoteOn”, 1, 59, 64);OffMsg = midimsg (“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;OnMsg midisend(设备)暂停(1.5)midisend(设备,OffMsg)

    通常,MIDI消息的发送速度比实时速度快,所以不需要跟踪绝对时间。

    对于现场表演或在MIDI流中启用中断,可以将时间戳设置为零,然后调用midisend在适当的现实世界时间间隔。根据您的用例,您可以将MIDI流划分为可重复的小时间块。

另请参阅

功能

相关的话题

外部网站