How to connect AKSequencer to a AKCallbackInstrument?

最后都变了- 提交于 2020-05-23 06:20:27

问题


I want to read a midi file and display things when note events are triggered. I found this stackoverflow question, where the second answer suggests to use AudioKit : How Do I Get Reliable Timing for my Audio App? More precisely, the suggestion is to use AKSequencer to absorb the midi file in the app, and then to link it to a AKCallbackInstrument to trigger the events and call a function for each midi note event.

I installed AudioKit 4.5.5 using this tutorial https://www.youtube.com/watch?v=iUvWxWvRvo8 Then I managed to run the code of the tutorial, so I know AudioKit is properly included in the project.

Then I wrote my own code :

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()
}

When I try to build my project, there is an error on the line sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)

The error is Value of type 'AKCallbackInstrument' has no member 'midiIn'

I tried to clean the project and re-build but the error is still here.

Can you explain me why do I get this error ? What should I do to solve it ? Because on the AudioKit doc, I found that AKCallbackInstrument is a subclass of AKMIDIInstrument, which does have a property called 'midiIn'. https://audiokit.io/docs/Classes/AKCallbackInstrument.html https://audiokit.io/docs/Classes/AKMIDIInstrument.html


回答1:


True, the class AKCallbackInstrument does not have a property midiIn, although the documentation does show it being used that way. Instead of using AKCallbackInstrument, use AKMIDICallbackInstrument. That class has midiIn, and seems to work fine.




回答2:


typewriter found the solution to my problem. Here is the code which works now, printing the midi number of the note each time it is played (but I didn't add sound yet) :

// 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/how-to-connect-aksequencer-to-a-akcallbackinstrument

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!