exponenta event banner

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

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

Сведения о взаимодействии с устройствами MIDI в целом см. в разделе Интерфейс устройств MIDI.

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

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

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

  • Note указывает частоту звукового сигнала. Note принимает значение от нуля до 127 включительно. Протокол MIDI указывает, что 60 - это Middle 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 Sustainable Release (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 для завершения соединения.

См. также

Классы

Функции

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