midimsg

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

Описание

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

Учебное руководство по сообщениям MIDI и интерфейсам с устройствами MIDI смотрите в MIDI Device Interface.

Создание

Описание

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

msg = midimsg('PitchBend',channel,change,timestamp) возвращает PitchBend midimsg, с заданными 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 Message Timing.

Типы данных: 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 определяют отображение между заметкой и номером заметки MIDI. Если Middle 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 объекты.

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

Каналы для 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 объекты. A NoteOn сообщение указывает, что заметка должна начать воспроизведение. A NoteOff сообщение указывает, что заметка должна прекратить воспроизведение. Также можно отправить второе NoteOn сообщение со скоростью, установленной на нуль, чтобы указать, что заметка должна прекратить воспроизведение. Audio Toolbox ® обеспечивает синтаксис удобства для создания пар примечаний и примечаний к сообщениям.

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

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

Чтобы создать сообщения Note On и Note Off отдельно, создайте два NoteOn сообщения и объединить их.

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

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

    msgs = [midimsg('NoteOn',channel,note,velocity,timestamp), ...
            midimsg('NoteOff',channel,note,velocity,3)]
msgs=1×2 object
  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 Type как 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 возвращает номер изменения управления и канал как одно число согласно следующей формуле: ccInfo = (Channel*1000 + CCNumber). Задайте сообщение MIDI Control Change, чтобы переместить идентифицированный контроллер. Ваша MIDI Control Surface должна быть двунаправленной, чтобы получать сообщения об изменении управления.

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);

Сообщения с изменениями программы, иногда называемые сообщениями «изменение патча», определяют, как интерпретируются заметки. Для примера в сообщении Program Change может быть указан воспроизводимый инструмент. Как создать ProgramChange midimsg object, задайте 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. Чтобы создать последовательность System Exclusive, задайте SystemExclusive midimsg введите во время создания, а затем укажите байты сообщения. Для этого синтаксиса требуется временная метка.

bytes = [0 1 2];
timestamp = 0;
msg = midimsg('SystemExclusive',bytes,timestamp)
msg=3×1 object
  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=1×3 object
  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-на-M со всеми нулевыми байтами.

msg = midimsg(2)
msg=2×2 object
  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=2×2 object
  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=2×2 object
  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 возвращает многомерный массив M-на-N-by-... -X. Для примера, чтобы задать трехмерный массив с каждой размерностью, имеющим разное количество элементов, задайте размер как вектор-строка из трех элементов.

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, а затем индексируете в массив в цикле, чтобы задать мелодию.

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

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=22×1 object
  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 ]
      ⋮

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

msg = midimsg('PitchBend',1,7192,4.01);
msgArray = [msgArray;msg]
msgArray=23×1 object
  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 ]
      ⋮

timeStamps = [msgArray.Timestamp];
[~,idx] = sort(timeStamps);

msgArray = msgArray(idx)
msgArray=23×1 object
  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 ]
      ⋮

Введенный в R2018a