AudioKit Swift 5 - Как мне прекратить визг при запуске / остановке AKFMOscillator? - PullRequest
1 голос
/ 06 ноября 2019

Я использую Swift 5 и AudioKit для разработки приложения, в котором пользователь может воспроизводить тоны на разных частотах. При запуске моего осциллятора появляется ужасный шум, почти как царапина, но очень высокий звук. В приведенном ниже коде вы можете видеть, как я обрисовал в общих чертах длительность линейного изменения, у меня сложилось впечатление, что это разрешит щелчки / щелчки, которые вы получаете при работе со звуковым сигналом, но вместо щелчка теперь появляется этот ужасный шум. Это происходит как на IOS Simulator внутри XCode, так и при сборке с моим устройством.

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? Или я могу что-то изменить в своем коде, чтобы это исправить?

1 Ответ

1 голос
/ 06 ноября 2019

Итак, происходит то, что вы инициализируете 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

...

"царапающий" звук исчез.

...