Как вывести внешний MIDI из AKMusicTrack в AudioKit - PullRequest
0 голосов
/ 07 декабря 2018

Мне интересно, как лучше всего иметь AKSequencer (на самом деле AKMusicTrack), выводить его MIDI на внешнее устройство.

Я получил его на работу, но я чувствую, что, вероятно, естьболее эффективный способ.

Способ, которым я это сделал:

Я создал подкласс AKPolyphonicNode ("MyPolyphonicNode")

Я использовал это для инициацииподкласс AKMIDINode ("MyMIDINode"),

class MyMIDINode:AKMIDINODE {

init(...) {
        ...
        let myPolyphonicNode = MyPolyphonicNode()
        super.init(node: myPolyphonicNode, midiOutputName: "myMIDIOutput")
        ...
        }

//etc

}

и setMIDIoutput вывода AKMusicTrack в midiIn подкласса AKMIDINode:

track.setMIDIOutput(myMIDINode.midiIn) 

Затем в подклассе MyPolyphonicNode, IПереопределено:

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 Ответ

0 голосов
/ 07 декабря 2018

Более простое решение - использовать 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играются

...