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"声音没了。
我正在使用 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"声音没了。