iOS 16.0.2中MusicSequenceFileCreate生成的MIDI含额外SysEx,如何禁用?
解决iOS 16+中MusicSequenceFileCreate自动添加专属SysEx的问题
iOS 16及以后版本的MusicSequenceFileCreate会自动在生成的MIDI文件开头(时间0位置)插入一条Apple专属的SysEx消息,用于存储GarageBand相关的序列元数据,但这条消息会导致多数第三方MIDI应用无法正常读取文件。目前苹果没有提供公开API直接禁用该行为,你可以通过以下两种方式解决:
方法一:生成后手动移除SysEx消息
生成MIDI文件后,读取文件数据并定位删除这条特定的SysEx序列:
- 读取生成的MIDI文件为
Data对象 - 定位目标SysEx的字节序列:
0xF0 0x2A 0x11 0x67 0x40 0x40 0x00 ... 0xF7(完整序列如你提供的内容) - 从Data中移除这段字节,再将修改后的Data写入新的MIDI文件
示例代码片段(Swift)
func removeAppleSysEx(from midiData: Data) -> Data? { let targetSysEx: [UInt8] = [0xF0, 0x2A, 0x11, 0x67, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7] guard let range = midiData.range(of: Data(targetSysEx)) else { return midiData } var modifiedData = midiData modifiedData.removeSubrange(range) return modifiedData } // 使用示例 if let originalData = try? Data(contentsOf: originalMidiURL), let cleanedData = removeAppleSysEx(from: originalData) { try? cleanedData.write(to: cleanedMidiURL) }
方法二:绕过MusicSequenceFileCreate,手动构建MIDI文件
如果手动移除的方式不够高效,你可以直接基于MusicSequence的事件数据,手动构建符合标准MIDI格式的文件,完全控制输出内容,避免系统插入额外消息。这种方式需要你处理MIDI文件的头块、轨道块等结构,但能彻底解决兼容性问题。
内容的提问来源于stack exchange,提问作者caminante errante
相关产品推荐
相关产品推荐

