我已经构建了一个项目的独立应用版本,到目前为止只是一个VST / audiounit。我通过rtaudio提供音频支持。
我想使用rtmidi添加MIDI支持,但我不清楚如何同步音频和MIDI部分。
在VST / audiounit land中,我习惯于具有时间戳的MIDI事件,该时间戳指示从音频块的开头开始的样本中的偏移。
rtmidi提供了自上次事件以来以秒为单位的增量时间,但我不确定如何获取这些事件以及如何计算与音频线程中当前样本相关的时间。
插件主机如何做到这一点?
我可以理解事件在回放时的样本是如何准确的,但是在使用实时输入时它们是如何准确地采样的。
rtaudio给了我一个回调函数。我将以低块大小运行(32个样本)。我想我会将指向rtmidi实例的指针作为回调的userdata部分传递,然后调用midiin-> getMessage(& message);在音频回调中,但我不确定这是否是线程敏感的。
非常感谢您提供给我的任何提示
答案 0 :(得分:5)
在您的情况下,您不必担心它。你的程序应该在它们到达时将MIDI事件发送到插件,时间戳为零。我想你可能误解了“样本准确”的含义背后的想法。
正如@Brad在他对你的问题的评论中指出的那样,MIDI确实很慢。但这只是问题的一部分......当您在基于块的环境中工作时,插件无法在块开始之前处理传入的MIDI事件。当计算机较慢并且块大小为512(或上帝禁止,> 1024)是常见的时,这引入了非平凡的延迟量,这导致该布置听起来不“紧”。因此,序列发生器提出了一种巧妙的方法来解决这个问题。由于MIDI事件已经提前知道,因此这些事件可以提前一个块发送到乐器,并且样本帧中存在偏移。然后插件在块的开头接收这些事件,并且知道在N
样本通过之前不开始实际处理它们。这就是“样本准确”在序列发生器中的含义。
但是,如果您正在处理来自键盘或某种其他MIDI设备的实时输入,则无法“安排”这些事件。事实上,当你收到它们时,时钟已经在滴答作响!因此,这些事件应该在下一个块开始时以0的偏移量发送到插件。像Ableton Live这样的排序器允许插件同时接收预先排序和现场事件,只需发送任何直播事件偏移量为0帧。
由于您使用的是非常小的块大小,最糟糕的情况是延迟为.7ms,这根本不是太糟糕。对于rtmidi,时间戳不表示您需要安排的偏移量,而是表示捕获事件的时间。但是因为你只打算接收直播事件(不是编写音序器,不是吗?),你可以立即将任何传入的MIDI传递给插件。