You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C/C++调用MIDISendEventList()发送MIDI无输出无报错问题求解

问题原因和修复方案

核心错误点

  • MIDIEventListAdd的第二个参数传值错误:该参数要求传入整个MIDIEventList结构体的总缓冲区大小,你当前传入的是单个packet的大小sizeof(MIDIEventList::packet),系统会判定缓冲区容量不足,直接丢弃消息但不会返回显性错误,此处应该替换为sizeof(clockMessageEventList)。
  • UMP格式封装错误:使用UMP API发送MIDI 1.0消息时,不能直接传入原始MIDI字节,需要符合UMP(通用MIDI数据包)的格式规范。你要发送的0xF8是MIDI 1.0系统实时消息,属于32位长度的UMP类型0消息,正确的32位消息值应为0x00F80000:高8位的0x00代表「消息类型为MIDI1.0短消息+MIDI组号为0」,次8位0xF8是原始MIDI状态字节,后16位为填充值0。
  • 可选端口检查:如果你创建outputPortRef时使用的是旧版MIDIOutputPortCreate接口,需要替换为新版的MIDIOutputPortCreateWithProtocol,并显式指定协议为kMIDIProtocol_1_0,旧接口创建的端口不支持MIDISendEventList方法。

修复后可运行代码

// 正确的UMP格式MIDI 1.0时钟消息
const ByteCount umpWordCount = 1;
const UInt32 clockMessage[umpWordCount] = { 0x00F80000 };    
const MIDITimeStamp timeStamp = mach_absolute_time();

MIDIEventList clockMessageEventList = {};
MIDIEventPacket* endPacket = MIDIEventListInit(&clockMessageEventList, kMIDIProtocol_1_0);
// 第二个参数传入整个EventList的大小
endPacket = MIDIEventListAdd(&clockMessageEventList, 
                            sizeof(clockMessageEventList), 
                            endPacket, 
                            timeStamp, 
                            umpWordCount, 
                            clockMessage);
                
for (NSUInteger i = 0; i < endPointRefsCount; ++i) {
    MIDIObjectRef destEndpoint = endPointRefs[i];
    OSStatus sendErr = MIDISendEventList(outputPortRef, destEndpoint, &clockMessageEventList);
    if (sendErr != noErr) {
        printf("MIDISendEventList error: %i", (int)sendErr);
    }
}

内容的提问来源于stack exchange,提问作者adamjansch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:09:04