gpt4 book ai didi

swift - 如何从 AudioKit 中的 AKMusicTrack 输出外部 MIDI

转载 作者:可可西里 更新时间:2023-11-01 01:55:31 25 4
gpt4 key购买 nike

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

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

我的做法:

我创建了 AKPolyphonicNode 的子类(“MyPolyphonicNode”)

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

class MyMIDINode:AKMIDINODE {

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

//etc

}

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

track.setMIDIOutput(myMIDINode.midiIn) 

然后在 MyPolyphonicNode 子类中,我覆盖了:

override func play(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, frequency: Double) {
myDelegate.myDelegateFunction(noteNumber:MIDINoteNumber, velocity:MIDIVelocity, channel:myChannel)
}

在它的委托(delegate)中:

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 直接向外部输出,而无需执行所有这些操作?

最佳答案

一个更简单的解决方案是使用 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 上的事件时都会调用此函数

关于swift - 如何从 AudioKit 中的 AKMusicTrack 输出外部 MIDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53666209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com