🎵 Strudel Live Coding Pattern

Tap the play button — browser audio needs exactly one tap, then it runs on its own.

const arp = note("<[c3 g3 b3 e4 g4 e4 b3 g3] [a2 e3 g3 c4 e4 c4 g3 e3] [f2 c3 a3 c4 e4 c4 a3 c3] [g2 d3 b3 d4 g4 d4 b3 d3]>")
  .slow(4)
  .attack(.02).sustain(.18).release(.5)

stack(
  note("<c1 a1 f1 g1>").slow(4)
    .s("sine")
    .attack(6).sustain(14).release(7)
    .gain(.55)
    .color("#1d1712"),

  note("<[c2,g2,b2] [a1,e2,g2] [f2,c3,e3] [g2,d3,b2]>").slow(4)
    .s("supersaw")
    .attack(4).sustain(12).release(7)
    .lpf(sine.slow(16).range(160,340))
    .pan(sine.slow(11).range(.42,.58))
    .gain(.2).room(.3).size(.92)
    .color("#8e2438"),

  note("<[e3,g3,b3] [e3,g3,c4] [f3,a3,c4] [d3,g3,b3]>").slow(4)
    .s("tri")
    .attack(5).sustain(13).release(8)
    .lpf(sine.slow(13).range(420,900))
    .pan(sine.slow(9).range(.5,.62))
    .gain(.14).room(.4).size(.95)
    .color("#2a4d8f"),

  arp
    .s("tri")
    .lpf(sine.slow(8).range(900,2600))
    .pan("<.44 .56>")
    .gain(.26).room(.35).size(.9)
    .delay(.25).delaytime(.375).delayfeedback(.32)
    .color("#d9a441"),

  arp
    .add(-12)
    .s("square")
    .lpf(sine.slow(10).range(300,680))
    .pan(.36)
    .gain(.1).room(.3).size(.9)
    .color("#8a5a26"),

  note("<g5 e6 a5 b5 a5 c6 b5 d6>").slow(2)
    .s("sine")
    .attack(2).sustain(3).release(5)
    .pan(sine.slow(7).range(.3,.7))
    .gain(sine.slow(9).range(.03,.1))
    .room(.6).size(.95)
    .color("#e6cfa0"),

  s("bd(3,8)")
    .speed(.85).lpf(200)
    .gain(.46).room(.18).size(.9)
    .color("#171310"),

  s("rim(5,16)")
    .gain(.14).pan(.6)
    .delay(.18).delaytime(.375).delayfeedback(.28)
    .room(.3).size(.88)
    .color("#2f7a55"),

  s("hh(7,32,<3 5 2 7>)")
    .hpf(3200).gain(.05).pan(.38)
    .room(.2)
    .color("#cfd8e3"),

  s("cp(3,16)")
    .lpf(1500).gain(.06).pan(.55)
    .room(.5).size(.92)
    .color("#6d4aa8"),

  s("sd(2,8)")
    .speed(.5).lpf(520)
    .gain(.13).room(.45).size(.95)
    .color("#3d352c")
)
Ready.