我目前正在使用c#中的算法实现MIDI MTC,使用旧的但仍然很好的Windows多媒体API winmm.dll进行从属同步。我的软件实际上使用midi流模式(midistreamopen等)和更典型的midioutopen,midiinopen等模式之间的混合。虽然流本身不能在时间上改变以获得同步,但我可以通过使用midistreamproperty调用实时改变速度来实现与传入MTC时钟消息的同步。
然而,在更详细地检查了流模式的准确性后,我对它的行为感到有些困惑。特别是,让我们忘记节奏改变和同步,并考虑使用例如Midi Machine Control几乎同时启动两台PC;这两台机器都只是运行预加载的midistreams,比如定期和定期慢节拍。当然,从一开始就会有节拍的一些补偿,但是你不会认为补偿会随着时间的推移保持相对稳定吗?我认为,时间方面,midistream模式在许多硬件平台上都是准确的。我认为这两个平台之间不会有很多偏差。它应该比更典型的基于定时器的定序器更准确。
我的调查表明,在两个不同硬件平台上运行的两个midi流之间存在漂移。这不是很多漂移,但它是不同的,所以在几分钟内你可以听到节拍靠近在一起并分开。两个流都以相同的速度和分度(时分)开始。我尝试了各种更慢,更高的节奏和分数。对于更多的极端参数,漂移似乎更糟,我期望但是我不希望在更规范的操作条件下有太多的变化。我可以通过实时的小节奏变化来克服这个问题,但我更喜欢这种最小的干预。我知道这是一个奇怪的问题,可能没有得到很多答复,但我认为值得一试。
答案 0 :(得分:0)
MTC不足以使系统保持同步。 MTC封装了基于秒数的SMPTE时间码,而不是节拍。
MMC用于控制开始,顶部,回到开头等等。
您遗失的部分是MIDI beat clock。它实际上是每季度发送24次脉冲(在大多数系统上)。通过此消息,您可以使多个系统几乎完全同步。
另请参阅:http://www.omegastudios.com/blog/bid/306605/Part-2-MIDI-Beat-Clock-and-the-Three-Dimensions-of-Sync
答案 1 :(得分:0)
嗯,在进行数据研究后,答案实际上是没有漂移。这是两个不同的midi流的抖动和漂移的.pdf,它们运行在两个不同的PC上,每个PC都运行相同的midi beat文件。漂移是在5分钟内绘制的黑线。抖动很小但是由于Windows消息传递而不是由于内核流。
http://mixermuse.com/blog/wp-content/uploads/2014/04/Jitter-and-Drift-Study.pdf
在pdf中向下滚动以查看图表。