主要内容

midimsg

创建MIDI消息

描述

在MATLAB中创建一个MIDI消息®使用midimsg.使用创建MIDI设备接口mididevice.使用发送和接收消息midisend而且midireceive.在创建MIDI消息时,将其指定为MIDI消息类型。

有关MIDI消息和MIDI设备接口的教程,请参见MIDI设备接口

创建

语法

描述

例子

味精= midimsg (“注意”,通道,注意,速度,时间,时间戳返回两个MIDI消息:NoteOn而且NoteOff,指定通道请注意速度,时间戳属性。的时间戳财产的NoteOff消息被确定为时间戳财产的NoteOn消息+持续时间

例子

味精= midimsg (“NoteOn”频道,注意,速度,时间戳返回一个NoteOnmidimsg,指定通道请注意速度,时间戳属性。

例子

味精= midimsg (件的NoteOff’,通道,注意,速度,时间戳返回一个NoteOffmidimsg,指定通道请注意速度,时间戳属性。

例子

味精= midimsg (“ControlChange”频道,ccnumber ccvalue,时间戳返回一个ControlChangemidimsg,指定通道CCNumberCCValue,时间戳属性。

例子

味精= midimsg (ProgramChange,渠道,计划,时间戳返回一个ProgramChangemidimsg,指定通道程序,时间戳属性。

例子

味精= midimsg (SystemExclusive,字节,时间戳返回一个完整的SystemExclusive消息序列,带有指定的时间戳财产。

例子

味精= midimsg (“SystemExclusive”,时间戳返回一个SystemExclusivemidimsg,指定时间戳财产。

例子

味精= midimsg (“数据”,字节,时间戳返回一个数据midimsg在系统独占消息中使用,带有指定的MsgBytes而且时间戳属性。字节指定为标量、向量或多维元素数组。的每个元素字节必须在[0,127]的范围内。

例子

味精= midimsg (“EOX”,时间戳返回一个EOXmidimsg,指定时间戳财产。

味精= midimsg (“TimingClock”,时间戳返回一个TimingClockmidimsg,指定时间戳财产。

味精= midimsg (“开始”,时间戳返回一个开始midimsg,指定时间戳财产。

味精= midimsg (“继续”,时间戳返回一个继续midimsg,指定时间戳财产。

味精= midimsg (“停止”,时间戳返回一个停止midimsg,指定时间戳财产。

味精= midimsg (“ActiveSensing”,时间戳返回一个ActiveSensingmidimsg,指定时间戳财产。

味精= midimsg (“SystemReset”,时间戳返回一个SystemResetmidimsg,指定时间戳财产。

味精= midimsg (“TuneRequest”,时间戳返回一个TuneRequestmidimsg,指定时间戳财产。

味精= midimsg (MIDITimeCodeQuarterFrame, seq,价值,时间戳返回一个MIDITimeCodeQuarterFramemidimsg,指定TimeCodeSequenceTimeCodeValue,时间戳属性。

味精= midimsg (“SongPositionPointer”,位置,时间戳返回一个SongPositionPointermidimsg,指定SongPosition而且时间戳属性。

味精= midimsg (“SongSelect”、歌曲、时间戳返回一个SongSelectmidimsg,指定首歌而且时间戳属性。

味精= midimsg (“AllSoundOff”频道,时间戳返回一个AllSoundOffmidimsg,指定通道而且时间戳属性。

味精= midimsg (“ResetAllControllers”频道,时间戳返回一个ResetAllControllersmidimsg,指定通道而且时间戳属性。

味精= midimsg (“LocalControl”,频道,LocalControl时间戳返回一个LocalControlmidimsg,指定通道LocalControl,时间戳属性。

味精= midimsg (“PolyOn”频道,时间戳返回一个PolyOnmidimsg,指定通道而且时间戳属性。

味精= midimsg (“MonoOn”,频道,monoChannels时间戳返回一个MonoOnmidimsg,指定通道MonoChannels,时间戳属性。

味精= midimsg (“OmniOn”频道,时间戳返回一个OmniOnmidimsg,指定通道而且时间戳属性。

味精= midimsg (“OmniOff”频道,时间戳返回一个OmniOffmidimsg,指定通道而且时间戳属性。

味精= midimsg (“AllNotesOff”频道,时间戳返回一个AllNotesOffmidimsg,指定通道而且时间戳属性。

味精= midimsg (“PolyKeyPressure”频道,注意,压力,时间戳返回一个PolyKeyPressuremidimsg,指定通道请注意压力,时间戳属性。

味精= midimsg (“ChannelPressure”频道,压力,时间戳返回一个ChannelPressuremidimsg,指定通道压力,时间戳属性。

味精= midimsg (“PitchBend”频道,改变,时间戳返回一个PitchBendmidimsg,指定通道PitchChange,时间戳属性。

例子

味精= midimsg返回一个标量midimsg都是零字节。所有零字节表示MIDI消息类型设置为数据

例子

味精= midimsg (大小返回一个midimsg的数组大小都是零字节。

例子

味精= midimsg (0)返回一个空midimsg

请注意

如果时间戳作为参数列出,它是可选的,默认为0。唯一的例外是SystemExclusive,字节,时间戳语法,在这种情况下需要时间戳参数。

属性

全部展开

此属性是只读的。

MIDI消息的类型,作为以下之一返回midimsgtype枚举值:

NoteOn 数据 停止 SongPositionPointer PolyOn PolyKeyPressure
NoteOff EOX ActiveSensing SongSelect MonoOn ChannelPressure
ControlChange TimingClock SystemReset AllSoundOff OmniOn PitchBendChange
ProgramChange 开始 TuneRequest ResetAllControllers OmniOff 未定义的
SystemExclusive 继续 MIDITimeCodeQuarterFrame LocalControl AllNotesOff

类的成员时,可以将MIDI消息的类型指定为字符向量、字符串或成员midimsgtype枚举。

例如,下面创建等价的MIDI消息:

  • midimsg (SongPositionPointer, 1)

  • midimsg(“SongPositionPointer”,1)

  • midimsg (midimsgtype.SongPositionPointer, 1)

此属性是只读的。

MIDI消息中的字节数,作为大小相同的标量、向量或数组返回味精

数据类型:

此属性是只读的。

以十进制形式构造的MIDI消息的实际字节数,作为大小相同的标量、向量或数组返回味精

数据类型:uint8

MIDI消息的时间位置,指定为大小相同的标量、向量或数组味精

您可以将时间戳指定为任何数值。但是,时间戳总是作为类型存储和返回

有关如何在Audio Toolbox™中实现MIDI时间戳的更多信息,请参见MIDI消息时间

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

消息发送到的MIDI通道,指定为范围为[1,16]的整数。

依赖关系

此属性仅对NoteOnNoteOffPolyKeyPressureAllSoundOffResetAllControllersLocalControlAllNotesOffOmniOnOmniOffMonoOnPolyOnControlChangeProgramChangeChannelPressure,PitchBendmidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

MIDI音符号,指定为范围[0,127]的整数。MIDI规范将60号音符定义为中C,所有其他音符都是相对的。MIDI设备和软件定义音符和MIDI音符号之间的映射关系。如果任意假设MIDI硬件或软件的Middle C为C5,则MIDI音符号与音符之间的对应关系如下表所示:

依赖关系

此属性仅对NoteOnNoteOff,PolyKeyPressuremidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

MIDI消息的速度,指定为范围[0,127]中的标量整数。速度描述一个音符演奏得有多快或多“用力”。数值越大,速度越快。

依赖关系

此属性仅对NoteOn而且NoteOffmidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

键压力,指定为范围[0,127]中的标量整数。主要适用于压力aftertouch给个别的注解。例如,在键盘上,键压描述的是键被敲击后施加在该键上的压力NoteOn消息发送)。您可以使用KeyPressure为保留的笔记添加表达式。

依赖关系

此属性仅对PolyKeyPressuremidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

启用本地控制,指定为真正的.当本地控制设置为,给定通道上的所有设备只响应通过MIDI接收的数据。

依赖关系

此属性仅对LocalControlmidimsg对象。

数据类型:逻辑

渠道MonoOn消息,指定为范围[0,16]的标量整数。

依赖关系

此属性仅对MonoOnmidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

控件更改号,指定为范围[0,119]中的整数。

依赖关系

此属性仅对ControlChangemidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

控件更改值,指定为范围[0,127]中的整数。

依赖关系

此属性仅对ControlChangemidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

要切换到的程序号,指定为范围[0,127]中的整数。

依赖关系

此属性仅对ProgramChangemidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

通道压力,指定为范围[0,127]的整数。主要适用于压力aftertouch到一个声道中的所有音符。

依赖关系

此属性仅对ChannelPressuremidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

要应用的螺距变化量,指定为范围[0,16383]的整数。中心位置(没有影响)是8192.灵敏度是接收器的函数。

依赖关系

此属性仅对PitchBendmidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

序列号,指定为范围[0,7]的整数。

依赖关系

此属性仅对MIDITimeCodeQuarterFramemidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

时间代码值,指定为范围[0,15]的整数。

依赖关系

此属性仅对MIDITimeCodeQuarterFramemidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

要去的歌曲中的位置,指定为范围[0,16383]的整数。

依赖关系

此属性仅对SongPositionPointermidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

要切换到的歌曲号,指定为范围[0,127]中的整数。

依赖关系

此属性仅对SongSelectmidimsg对象。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

例子

全部折叠

方法可以创建MIDI注释消息NoteOn而且NoteOffmidimsg对象。一个NoteOn消息表示音符应该开始演奏。一个NoteOff消息表示音符应该停止播放。或者,您也可以发送第二个NoteOn速度设置为零的消息,表示音符应该停止播放。Audio Toolbox®提供了一种方便的语法来创建开注和关注消息对。

方法创建一对MIDI消息来指示音符开和音符关序列请注意方便的语法。指定音符在1秒后开始,持续时间为2秒。

频道= 1;注意= 60;速度= 64;时间= 2;时间戳= 1;公司= midimsg (“注意”、通道、注意、速度、持续时间、时间戳)
公司=2×1对象MIDI message: NoteOn Channel: 1 Note: 60 Velocity: 64 Timestamp: 1 [90 3C 40] NoteOn Channel: 1 Note: 60 Velocity: 0 Timestamp: 3 [90 3C 00]

两个midimsg对象被创建并作为数组返回。的请注意语法将注释关闭消息返回为NoteOnmidimsg对象与速度设置为零。

要分别创建Note On和Note Off消息,请创建两个NoteOn消息并连接它们。

公司= [midimsg (“NoteOn”通道,注意,速度,时间戳),...midimsg (“NoteOn”通道,注意0 3)]
公司=1×2对象MIDI message: NoteOn Channel: 1 Note: 60 Velocity: 64 Timestamp: 1 [90 3C 40] NoteOn Channel: 1 Note: 60 Velocity: 0 Timestamp: 3 [90 3C 00]

您还可以使用NoteOffmidimsg对象。使用NoteOff语法允许您指定发布速度。

公司= [midimsg (“NoteOn”通道,注意,速度,时间戳),...midimsg (件的NoteOff”,通道,注意速度,3)]
公司=1×2对象MIDI message: NoteOn Channel: 1 Note: 60 Velocity: 64 Timestamp: 1 [90 3C 40] NoteOff Channel: 1 Note: 60 Velocity: 64 Timestamp: 3 [80 3C 40]

要创建控件更改消息,请指定midimsg类型作为ControlChange并设置所需参数:通道CCNumber,CCValue.若要确定分配给MIDI控件表面的通道和控件编号,请使用midiid.输入midiid,然后移动要标识的控件。

[ccInfo,设备名称]= midiid;
移动要标识的控件;类型^C中止。等待控制消息…完成

midiid根据以下公式,将控件更改编号和通道作为单个数字返回:ccInfo =(通道*1000 + CCNumber).定义一个MIDI Control Change消息来移动识别的控制器。MIDI控制面必须是双向的,才能接收控制更改消息。

频道=地板(ccInfo / 1000);ccnumber = ccInfo - channel*1000;ccvalue = 1;味精= midimsg (“ControlChange”、通道、ccnumber ccvalue)
msg = MIDI message: ControlChange Channel: 1 CCNumber: 16 CCValue: 1 Timestamp: 0 [B0 10 01]

创建一个mididevice对象使用设备名称确定使用midiid.发送MIDI消息到您的设备。

设备= mididevice(设备名称);midisend(设备,味精);

程序更改消息(有时称为“补丁更改”消息)指定如何解释注释。例如,Program Change消息可以指定正在演奏的乐器。创建一个ProgramChangemidimsg对象,指定midimsg类型为ProgramChange,以及所需的属性值:通道而且程序

频道= 4;程序= 7;味精= midimsg (“ProgramChange”、渠道、程序)
msg = MIDI message: ProgramChange Channel: 4 Program: 7 Timestamp: 0 [C3 07]

的序列定义系统独占消息midimsg对象:SystemExclusive数据,EOX.要创建系统独占序列,请指定SystemExclusivemidimsg在创建过程中键入,然后指定消息的字节。该语法需要一个时间戳。

Bytes = [0 1 2];时间戳= 0;味精= midimsg (“SystemExclusive”字节,时间戳)
味精=3×1对象MIDI message: SystemExclusive Timestamp: 0 [F0] Data Timestamp: 0 [00 01 02] EOX Timestamp: 0 [F7]

您还可以创建SystemExclusive数据,EOXmidimsg单独的对象。例如midimsg数组与前面的相同。

味精= [midimsg (“SystemExclusive”时间戳),...midimsg (“数据”、字节数、时间戳)...midimsg (“EOX”、时间戳)
味精=1×3对象MIDI message: SystemExclusive Timestamp: 0 [F0] Data Timestamp: 0 [00 01 02] EOX Timestamp: 0 [F7]

默认的MIDI消息是一个全为零字节的标量,并且类型数据

味精= midimsg
数据时间戳:0 [00 00 00 00 00 00 00 00 00]

可以通过用标量或行向量指定大小来创建MIDI消息数组。

如果将大小指定为标量midimsg返回一个——- - - - - -数组中的所有字节都为零。

味精= midimsg (2)
味精=2×2对象MIDI消息:数据时间戳:0[00 00 00 00 00 00 00 00 00 00 00]数据时间戳:0[00 00 00 00 00 00 00 00 00 00 00 00]数据时间戳:0 [00 00 00 00 00 00 00 00 00 00 00 00 00 00]

MIDI消息数组总是按照它们的线性索引顺序垂直显示。您可以通过指定数组在每个维度中的位置或通过其线性索引来引用数组的各个元素。例如,更改时间戳的第三元素02使用线性索引,然后从23.使用一维索引。

味精(3)。时间戳= 2
味精=2×2对象MIDI消息:数据时间戳:0[00 00 00 00 00 00 00 00 00 00 00]数据时间戳:0[00 00 00 00 00 00 00 00 00 00 00 00]数据时间戳:2 [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
味精(1、2)。时间戳= 3
味精=2×2对象MIDI消息:数据时间戳:0[00 00 00 00 00 00 00 00 00 00 00]数据时间戳:0[00 00 00 00 00 00 00 00 00 00 00 00 00]数据时间戳:3 [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]

还可以指定非对称数组。如果将大小指定为包含两个或多个元素的行向量,midimsg返回一个——- - - - - -N——-…X多维数组。例如,要指定一个三维数组,其中每个维度具有不同数量的元素,请将其大小指定为包含三个元素的行向量。

味精= midimsg ((2, 1, 3))
味精= MIDI消息:数据的时间戳:0(00 00 00 00 00 00 00 00)数据的时间戳:0(00 00 00 00 00 00 00 00)数据的时间戳:0(00 00 00 00 00 00 00 00)数据的时间戳:0(00 00 00 00 00 00 00 00)数据的时间戳:0(00 00 00 00 00 00 00 00)数据的时间戳:0 (00 00 00 00 00 00 00 00)
大小(味精)
ans =1×32 1 3
味精= midimsg (0)
MIDI消息数组

在本例中,您创建了一个MIDI消息数组,然后在循环中对数组进行索引以定义旋律。

创建一个包含所有零数据的22 × 1 MIDI消息数组。

msgArray = midimsg([22日1]);

要创建一个旋律,创建MIDINoteOn而且NoteOff通过在循环中索引来传递消息。显示结果。

旋律=[65,60,57岁,55岁,53岁,60岁,65年,60岁,67年,60岁);I = 1:numel(旋律)idx = (2* I -1):(2* I);msgArray (idx) = midimsg (“注意”1,旋律(i), 50岁,0.5,我);结束msgArray
msgArray =22×1对象MIDI消息:NoteOn通道:1注意:60速度:50时间戳:1 (90 3 c 32) NoteOn通道:1注意:60速度:0时间戳:1.5 (3 c 90 00) NoteOn通道:1注意:65速度:50时间戳:2 [90 41 32]NoteOn通道:1注意:65速度:0时间戳:2.5 (41 90 00)NoteOn通道:1注意:60速度:50时间戳:3 (90 3 c 32) NoteOn频道:1注意:60速度:0时间戳:3.5 (3 c 90 00) NoteOn通道:1注意:57速度:50时间戳:4 [90 39 32]NoteOn频道:1注意:57速度:0时间戳:4.5 (39 90 00)NoteOn通道:1注意:55速度:50时间戳:5 [90 37 32]NoteOn通道:1注意:55速度:0时间戳:5.5 (37 90 00)NoteOn通道:1注意:53速度:50时间戳:6 [90 35 32]NoteOn通道:1注意:53速度:0时间戳:6.5 (35 90 00)NoteOn通道:1注意:60速度:50时间戳:7 [90 3 c 32] NoteOn通道:1注意:60速度:0时间戳:7.5 (3 c 90 00) NoteOn通道:1注意:65速度:50 Timestamp: 8 [90 41 32] NoteOn Channel: 1 Note: 65 Velocity: 0 Timestamp: 8.5 [90 41 00]

MIDI消息在数组中的顺序只对可读性重要。发送MIDI消息时使用mididevice对象,mididevice对象根据它们的时间戳重新排序你的MIDI消息,并按时间顺序发送它们。创建一个PitchBendMIDI消息向下弯曲第四个音符并将其添加到MIDI消息数组。为了可读性,对MIDI消息数组按时间戳

味精= midimsg (“PitchBend”, 7192, 4.01);msgArray = [msgArray;味精)
msgArray =23日×1对象MIDI消息:NoteOn通道:1注意:60速度:50时间戳:1 (90 3 c 32) NoteOn通道:1注意:60速度:0时间戳:1.5 (3 c 90 00) NoteOn通道:1注意:65速度:50时间戳:2 [90 41 32]NoteOn通道:1注意:65速度:0时间戳:2.5 (41 90 00)NoteOn通道:1注意:60速度:50时间戳:3 (90 3 c 32) NoteOn频道:1注意:60速度:0时间戳:3.5 (3 c 90 00) NoteOn通道:1注意:57速度:50时间戳:4 [90 39 32]NoteOn频道:1注意:57速度:0时间戳:4.5 (39 90 00)NoteOn通道:1注意:55速度:50时间戳:5 [90 37 32]NoteOn通道:1注意:55速度:0时间戳:5.5 (37 90 00)NoteOn通道:1注意:53速度:50时间戳:6 [90 35 32]NoteOn通道:1注意:53速度:0时间戳:6.5 (35 90 00)NoteOn通道:1注意:60速度:50时间戳:7 [90 3 c 32] NoteOn通道:1注意:60速度:0时间戳:7.5 (3 c 90 00) NoteOn通道:1注意:65速度:50 Timestamp: 8 [90 41 32] NoteOn Channel: 1 Note: 65 Velocity: 0 Timestamp: 8.5 [90 41 00]
时间戳= [msgArray.Timestamp];[~, idx] =排序(时间戳);msgArray = msgArray (idx)
msgArray =23日×1对象MIDI消息:NoteOn通道:1注意:60速度:50时间戳:1 (90 3 c 32) NoteOn通道:1注意:60速度:0时间戳:1.5 (3 c 90 00) NoteOn通道:1注意:65速度:50时间戳:2 [90 41 32]NoteOn通道:1注意:65速度:0时间戳:2.5 (41 90 00)NoteOn通道:1注意:60速度:50时间戳:3 (90 3 c 32) NoteOn频道:1注意:60速度:0时间戳:3.5 (3 c 90 00) NoteOn通道:1注意:57速度:50时间戳:4 [90 39 32]PitchBend频道:1 PitchChange: 7192时间:4.01 (E0 18 38) NoteOn通道:1注意:57速度:0时间戳:4.5 (39 90 00)NoteOn通道:1注意:55速度:50时间戳:5 [90 37 32]NoteOn通道:1注意:55速度:0时间戳:5.5 (37 90 00)NoteOn通道:1注意:53速度:50时间戳:6 [90 35 32]NoteOn通道:1注意:53速度:0时间戳:6.5 (35 90 00)NoteOn通道:1注意:60速度:50时间戳:7 [90 3 c 32] NoteOn通道:1注意:60速度:0时间戳:7.5 [90 3C 00] NoteOn Channel: 1 Note: 65 Velocity: 50 Timestamp: 8 [90 41 32]
介绍了R2018a