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