Проблема с линейным изменением частоты генератора AudioKit v5

Я новичок в AudioKit и использую v5. Изменение частоты генератора работает не так, как ожидалось. В следующем примере 2 последовательных пандуса. Сначала он набирает 440-880, но потом звучит так, будто идет 880-660 вместо 440-660.

Если я закомментирую osc.$frequency.ramp(to: 660.0, duration: 1.0), он поднимается до 440-880, затем очень быстро поднимается до 440, но достигает цели.

Похоже, что-то не сбрасывается после съезда.

(sleeps предназначены только для тестирования.)

Это ошибка? Что мне еще нужно сделать? Любое понимание будет очень признательно! Спасибо!

import Cocoa
import AudioKit

class Test {

    let akEngine = AudioEngine()
    let osc = Oscillator()

    func setup() {
        osc.amplitude = 0.1
        akEngine.output = osc
        do {
            try akEngine.start()
        } catch {
            print("Couldn't start AudioEngine.")
        }
        osc.frequency = 440.0
        osc.start()
        osc.$frequency.ramp(to: 880.0, duration: 1.0)
        sleep(2)
        osc.stop()
        sleep(1)
        osc.frequency = 440.0
        osc.start()
        osc.$frequency.ramp(to: 660.0, duration: 1.0)
        sleep(2)
        osc.stop()
    }
    
}

person Eggsalad    schedule 21.04.2021    source источник


Ответы (2)


Это, вероятно, заслуживает объяснения, или, может быть, это должно быть исправлено, чтобы оно работало так, как указано выше, но как только вы начнете автоматизировать изменения, вам следует придерживаться синтаксиса автоматизации и не переходить к простой установке значений. Для вас это означает просто замену osc.frequency = 440 на osc.$frequency.ramp(to: 440.0, duration: 0.0), и я верю, что вы получите желаемый эффект.

person Aurelius Prochazka    schedule 21.04.2021
comment
Ах хорошо. Понятно. Спасибо! И это зависит от каждого параметра - если я автоматизирую частоту, я все равно могу установить амплитуду напрямую? - person Eggsalad; 22.04.2021
comment
После дополнительного тестирования параметры кажутся независимыми. Но я заметил еще одну вещь: если я устанавливаю амплитуду осциллятора на 0 напрямую и напрямую увеличиваю, есть начальная атака, которая больше 0, тогда она мягкая (как музыкальный акцент) и возрастает. Если я установлю его на 0, увеличивая продолжительность с 0, начального акцента нет, начнется мягкий, и я могу напрямую его увеличить (хотя, возможно, это непреднамеренно, учитывая то, что вы сказали). - person Eggsalad; 22.04.2021
comment
Да, линейное изменение зависит от параметра. - person Aurelius Prochazka; 22.04.2021

Установка параметра (osc.frequency = 440.0) приводит к использованию крошечной рампы, чтобы избежать застревания (эквивалент osc.$frequency.ramp(to: 440.0, duration:epsilon)). Тестовый код немедленно применяет другой пандус, перекрывая пандус с застежкой-молнией.

Если вы вставите sleep после второго osc.start(), вы услышите, как быстро застегивает молния, возвращаясь к 440.

person Taylor    schedule 23.04.2021
comment
Я вижу (слышу). Хорошо знать! Спасибо! - person Eggsalad; 24.04.2021