C/ c++中使用MIDISendEventList()发送MIDI



我一直在努力将一个旧的Core MIDI发送实现迁移到使用Apple新的感知udp的MIDI事件列表API方法发送MIDI 1.0消息。

我已经找出了运行和应该输出MIDI时钟消息的代码,但是当我用MIDISendEventList(...)发送它时,我看到没有从我的MIDI接口输出;该方法也没有返回错误来指示问题所在。

下面是我使用的代码:
const ByteCount clockMessageSize = 1;
const UInt32 clockMessage[clockMessageSize] = { (UInt32)0xF8 };    // MIDI clock tick 
const MIDITimeStamp timeStamp = mach_absolute_time();
MIDIEventList clockMessageEventList = {};
MIDIEventPacket* clockMessageEventListEndPacket = nullptr;
clockMessageEventListEndPacket = MIDIEventListInit(&clockMessageEventList, kMIDIProtocol_1_0);
clockMessageEventListEndPacket = MIDIEventListAdd(&clockMessageEventList, sizeof(MIDIEventList::packet), clockMessageEventListEndPacket, timeStamp, clockMessageSize, clockMessage);

for (NSUInteger endpointRefIndex = 0; endpointRefIndex < endPointRefsCount; ++endpointRefIndex) {
MIDIObjectRef destinationEndpoint = endPointRefs[endpointRefIndex];
OSStatus midiSendError = MIDISendEventList(outputPortRef, destinationEndpoint, &clockMessageEventList);

if (midiSendError != noErr) {
printf("MIDISendEventList error: %i", (int)midiSendError);
}
}

clockMessageEventList.packet配置完成后发送前检查显示:

(248, 0, 0, [... all zeros to index 63]) 

有谁知道我哪里错了吗?

在https://stackoverflow.com/a/74248460/8653957提供的额外指导下,我设法破解了这个问题。

由于某种原因,为MIDI时钟消息创建的单词需要稍微不同的格式,第一个字节是0x10,第二个字节是MIDI时钟消息:

const ByteCount clockMessageSize = 1;
const UInt32 clockMessage[clockMessageSize] = { 0x10000000 | ((UInt32)message << 16) };
const MIDITimeStamp timeStamp = mach_absolute_time();
MIDIEventList clockMessageEventList = {};
MIDIEventPacket* clockMessageEventListEndPacket = nullptr;
clockMessageEventListEndPacket = MIDIEventListInit(&clockMessageEventList, kMIDIProtocol_1_0);
clockMessageEventListEndPacket = MIDIEventListAdd(&clockMessageEventList, sizeof(MIDIEventList::packet), clockMessageEventListEndPacket, timeStamp, clockMessageSize, clockMessage);

如果有人知道这是为什么,请发帖!现在,MIDI时钟通过mideventlist。

最新更新