I'm trying to get a callback when a midi note is triggered so I can display a graphical representation of the current beat in the bar. Nothing I do seems to callback. This is the simplest version of the code that I have tried - audio plays back fine but the callback is never triggered. I have enabled Audio in Background Modes.
Here is the code:
class ViewMain: UIViewController {
let engine = AudioEngine()
let kicks = Sampler()
let claps = Sampler()
let sequencer = Sequencer()
let mixer = Mixer()
let midiCallbackInstrument = MIDICallbackInstrument()
override func viewDidLoad() {
super.viewDidLoad()
midiCallbackInstrument.callback = myCallBack
mixer.addInput(midiCallbackInstrument)
mixer.addInput(kicks)
mixer.addInput(claps)
engine.output = mixer
do {
try engine.start()
} catch {
Log("AudioKit did not start! \(error)")
}
kicks.unloadAllSamples()
claps.unloadAllSamples()
guard let url = Bundle.main.resourceURL?.appendingPathComponent("SamplesSFZ/sfz/909A.sfz") else { return }
kicks.loadSFZ(url: url)
guard let url = Bundle.main.resourceURL?.appendingPathComponent("SamplesSFZ/sfz/909B.sfz") else { return }
claps.loadSFZ(url: url)
sequencer.addTrack(for: midiCallbackInstrument)
sequencer.tracks[0].add(noteNumber: 36, velocity: 120, channel: 0, position: 0.0, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 37, velocity: 120, channel: 1, position: 0.5, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 38, velocity: 120, channel: 2, position: 1.0, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 39, velocity: 120, channel: 3, position: 0.5, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 40, velocity: 120, channel: 4, position: 2.0, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 41, velocity: 120, channel: 5, position: 0.5, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 42, velocity: 120, channel: 6, position: 3.0, duration: 1.0)
sequencer.tracks[0].add(noteNumber: 43, velocity: 120, channel: 7, position: 0.5, duration: 1.0)
sequencer.addTrack(for: kicks)
sequencer.tracks[1].add(noteNumber: 24, velocity: 120, channel: 0, position: 0.0, duration: 2.0)
sequencer.addTrack(for: claps)
sequencer.tracks[2].add(noteNumber: 25, velocity: 120, channel: 0, position: 1.0, duration: 0.1)
sequencer.tracks[2].add(noteNumber: 25, velocity: 120, channel: 0, position: 3.0, duration: 0.1)
sequencer.loopEnabled = true
sequencer.tempo = 120.0
sequencer.length = 4.0
sequencer.play()
}
func myCallBack(a: UInt8, b:MIDINoteNumber, c:MIDIVelocity) -> () {
// THIS IS NEVER CALLED
print("*** callback invoked")
}
}
Thanks in advance - I really appreciate any help here.