миди-вход в реальном времени и синхронизация со звуком - PullRequest
6 голосов
/ 12 мая 2011

Я создал отдельную версию приложения для проекта, которая до сих пор была просто VST / audiounit. Я предоставляю аудио поддержку через rtaudio .

Я бы хотел добавить поддержку MIDI, используя rtmidi , но мне не совсем ясно, как синхронизировать аудио и MIDI части.

В земле VST / audiounit я привык к событиям MIDI, которые имеют временную метку, указывающую их смещение в сэмплах от начала аудиоблока.

rtmidi предоставляет дельта-время в секундах с момента предыдущего события, но я не уверен, как мне следует захватить эти события и как я могу рассчитать их время относительно текущего сэмпла в аудиопотоке.

Как хосты плагинов делают это?

Я могу понять, как события могут быть точными сэмплами при воспроизведении, но неясно, как они могут быть точными сэмплами при использовании ввода в реальном времени.

rtaudio дает мне функцию обратного вызова. Я буду работать с небольшим размером блока (32 образца). Я предполагаю, что передам указатель на экземпляр rtmidi как часть пользовательских данных обратного вызова, а затем вызову midiin-> getMessage (& message); внутри звукового обратного вызова, но я не уверен, является ли это чувствительным к потоку.

Большое спасибо за любые советы, которые вы можете дать мне

1 Ответ

6 голосов
/ 16 мая 2011

В вашем случае вам не нужно беспокоиться об этом. Ваша программа должна отправлять MIDI-события плагину с нулевой отметкой времени, как только они поступят. Я думаю, что вы, возможно, неправильно поняли идею того, что значит быть «точной выборкой».

Как заметил @Brad в своем комментарии к вашему вопросу, MIDI действительно очень медленный. Но это только часть проблемы ... когда вы работаете в блочной среде, входящие MIDI-события не могут обрабатываться плагином до начала блока. Когда компьютеры работали медленнее, а размеры блоков 512 (или, не дай бог,> 1024) были обычным явлением, это приводило к нетривиальной задержке, что приводило к тому, что устройство не звучало как «плотное». Поэтому секвенсоры нашли умный способ обойти эту проблему. Поскольку события MIDI уже известны заранее, эти события могут быть отправлены инструменту на один блок раньше со смещением в выборочных кадрах. Затем плагин получает эти события в начале блока и знает, что на самом деле не следует начинать их обработку до тех пор, пока не пройдут N выборки. Это то, что означает «точность выборки» в секвенсорах.

Однако, если вы имеете дело с вводом в реальном времени с клавиатуры или какого-либо другого MIDI-устройства, нет способа «запланировать» эти события. На самом деле, к тому времени, как вы их получили, часы уже тикают! Поэтому эти события должны быть просто отправлены плагину в начале самого следующего блока со смещением 0. Секвенсоры, такие как Ableton Live, которые позволяют плагину одновременно получать как пре-последовательные, так и живые события, просто отправляют любые живые события. со смещением 0 кадров.

Поскольку вы используете блок очень маленького размера, наихудший сценарий - это задержка 0,7 мс, что совсем не плохо. В случае rtmidi временная метка представляет собой не смещение, которое необходимо запланировать, а время, когда событие было захвачено. Но так как вы намереваетесь только получать живые события (вы не пишете секвенсор, не так ли?), Вы можете просто передать любой входящий MIDI-код плагину сразу.

...