如何在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
相关产品推荐
相关产品推荐

