【问题标题】:How to output external MIDI from an AKMusicTrack in AudioKit如何从 AudioKit 中的 AKMusicTrack 输出外部 MIDI
【发布时间】:2018-12-07 08:58:49
【问题描述】:

我想知道最好的方法是让 AKSequencer(实际上是 AKMusicTrack)将它的 MIDI 输出到外部设备。

我已经让它工作了,但我觉得可能有更有效的方法。

我的做法:

我已经创建了 AKPolyphonicNode ("MyPolyphonicNode") 的子类

我用它来初始化 AKMIDINode ("MyMIDINode") 的子类,

class MyMIDINode:AKMIDINODE {

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

//etc

}

并将 AKMusicTrack 的输出设置为 AKMIDINode 子类的 midiIn:

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 在外部输出而不执行所有这些操作?

【问题讨论】:

    标签: swift audiokit aksequencer


    【解决方案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 上的事件时,都会调用此函数

    【讨论】:

    • 太棒了。似乎可以工作,并且至少更简单一点:) 唯一的是,我确实从您的代码中得到了一个错误,以下似乎是它想要的:let status = AKMIDIStatus(rawValue: statusByte.rawValue)跨度>
    • 嗯。这似乎只适用于 Note on's 和 note off,而不适用于 midi 控制器。根据 AKMIDIListener 协议,我尝试扩展 AKCallbackInstrument 以包含 receivedMIDIController 函数,但这似乎不是正确的做法......
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多