Протокол 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
Воспроизведение массива 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. simplesynth примерная функция:
получает сообщения с примечаниями MIDI от указанного устройства MIDI
синтезирует аудиосигнал
воспроизводит их на устройстве вывода звука в реальном времени
Сохранить 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 для завершения соединения.