midimsg

Создайте сообщение MIDI

Описание

Создайте сообщение MIDI в MATLAB® с помощью midimsg. Создайте интерфейс MIDI-устройства использование mididevice. Отправьте и получите сообщения с помощью midisend и midireceive. Когда вы создаете сообщение MIDI, вы задаете его как тип сообщения MIDI.

Для примера на сообщениях MIDI и взаимодействующий через интерфейс с MIDI-устройствами, смотрите Интерфейс MIDI-устройства.

Создание

Синтаксис

msg = midimsg('Note',channel,note,velocity,duration,timestamp)
msg = midimsg('NoteOn',channel,note,velocity,timestamp)
msg = midimsg('NoteOff',channel,note,velocity,timestamp)
msg = midimsg('ControlChange',channel,ccnumber,ccvalue,timestamp)
msg = midimsg('ProgramChange',channel,program,timestamp)
msg = midimsg('SystemExclusive',bytes,timestamp)
msg = midimsg('SystemExclusive',timestamp)
msg = midimsg('Data',bytes,timestamp)
msg = midimsg('EOX',timestamp)
msg = midimsg('TimingClock',timestamp)
msg = midimsg('Start',timestamp)
msg = midimsg('Continue',timestamp)
msg = midimsg('Stop',timestamp)
msg = midimsg('ActiveSensing',timestamp)
msg = midimsg('SystemReset',timestamp)
msg = midimsg('TuneRequest',timestamp)
msg = midimsg('MIDITimeCodeQuarterFrame',seq,value,timestamp)
msg = midimsg('SongPositionPointer',position,timestamp)
msg = midimsg('SongSelect',song,timestamp)
msg = midimsg('AllSoundOff',channel,timestamp)
msg = midimsg('ResetAllControllers',channel,timestamp)
msg = midimsg('LocalControl',channel,localcontrol,timestamp)
msg = midimsg('PolyOn',channel,timestamp)
msg = midimsg('MonoOn',channel,monoChannels,timestamp)
msg = midimsg('OmniOn',channel,timestamp)
msg = midimsg('OmniOff',channel,timestamp)
msg = midimsg('AllNotesOff',channel,timestamp)
msg = midimsg('PolyKeyPressure',channel,note,pressure,timestamp)
msg = midimsg('ChannelPressure',channel,pressure,timestamp)
msg = midimsg('PitchBend',channel,change,timestamp)
msg = midimsg
msg = midimsg(size)
msg = midimsg(0)

Описание

пример

msg = midimsg('Note',channel,note,velocity,duration,timestamp) возвращает два сообщения MIDI: NoteOn и NoteOff, с заданным Channel, Note, Velocity и свойствами Timestamp. Свойство Timestamp сообщения NoteOff определяется как свойство Timestamp сообщения NoteOn плюс duration.

пример

msg = midimsg('NoteOn',channel,note,velocity,timestamp) возвращает midimsg NoteOn, с заданным Channel, Note, Velocity и свойствами Timestamp.

пример

msg = midimsg('NoteOff',channel,note,velocity,timestamp) возвращает midimsg NoteOff, с заданным Channel, Note, Velocity и свойствами Timestamp.

пример

msg = midimsg('ControlChange',channel,ccnumber,ccvalue,timestamp) возвращает midimsg ControlChange, с заданным Channel, CCNumber, CCValue и свойствами Timestamp.

пример

msg = midimsg('ProgramChange',channel,program,timestamp) возвращает midimsg ProgramChange, с заданным Channel, Program и свойствами Timestamp.

пример

msg = midimsg('SystemExclusive',bytes,timestamp) возвращает полную последовательность сообщения SystemExclusive, с заданным свойством Timestamp.

пример

msg = midimsg('SystemExclusive',timestamp) возвращает midimsg SystemExclusive, с заданным свойством Timestamp.

пример

msg = midimsg('Data',bytes,timestamp) возвращает midimsg Data для использования в Системе Исключительное сообщение, с заданными свойствами MsgBytes и Timestamp. bytes задан как скаляр, вектор или многомерный массив элементов. Каждый элемент bytes должен быть в области значений [0,127].

пример

