Протокол 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
чтобы завершить соединение.