实时midi输入和音频同步

问题描述:

我已经构建了一个独立的应用程序版本的项目,直到现在只是一个VST/audiounit。我通过rtaudio提供音频支持。实时midi输入和音频同步

我想添加MIDI支持使用rtmidi但我不清楚如何同步音频和MIDI部分。

在VST/audiounit land中,我习惯于MIDI事件,它有一个时间戳,指示它们从音频块开始的样本中的偏移量。

rtmidi提供自上一个事件以来的增量时间,但我不确定应该如何获取这些事件,以及如何根据音频线程中的当前样本计算出他们的时间。

插件主机如何做到这一点?

我可以理解事件如何在播放时获得准确的样本,但尚不清楚在使用实时输入时他们如何能够获得准确的样本。

rtaudio给我一个回调函数。我将以低块大小运行(32个样本)。我想我会传递一个指向rtmidi实例的指针作为回调的userdata部分,然后调用midiin-> getMessage(& message);里面的音频回调,但我不知道这是否线程合理。

非常感谢您能给我的任何提示

+0

MIDI永远不会是精确的样本,也不需要。 MIDI数据相对较慢。 – Brad 2011-05-12 14:14:35

就您而言,您无需担心。一旦它们到达,您的程序应该将MIDI事件发送给插件,时间戳记为零。我认为你可能误解了“取样准确”的含义。

由于@布拉德在他对你的问题的评论中指出,MIDI确实非常慢。但这只是问题的一部分......当您在基于块的环境中工作时,传入的MIDI事件无法由插件处理,直到块开始。当计算机速度较慢并且块大小为512(或上帝禁止,> 1024)的情况很常见时,这就引入了一个不平凡的延迟时间,导致排列听起来不那么“紧密”。因此,顺序器想出了一个巧妙的方法来解决这个问题。由于MIDI事件是事先已知的,所以这些事件可以提前一格发送到仪器,并在样本帧中有一个偏移量。该插件然后在块的开始处接收这些事件,并且知道不会开始实际处理它们,直到N样本已经过去。这就是“精确采样”意味着音序器。

但是,如果您正在处理来自键盘或某种其他MIDI设备的实时输入,则无法“安排”这些事件。事实上,当你收到它们时,时钟已经在滴答滴答了!因此,这些事件应该只在下一个块的开始时发送到插件,并且偏移量为0.仅允许插件同时接收预先排序和现场事件的Ableton Live等排序器只需发送任何实时事件与0帧的偏移量。

由于您使用的是一个非常小的块大小,最坏的情况是延迟为.7ms,这根本不算太糟糕。在rtmidi的情况下,时间戳不代表您需要计划的偏移量,而是表示事件被捕获的时间。但是既然你只打算接收现场直播活动(你不是写一个音序器,是吗?),你可以简单地传入任何传入的MIDI到插件马上。

+0

感谢尼克,这使得它更清晰。我得到了它的工作 – olilarkin 2011-05-16 17:51:05