msg = midimsg('EOX',timestamp) возвращает midimsg EOX, с заданным свойством Timestamp.

msg = midimsg('TimingClock',timestamp) возвращает midimsg TimingClock, с заданным свойством Timestamp.

msg = midimsg('Start',timestamp) возвращает midimsg Start, с заданным свойством Timestamp.

msg = midimsg('Continue',timestamp) возвращает midimsg Continue, с заданным свойством Timestamp.

msg = midimsg('Stop',timestamp) возвращает midimsg Stop, с заданным свойством Timestamp.

msg = midimsg('ActiveSensing',timestamp) возвращает midimsg ActiveSensing, с заданным свойством Timestamp.

msg = midimsg('SystemReset',timestamp) возвращает midimsg SystemReset, с заданным свойством Timestamp.

msg = midimsg('TuneRequest',timestamp) возвращает midimsg TuneRequest, с заданным свойством Timestamp.

msg = midimsg('MIDITimeCodeQuarterFrame',seq,value,timestamp) возвращает midimsg MIDITimeCodeQuarterFrame, с заданным TimeCodeSequence, TimeCodeValue и свойствами Timestamp.

msg = midimsg('SongPositionPointer',position,timestamp) возвращает midimsg SongPositionPointer, с заданными свойствами SongPosition и Timestamp.

msg = midimsg('SongSelect',song,timestamp) возвращает midimsg SongSelect, с заданными свойствами Song и Timestamp.

msg = midimsg('AllSoundOff',channel,timestamp) возвращает midimsg AllSoundOff, с заданными свойствами Channel и Timestamp.

msg = midimsg('ResetAllControllers',channel,timestamp) возвращает midimsg ResetAllControllers, с заданными свойствами Channel и Timestamp.

msg = midimsg('LocalControl',channel,localcontrol,timestamp) возвращает midimsg LocalControl, с заданным Channel, LocalControl и свойствами Timestamp.

msg = midimsg('PolyOn',channel,timestamp) возвращает midimsg PolyOn, с заданными свойствами Channel и Timestamp.

msg = midimsg('MonoOn',channel,monoChannels,timestamp) возвращает midimsg MonoOn, с заданным Channel, MonoChannels и свойствами Timestamp.

msg = midimsg('OmniOn',channel,timestamp) возвращает midimsg OmniOn, с заданными свойствами Channel и Timestamp.

msg = midimsg('OmniOff',channel,timestamp) возвращает midimsg OmniOff, с заданными свойствами Channel и Timestamp.

msg = midimsg('AllNotesOff',channel,timestamp) возвращает midimsg AllNotesOff, с заданными свойствами Channel и Timestamp.

msg = midimsg('PolyKeyPressure',channel,note,pressure,timestamp) возвращает midimsg PolyKeyPressure, с заданным Channel, Note, Pressure и свойствами Timestamp.

msg = midimsg('ChannelPressure',channel,pressure,timestamp) возвращает midimsg ChannelPressure, с заданным Channel, Pressure и свойствами Timestamp.

msg = midimsg('PitchBend',channel,change,timestamp) возвращает midimsg PitchBend, с заданным Channel, PitchChange и свойствами Timestamp.

пример

msg = midimsg возвращает скалярный midimsg со всеми нулевыми байтами. Все нулевые байты указывают на сообщение MIDI с набором Type к Data.

пример

msg = midimsg(size) возвращает массив midimsg size со всеми нулевыми байтами.

пример

msg = midimsg(0) возвращает пустой midimsg.

Примечание

Если timestamp перечислен как аргумент, это является дополнительным и значения по умолчанию, чтобы обнулить. Исключением является синтаксис 'SystemExclusive',bytes,timestamp, в этом случае аргумент метки времени требуется.

Свойства

развернуть все

Это свойство доступно только для чтения.

Тип сообщения MIDI, возвращенного как одна из следующих перечислимых величин midimsgtype:

NoteOnDataStopSongPositionPointerPolyOnPolyKeyPressure
NoteOffEOXActiveSensingSongSelectMonoOnChannelPressure
ControlChangeTimingClockSystemResetAllSoundOffOmniOnPitchBendChange
ProgramChangeStartTuneRequestResetAllControllersOmniOffUndefined
SystemExclusiveContinueMIDITimeCodeQuarterFrameLocalControlAllNotesOff 

