我在 MIDI 同步方面遇到了问题。按照 syntheticbits.com 中的帖子,我使用了 PGMidi 类。 同步有效,但不断转变为 1-2 bpm。
这是我使用的代码:
- (void)sendMidiClockInMidiThread {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[lock lock];
const int64_t kOneMillion = 1000 * 1000;
const UInt8 tick[] = { 0xF8 };
// Calculate tick time
// returns sample for sixteen note (5512 if current bpm is 120)
SInt32 sixteen = AGGetSamples_SixteensWithoutSwing(_grid, 1.0);
UInt64 tickTime = (sixteen / 6) * kOneMillion;
int tickLatency = 0;
// Send ticks messages
for (int i = 0; i < 6; ++i) {
int beginTime = clock();
hostTime = hostTime + (tickTime - tickLatency);
[self.midi sendBytes:tick size:sizeof(tick) atTime:hostTime];
int endTime = clock();
tickLatency = endTime - beginTime;
}
[lock unlock];
[pool drain];
}
请告诉我如何获得清晰的同步。
最佳答案
首先:这条消息是从哪里调用的?你的计时器是什么?您需要确保使用非常准确的计时器。您基本上需要小于 10 毫秒的时间(20 毫秒是 MIDI 时钟脉冲的周期,每四分音符 24 个脉冲,每分钟 120 个四分音符)。
This guy写了一篇关于 iOS/MacOS 上可用的同步原语的相当不错的文章。
他在这里的最坏情况(涉及自旋锁定)在最坏情况下仍然关闭了近 50 毫秒,在平均情况下关闭了 14 毫秒。这对 MIDI 来说绝对是糟糕的时机。最好的办法是启动 CoreAudio 线程(或使用可用信息的实时线程 here )。
关于objective-c - CoreMIDI:坚如磐石的 MIDI 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9739756/