I'm halfway through my fourth week of trying out Strudel recipes

And there were some plums left over from the previous recipe, so I've made a new variation, sour plum strudel (it has a different flavor).

// ==================================================================================
// technoabu 2026-09
// https://technoabu.codeberg.page
// https://youtube.com/@technoabu
// ==================================================================================

setcpm(128/4)

const KICK = s("[bd:6 ~]*4")
  .orbit(0)
  .duckorbit(1)
  .duckdepth(0.85)
  .duckattack(0.02)

const SNARE = s("[~ sd:10]*4")
  .lpf(cosine.range(300, 600).slow(8))

const CHARLES = s("hh*<8!4 [16 | 4]>")
  .lpf(sine.range(1000, 1600).slow(8))

const BASS = n(`<
  [3]!3@4 5 3
  [5]!3@4 6 5
  [2]!3@4 4 2
  [6]!3@4 2 6
  >*4`)
  .s("saw")
  .scale("C2:minor")
  .legato(1)
  .orbit(1)
  .lpf(sine.range(300, 800).slow(8))
  .sometimesBy(0.05, x => x.postgain(0.75).room(0.75).delay(0.75).lpq(8).lpe(3).lpdecay(0.25).plyForEach(5, (p, i) => p.pan(i % 2)).lpf(400))

const PADS = chord("<Cm7 Fm7 Bbm7 ~>")
  .anchor("C5")
  .voicing()
  .struct("[x ~ x ~]")
  .s("sine")
  .hpf(400)
  .sometimesBy(0.4, x => x.plyForEach(3, (p, i) => p.pan(i % 2)))
  .delay(0.4)
  .gain(0.4)

$: stack(
  KICK .mask("<0!4 1!120 0!200>"),
  BASS .mask("<1!64 0!4 1!82 0!200>"),
  PADS .mask("<0!16 1!4 0!8 1!4 0!8 1!80 0!200>"),
  SNARE .mask("<0!24 1!100 0!200>"),
  CHARLES .mask("<0!32 1!100 0!200>"),
)

all(x => x.when(
  time.gt(135), 
  y => y.gain(sine.range(1, 0).slow(24)) // fade-out sincronizado manualmente (export 150) para que no reaparezca (mask 0....) 
))