Можно задать тип сообщения MIDI во время создания как вектор символов, строка или участник перечисления midimsgtype.

Например, следующее создают эквивалентные сообщения MIDI:

  • midimsg('SongPositionPointer',1)

  • midimsg("SongPositionPointer",1)

  • midimsg(midimsgtype.SongPositionPointer,1)

Это свойство доступно только для чтения.

Количество байтов в сообщении MIDI, возвращенном как скаляр, вектор или массив тот же размер как msg.

Типы данных: double

Это свойство доступно только для чтения.

Фактические байты созданного MIDI обмениваются сообщениями в десятичном числе, возвращенном как скаляр, вектор или массив тот же размер как msg.

Типы данных: uint8

Местоположение как раз к сообщению MIDI, заданному как скаляр, вектор или массив тот же размер как msg.

Можно задать метку времени как любое числовое значение. Однако метка времени всегда хранится и возвращается как тип double.

Для больше о том, как метки времени MIDI реализованы в Audio Toolbox™, смотрите, что MIDI передает Синхронизацию.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Канал MIDI, которому адресовано сообщение, задал как целое число в области значений [1,16].

Зависимости

Это свойство допустимо только для NoteOn, NoteOff, PolyKeyPressure, AllSoundOff, ResetAllControllers, LocalControl, AllNotesOff, OmniOn, OmniOff, MonoOn, PolyOn, ControlChange, ProgramChange, ChannelPressure и PitchBend объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Номер примечания MIDI, заданный как целое число в области значений [0,127]. Спецификация MIDI задает примечание номер 60 как середину C, и все другие примечания относительны. MIDI-устройства и программное обеспечение define отображение между примечанием и MIDI отмечают номер. Если середина C произвольно принята, чтобы быть C5 для целевого оборудования MIDI или программного обеспечения, карт следующей таблицы между числами примечания MIDI и примечаний:

Зависимости

Это свойство допустимо только для NoteOn, NoteOff и PolyKeyPressure объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Скорость сообщения MIDI, заданного как скалярное целое число в области значений [0,127]. Velocity описывает, как быстро, или "трудно", примечание проигрывается. Более высокий номер соответствует более быстрой скорости.

Зависимости

Это свойство допустимо только для NoteOn и NoteOff объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Ключевое давление, заданное как скалярное целое число в области значений [0,127]. Ключевое давление применяет ретушь к отдельному примечанию. Например, на клавиатуре, ключевое давление описывает давление, применился к ключу после того, как та клавиша была нажата (после того, как сообщение NoteOn отправляется). Можно использовать KeyPressure, чтобы добавить выражение в сохраненные примечания.

Зависимости

Это свойство допустимо только для PolyKeyPressure объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Включите локальное управление, заданное как true или false. Когда локальное управление установлено в false, все устройства на данном канале только отвечают на данные, полученные по MIDI.

Зависимости

Это свойство допустимо только для LocalControl объекты midimsg.

Типы данных: логический

Каналы для сообщений MonoOn, заданных как скалярное целое число в области значений [0,16].

Зависимости

Это свойство допустимо только для MonoOn объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Управляйте номером изменения, заданным как целое число в области значений [0,119].

Зависимости

Это свойство допустимо только для ControlChange объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Управляйте значением изменения, заданным как целое число в области значений [0,127].

Зависимости

Это свойство допустимо только для ControlChange объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Номер программы, чтобы переключиться на, заданный как целое число в области значений [0,127].

Зависимости

Это свойство допустимо только для ProgramChange объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Давление канала, заданное как целое число в области значений [0,127]. Ключевое давление применяет ретушь ко всем примечаниям в канале.

Зависимости

Это свойство допустимо только для ChannelPressure объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Объем подачи изменяется, чтобы применяться, заданный как целое число в области значений [0,16383]. Центральным положением (никакой эффект) является 8192. Чувствительность является функцией получателя.

Зависимости

Это свойство допустимо только для PitchBend объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Порядковый номер, заданный как целое число в области значений [0,7].

Зависимости

