objective-c - CoreMIDI:坚如磐石的 MIDI 同步

标签 objective-c c coremidi

我在 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/

相关文章:

iphone - 如何在 iPhone 中安全地存储 SQLite 数据库..?

swift - 如何保持 AVMIDIPlayer 播放?

ios - 使用 MusicTrackNewMIDINoteEvent 在播放时添加音符

ios - 发送应用程序崩溃日志/常规应用程序日志

objective-c - IBOutlet 为零的原因

ios - 如何在 Objective C 中显示另一个之前关闭一个呈现的 UIAlertController

对 htonl 输出感到困惑

c - 将参数传递给 bind() 函数

c# - C 中 char 存储为 int 数组?如何将其转换为 C#

ios - 在 MusicSequence 中显示当前节拍位置(coreMIDI/Swift)