首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoreMIDI: rock solid midi同步

CoreMIDI: rock solid midi同步
EN

Stack Overflow用户
提问于 2012-03-16 23:08:07
回答 1查看 1.4K关注 0票数 1

我在midi同步方面遇到了问题。在syntheticbits.com中的帖子之后,我使用了PGMidi类。同步工作,但不断转换到1-2 bpm。

下面是我使用的代码:

代码语言:javascript
复制
- (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];
}

请告诉我如何获得清晰的同步。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-15 08:29:03

首先:这条消息是从哪里调用的?你的计时器是多少?你需要确保你使用一个非常精确的计时器。你基本上需要一些比10ms更紧的东西(20ms是MIDI时钟脉冲的周期,每四分之一音符24个脉冲,每分钟120个四分之一音符)。

This guy对iOS / MacOS上提供的同步原语做了相当不错的介绍。

他在这里的最坏情况(包括自旋锁定)在最坏的情况下仍然是50毫秒,在平均情况下是14毫秒。对于MIDI来说,这绝对是一个糟糕的时机。最好的办法是启动一个CoreAudio线程(或使用可用信息here的实时线程)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9739756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档