我正在尝试将操作生成的声音组合到一个乐器中,我知道可以将操作用作彼此的参数 - 但如果可能的话,我试图在同一乐器中同时触发两个(或更多) - 所以我试着用搅拌机来做。这是我的仪器代码:
public class LayeredInstrument: MIDIInstrument {
var opGenOne = OperationGenerator {
let volSlideCurve = Operation.exponentialSegment(trigger: Operation.trigger, start: 1, end: 0, duration: 0.09)
return Operation.sawtooth(frequency: 880, amplitude: volSlideCurve)
}
var opGenTwo = OperationGenerator {
let volSlideCurve = Operation.exponentialSegment(trigger: Operation.trigger, start: 1, end: 0, duration: 0.09)
return Operation.square(frequency: 220, amplitude: volSlideCurve)
}
var mixer = Mixer()
public init(){
super.init()
opGenOne.start()
opGenTwo.start()
mixer.start()
mixer.addInput(Node(avAudioNode: opGenOne.avAudioNode))
mixer.addInput(Node(avAudioNode: opGenTwo.avAudioNode))
avAudioUnit = mixer.avAudioUnit
avAudioNode = mixer.avAudioNode
}
public override func play(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
opGenOne.trigger()
opGenTwo.trigger()
}
public func stop(){}
}
我有两个问题,1:为什么我可以使用这两个操作中的任何一个的 avAudioUnit 和 avAudioNode 并将其用于语音但我不能使用混音器(它在 play() 时静音),是否有如何让它工作并听到两种声音?
2:关于操作触发本身的问题,操作中播放的音符是否需要停止?如果是这样,最好的方法是什么?可能在持续时间结束时有一些事件,或者有一个监控所有播放音符的类?只是到目前为止我看到的例子有空的 stop() 方法