【问题标题】:OSX Core MIDI- Calling MIDIPacketListAdd from NSTimerOSX Core MIDI- 从 NSTimer 调用 MIDIPacketListAdd
【发布时间】:2011-12-01 20:59:57
【问题描述】:

我正在使用 MIDIPacketListAdd 发送一串 MIDI 数据包。我想在播放期间动态更改数据包,所以我使用 NSTimer 在数据包应该发出的预定时间之前添加每个数据包。

代码运行完美,当前数据包的地址更新正确,我已经验证所有数据都是正确的。但是,当从计时器调用 MIDIPacketListAdd 时,不会发送任何 MIDI 数据。我在启动计时器之前添加了前两个数据包,以确保数据包在需要播放之前发送到 MIDIPacketListAdd。

我很困惑。有什么建议吗?

谢谢,汤姆·杰弗里斯

【问题讨论】:

    标签: macos nstimer core-audio midi coremidi


    【解决方案1】:

    您的描述也正是我发送 MIDI 数据的方式,而且效果很好。也许你可以发布你的源代码,没有它就很难猜出哪里出了问题。

    另外,为了测试,尝试将时间戳设置为零,以确保您能够发送 MIDI,之后您可以将时间戳放回以单独调试它们。

    代替源代码,这是一个发送 MIDI 的简单方法,我确实从 NSTimer 调用它,它基于一些 Apple 示例并且它有效。注意 'outputPort' 是您在尝试将 MIDI 与您的客户端 ref 一起发送之前应该在某处创建的东西(我假设您已经这样做了)

    OSStatus s;
    MIDIClientRef client;
    MIDIPortRef outputPort;
    s = MIDIClientCreate((CFStringRef)@"My Test MIDI Client", MyMIDINotifyProc, self, &client);
    s = MIDIOutputPortCreate(client, (CFStringRef)@"My Test MIDI Output Port", &outputPort);
    

    一旦你有了这些,你就可以发送 MIDI

    - (void) MySendMidi:(const UInt8*)data size:(UInt32)bsize
    {
        NSLog(@"%s(%u bytes to core MIDI)", __func__, unsigned(bsize));
        assert(bsize < 65536);
    
        Byte packetBuffer[bsize+100];
        MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
        MIDIPacket     *packet     = MIDIPacketListInit(packetList);
    
        packet = MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, bsize, data);
    
        // Send it to every destination in the system...
        for (ItemCount index = 0; index < MIDIGetNumberOfDestinations(); ++index)
        {
            MIDIEndpointRef outputEndpoint = MIDIGetDestination(index);
            if (outputEndpoint)
            {
                // Send it
                OSStatus s = MIDISend(outputPort, outputEndpoint, packetList);
            }
        }
    }
    

    【讨论】:

    • 谢谢——我终于发现 MIDIPacketListAdd 实际上并没有发送数据,它只是将它添加到数据包列表中。一旦我添加了一个 MIDISend,它就一切正常了。很遗憾,Apple 没有选择记录 CoreMIDI。
    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多