1

我正在尝试将操作生成的声音组合到一个乐器中,我知道可以将操作用作彼此的参数 - 但如果可能的话,我试图在同一乐器中同时触发两个(或更多) - 所以我试着用搅拌机来做。这是我的仪器代码:

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() 方法

4

0 回答 0