Разработайте и проигрывайте синтезатор MIDI

Протокол MIDI позволяет вам отправить и получить информационный звук описания. Синтезатор MIDI является устройством или программным обеспечением, которое синтезирует звук в ответ на входящие данные MIDI. В его самой простой форме синтезатор MIDI преобразовывает сообщения примечания MIDI в звуковой сигнал. Более сложные синтезаторы обеспечивают управление подстройки получившегося звука, позволяя вам подражать инструментам. В этом примере вы создаете монофонический синтезатор, который преобразовывает поток сообщений примечания MIDI к звуковому сигналу в режиме реального времени.

Чтобы узнать о взаимодействии через интерфейс с MIDI-устройствами в целом, смотрите Интерфейс MIDI-устройства.

Преобразуйте сообщения примечания MIDI в звуковые волны

Информация о примечании MIDI группирована как объект NoteOn или NoteOff midimsg в Audio Toolbox™. И NoteOn и NoteOff объекты midimsg имеют свойства Note и Velocity:

  • Velocity указывает, как трудно примечание проигрывается. Условно, Примечание По сообщениям с обнуленной скоростью представляет примечание от сообщений. Представление примечания от сообщений с примечанием по сообщениям более эффективно при использовании Рабочего Состояния.

  • Note указывает на частоту звукового сигнала. Свойство Note принимает значение между нулем и 127, включительно. Протокол MIDI указывает, что 60 средний C, со всеми другими примечаниями относительно того примечания. Создайте примечание MIDI по сообщению, которое указывает, чтобы проигрывать середину C.

channel = 1;
note = 60;
velocity = 64;
msg = midimsg('NoteOn',channel,note,velocity)
msg = 

  MIDI message:
    NoteOn          Channel: 1  Note: 60  Velocity: 64  Timestamp: 0  [ 90 3C 40 ]

Чтобы интерпретировать свойство примечания как частоту, используйте равную умеренную шкалу и соглашение A440:

frequency = 440 * 2^((msg.Note-69)/12)
frequency =

  261.6256

Некоторые синтезаторы MIDI используют конверт Затухания нападения выдерживает релиз (ADSR), чтобы управлять объемом или амплитудой, примечания в зависимости от времени. Для простоты используйте скорость примечания, чтобы определить амплитуду. Концептуально, если клавиша нажата тяжелее, получившийся звук громче. Свойство Velocity принимает значение между нулем и 127, включительно. Нормируйте скорость и интерпретируйте как амплитуда примечания.

amplitude = msg(1).Velocity/127
amplitude =

    0.5039

Чтобы синтезировать синусоиду, создайте Систему audioOscillator object™. Чтобы проигрывать звук к устройству аудиовыхода вашего компьютера по умолчанию, создайте Системный объект audioDeviceWriter. Шаг объекты в течение двух секунд и слушает примечание.

osc = audioOscillator('Frequency',frequency,'Amplitude',amplitude);
deviceWriter = audioDeviceWriter('SampleRate',osc.SampleRate);

tic
while toc < 2
    synthesizedAudio = osc();
    deviceWriter(synthesizedAudio);
end

Синтезируйте сообщения MIDI

Чтобы проигрывать массив объектов midimsg с соответствующей синхронизацией, создайте цикл.

Во-первых, создайте массив объектов midimsg и кэшируйте примечание по и отметьте от времен к переменной, eventTimes.

msgs = [midimsg('Note',channel,60,64,0.5,0), ...
        midimsg('Note',channel,62,64,0.5,.75), ...
        midimsg('Note',channel,57,40,0.5,1.5), ...
        midimsg('Note',channel,60,50,1,3)];
eventTimes = [msgs.Timestamp];

Чтобы подражать приемо-сдаточным ведомостям в режиме реального времени, создайте цикл for, который использует переменную eventTimes и tic и toc, чтобы проигрывать примечания согласно меткам времени сообщения MIDI. Выпустите свое аудио устройство после того, как цикл будет завершен.

i = 1;
tic
while toc < max(eventTimes)
    if toc > eventTimes(i)
        msg = msgs(i);
        i = i+1;
        
        if msg.Velocity~= 0
            osc.Frequency = 440 * 2^((msg.Note-69)/12);
            osc.Amplitude = msg.Velocity/127;
        else
            osc.Amplitude = 0; 
        end
    end
    deviceWriter(osc());
end
release(deviceWriter)

Синтезируйте сообщения примечания в реальном времени от MIDI-устройства

Чтобы получить и синтезировать сообщения примечания в режиме реального времени, создайте интерфейс к MIDI-устройству. Функция, взятая в качестве примера, simplesynth:

  • получает сообщения примечания MIDI от заданного MIDI-устройства

  • синтезирует звуковой сигнал

  • проигрывает их к вашему устройству аудиовыхода в режиме реального времени

Сохраните функцию simplesynth в свою текущую папку.

 simplesynth

Чтобы запросить вашу систему для вашего имени устройства, используйте mididevinfo. Чтобы слушать ваше выбранное устройство, вызовите функцию simplesynth с именем устройства. Этот пример использует устройство M-Audio KeyRig 25, которое указывает с именем устройства USB 02 на машине, используемой в этом примере.

mididevinfo
  MIDI devices available:
  ID  Direction  Interface   Name
   0   output    MMSystem   'Microsoft MIDI Mapper'
   1    input    MMSystem   'USB MIDI Interface '
   2    input    MMSystem   'USB O2'
   3   output    MMSystem   'Microsoft GS Wavetable Synth'
   4   output    MMSystem   'USB MIDI Interface '
   5   output    MMSystem   'USB O2'

Вызовите функцию simplesynth со своим именем устройства. Функция simplesynth прислушивается к сообщениям примечания и проигрывает их к вашему устройству аудиовыхода по умолчанию. Проигрывайте примечания по своему MIDI-устройству и слушайте синтезируемое аудио.

simplesynth('USB 02')

Используйте Ctrl-C, чтобы закончить связь.

Смотрите также

Классы

Функции

Внешние веб-сайты