Handling AudioBus MIDI Input & State Saving
December 11, 2017 ยท View on GitHub
// ********************************************************** // MARK: - AudioBus MIDI Input // **********************************************************
extension ParentViewController {
func setupAudioBusInput() {
midiInput = ABMIDIReceiverPort(name: "FM Player MIDI In", title: "FM Player MIDI In") { (port, midiPacketListPointer) in
let events = AKMIDIEvent.midiEventsFrom(packetListPointer: midiPacketListPointer)
for event in events {
guard event.channel == self.midiChannelIn || self.omniMode else { return }
if event.status == AKMIDIStatus.noteOn {
if event.internalData[2] == 0 {
self.conductor.stopNote(note: event.noteNumber!, channel: event.channel!)
} else {
self.conductor.playNote(note: event.noteNumber!, velocity: event.internalData[2], channel: event.channel!)
}
}
if event.status == AKMIDIStatus.noteOff {
guard event.channel == self.midiChannelIn || self.omniMode else { return }
self.conductor.stopNote(note: event.noteNumber!, channel: event.channel!)
}
if event.status == AKMIDIStatus.pitchWheel {
guard event.channel == self.midiChannelIn || self.omniMode else { return }
let x = MIDIWord(event.internalData[1])
let y = MIDIWord(event.internalData[2]) << 7
self.receivedMIDIPitchWheel(y+x, channel: event.channel!)
}
if event.status == AKMIDIStatus.programChange {
guard event.channel == self.midiChannelIn || self.omniMode else { return }
self.receivedMIDIProgramChange(event.data1, channel: event.channel!)
}
if event.status == AKMIDIStatus.controllerChange {
guard event.channel == self.midiChannelIn || self.omniMode else { return }
self.receivedMIDIController(event.data1, value: event.data2, channel: event.channel!)
}
}
}
Audiobus.client?.controller.addMIDIReceiverPort(midiInput)
Audiobus.client?.controller.stateIODelegate = self
}
}