Это свойство допустимо только для MIDITimeCodeQuarterFrame объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Значение временного кода, заданное как целое число в области значений [0,15].

Зависимости

Это свойство допустимо только для MIDITimeCodeQuarterFrame объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Положение в песне, чтобы перейти в, заданный как целое число в области значений [0,16383].

Зависимости

Это свойство допустимо только для SongPositionPointer объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Номер песни, чтобы переключиться на, заданный как целое число в области значений [0,127].

Зависимости

Это свойство допустимо только для SongSelect объекты midimsg.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Примеры

свернуть все

Можно создать сообщения примечания MIDI с помощью NoteOn и NoteOff объекты midimsg. Сообщение NoteOn указывает, что примечание должно начать вопроизводить. Сообщение NoteOff указывает, что примечание должно прекратить вопроизводить. Также можно отправить второе сообщение NoteOn со скоростью, обнуленной, чтобы указать, что примечание должно прекратить вопроизводить. Audio Toolbox® обеспечивает синтаксис удобства, чтобы создать знаменитые пары на и примечание от сообщений.

Создайте пару сообщений MIDI, чтобы указать на Примечание По и Примечание От последовательности с помощью синтаксиса удобства Note. Укажите, что примечание запускается после одной секунды, и имеет длительность двух секунд.

channel = 1;
note = 60;
velocity = 64;
duration = 2;
timestamp = 1;
msgs = midimsg('Note',channel,note,velocity,duration,timestamp)
msgs = 
  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 созданы и возвращены как массив. Синтаксис Note возвращает примечание от сообщения как объект NoteOn midimsg с обнуленным Velocity.

Чтобы создать Примечание По и Примечание От сообщений отдельно, создайте два сообщения NoteOn и конкатенируйте их.

msgs = [midimsg('NoteOn',channel,note,velocity,timestamp), ...
        midimsg('NoteOn',channel,note,0,3)]
msgs = 
  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 ]

Можно также задать Примечание От использования объекта NoteOff midimsg. Используя NoteOff синтаксис позволяет вам задать скорость релиза.

    msgs = [midimsg('NoteOn',channel,note,velocity,timestamp), ...
            midimsg('NoteOff',channel,note,velocity,3)]
msgs = 
  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 ]

Чтобы создать сообщение изменения управления, задайте Type midimsg как ControlChange и установите обязательные параметры: Channel, CCNumber и CCValue. Чтобы определить канал и контрольное число, присвоенное вашей поверхности управления MIDI, используйте midiid. Введите midiid в Командной строке и затем переместите управление, которое вы хотите идентифицировать.

[ccInfo,deviceName] = midiid;
Move the control you wish to identify; type ^C to abort.
Waiting for control message... done

midiid возвращает номер изменения управления и канал как один номер согласно следующему formula: ccInfo = (Channel*1000 + CCNumber). Задайте сообщение Изменения Управления MIDI, чтобы переместить идентифицированный контроллер. Ваша Поверхность Управления MIDI должна быть двунаправлена, чтобы получить сообщения Изменения Управления.

channel = floor(ccInfo/1000);
ccnumber = ccInfo - channel*1000;
ccvalue = 1;
msg = midimsg('ControlChange',channel,ccnumber,ccvalue)
msg = 
  MIDI message:
    ControlChange   Channel: 1  CCNumber: 16  CCValue: 1   Timestamp: 0  [ B0 10 01 ]

Создайте объект mididevice с помощью deviceName, идентифицированного с помощью midiid. Отправьте сообщение MIDI в свое устройство.

device = mididevice(deviceName);
midisend(device,msg);

Сообщения Изменения программы, иногда называемые "сообщения" изменения закрашенной фигуры, задают, как интерпретированы примечания. Например, сообщение Изменения Программы может задать игравший инструмент. Чтобы создать объект ProgramChange midimsg, задайте тип midimsg как ProgramChange и необходимые значения свойств: Channel и Program.

channel = 4;
program = 7;
msg = midimsg('ProgramChange',channel,program)
msg = 
  MIDI message:
    ProgramChange   Channel: 4  Program: 7   Timestamp: 0  [ C3 07 ]

