如何将AKSequencer连接到AKCallbackInstrument?

Nic*_*eld 6 swift audiokit

我想读取midi文件并在触发音符事件时显示内容.我发现了这个stackoverflow问题,其中第二个答案建议使用AudioKit: 如何为我的音频应用程序获得可靠的时间? 更确切地说,建议是使用AKSequencer吸收应用程序中的midi文件,然后将其链接到AKCallbackInstrument以触发事件并为每个midi音符事件调用函数.

我使用本教程安装了AudioKit 4.5.5 https://www.youtube.com/watch?v=iUvWxWvRvo8 然后我设法运行了教程的代码,所以我知道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()
}
Run Code Online (Sandbox Code Playgroud)

当我尝试构建我的项目时,该行有一个错误 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

Nic*_*eld 5

打字机找到了解决我的问题的方法。这是现在有效的代码,每次播放时打印音符的 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)
    }
}
Run Code Online (Sandbox Code Playgroud)


typ*_*ter 3

确实,类AKCallbackInstrument没有属性midiIn,尽管文档确实显示了它的使用方式。不使用AKCallbackInstrument,而是使用AKMIDICallbackInstrument。该课程有midiIn,并且似乎工作正常。