You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AudioKit Oscillator中禁用滑音(Portamento)功能

解决AudioKit Oscillator切换音符的滑音问题

问题原因

AudioKit的Oscillator组件默认会对frequency参数应用平滑过渡(ramp),目的是避免参数突变产生爆音,但这会导致切换音符时出现类似滑音的效果。

解决方案

要让频率立即跳变,只需将频率参数的平滑过渡时长设为0,有两种实现方式:

方式一:初始化时设置全局默认ramp时长

在创建Oscillator后,直接修改其frequency参数的rampDuration为0,后续所有频率变更都会立即生效:

class AudioManager: ObservableObject {
    let engine = AudioEngine()
    let osc: Oscillator
    var env: AmplitudeEnvelope

    init() {
        osc = Oscillator(waveform: Table(.sine))
        // 禁用频率的平滑过渡
        osc.$frequency.rampDuration = 0
        env = AmplitudeEnvelope(
            osc,
            attackDuration: 0.01,
            decayDuration: 0.1,
            sustainLevel: 0.0,
            releaseDuration: 0.05
        )
        engine.output = env
        try? engine.start()
        osc.start()
    }
    
    func play(freq: AUValue) {
        osc.frequency = freq
        env.openGate()
    }
    func stop() {
        env.closeGate()
    }
}

方式二:单次设置频率时指定无过渡

使用Oscillator的setFrequency(_:rampDuration:)方法,每次设置频率时传入0作为过渡时长,适合需要灵活切换平滑/非平滑模式的场景:

func play(freq: AUValue) {
    // 立即切换到目标频率,无任何过渡
    osc.setFrequency(freq, rampDuration: 0)
    env.openGate()
}

注意事项

  • 禁用频率平滑后,极端情况下可能出现轻微爆音,但你已配置的AmplitudeEnvelope(attack时长0.01)会通过淡入效果抵消这个问题,不会影响听觉体验。
  • 两种方式效果一致,可根据实际需求选择:全局禁用平滑选方式一,按需切换选方式二。

内容的提问来源于stack exchange,提问作者FumiSA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:42:47