πŸŒ™ 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

πŸŒ™βœ¨