Ios Swift AudioKit:如何建立一个VCO who';s音高由AR包络线控制?

Ios Swift AudioKit:如何建立一个VCO who';s音高由AR包络线控制?,ios,swift,audiokit,akoperationgenerator,Ios,Swift,Audiokit,Akoperationgenerator,我对AudioKit不熟悉。我想建立一个VCO谁的音高是由一个可重新触发的a(H)R信封(可调衰减)控制,我正在寻找最好的或最常见的方法来做到这一点 经过一些研究()我觉得我必须使用AKOperationGenerator和AKOperation 最好的例子是从操场上看到的 我试过: enum PitchEnvVCOSynthParameter: Int { case frequency, decayTime, gate } struct PitchEnvVCO { stati

我对AudioKit不熟悉。我想建立一个VCO谁的音高是由一个可重新触发的a(H)R信封(可调衰减)控制,我正在寻找最好的或最常见的方法来做到这一点

经过一些研究()我觉得我必须使用AKOperationGenerator和AKOperation

最好的例子是从操场上看到的

我试过:

enum PitchEnvVCOSynthParameter: Int {
    case frequency, decayTime, gate
}

struct PitchEnvVCO {
    static var frequency: AKOperation {
        return AKOperation.parameters[PitchEnvVCOSynthParameter.frequency.rawValue]
    }
    static var decayTime: AKOperation {
        return AKOperation.parameters[PitchEnvVCOSynthParameter.decayTime.rawValue]
    }
    static var gate: AKOperation {
        return AKOperation.parameters[PitchEnvVCOSynthParameter.gate.rawValue]
    }
}

extension AKOperationGenerator {
    var frequency: Double {
        get { return self.parameters[PitchEnvVCOSynthParameter.frequency.rawValue] }
        set(newValue) { self.parameters[PitchEnvVCOSynthParameter.frequency.rawValue] = newValue }
    }
    var decayTime: Double {
        get { return self.parameters[PitchEnvVCOSynthParameter.decayTime.rawValue] }
        set(newValue) { self.parameters[PitchEnvVCOSynthParameter.decayTime.rawValue] = newValue }
    }
    var gate: Double {
        get { return self.parameters[PitchEnvVCOSynthParameter.gate.rawValue] }
        set(newValue) { self.parameters[PitchEnvVCOSynthParameter.gate.rawValue] = newValue }
    }
}

我通过音序器轨道触发发生器,触发一个calback

let seqPositioncallbackTrack = sequencer.newTrack()
seqPositioncallbackTrack?.setMIDIOutput(sequencerCallbackInst.midiIn)
sequencerCallbackInst.callback = { status, noteNumber, velocity in
    self.onSequencerStepChange(status: status, noteNumber: noteNumber, velocity: velocity)
}
//...for i in 0 ..< numberOfSteps...etc.
seqPositioncallbackTrack?.add(noteNumber: MIDINoteNumber(i), 
    velocity: 100, 
    position: AKDuration(beats: Double(i)), 
    duration: AKDuration(beats: 0.5)
)
让seqPositioncallbackTrack=sequencer.newTrack()
seqPositioncallbackTrack?.setMIDIOutput(sequencerCallbackInst.midiIn)
sequencerCallbackInst.callback={状态、noteNumber、速度单位
self.onSequencerStepChange(状态:状态,注释编号:注释编号,速度:速度)
}
//…对于0中的i…

这很好用。但我只是听到一种无休止的音调(频率正确)。只有第一个触发器会在沥青中膨胀。其他触发器不会重新触发信封。怎么会-我做错了什么?THNX

似乎我需要找到正确的闸门开启时间长度(注意定序器步长持续时间的长度),并发送闸门关闭事件以将闸门设置为零

...duration: AKDuration(seconds: 0.03)


private func onSequencerStepChange(status: AKMIDIStatus, noteNumber: MIDINoteNumber, velocity: MIDIVelocity) {

    if status == .noteOn {
        core.triggerGateOn(seq1Values[Int(noteNumber)])
    }
    else if status == .noteOff {
        core.triggerGateOff()
    }
    else { return }

}
...
// splitting func triggerGate(_ freq: Double) into on/off:
func triggerGateOn(_ freq: Double) {
    generator.parameters[PitchEnvVCOSynthParameter.gate.rawValue] = 1
}

func triggerGateOff() {
    generator.parameters[PitchEnvVCOSynthParameter.gate.rawValue] = 0
}
当持续时间太短时,它似乎也不起作用,这意味着<0.03-那么我猜闸门打开比攻击时间结束时更快设置为关闭。 还有,我不得不用释放时间来模拟衰减时间

let generator = AKOperationGenerator { parameters in

    let oscillator = AKOperation.squareWave(
        frequency: PitchEnvVCO.frequency.triggeredWithEnvelope(
            trigger: PitchEnvVCO.gate,
            attack: 0.01,
            hold: 0.0,
            release: PitchEnvVCO.freqDecayTime
        ),
        amplitude: PitchEnvVCO.amplitude.triggeredWithEnvelope(
            trigger: PitchEnvVCO.gate,
            attack: 0.01,
            hold: 0.0,
            release: PitchEnvVCO.ampDecayTime
        )
    )
    return oscillator
}

编辑:确定-我发布的正确答案

似乎需要在生成器中添加另一个参数:振幅:PitchNVVCO.Amplication.triggeredWithEnvelope()很不幸,这并没有解决主要的问题:我怎样才能用一个可反转的封套来制作vco呢?我在这里又做了一次尝试:我找到的正确答案是
let generator = AKOperationGenerator { parameters in

    let oscillator = AKOperation.squareWave(
        frequency: PitchEnvVCO.frequency.triggeredWithEnvelope(
            trigger: PitchEnvVCO.gate,
            attack: 0.01,
            hold: 0.0,
            release: PitchEnvVCO.freqDecayTime
        ),
        amplitude: PitchEnvVCO.amplitude.triggeredWithEnvelope(
            trigger: PitchEnvVCO.gate,
            attack: 0.01,
            hold: 0.0,
            release: PitchEnvVCO.ampDecayTime
        )
    )
    return oscillator
}