Как вывести внешний MIDI из AKMusicTrack в AudioKit
Мне интересно, как лучше всего, чтобы AKSequencer (на самом деле AKMusicTrack) выводил MIDI на внешнее устройство.
Я получил его на работу, но я чувствую, что, возможно, есть более эффективный способ.
Как я это сделал:
Я сделал подкласс AKPolyphonicNode ("MyPolyphonicNode")
Я использовал это, чтобы инициировать подкласс AKMIDINode ("MyMIDINode"),
class MyMIDINode:AKMIDINODE {
init(...) {
...
let myPolyphonicNode = MyPolyphonicNode()
super.init(node: myPolyphonicNode, midiOutputName: "myMIDIOutput")
...
}
//etc
}
и установите MIDIoutput вывода AKMusicTrack в середину подкласса AKMIDINode:
track.setMIDIOutput(myMIDINode.midiIn)
Затем в подклассе MyPolyphonicNode я переопределил:
override func play(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, frequency: Double) {
myDelegate.myDelegateFunction(noteNumber:MIDINoteNumber, velocity:MIDIVelocity, channel:myChannel)
}
И в своем делегате:
let midi:AKMIDI //set in the init
enableMIDI(midi.client, name: "midiClient") //also in the init
func myDelegateFunction(noteNumber:MIDINoteNumber, velocity:MIDIVelocity, channel:MIDIChannelNumber) {
midi.sendEvent(AKMIDIEvent(noteOn: noteNumber, velocity: velocity, channel: channel))
}
Это работает, но я думаю, что, возможно, есть способ напрямую указать AKMusicTracks на внешний вывод без выполнения всего этого?
1 ответ
Более простое решение - использовать AKMIDICallbackInstrument
, хотя это та же основная идея. Это легко настроить:
callbackInst = AKMIDICallbackInstrument()
track.setMIDIOutput(callbackInst.midiIn)
Вам необходимо предоставить функцию обратного вызова, которая будет запускать внешний MIDI:
callbackInst.callback = { statusByte, note, velocity in
// NB: in the next AudioKit release, there will be an easier init for AKMIDIStatus:
// let status = AKMIDIStatus(statusByte: statusByte)
let status = AKMIDIStatus(rawValue: Int(statusByte >> 4))
switch status {
case .noteOn:
midi.sendNoteOnMessage(noteNumber: note, velocity: velocity)
case .noteOff:
midi.sendNoteOffMessage(noteNumber: note, velocity: velocity)
default:
// etc.
}
Эта функция будет вызываться всякий раз, когда события на AKMusicTrack
играются