主要内容

MIDI设备接口

MIDI

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

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

MIDI设备

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

Audio Toolbox使您可以使用MIDI设备创建接口迈出迪维德.要为特定设备创建MIDI接口,请使用MidideVinfo.为可用设备查询系统。然后创建一个迈出迪维德对象通过名称或ID指定MIDI设备。

MidideVinfo.
1 input MMSystem 'USB MIDI Interface ' 2 output MMSystem 'Microsoft GS Wavetable Synth' 3 output MMSystem 'USB MIDI Interface '
设备= mididevice (“USB MIDI接口”的)
Device = MIDidevice连接到输入:'USB MIDI接口'(1)输出:'USB MIDI接口'(3)

你可以指定迈出迪维德要侦听输入消息,请发送输出消息或两者的对象。在这个例子中,迈出迪维德对象在指定的输入端口接收MIDI消息“USB MIDI接口”,并从指定的输出端口发送MIDI消息“USB MIDI接口”

MIDI消息

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

  1. 第一个字节描述了一种动作和频道。第一个字节被称为状态字节

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

  3. 第三个字节描述了按键的播放难度。第三个字节也是数据字节。

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

在MATLAB®,MIDI消息包装为一个米米对象,并可作为标量或数组进行操作。要创建MIDI消息,调用米米使用消息类型,然后为特定消息类型指定所需的参数。例如,要在消息上创建注释,请指定米米类型作为“NoteOn”然后指定所需的输入:频道,注意和速度。

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

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

发送和接收MIDI消息

要发送和接收MIDI消息,请使用迈出迪维德对象功能midisend中间人.当你创建迈出迪维德对象时,它开始在其输入处接收数据并将其放入缓冲区。

从缓冲区中检索MIDI消息,调用中间人

receivedMessages = midireceive(设备)
receivedMessages = MIDI message: NoteOn Channel: 1 Note: 36 Velocity: 64 Timestamp: 15861.9 [90 24 40]
MIDI消息作为数组返回米米对象。在此示例中,按下MIDI键盘键。

要发送MIDI消息到MIDI设备,调用midisend

midisend(设备,味精)

MIDI消息类型

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

ChannetPressUreMessage = Midimsg(“ChannelPressure”,1,20)
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 20 Timestamp: 0 [D0 14]
创建MIDI消息后,您可以修改属性,但无法修改类型。
channelPressureMessage。ChannelPressure = 37
channelPressureMessage = MIDI消息:ChannelPressure通道:1 ChannelPressure: 37 Timestamp: 0 [D0 25]

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

音频工具箱提供了方便语法,以创建依次使用的多个MIDI消息,并创建MIDI消息数组。看米米有关完整的语法列表。

MIDI消息时序

MIDI协议没有定义消息时序,并假设立即采取消息。许多应用需要用于排队和批处理的时间信息。为方便起见,音频工具箱将与MIDI消息的定时信息包装成单个米米对象。所有米米物体有一个时间戳属性,在创建期间设置为可选的最后一个参数或创建后。默认值时间戳是零。

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

  • 在接收MIDI消息时使用中间人,底层基础设施在接收MIDI消息时分配时间戳。从概念上讲,计时时钟开始于迈出迪维德对象被创建并作为侦听器附加到给定的MIDI输入端口。如果另一个迈出迪维德连接到相同的输入端口时,它将从与第一个对象相同的计时时钟接收时间戳。

  • 使用MIDI消息时使用midisend,时间戳被解释为何时发送消息。

    如果最近没有人打电话来midisend, 然后midisend将时间戳解释为相对于当前的真实世界时间。立即发送具有零时间戳的消息。如果有最近的电话midisend, 然后midisend将时间戳解释为相对于最后一个呼叫的最大时间戳midisend.时间戳时钟midisend特定于MIDI输出端口迈出迪维德连接到。

    考虑一对打开或关闭音符的MIDI消息。这些消息指定通知在一秒之后开始并持续一秒。

    创建注意事项并记下消息。

    onmsg = midimsg(“NoteOn”, 1, 59, 64);OffMsg = midimsg (“NoteOn”59岁的1 0);

    使用单个呼叫发送打开和关闭消息midisend,指定相对于相同开始时间的消息的时间戳。

    OnMsg。时间戳= 1;OffMsg。时间戳= 2;midisend(设备,(OnMsg; OffMsg)))

    要单独发送备注消息,请指定相对于前一个调用的最大时间戳的记录消息的时间戳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流划分为小型可重复的时间块。

也可以看看

课堂

职能

相关的话题

外部网站