AudioKit Swift 5 - 如何在 starting/stopping AKFMOscillator 时停止尖叫声?

AudioKit Swift 5 - How do I stop shrieking noise when starting/stopping AKFMOscillator?

我正在使用 Swift 5 和 AudioKit 开发一个应用程序,用户可以在其中以不同的频率播放音调。启动我的振荡器时,会发出一种可怕的噪音,几乎像刮擦声,但音调非常高。在我下面的代码中,您可以看到我已经概述了斜坡持续时间,我的印象是这将解决您在使用波形音频时遇到的 popping/clicking 但现在没有点击,而是这种丑陋的噪音。这发生在 Xcode 内的 IOS 模拟器和构建到我的设备时。

func playTone(){

     let osc = AKFMOscillator(waveform:AKTable(.sine), amplitude: 0)
     osc.rampDuration = 0.1 //Changing ramp duration makes the scratch noise last longer.
     osc.baseFrequency = 1
     osc.carrierMultiplier = 1000 //Frequency of tone
     osc.modulatingMultiplier = 5
     osc.modulationIndex = osc.carrierMultiplier/100*4

     AudioKit.output = osc

     try? AudioKit.start()
     osc.start()
     osc.amplitude = 1.0
     sleep(3)
     osc.amplitude = 0
     try? AudioKit.stop()
}

这是 AudioKit 的错误吗?或者我可以更改我的代码来解决这个问题吗?

所以,发生的事情是您使用某些默认值初始化 FM 振荡器然后更改它们,但实际上不是立即更改,因为 rampDuration 应用于初始化值和您之后设置的值之间。这可能有点令人困惑,因为当您阅读代码时,似乎您在 AudioKit 启动之前设置了值。接下来,斜坡随着时间的推移以线性方式发生,它通过许多不同的载波乘数值,基本上在每个微小的增量上给你一个截然不同的声音。因此,我建议您使用与最终结果接近或相同的值来初始化振荡器,并且只让振幅倾斜以避免点击:

let osc = AKFMOscillator(waveform:AKTable(.sine),
                         baseFrequency: 1,
                         carrierMultiplier: 1000,
                         modulatingMultiplier: 5,
                         modulationIndex: 5.0/400.0,
                         amplitude: 0)

osc.rampDuration = 5 //Changing ramp duration makes the scratch noise last longer.

AudioKit.output = oscillator

...

"scratchy"声音没了。