首页 > 解决方案 > 在 AudioKit v5 中向 PWMOscillator 添加 LowPassFilter

问题描述

我正在玩 AKv5,我试图在 PWMOscillator 之后添加一个 LowPassFilter,使用食谱中的 PWMOscillator 配方作为基础。

[PWMOscillator] -> [LowPassFilter] -> Out

看起来应该很简单,我已将下面的代码添加到基本的 PWMOscillator Cookbook 食谱中。但是 LowPassFilters 似乎没有任何效果,就像它被绕过一样。

我已将此与食谱中的 LowPassFilter 配方进行了比较,与该示例相比,我似乎没有遗漏任何东西。

所以我希望人们知道为什么我听不到 LowPassFilter 做任何事情?

我错过了一些非常明显的东西吗?

提前致谢。

struct PWMOscillatorData {
    var isPlaying: Bool = false
    /// Pulse Width ranges from 0.001 to .5 (Default: .5)
    var pulseWidth: AUValue = 0.5
    /// Frequency (Hz) ranges from 10 to 22050 (Default: 6900)
    var frequency: AUValue = 440
    /// Amplitude ranges from 0 to 1
    var amplitude: AUValue = 0.1
    /// Ramp Duration ranges from 0 to ? Seconds
    var rampDuration: AUValue = 1
    /// Cutoff Frequency (Hz) ranges from 10 to 22050 (Default: 6900)
    var cutoff: AUValue = 20
    /// Resonance (dB) ranges from -20 to 40 (Default: 0)
    var resonance: AUValue = 0
}

class PWMOscillatorConductor: ObservableObject, KeyboardDelegate {
...
    let engine = AudioEngine()

    var osc: PWMOscillator
    var lpFilter: LowPassFilter
...
    @Published var data = PWMOscillatorData() {
        didSet {
            if data.isPlaying {
                osc.start()
                osc.$pulseWidth.ramp(to: data.pulseWidth, duration: data.rampDuration)
                osc.$frequency.ramp(to: data.frequency, duration: data.rampDuration)
                osc.$amplitude.ramp(to: data.amplitude, duration: 0.01)
            } else {
                osc.amplitude = 0.0
            }
            lpFilter.$cutoffFrequency.ramp(to: data.cutoff, duration: 0.01)
            lpFilter.$resonance.ramp(to: data.resonance, duration: 0.01)
        }
    }
...
    init() {
        osc = PWMOscillator()
        lpFilter = LowPassFilter(osc)
        engine.output = lpFilter
    }
...
    ParameterSlider(text: "Cutoff",
                    parameter: self.$pwmConductor.data.cutoff,
                    range: 10...11500).padding(5)
    ParameterSlider(text: "Resonance",
                    parameter: self.$pwmConductor.data.resonance,
                    range: -20...40 ).padding(5)

测试

标签: audiokit

解决方案


似乎 LowPassFilter 对绑定变量不太满意。

我不得不改变 var = data 。

@Published var data = PWMOscillatorData() {
    didSet {
        if data.isPlaying {
            osc.start()
            osc.$pulseWidth.ramp(to: data.pulseWidth, duration: data.rampDuration)
            osc.$frequency.ramp(to: data.frequency, duration: data.rampDuration)
            osc.$amplitude.ramp(to: data.amplitude, duration: 0.01)
        } else {
            osc.amplitude = 0.0
        }
        lpFilter.cutoffFrequency = data.cutoff
        lpFilter.resonance = data.resonance
    }
}

推荐阅读