Synths 🌀 Bulka

Synths

В дополнение к движку сэмплирования, strudel поставляется с синтезатором для создания звуков на лету.

Базовые Waveforms

Базовые waveforms — это sine, sawtooth, square и triangle, которые можно выбрать через sound (или s):

note("c2 <eb2 <g2 g1>>".fast(2))
.sound("<sawtooth square triangle sine>")
._scope()

Если вы не установите sound, но установите note, значением по умолчанию для sound будет triangle!

Noise

Вы также можете использовать noise в качестве источника, установив waveform на: white, pink или brown. Это разные виды noise, здесь написаны от жесткого к мягкому.

sound("<white pink brown>")._scope()

Вот более музыкальный пример использования noise для хэтов:

sound("bd*2,<white pink brown>*8")
.decay(.04).sustain(0)._scope()

Некоторое количество pink noise также может быть добавлено к любому oscillator с помощью параметра noise:

note("c3").noise("<0.1 0.25 0.5>")._scope()

Вы также можете использовать тип crackle для воспроизведения тонких шумовых треска. Вы можете контролировать количество noise, используя параметр density:

s("crackle*4").density("<0.01 0.04 0.2 0.5>".slow(2))._scope()

Additive Synthesis

Периодические waveforms состоят из нескольких harmonics выше основной частоты, расположенных на целых кратных. Эти обертоны объединяются, чтобы придать звуку его уникальное тембральное качество.

Для базовых waveforms мы предлагаем вам контроль над этими harmonics с помощью функций partials и phases.

Partials

partials относится к величине каждого harmonic относительно основной частоты. Таким образом, их можно использовать для спектральной фильтрации этих waveforms и смягчения некоторой их резкости:

note("c2 <eb2 <g2 g1>>".fast(2))
.sound("sawtooth")
.partials([1, 1, "<1 0>", "<1 0>", "<1 0>", "<1 0>", "<1 0>"])
._scope()

partials также можно использовать для построения новых waveforms, отсутствующих в нашем базовом наборе, с помощью источника звука ‘user’:

note("c2 <eb2 <g2 g1>>".fast(2))
.sound("user")
.partials([1, 0, 0.3, 0, 0.1, 0, 0, 0.3])
._scope()

Мы можем алгоритмически создавать списки величин с помощью кода Javascript следующим образом:

const numHarmonics = 22;
note("c2 <eb2 <g2 g1>>".fast(2))
.sound("saw")
.partials(new Array(numHarmonics).fill(1))
._scope()

что действует как спектральный filter. Или:

note("c2 <eb2 <g2 g1>>").fast(2)
.sound("user")
.partials(new Array(50).fill(0)
.map((_, idx) => ((-1) ** (idx + 1)) / (idx + 1))
)
._scope()

что восстанавливает знакомую waveform.

partials также совместим с функциями pattern, предназначенными для создания списков, такими как randL или binaryL:

note("c2 <eb2 <g2 g1>>").fast(2)
.sound("user")
.partials(randL(10))
._scope()

и со списками из patterns:

note("c2 <eb2 <g2 g1>>".fast(4))
.sound("user")
.partials([1, 0, "0 1", "0 1 0.3", rand])
._scope()

Обратите внимание, что первое значение в массиве partials контролирует величину фундаментального harmonic, а не смещение по постоянному току, которое зафиксировано на 0.

Phases

Ранее мы упоминали, что периодические waveforms можно разложить на набор harmonics выше основной частоты. Каждый harmonic имеет два определяющих свойства: его величину (насколько он громкий) и его фазу, которая определяет, где в своем цикле начинается эта синусоида при построении waveform.

Эти phases также могут быть объявлены в Strudel и могут придать вашим звукам интересную глубину.

s("saw").seg(16).n(irand(12)).scale("F1:minor")
.penv(48).panchor(0).pdec(0.05)
.delay(0.25).room(0.25)
.compressor(-20).vib(0.3)
.partials(randL(200))
.phases(randL(200))

Vibrato

vib

Synonyms: vibrato, v

Применяет vibrato к частоте oscillator.

  • frequency (number|Pattern): частота vibrato в герцах
note("a e")
.vib("<.5 1 2 4 8 16>")
._scope()
// изменить глубину модуляции с помощью ":"
note("a e")
.vib("<.5 1 2 4 8 16>:12")
._scope()

vibmod

Synonyms: vmod

Устанавливает глубину vibrato в полутонах. Имеет эффект только если vibrato | vib | v также установлен

  • depth (number|Pattern): глубина vibrato (в полутонах)
note("a e").vib(4)
.vibmod("<.25 .5 1 2 12>")
._scope()
// изменить частоту vibrato с помощью ":"
note("a e")
.vibmod("<.25 .5 1 2 12>:8")
._scope()

FM Synthesis

