我想读取一个midi文件,并在触发便笺事件时显示内容。我发现了一个堆栈溢出问题,第二个答案建议使用AudioKit:How Do I Get Reliable Timing for my Audio App?更准确地说,建议使用AKSequencer吸收应用程序中的midi文件,然后将其链接到AKCallbackInstrument以触发事件,并为每个midi便笺事件调用一个函数。
我使用本教程安装了AudioKit 4.5.5,然后我成功地运行了教程的代码,因此我知道项目中正确地包含了AudioKit。
然后我写了自己的代码:
let sequencer = AKSequencer(filename: "myMidiFile.mid")
let callbackInstr = AKCallbackInstrument()
callbackInstr.callback = myCallBack
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
func myCallBack(a:UInt8, b:MIDINoteNumber, c:MIDIVelocity){
print(b)
}
func test() {
do {
try AudioKit.start()
}
catch {
print("Oops! AudioKit didn't start!")
}
sequencer.play()
}当我试图构建我的项目时,sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)行上出现了一个错误
错误是Value of type 'AKCallbackInstrument' has no member 'midiIn'
我试图清理项目和重新构建,但错误仍然存在。
你能解释一下为什么我会犯这个错误吗?我该怎么办才能解决这个问题?因为在AudioKit文档中,我发现AKCallbackInstrument是AKMIDIInstrument的一个子类,它有一个名为“midiIn”的属性。https://audiokit.io/docs/Classes/AKCallbackInstrument.html https://audiokit.io/docs/Classes/AKMIDIInstrument.html
发布于 2019-01-23 05:39:39
的确,类AKCallbackInstrument没有属性midiIn,尽管文档确实显示它是以这种方式使用的。不要使用AKCallbackInstrument,,而是使用AKMIDICallbackInstrument.这个类有midiIn,并且似乎工作得很好。
发布于 2019-01-25 13:54:09
打字机找到了解决我问题的办法。下面是现在起作用的代码,每次播放时打印音符的midi号(但我还没有添加声音):
// dont write the .mid extension in filename :
let sequencer = AKSequencer(filename:"coucou")
let callbackInstr = AKMIDICallbackInstrument()
callbackInstr.callback = myCallBack
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
sequencer.play()
func myCallBack(a:UInt8, b:MIDINoteNumber, c:MIDIVelocity) -> () {
if (a == 144) { // if noteOn
print(b)
}
}https://stackoverflow.com/questions/54171051
复制相似问题