#audio #midi #audiounit #vst
#Аудио #midi #audiounit #vst
Вопрос:
Я создал автономную версию приложения проекта, который до сих пор был просто VST / audiounit. Я предоставляю поддержку звука через rtaudio.
Я хотел бы добавить поддержку MIDI с помощью rtmidi, но мне непонятно, как синхронизировать аудио- и MIDI-части.
В среде VST / audiounit я привык к MIDI-событиям, которые имеют временную метку, указывающую на их смещение в сэмплах от начала аудиоблока.
rtmidi предоставляет время разности в секундах с момента предыдущего события, но я не уверен, как я должен фиксировать эти события и как я могу вычислить их время по отношению к текущему сэмплу в аудиопотоке.
Как хосты плагинов это делают?
Я могу понять, как события могут быть с точностью до сэмпла при воспроизведении, но неясно, как они могут быть с точностью до сэмпла при использовании ввода в реальном времени.
rtaudio предоставляет мне функцию обратного вызова. Я буду работать с небольшим размером блока (32 сэмпла). Я предполагаю, что передам указатель на экземпляр rtmidi в качестве части userdata обратного вызова, а затем вызову midiin-> GetMessage( amp;message ); внутри обратного аудиовызова, но я не уверен, что это целесообразно для потока.
Большое спасибо за любые советы, которые вы можете мне дать
Комментарии:
1. MIDI никогда не будет сэмплировать точно, да это и не обязательно. Передача MIDI-данных происходит относительно медленно.
Ответ №1:
В вашем случае вам не нужно беспокоиться об этом. Ваша программа должна отправлять MIDI-события плагину с отметкой времени, равной нулю, как только они поступают. Я думаю, вы, возможно, неправильно поняли идею, лежащую в основе того, что значит быть «точным в выборках».
Как отметил @Brad в своем комментарии к вашему вопросу, MIDI действительно работает очень медленно. Но это только часть проблемы … когда вы работаете в блочной среде, входящие MIDI-события не могут обрабатываться плагином до начала блока. Когда компьютеры были медленнее и размеры блоков 512 (или, не дай бог, > 1024) были обычным явлением, это приводило к нетривиальной задержке, в результате чего аранжировка звучала не так «туго». Поэтому разработчики секвенсоров придумали умный способ обойти эту проблему. Поскольку MIDI-события уже известны заранее, эти события могут быть отправлены на инструмент на один блок раньше со смещением в кадрах сэмплов. Затем плагин получает эти события в начале блока и знает, что не следует начинать их фактическую обработку, пока N
не пройдут сэмплы. Вот что означает «точность сэмплирования» в секвенсорах.
Однако, если вы имеете дело с вводом в реальном времени с клавиатуры или какого-либо другого MIDI-устройства, «запланировать» эти события невозможно. Фактически, к тому времени, когда вы их получите, часы уже тикают! Поэтому эти события следует просто отправлять плагину в начале самого следующего блока со смещением 0. Такие секвенсоры, как Ableton Live, которые позволяют плагину одновременно получать как предварительно упорядоченные, так и живые события, просто отправляют любые живые события со смещением в 0 кадров.
Поскольку вы используете очень маленький размер блока, наихудшим сценарием является задержка в 0,7 мс, что совсем не так уж плохо. В случае rtmidi временная метка представляет собой не смещение, которое вам нужно запланировать, а скорее время, в течение которого было зафиксировано событие. Но поскольку вы собираетесь получать только события в реальном времени (вы не пишете секвенсор, не так ли?), вы можете просто сразу передать любой входящий MIDI в плагин.