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