Система Исключительные сообщения задана последовательностью объектов midimsg: SystemExclusive, Data и EOX. Чтобы создать Систему Исключительная последовательность, задайте тип midimsg SystemExclusive во время создания и затем задайте байты сообщения. Этот синтаксис требует метки времени.

bytes = [0 1 2];
timestamp = 0;
msg = midimsg('SystemExclusive',bytes,timestamp)
msg = 
  MIDI message:
    SystemExclusive Timestamp: 0  [ F0 ]
    Data            Timestamp: 0  [ 00 01 02 ]
    EOX             Timestamp: 0  [ F7 ]

Можно также создать SystemExclusive, Data и EOX, которому midimsg возражает индивидуально. Например, следующий массив midimsg совпадает с предыдущим.

msg = [midimsg('SystemExclusive',timestamp), ...
       midimsg('Data',bytes,timestamp), ...
       midimsg('EOX',timestamp)]
msg = 
  MIDI message:
    SystemExclusive Timestamp: 0  [ F0 ]
    Data            Timestamp: 0  [ 00 01 02 ]
    EOX             Timestamp: 0  [ F7 ]

Сообщение MIDI по умолчанию является скаляром со всеми нулевыми байтами, и Type является Data.

msg = midimsg
msg = 
  MIDI message:
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]

Можно создать массив сообщения MIDI путем определения размера скалярным или вектором - строкой.

Если вы задаете размер как скаляр M, midimsg возвращает M-by-M массив со всеми нулевыми байтами.

msg = midimsg(2)
msg = 
  MIDI message:
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]

Массив сообщений MIDI всегда отображается вертикально в порядке их линейной индексации. Можно обратиться к отдельным элементам массива путем определения его положения в каждой размерности, или его линейным индексом. Например, измените Timestamp третьего элемента от 0 до 2 using linear indexing, и затем от 2 до 3, использующего сначала размерную индексацию.

msg(3).Timestamp = 2
msg = 
  MIDI message:
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 2  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
msg(1,2).Timestamp = 3
msg = 
  MIDI message:
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 3  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]

Можно также задать несимметричные массивы. Если вы задаете размер как вектор - строку из двух или больше элементов, midimsg возвращает...-X многомерный массив M-by-N-by-. Например, чтобы задать трехмерный массив с каждой размерностью, имеющей различное число элементов, задайте размер как вектор - строку из трех элементов.

msg = midimsg([2,1,3])
msg = 
  MIDI message:
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
    Data            Timestamp: 0  [ 00 00 00 00 00 00 00 00 ]
size(msg)
ans = 1×3

     2     1     3

msg = midimsg(0)
msg = 

  empty MIDI message array

В этом примере вы создаете массив сообщений MIDI, и затем индексируете в массив в цикле, чтобы задать мелодию.

Создайте 22 1 массив сообщений MIDI со всеми нулевыми данными.

msgArray = midimsg([22,1]);

Чтобы создать мелодию, создайте MIDI NoteOn и сообщения NoteOff путем индексации в цикле. Отобразите результат.

melody = [60,65,60,57,55,53,60,65,60,67,60];
for i = 1:numel(melody)
    idx = (2*i-1):(2*i);
    msgArray(idx) = midimsg('Note',1,melody(i),50,0.5,i);
