在使用MIDICallbackInstrument时,需要注意当该 Instrument 与 Sequence 结合使用时,需要重载 SequencerDelegate 中的相关函数,以确保回调函数得以被正确触发。以下是解决方法的代码示例:
class ViewController: UIViewController, AKMIDIListener, AKKeyboardDelegate, SequencerDelegate {
var sequence = AKSequencer()
var callbackInst = MIDICallbackInstrument()
override func viewDidLoad() {
super.viewDidLoad()
// 创建一个 Sequence 并添加一些 MusicTrack
// ...
// 将 MIDICallbackInstrument 添加到 Sequence 中的某个 Track 上
// ...
// 设置 MIDICallbackInstrument 的回调函数
self.callbackInst.callback = { status, noteNumber, velocity in
print("MIDI Callback Instrument Triggered!")
}
// 将 SequencerDelegate 设置为 ViewController 本身
self.sequence.setGlobalMIDIOutput(callbackInst.midiIn)
self.sequence.setTempo(120.0)
self.sequence.prepareClickTrack()
self.sequence.enableLooping()
// 注册 SequencerDelegate 的回调函数
self.sequence.delegate = self
}
// 重载 SequencerDelegate 中的相关函数,并确保回调函数得以被正确触发
func sequencer(_ sequencer: AKSequencer, didStartPlaying track: AKMusicTrack) {
self.callbackInst.enableMIDIInput()
}
func sequencer(_ sequencer: AKSequencer, didStopPlaying track: AKMusicTrack) {
self.callbackInst.disableMIDIInput()
}
func sequencer(_ sequencer: AKSequencer, didChangeTempo bpm: Double) {
// do nothing
}
}
在以上的代码示例中,我们创建了一个 ViewController,将 MIDICallbackInstrument 添加到 Sequence 中的某个 MusicTrack 上,并设置了其回调函数。接着,我们重载了 SequencerDelegate 中的相关函数,并通过设置 delegate,确保回调函数得以被正确触发。