实时MIDI输入并与音频同步

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

要回复问题请先登录注册