end
msgArray
msgArray = 
  MIDI message:
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 1  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 1.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 50  Timestamp: 2  [ 90 41 32 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 0   Timestamp: 2.5  [ 90 41 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 3  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 3.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 57  Velocity: 50  Timestamp: 4  [ 90 39 32 ]
    NoteOn          Channel: 1  Note: 57  Velocity: 0   Timestamp: 4.5  [ 90 39 00 ]
    NoteOn          Channel: 1  Note: 55  Velocity: 50  Timestamp: 5  [ 90 37 32 ]
    NoteOn          Channel: 1  Note: 55  Velocity: 0   Timestamp: 5.5  [ 90 37 00 ]
    NoteOn          Channel: 1  Note: 53  Velocity: 50  Timestamp: 6  [ 90 35 32 ]
    NoteOn          Channel: 1  Note: 53  Velocity: 0   Timestamp: 6.5  [ 90 35 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 7  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 7.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 50  Timestamp: 8  [ 90 41 32 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 0   Timestamp: 8.5  [ 90 41 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 9  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 9.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 67  Velocity: 50  Timestamp: 10  [ 90 43 32 ]
    NoteOn          Channel: 1  Note: 67  Velocity: 0   Timestamp: 10.5  [ 90 43 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 11  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 11.5  [ 90 3C 00 ]

Порядок сообщений MIDI в массиве только важен для удобочитаемости. Когда вы отправляете сообщения MIDI с помощью объекта mididevice, объект mididevice переупорядочивает сообщения MIDI согласно их меткам времени и отправляет их в хронологическом порядке. Создайте сообщение MIDI PitchBend, чтобы изогнуть четвертое примечание вниз и добавить его в массив сообщения MIDI. Для удобочитаемости отсортируйте массив сообщения MIDI по Timestamp.

msg = midimsg('PitchBend',1,7192,4.01);
msgArray = [msgArray;msg]
msgArray = 
  MIDI message:
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 1  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 1.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 50  Timestamp: 2  [ 90 41 32 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 0   Timestamp: 2.5  [ 90 41 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 3  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 3.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 57  Velocity: 50  Timestamp: 4  [ 90 39 32 ]
    NoteOn          Channel: 1  Note: 57  Velocity: 0   Timestamp: 4.5  [ 90 39 00 ]
    NoteOn          Channel: 1  Note: 55  Velocity: 50  Timestamp: 5  [ 90 37 32 ]
    NoteOn          Channel: 1  Note: 55  Velocity: 0   Timestamp: 5.5  [ 90 37 00 ]
    NoteOn          Channel: 1  Note: 53  Velocity: 50  Timestamp: 6  [ 90 35 32 ]
    NoteOn          Channel: 1  Note: 53  Velocity: 0   Timestamp: 6.5  [ 90 35 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 7  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 7.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 50  Timestamp: 8  [ 90 41 32 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 0   Timestamp: 8.5  [ 90 41 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 9  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 9.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 67  Velocity: 50  Timestamp: 10  [ 90 43 32 ]
    NoteOn          Channel: 1  Note: 67  Velocity: 0   Timestamp: 10.5  [ 90 43 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 11  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 11.5  [ 90 3C 00 ]
    PitchBend       Channel: 1  PitchChange: 7192 Timestamp: 4.01  [ E0 18 38 ]
timeStamps = [msgArray.Timestamp];
[~,idx] = sort(timeStamps);

msgArray = msgArray(idx)
msgArray = 
  MIDI message:
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 1  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 1.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 50  Timestamp: 2  [ 90 41 32 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 0   Timestamp: 2.5  [ 90 41 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 3  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 3.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 57  Velocity: 50  Timestamp: 4  [ 90 39 32 ]
    PitchBend       Channel: 1  PitchChange: 7192 Timestamp: 4.01  [ E0 18 38 ]
    NoteOn          Channel: 1  Note: 57  Velocity: 0   Timestamp: 4.5  [ 90 39 00 ]
    NoteOn          Channel: 1  Note: 55  Velocity: 50  Timestamp: 5  [ 90 37 32 ]
    NoteOn          Channel: 1  Note: 55  Velocity: 0   Timestamp: 5.5  [ 90 37 00 ]
    NoteOn          Channel: 1  Note: 53  Velocity: 50  Timestamp: 6  [ 90 35 32 ]
    NoteOn          Channel: 1  Note: 53  Velocity: 0   Timestamp: 6.5  [ 90 35 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 7  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 7.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 50  Timestamp: 8  [ 90 41 32 ]
    NoteOn          Channel: 1  Note: 65  Velocity: 0   Timestamp: 8.5  [ 90 41 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 9  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 9.5  [ 90 3C 00 ]
    NoteOn          Channel: 1  Note: 67  Velocity: 50  Timestamp: 10  [ 90 43 32 ]
    NoteOn          Channel: 1  Note: 67  Velocity: 0   Timestamp: 10.5  [ 90 43 00 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 50  Timestamp: 11  [ 90 3C 32 ]
    NoteOn          Channel: 1  Note: 60  Velocity: 0   Timestamp: 11.5  [ 90 3C 00 ]

Введенный в R2018a