主要内容

MIDI设备接口

迷笛

本教程介绍了乐器数字接口(MIDI)协议,以及如何使用Audio Toolbox™与MIDI设备进行交互。这里描述的工具使您能够按照MIDI协议的描述发送和接收所有MIDI消息。如果您只对使用MIDI控件面发送和接收控件更改消息感兴趣,请参见MIDI控制界面.如果您有兴趣使用MIDI来控制您的音频插件,请参阅音频插件的MIDI控件. 要了解有关MIDI的更多信息,请咨询MIDI制造商协会

MIDI是电子仪器、计算机和相关设备之间通信的技术标准。MIDI携带特定于音频信号的事件消息,如音调和速度,以及参数控制信号和时钟信号,以同步节奏。

MIDI设备

一个MIDI设备是任何能够发送或接收MIDI消息的设备。MIDI设备有输入端口和/或输出端口。MIDI协议将消息定义为单向的。MIDI设备可以是真实的,也可以是虚拟的。

使用“音频工具箱”可以创建到MIDI设备的接口mididevice.要创建到特定设备的MIDI接口,请使用mididevinfo查询系统中可用的设备。然后创建一个mididevice对象,通过名称或ID指定MIDI设备。

mididevinfo
1 input MMSystem 'USB MIDI Interface ' 2 output MMSystem 'Microsoft GS Wavetable Synth' 3 output MMSystem 'USB MIDI Interface '
设备=MIDI设备(“USB MIDI接口”
输入:'USB MIDI Interface '(1)输出:'USB MIDI Interface ' (3)

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

MIDI消息

一个MIDI消息包含描述音频相关操作的信息。例如,当您按下键盘上的键时,相应的MIDI消息包含3个字节:

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

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

  3. 第三个字节描述了按键的力度。第三个字节也是一个数据字节。

此消息是一个关于消息。注意On被称为消息名称、命令或类型。

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

频道= 1;注意= 60;速度= 64;味精= midimsg (“注意”,通道,音符,速度)
msg=MIDI消息:NoteOn频道:1注意:60速度:64时间戳:0[90 3C 40]

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

发送和接收MIDI消息

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

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

receivedMessages=MIDI接收(设备)
receivedMessages=MIDI消息:NoteOn频道:1注:36速度:64时间戳:15861.9[90 24 40]注:频道:1注:36速度:0时间戳:15862.1[90 24 00]
MIDI消息以数组的形式返回midimsg对象。在本例中,按下MIDI键盘键。

要向MIDI设备发送MIDI消息,请调用米迪森德

midisend(设备,消息)

MIDI消息类型

您创建的MIDI消息类型定义为字符向量或字符串。若要创建MIDI消息,请按其类型和所需的属性值进行指定。例如,通过在命令提示下输入以下内容来创建通道压力MIDI消息:

channelPressureMessage = midimsg (“通道压力”1 20)
channelPressureMessage=MIDI消息:ChannelPressure通道:1 ChannelPressure:20时间戳:0[D0 14]
创建MIDI消息后,可以修改属性,但不能修改类型。
通道压力消息。通道压力=37
channelPressureMessage=MIDI消息:ChannelPressure通道:1 ChannelPressure:37时间戳:0[D0 25]

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

Audio Toolbox提供了方便的语法来创建多个按顺序使用的MIDI消息和创建MIDI消息数组。看到midimsg查看完整的语法列表。

MIDI消息时间

MIDI协议没有定义消息计时,并假定消息是立即执行的。许多应用程序需要时间信息来进行排队和批处理。为了方便起见,Audio Toolbox将带有MIDI消息的时间信息打包成单个midimsg反对,全部midimsg对象有一个时间戳属性,它在创建期间作为可选的last参数或创建之后设置。默认的时间戳是零。

时间戳属性取决于如何创建和使用MIDI消息:

  • 在接收MIDI消息时使用midireceive,底层基础结构在接收MIDI消息时分配时间戳mididevice对象被创建并作为侦听器附加到给定的MIDI输入端口mididevice连接到相同的输入端口时,它将从与第一个对象相同的计时时钟接收时间戳。

  • 在发送MIDI消息时使用米迪森德,时间戳被解释为何时发送消息。

    如果最近没有打电话给米迪森德,然后米迪森德将时间戳相对于当前实际时间进行解释。时间戳为0的消息将立即发送。如果最近有人打电话来米迪森德,然后米迪森德将时间戳相对于最后一次调用的最大时间戳进行解释米迪森德. 时钟的时间戳米迪森德是特定于MIDI输出端口的mididevice已连接到。

    考虑一对MIDI消息,打开和关闭音符。消息指定音符在一秒钟后开始并持续一秒钟。

    创建笔记打开和笔记关闭消息。

    OnMsg = midimsg (“注意”,1,59,64); OffMsg=midimsg(“注意”,1,59,0);

    使用单个呼叫发送和发送消息米迪森德,指定相对于相同开始时间的消息的时间戳。

    OnMsg.Timestamp=1;OffMsg.Timestamp=2;midisend(设备[OnMsg;OffMsg]))

    要单独发送Note Off消息,请指定Note Off消息的时间戳相对于前一个调用的最大时间戳米迪森德

    OnMsg.Timestamp=1;OffMsg.Timestamp=1;midisend(设备,OnMsg)midisend(设备,OffMsg)

    的“开始”时间或参考时间米迪森德是绝对时间和上次调用的最大时间戳之间的最大值米迪森德.例如,考虑一下x,任意的开始时间,等于当前的绝对时间。如果在发送开音符和关音符消息之间有1.5秒的停顿,那么产生的音符持续时间是1.5秒。

    OnMsg.Timestamp=1;OffMsg.Timestamp=1;midisend(设备,OnMsg)暂停(1.5)midisend(设备,OffMsg)

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

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

另请参阅

功能

相关的话题

外部网站