如何解决在 AudioKit v5 中使用音序器控制振荡器
我正在尝试使用 AudioKit v5 来控制带有音序器的振荡器,但我遇到了障碍。我正在继承 MIDIInstrument
,但我不确定这是否正确。请参阅下面的代码。
我在启动时收到此错误:
AVAEInternal.h:76 要求条件为假: [AVAudioEngine.mm:413:AttachNode: (node != nil)]
之前有一篇关于旧版 AK 版本的帖子,这有点帮助,但其中的示例链接都不起作用: How do I control an oscillator's frequency with a sequencer
你能指出我正确的方向吗?非常感谢!
编辑:小幅进步?我误解了 AudioEngine
函数并且有 2 个实例,所以我删除了一个,从而清除了错误。并添加 track!.setMIDIOutput(instrument.midiIn)
使其现在记录 4 个音符,但仍然没有声音。 MIDIInstrument
似乎接受 MIDIClientRef
,但我在音序器类中看不到对它的引用...
import AudioKit
import CAudioKit
class Test2 {
var instrument: OscMIDIInstrument
var sequencer: AppleSequencer
init() {
instrument = OscMIDIInstrument()
sequencer = AppleSequencer()
sequencer.setGlobalMIDIOutput(instrument.midiIn)
instrument.enableMIDI()
let track = sequencer.newTrack()
track!.setMIDIOutput(instrument.midiIn)
for i in 0 ..< 4 {
track!.add(noteNumber: 60,velocity: 64,position: Duration(seconds: Double(i)),duration: Duration(seconds: 0.5))
}
}
func testButton() {
if sequencer.isPlaying {
sequencer.stop()
} else {
sequencer.rewind()
sequencer.play()
}
}
}
class OscMIDIInstrument: MIDIInstrument {
var akEngine: AudioEngine
var osc: Oscillator
init() {
akEngine = AudioEngine()
osc = Oscillator()
super.init()
akEngine.output = osc
osc.amplitude = 0.1
osc.frequency = 440.0
do {
try akEngine.start()
} catch {
print("Couldn't start AudioEngine.")
}
}
override func receivedMIDINoteOn(noteNumber: MIDINoteNumber,velocity: MIDIVelocity,channel: MIDIChannel,portID: MIDIUniqueID? = nil,offset: MIDITimeStamp = 0) {
osc.play()
}
override func receivedMIDINoteOff(noteNumber: MIDINoteNumber,offset: MIDITimeStamp = 0) {
osc.stop()
}
}
解决方法
有点效果。我发现这个例子指向我 not exists
:
https://github.com/AudioKit/Cookbook/blob/main/Cookbook/Cookbook/Recipes/CallbackInstrument.swift
剩下的问题是你显然不能以这种方式实现 sysex 消息,我猜是因为回调消息被限制为 3 个字节。
因此,如果有人可以提供帮助,我仍在寻找更好的解决方案。
非常感谢!
MIDICallbackInstrument
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。