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

iOS 16.0.2中MusicSequenceFileCreate生成的MIDI含额外SysEx,如何禁用?

解决iOS 16+中MusicSequenceFileCreate自动添加专属SysEx的问题

iOS 16及以后版本的MusicSequenceFileCreate会自动在生成的MIDI文件开头(时间0位置)插入一条Apple专属的SysEx消息,用于存储GarageBand相关的序列元数据,但这条消息会导致多数第三方MIDI应用无法正常读取文件。目前苹果没有提供公开API直接禁用该行为,你可以通过以下两种方式解决:

方法一:生成后手动移除SysEx消息

生成MIDI文件后,读取文件数据并定位删除这条特定的SysEx序列:

  1. 读取生成的MIDI文件为Data对象
  2. 定位目标SysEx的字节序列:0xF0 0x2A 0x11 0x67 0x40 0x40 0x00 ... 0xF7(完整序列如你提供的内容)
  3. 从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:34