π AMBIENT/EXPERIMENTAL - Advanced Strudel Techniques
Basierend auf "Bonespurs" by @eefano
π― Der Sound
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π AMBIENT = SLOW + LAYERS + EVOLUTION + SPACE β
β β
β Tempo: 20-40 BPM effective (setcps 0.3-0.7) β
β Form: Long cycles (8, 12, 16 loops) β
β Feel: Hypnotic, evolving, textural β
β β
β Techniken: β
β β’ .layer() - Split & Transform β
β β’ .mask() - Arrangement Control β
β β’ /N Automation - Time-based Changes β
β β’ irand() - Controlled Randomness β
β β’ all() - Global Effects β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π’ TEMPO - Die Slow Zone
// setcps = cycles per second
// Normale Musik: setcps(1) = 60 BPM (bei 1 cycle = 1 bar)
setcps(90/60/3) // = 0.5 cps = 30 BPM effective
setcps(90/60/4) // = 0.375 cps = 22.5 BPM (sehr langsam)
setcps(0.3) // = 18 BPM (extrem langsam, drone territory)
// Warum so langsam?
// β Raum zum Atmen
// β Details hΓΆrbar
// β Hypnotischer Effekt
// β KlΓ€nge kΓΆnnen sich entfalten
π§ TECHNIK 1: .layer() - Split & Transform
Das mΓ€chtigste Tool fΓΌr komplexe Texturen!
.layer() nimmt ein Pattern und erstellt mehrere Versionen mit Transformationen:
// Einfach: Akkord in Bass und HΓΆhen splitten
"<[0,4,7]>/4".layer(
x => x.sub(12).s('sawtooth').lpf(400), // Bass: -12 HalbtΓΆne
x => x.s('triangle'), // Mitte: Original
x => x.add(12).s('sine').gain(0.3) // HΓΆhe: +12 HalbtΓΆne
)
// Bonespurs-Style: Zwei Synths, unterschiedliche Charaktere
"<[-3,0] [-4,0] [-2,0]>/4".layer(
x => x.sub(7) // Oktave runter
.s('supersaw') // Fetter Sound
.lpf(300) // Dunkel gefiltert
.lpe("<1 1.5 2 2!3>/12"), // Filter-Envelope wΓ€chst
x => x.add(7) // Oktave hoch
.s('triangle') // Sanfter Sound
.gain("<0 .1 .15 .2!3>/12") // Faded langsam ein
)
Layer Rezepte:
// OCTAVE SPLIT (Bass + High)
pattern.layer(
x => x.sub(12).s('saw').lpf(300),
x => x.add(12).s('sine').gain(0.3)
)
// RHYTHM VARIATION
pattern.layer(
x => x.s('pad'),
x => x.struct("x*4").s('pluck')
)
// DELAY TEXTURE
pattern.layer(
x => x.s('sine'),
x => x.s('sine').delay(0.3).dfb(0.5).gain(0.3)
)
// FILTER CONTRAST
pattern.layer(
x => x.s('saw').lpf(300),
x => x.s('saw').hpf(2000).gain(0.2)
)
π§ TECHNIK 2: /N Automation - Lange Formen
Pattern ΓΌber N Cycles entwickeln:
// Syntax: "<values>/N"
// N = Anzahl der Cycles, ΓΌber die sich das Pattern erstreckt
// Gain Automation ΓΌber 12 Cycles
.gain("<0 0 0 0 0 0 0 0 0 .2 .2 .2>/12")
// Shorthand: .gain("<0!9 .2!3>/12")
// Filter ΓΆffnet sich langsam
.lpf("<200 400 600 800 1000 1200>/6")
// Exponentieller Filter Sweep
.lpf(sine.range(200, 2000).slow(12))
Wichtige Notation:
!N = Wiederhole N mal
".2!3" = ".2 .2 .2"
@N = Pause N mal (fΓΌr Masken)
"~@3" = "~ ~ ~"
/N = Verteile ΓΌber N Cycles
"<a b c>/3" = a fΓΌr Cycle 1, b fΓΌr Cycle 2, c fΓΌr Cycle 3
Arrangement ΓΌber 12 Cycles:
// Element faded ein in letzten 3 von 12 Cycles
.gain("<0!9 .3!3>/12")
// Filter ΓΆffnet schrittweise
.lpf("<300 300 300 300 600 600 600 600 1200 1200 1200 1200>/12")
// KΓΌrzer: .lpf("<300!4 600!4 1200!4>/12")
// Element erscheint nur am Ende
.mask("<~!9 1!3>/12")
π§ TECHNIK 3: .mask() - Arrangement Control
Elemente ein/aus ΓΌber Zeit:
// .mask() silenced das Pattern wo die Maske silent (~) ist
// Nur in letzter HΓ€lfte spielen
pattern.mask("<~ 1>/2")
// Nur in letztem Viertel
pattern.mask("<~ ~ ~ 1>/4")
// Komplex: 8 Cycles still, 4 Cycles aktiv
pattern.mask("<~@8 1!4>/12")
// Bonespurs: Random stabs nur am Ende
n(irand(7))
.s('square')
.mask("<~@3 1!3>/12") // 9 silent, 3 playing
Arrangement mit Masken:
Cycle: 1 2 3 4 5 6 7 8 9 10 11 12
βββββββββββββββββββββββββββββββββββββββββββββββ
Pad: ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ mask("<1>/1")
Bass: ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ mask("<1>/1")
Melody: ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ mask("<~!6 1!6>/12")
Drums: ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ ββ mask("<~!9 1!3>/12")
π§ TECHNIK 4: irand() - Kontrollierter Zufall
Generative Patterns:
// irand(n) = Zufalls-Integer von 0 bis n-1
// Random Melodie in Skala (0-6 = 7 Noten)
n(irand(7)).s('sine').scale("c:minor")
// Random + Offset (Noten 6-12)
n(irand(7).add(6)).s('sine')
// Random + Chord
n(irand(4)).chord("minor7").s('pad')
// Mit Rhythmus-Struktur
n(irand(7).struct("<x ~ [x x] ~>")).s('pluck')
// Mit Maske (nur manchmal)
n(irand(7))
.struct("<~@2 [x x] [x ~]>")
.mask("<~@3 1!3>/12")
Generative Akkorde:
// Random Grundton + feste Chord-QualitΓ€t
n(irand(4).add("<0 -2 -4 -3>/4"))
.chord("<major minor minor7 sus4>/8")
.s('supersaw')
π§ TECHNIK 5: all() - Globale Effekte
Einmal fΓΌr alle Patterns:
// Am Ende der Datei:
all(x => x.room(0.8)) // Reverb auf alles
all(x => x.scale("f3:minor")) // Skala auf alles
all(x => x.room(0.8).scale("f3:minor")) // Kombiniert
// Bonespurs:
all(x => x.room(.8).scale("f3:minor"))
πΉ FILTER ENVELOPE (lpa, lpd, lpe)
Dynamische Filter-Bewegung:
.lpf(300) // Statischer Filter bei 300 Hz
.lpa(0) // LP Attack = 0 (sofort)
.lpd(0.15) // LP Decay = 0.15s
.lpe(2) // LP Envelope Depth = 2 (Oktaven)
// Ergebnis: Filter springt hoch und fΓ€llt auf 300 Hz zurΓΌck
// Bonespurs: Envelope Depth wΓ€chst ΓΌber Zeit
.lpe("<1 1.5 2 2!3>/12") // Mehr "Pluck" gegen Ende
π BONESPURS ANALYSE
setcps(90/60/3) // 0.5 cps = 30 BPM
// LAYER 1: Akkorde
$: "<[-3,0] [-4,0] [-2,0]>/4".layer(...)
// Fm Ebm Gm (in F minor)
// LAYER 2: 12-Noten Melodie
$: "<[0 2 5 0 3 -1 2 3 -1 -2 3 2]>".s('sine')
// f g bb f ab e g ab e eb ab g
// LAYER 3: Random Stabs (nur Ende)
$: n(irand(7).add(6)...).mask("<~@3 1!3>/12")
// LAYER 4: Drums (Filter ΓΆffnet)
$: s("[bd [~ <~ bd>] sd]").lpf("<600...1200!3>/12")
// LAYER 5: Ride (konstant, subtle)
$: s("rd*3").gain(.1)
// GLOBAL
all(x => x.room(.8).scale("f3:minor"))
π REZEPTE
Dark Ambient
setcps(0.3) // Sehr langsam
$: note("c1").s('sine').lpf(80).gain(0.5) // Sub drone
$: "<[-7,0] [-5,0]>/8".s('sawtooth').lpf(200).gain(0.3)
$: n(irand(3).struct("<~ ~ x ~>/4")).s('triangle')
.hpf(1000).delay(0.5).dfb(0.7).gain(0.15)
all(x => x.room(0.95).scale("c2:minor"))
Bright Evolving
setcps(0.5)
$: "<[0,4,7] [0,3,7] [-2,2,5]>/4"
.s('supersaw').lpf(sine.range(800,3000).slow(8))
$: "<0 4 7 11 7 4 0 -1>".s('pluck').delay(0.3).dfb(0.4)
all(x => x.room(0.6).scale("c4:major"))
Generative Minimal
setcps(0.4)
$: n(irand(4)).chord("minor7").s('pad').lpf(1200)
$: n(irand(7).struct("<x ~ x [~ x]>")).s('sine').gain(0.3)
$: s("<bd ~ ~ ~> <~ ~ hh ~>").gain(0.4)
all(x => x.room(0.7).scale("d3:dorian"))
π¦ FunkFox Ambient Rules
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π "Langsam = mehr Details hΓΆrbar." β
β β
β π "layer() ist dein bester Freund fΓΌr Texturen." β
β β
β π "/12 = denke in langen BΓΆgen, nicht in Bars." β
β β
β π "mask() = Arrangement ohne DAW." β
β β
β π "irand() + struct() = kontrolliertes Chaos." β
β β
β π "all() am Ende = Kleber fΓΌr alles." β
β β
β π "room(0.8+) = Ambient braucht RAUM." β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π» Instant Ambient (Copy & Paste)
setcps(0.5)
$: "<[-3,0] [-4,0] [-2,0]>/4".layer(
x=>x.sub(7).s('supersaw').lpf(400).gain(0.4),
x=>x.add(7).s('triangle').gain("<0 .1 .2 .3>/4")
)
$: "<[0 2 5 3 -1 2]>".s('sine').gain(0.25)
$: n(irand(7).struct("<~ x [x ~] ~>")).s('square')
.hpf(800).lpf(2000).gain(0.2).delay(0.3)
$: s("[bd ~ ~ bd] [~ ~ sd ~]").gain(0.5)
all(x=>x.room(0.8).scale("f3:minor"))
π Credits
- Original "Bonespurs" by @eefano
- Dokumentation by CrumbMidi / FunkFox π¦
π AMBIENT π
Slow down.
Layer up.
Let it breathe.
setcps(0.5)
.layer(x => x...)
.mask("<~@9 1!3>/12")
all(x => x.room(0.9))
#ambient #experimental #strudel #generative #layers #eefano
πβ¨