AudioKit Swift 5-启动/停止AKFMOscillator时如何停止发出尖叫声?

问题描述 投票:1回答:1

我正在使用Swift 5和AudioKit开发一个应用程序,用户可以在其中播放不同频率的音调。启动我的振荡器时,会发出刺耳的声音,就像刮擦一样,但是音调很高。在下面的代码中,您可以看到我概述了斜坡持续时间,给人的印象是,这可以解决使用波形音频时出现的爆音/咔嗒声,但是现在却没有咔嗒声,而是这种丑陋的噪音。在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的错误吗?还是可以更改代码中的某些内容来解决此问题?

ios swift audiokit
1个回答
0
投票

因此,正在发生的事情是使用某些默认值初始化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

...

“刺耳的”声音消失了。

© www.soinside.com 2019 - 2024. All rights reserved.