Examples / Songs

Cycletron Trailer

dark acid techno · F minor · 140 BPM · 44 bars

Demos/Songs/cycletron-trailer.strudel

Play in Cycletron Opens it in the app in your browser, with the visualizers. Desktop browsers only.

// Cycletron Trailer — dark acid techno · F minor · 140 BPM · 44 bars
// The music for Shows/cycletron-trailer.show.toml, which cuts its picture on
// these section labels. Every section is 4-bar aligned (1 bar = 1.714 s).
//
// FORM (1 cycle = 1 bar):
//   open    4   sub drone, a lone ticking hat, crackle
//   build   4   kick in, the acid line, its filter opening bar by bar
//   build2  4   sixteenth hats and rimshots, the acid brighter
//   listen  4   the floor drops out from under the kick, noise riser
//   drop    8   full kit, distorted acid, clap
//   break   4   kick out: pad, acid in the delay
//   riser   4   snare roll, noise sweep, pitch climb
//   drop2   8   everything, a second acid layer, stabs
//   logo    4   one hit on the downbeat, then the room rings out

setbpm(140);

"<open build build2 listen drop@2 break riser drop2@2 logo>".slow(4).pickRestart({
  // OPEN
  open: stack(
    note("f1").s("sine").attack(1.2).release(2).lpf(160).gain(0.7),
    s("~ ~ ~ hh").gain(0.3).hpf(7000).room(0.4).pan(0.62),
    s("crackle*4").gain(0.12).hpf(3000).pan(0.35),
    note("<~ ~ [~ ~ ~ f5] [~ ~ c6 ~]>").s("wt_bell").decay(0.2).sustain(0)
      .delay(0.4).delaytime(0.3214).delayfeedback(0.5).room(0.6).gain(0.22).pan(0.7)
  ),

  // BUILD A
  build: stack(
    s("bd*4").gain(0.9).dist(0.4).lpf(2600),
    note("f1*4").s("sine").attack(0.001).decay(0.3).sustain(0).release(0.35)
      .lpf(200).dist(0.45).gain(0.55),
    s("<[~ hh ~ hh] [~ hh ~ hh] [hh*8] [hh*8]>").gain(0.3).hpf(7000).pan(0.4),
    note("f2 f2 f3 f2 ab2 f2 c3 f2 f2 eb3 f2 f3 gb2 f2 c3 f2")
      .s("sawtooth").hpf(120).lpf("<500 700 900 1200>").resonance(14)
      .decay(0.14).sustain(0.05).dist(0.35).gain(0.5).pan(0.45)
  ),

  // BUILD B
  build2: stack(
    s("bd*4").gain(0.95).dist(0.45).lpf(3000),
    note("f1*4").s("sine").attack(0.001).decay(0.3).sustain(0).release(0.35)
      .lpf(210).dist(0.5).gain(0.55),
    s("hh*16").gain("0.22 0.35 0.26 0.4").hpf(7000).pan(0.35),
    s("~ rim ~ ~ rim ~ ~ rim").gain(0.3).hpf(1800).room(0.15).pan(0.65),
    note("f2 f2 f3 f2 ab2 f2 c3 f2 f2 eb3 f2 f3 gb2 f2 c3 f2")
      .s("sawtooth").hpf(120).lpf("<1500 1900 2400 3000>").resonance(16)
      .decay(0.14).sustain(0.05).dist(0.4).gain(0.52).pan(0.45)
  ),

  // LISTEN — the floor drops out from under the kick
  listen: stack(
    s("bd*4").gain(0.85).lpf("<900 700 500 300>"),
    s("hh*16").gain(0.2).hpf(8000).pan(0.4),
    note("f2 f2 f3 f2 ab2 f2 c3 f2 f2 eb3 f2 f3 gb2 f2 c3 f2")
      .s("sawtooth").hpf(200).lpf(sine.range(400, 3500).fast(2)).resonance(20)
      .decay(0.14).sustain(0.05).dist(0.3).gain(0.45)
      .delay(0.3).delaytime(0.3214).delayfeedback(0.35).pan(0.5),
    s("white*16").hpf(saw.range(400, 9000).slow(4)).gain(saw.range(0.02, 0.22).slow(4)).pan(0.5)
  ),

  // DROP 1
  drop: stack(
    s("bd*4").gain(1.0).dist(0.6).lpf(3500),
    note("f1*4").s("sine").attack(0.001).decay(0.32).sustain(0).release(0.4)
      .lpf(230).dist(0.6).room(0.4).roomsize(0.8).gain(0.6),
    s("~ cp ~ cp").gain(0.7).hpf(1000).dist(0.2).room(0.2),
    s("~ oh ~ oh").gain(0.4).hpf(4500).pan(0.62),
    s("hh*16").gain("0.25 0.42 0.3 0.46").hpf(7000).pan(0.32),
    s("~ rim ~ ~ rim ~ ~ rim").gain(0.34).hpf(1800).dist(0.25).room(0.12).pan(0.68),
    s("<[~ ~ ~ ~] [~ ~ ~ [ht mt]]>").gain(0.35).crush(6).hpf(700).pan(0.6),
    note("<[f2 f2 f3 f2 ab2 f2 c3 f2 f2 eb3 f2 f3 gb2 f2 c3 f2] [f2 f2 f3 f2 ab2 f2 c3 f2 db3 c3 ab2 f2 gb2 f2 eb3 c3]>")
      .s("superzow").hpf(160).lpf(sine.range(700, 5200).slow(4)).resonance(19)
      .decay(0.16).sustain(0.08).dist(0.55).gain(0.62).pan(0.45)
  ),

  // BREAK
  break: stack(
    note("<[f3, ab3, c4, eb4] [f3, ab3, c4, eb4] [db3, f3, ab3, c4] [eb3, gb3, bb3, db4]>")
      .s("supersaw").attack(0.6).release(2.5).lpf(1000).gain(0.2).room(0.8).roomsize(0.9),
    note("f1").s("sine").attack(0.5).release(2).lpf(150).gain(0.35),
    note("f2 ~ f3 ~ ab2 ~ c3 ~ ~ ~ ~ ~ ~ ~ ~ ~")
      .s("sawtooth").lpf(1400).resonance(18).decay(0.15).sustain(0)
      .delay(0.55).delaytime(0.3214).delayfeedback(0.6).room(0.5).gain(0.25).pan(0.55),
    note("<f5 ~ c6 ~>").s("wt_bell").room(0.8).gain(0.18).pan(0.3)
  ),

  // RISER
  riser: stack(
    s("<sd*4 sd*8 sd*16 [sd*16, sd*32]>").gain(saw.range(0.3, 1.0).slow(4)).hpf(900).dist(0.2).pan(0.5),
    s("bd*4").gain(saw.range(0.6, 1.0).slow(4)).lpf(saw.range(300, 3000).slow(4)),
    s("white*16").hpf(saw.range(300, 10000).slow(4)).gain(saw.range(0.05, 0.5).slow(4)),
    note("<f2*16 ab2*16 bb2*16 c3*16>").s("sawtooth")
      .lpf(saw.range(500, 6000).slow(4)).resonance(20).decay(0.12).sustain(0.05)
      .dist(0.45).gain(0.6)
  ),

  // DROP 2
  drop2: stack(
    s("bd*4").gain(1.0).dist(0.65).lpf(3800),
    note("f1*4").s("sine").attack(0.001).decay(0.32).sustain(0).release(0.4)
      .lpf(240).dist(0.6).room(0.4).roomsize(0.8).gain(0.6),
    s("~ cp ~ cp").gain(0.75).hpf(1000).dist(0.25).room(0.25),
    s("~ ~ sd ~").gain(0.5).hpf(1400).dist(0.3),
    s("~ oh ~ oh").gain(0.45).hpf(4500).pan(0.62),
    s("hh*16").gain("0.28 0.45 0.32 0.5").hpf(7000).pan(0.32),
    s("rd*4").gain(0.22).hpf(5000).pan(0.75),
    s("~ rim ~ ~ rim ~ ~ rim").gain(0.36).hpf(1800).dist(0.3).room(0.12).pan(0.68),
    s("<[~ ~ ~ [~ mt]] [~ ~ ~ [ht mt]]>").gain(0.38).crush(6).hpf(700).pan(0.6),
    note("<[f2 f2 f3 f2 ab2 f2 c3 f2 f2 eb3 f2 f3 gb2 f2 c3 f2] [f2 f2 f3 f2 ab2 f2 c3 f2 db3 c3 ab2 f2 gb2 f2 eb3 c3]>")
      .s("superzow").hpf(160).lpf(sine.range(900, 6000).slow(2)).resonance(20)
      .decay(0.16).sustain(0.08).dist(0.6).gain(0.62).pan(0.4),
    note("<[f4 ~ f4 ab4 ~ c5 ~ eb5] [f4 ~ f4 ab4 ~ db5 c5 ~]>")
      .s("supersquare").decay(0.1).sustain(0).release(0.06)
      .lpf(3200).resonance(8).dist(0.35)
      .delay(0.25).delaytime(0.1607).delayfeedback(0.3).gain(0.36).pan(0.68)
  ),

  // LOGO — one hit, then the room rings out
  logo: stack(
    s("<[bd, cr] ~ ~ ~>").gain(1.0).dist(0.5).room(0.6).roomsize(0.95),
    note("<f1 ~ ~ ~>").s("sine").attack(0.001).decay(2.5).sustain(0).release(2)
      .lpf(200).dist(0.5).gain(0.8),
    note("<[f3, ab3, c4, f4] ~ ~ ~>").s("superzow").attack(0.001).decay(1.8).sustain(0)
      .lpf(2400).resonance(6).dist(0.4).room(0.8).roomsize(0.95).gain(0.4),
    note("<~ ~ ~ [~ ~ ~ [f5 c6]]>").s("wt_bell").delay(0.5).delaytime(0.3214)
      .delayfeedback(0.5).room(0.7).gain(0.22).pan(0.6)
  )
})