Протокол MIDI позволяет отправлять и получать информацию, описывающую звук. Синтезатор MIDI - это устройство или программное обеспечение, которое синтезирует звук в ответ на поступающие данные MIDI. В самой простой форме синтезатор MIDI преобразует сообщения MIDI-ноты в аудиосигнал. Более сложные синтезаторы обеспечивают тонкое управление полученным звуком, позволяя имитировать инструменты. В этом руководстве вы создаете монофонический синтезатор, который преобразует поток сообщений MIDI-ноты в аудиосигнал в режиме реального времени.
Чтобы узнать об интерфейсах с устройствами MIDI в целом, смотрите MIDI Device Interface.
Информация о примечании 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
Чтобы воспроизвести массив 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-устройства. The 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 функция с именем вашего устройства. The simplesynth функция прослушивает сообщения с примечаниями и воспроизводит их на устройстве аудио выхода по умолчанию. Проигрывайте заметки на устройстве MIDI и слушайте синтезированный звук.
simplesynth('USB 02')
Использование Ctrl-C чтобы завершить соединение.