FM Synthesis — это техника, которая быстро изменяет частоту базовой waveform для изменения тембра.

Вы можете использовать fm с любой из вышеперечисленных waveforms, хотя все приведенные ниже примеры используют triangle wave по умолчанию.

fm

fmh

Устанавливает коэффициент гармоничности частотной модуляции. Управляет тембром звука. Целые числа и простые соотношения звучат более естественно, тогда как десятичные числа и сложные соотношения звучат металлически.

Можно добавить номер для управления гармоничностью любого из 8 индивидуальных FM (например, fmh2)

  • harmonicity (number|Pattern):
note("c e g b g e")
.fm(4)
.fmh("<1 2 1.5 1.61>")
._scope()

fmattack

Synonyms: fmatt

Время attack для FM envelope: время, необходимое для достижения максимальной модуляции

Можно добавить номер для управления attack envelope любого из 8 индивидуальных FM (например, fmatt5)

  • time (number|Pattern): время attack
note("c e g b g e")
.fm(4)
.fmattack("<0 .05 .1 .2>")
._scope()

fmdecay

Synonyms: fmdec

Время decay для FM envelope: секунды до достижения уровня sustain после фазы attack.

Можно добавить номер для управления decay envelope любого из 8 индивидуальных FM (например, fmdec6)

  • time (number|Pattern): время decay
note("c e g b g e")
.fm(4)
.fmdecay("<.01 .05 .1 .2>")
.fmsustain(.4)
._scope()

fmsustain

Synonyms: fmsus

Уровень sustain для FM envelope: какая модуляция применяется после фазы decay

Можно добавить номер для управления sustain envelope любого из 8 индивидуальных FM (например, fmsus7)

  • level (number|Pattern): уровень sustain
note("c e g b g e")
.fm(4)
.fmdecay(.1)
.fmsustain("<1 .75 .5 0>")
._scope()

fmenv

Тип нарастания fm envelope. Exp может работать некорректно..

Можно добавить номер для управления envelope любого из 8 индивидуальных FM (например, fmenv4)

  • type (number|Pattern): lin | exp
note("c e g b g e")
.fm(4)
.fmdecay(.2)
.fmsustain(0)
.fmenv("<exp lin>")
._scope()

Wavetable Synthesis

Strudel также может использовать sampler для загрузки пользовательских waveforms в качестве замены waveforms по умолчанию, используемых WebAudio для базового synth. Набор по умолчанию из более чем 1000 wavetables доступен по умолчанию (из набора AKWF). Вы также можете импортировать/использовать свои собственные. Wavetable — это waveform одного цикла, которая затем повторяется для создания звука на желаемой частоте. Это классическая, но очень эффективная техника синтеза.

Любой sample с префиксом wt_ будет загружен как wavetable. Это означает, что аргумент loop будет установлен на 1 по умолчанию. Вы также можете сканировать wavetable, используя loopBegin и loopEnd.

samples('bubo:waveforms');
note("<[g3,b3,e4]!2 [a3,c3,e4] [b3,d3,f#4]>")
.n("<1 2 3 4 5 6 7 8 9 10>/2").room(0.5).size(0.9)
.s('wt_flute').velocity(0.25).often(n => n.ply(2))
.release(0.125).decay("<0.1 0.25 0.3 0.4>").sustain(0)
.cutoff(2000).cutoff("<1000 2000 4000>").fast(4)
._scope()

ZZFX

“Zuper Zmall Zound Zynth” ZZFX также интегрирован в strudel. Разработанный Frank Force, это движок synth и FX, изначально предназначенный для использования в играх с ограниченным размером кода.

У него всего 20 параметров, вот фрагмент, который использует все:

note("c2 eb2 f2 g2") // также поддерживает freq
.s("{z_sawtooth z_tan z_noise z_sine z_square}%4")
.zrand(0) // randomization
// zzfx envelope
.attack(0.001)
.decay(0.1)
.sustain(.8)
.release(.1)
// специальные параметры zzfx
.curve(1) // waveshape 1-3
.slide(0) // +/- скольжение высоты тона
.deltaSlide(0) // +/- скольжение высоты тона (?)
.noise(0) // сделать грязнее
.zmod(0) // скорость fm
.zcrush(0) // bit crush 0 - 1
.zdelay(0) // простой delay
.pitchJump(0) // +/- изменение высоты тона после pitchJumpTime
.pitchJumpTime(0) // >0 время после применения pitchJump
.lfo(0) // >0 сбрасывает slide + pitchJump + устанавливает скорость tremolo
.tremolo(0.5) // 0-1 количество модуляции громкости lfo
//.duration(.2) // переопределить длительность event strudel
//.gain(1) // изменить громкость
._scope() // визуализация waveform (не связана с zzfx)

Обратите внимание, что вы также можете комбинировать zzfx со всеми другими audio fx (следующая глава).

Далее: Audio Effects