【问题标题】:AudioKit Swift 5 - How do I stop shrieking noise when starting/stopping AKFMOscillator?AudioKit Swift 5 - 启动/停止 AKFMOscillator 时如何停止尖叫?
【发布时间】:2019-11-06 14:23:49
【问题描述】:

我正在使用 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】:

    所以,发生的事情是您使用某些默认值初始化 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
    
    ...
    

    “沙哑”的声音消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多