我正在尝试编写一个程序来移动midi文件的键。基本上,我只需要将每个音符事件移动给定的数量,其余部分保持不变。我发现使用 MIKMIDI 读取、解析、修改和写回流很容易。
不幸的是,我有一个无法解决的问题。我有一个循环,我在其中选择音符事件并添加/减去所需的移位值,但是当我在输出轨道中附加事件时,我从 MIKMIDI 库中收到一条消息:
"Warning: attempted to insert a NULL event".
我写的代码如下:
for event in inputTrack.events {
if event.eventType == .midiNoteMessage {
var tmpData = event.data
if (event.data[0] != 9) { // skip percussion channel
tmpData[1] = event.data[1] - shift
}
let outEvent = MIKMIDIEvent(timeStamp: event.timeStamp, midiEventType: .midiNoteMessage, data: tmpData)!
outputSeq.tracks[i].events.append(outEvent)
}
else {
outSeq.tracks[i].events.append(event)
}
}
顺便说一句,代码运行良好(midi 文件按预期播放),只是由于调试屏幕上打印了无限序列的警告消息,在调试模式下执行需要几分钟。谢谢!