Подробное объяснение интерфейса побочных эффектов в генераторе обертонов clojure
Я новичок в обертоне / суперколлайдере. Я знаю, как звук формируется физически. Однако я не понимаю магию внутри генерирующих звук функций обертона.
Допустим, у меня есть основной звук:
(definst sin-wave [freq 440 attack 0.01 sustain 0.4 release 0.1 vol 0.4]
(* (env-gen (lin-env attack sustain release) 1 1 0 1 FREE)
(+ (sin-osc freq)
(sin-osc (* freq 2))
(sin-osc (* freq 4)))
vol))
Я понимаю ASR цикл звуковой огибающей, синусоиды, частоты, громкости здесь. Они описывают амплитуду звука во времени. Что я не понимаю, так это время. Поскольку здесь отсутствует время ввода всех функций, как я могу управлять такими вещами, как эхо и другие интересные эффекты?
Если я хочу написать свою собственную функцию sin-osc, как мне указать амплитуду моего звука в определенный момент времени? Допустим, мой sin-osc должен установить, что на 1/4 цикла выход достигает пика амплитуды 1.0, какой интерфейс я могу кодировать для управления им?
Не зная этого, все генераторы звукового синтеза в обертоне не имеют смысла для меня, и они выглядят как странные функции с неизвестными побочными эффектами.
2 ответа
Overtone не определяет отдельные сэмплы или формы с течением времени для каждого сигнала, на самом деле это просто интерфейс к серверу суперколлайдера (который определяет протокол взаимодействия, язык суперколлайдера является каноническим клиентом для этого сервера, а обертон - еще один). По этой причине весь обертон делает за кулисами отправку сигналов о том, как построить синтезирующий граф на сервер суперколлайдера. Сервер суперколлайдера - это то, что фактически вычисляет, какие сэмплы отправляются в ЦАП, основываясь на определениях синтезаторов, которые воспроизводятся в любой момент времени. Вот почему вы получаете примитивные элементы синтезатора, такие как синусоидальные генераторы, прямоугольные волны и фильтры: они вызываются на сервере для фактического вычисления выборок.
Я получил ответ от droidcore на # supercollider / Freenode IRC
d: время действительно похоже на время настенного часа, оно просто проходит
d: ugen знает, сколько времени занимает каждая выборка в миллисекундах, поэтому он знает, сколько времени продвигает его представление о времени.
d: так что в adsr, когда вы говорите, что хотите время атаки 1,0 секунды, он знает, что ему нужно 44100 выборок (скажем), чтобы попасть туда
d: частота дискретизации фиксирована и является глобальной. устанавливается, когда вы запускаете процесс синтеза
d: да, это как поиск в синусоидальной таблице
d: они просто будут многократно искать следующее значение в таблице, представляющей один цикл волны, а затем просто обойдутся вокруг начала, когда доберутся до конца.
d: вы не можете сделать логику выборки за образцом со стороны SC
d: Чак сделает это, хотя, если вы хотите поэкспериментировать с этим
d: время глобально, и оно неявно, оно доступно для всех осцилляторов все время, но внутренне это не так, как будто это закрытая форма, где вы говорите: "дайте мне образец для этого значения времени"
d: вы говорите: "время увеличилось на 5 микросекунд. дайте мне новое значение"
д: это больше похоже на ручей
d: вам не нужно иметь произвольный доступ к значениям осцилляторов, только следующий во временной последовательности