Проектирование и воспроизведение MIDI-синтезатора

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

Чтобы узнать об интерфейсах с устройствами MIDI в целом, смотрите MIDI Device Interface.

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

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

  • Velocity указывает, как тяжело воспроизводится заметка. По соглашению, сообщения Note On со скоростью, установленной на нуль, представляют сообщения note off. Представление примечаний к сообщениям с примечаниями более эффективно при использовании Running Status.

  • Note указывает частоту аудиосигнала. The Note свойство принимает значение от нуля до 127 включительно. Протокол MIDI задает, что 60 является средним C, со всеми другими примечаниями относительно этой заметки. Создайте MIDI-примечание к сообщению, которое указывает на воспроизведение Middle 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 ]

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

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

  261.6256

Некоторые синтезаторы MIDI используют огибающую Attack Decay Sustain Release (ADSR), чтобы контролировать объем, или амплитуду, ноты с течением времени. Для простоты используйте скорость ноты, чтобы определить амплитуду. Концептуально, если клавиша попадает сильнее, получившийся звук громче. The 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-loop, который использует 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-устройства. The 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 функция с именем вашего устройства. The simplesynth функция прослушивает сообщения с примечаниями и воспроизводит их на устройстве аудио выхода по умолчанию. Проигрывайте заметки на устройстве MIDI и слушайте синтезированный звук.

simplesynth('USB 02')

Использование Ctrl-C чтобы завершить соединение.

См. также

Классы

Функции

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