Examples / Songs / Agency

Legacy System

Demos/Songs/agency/01-legacy-system.strudel · 56 BPM

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

// AGENCY OST — 01 · Legacy System
// Boot-up. The old mainframe hums in a dark server room; badge-in at dawn.
// Dark ambient waking into a Berlin-school sequence. This track states the
// ALBUM MOTIF: scale degrees 0 2 4 6 · 7 4 2 0 (rise to the subtonic,
// answer falling from the octave) — it returns in tracks 4, 5 and 8.
//
// FORM (56 BPM · 1 cycle = 1 bar ≈ 4.3s · 48 bars ≈ 3:26 · loops):
//   boot   8  e1  sub drone + detuned octave beating
//   hum    8  e1  + machine noise wash, electrical hum
//   wake   8  e2  + evolving pad (i→VI), tritone unease underneath
//   drift  12 e3  + the motif enters as a sequencer line
//   surge  8  e3  pad opens, cello fifth, motif migrates up a fourth
//   fade   4  e1  everything recedes; the drone never stops
// hook: the Agency motif — first statement, high and patient.

setbpm(56);

"<boot@2 hum@2 wake@2 drift@3 surge@2 fade>".slow(4).pickRestart({
  boot: stack(
    note("c#1").s("sine").slow(4).attack(4).release(12).gain(0.55),
    note("c#2").s("sine").slow(4).attack(6).release(12).detune(9).gain(0.26)
  ).room(0.92),
  hum: stack(
    note("c#1").s("sine").slow(4).attack(4).release(12).gain(0.52),
    note("c#2").s("sine").slow(4).attack(6).release(12).detune(9).gain(0.24),
    s("brown").slow(2).attack(4).release(8).lpf(sine.range(180, 650).slow(12)).pan(0.4).gain(0.26),
    note("c#1").s("square").slow(2).attack(2).release(8).lpf(200).vib(0.25).vibmod(0.4).crush(7).pan(0.6).gain(0.12)
  ).room(0.85),
  wake: stack(
    note("c#1").s("sine").slow(4).attack(4).release(12).gain(0.5),
    s("brown").slow(2).attack(4).release(8).lpf(sine.range(180, 650).slow(12)).pan(0.4).gain(0.22),
    note("<[c#3, e3, g#3, b3] [a2, c#3, e3, g#3]>/2").s("wt_pad")
      .attack(3).release(6)
      .lpf(sine.range(300, 1100).slow(16)).resonance(4)
      .pan(sine.range(0.35, 0.65).slow(24)).gain(0.3),
    note("g2").s("sine").slow(4).attack(6).release(12)
      .detune(sine.range(-14, 14).slow(20)).gain(0.16)
  ).room(0.9),
  drift: stack(
    note("c#1").s("sine").slow(4).attack(4).release(12).gain(0.46),
    note("<[c#3, e3, g#3, b3] [a2, c#3, e3, g#3]>/2").s("wt_pad")
      .attack(3).release(6).lpf(sine.range(400, 1200).slow(16))
      .pan(sine.range(0.35, 0.65).slow(24)).gain(0.28),
    note("<[0 2 4 6 7 4 2 0] [0 2 4 6 7 9 7 6] [0 2 4 6 7 4 2 0] [7 6 4 2 0 ~ ~ ~]>")
      .scale("C#5:minor").s("wt_pluck")
      .every(8, x => x.transpose(5))
      .lpf(sine.range(600, 2000).slow(8)).resonance(6)
      .delay(0.5).delaytime(0.375).delayfeedback(0.55)
      .pan(0.6).gain(0.3)
  ).room(0.8),
  surge: stack(
    note("c#1").s("sine").slow(4).attack(4).release(12).gain(0.44),
    note("g#1").s("wt_cello").slow(4).attack(6).release(12).lpf(420).pan(0.42).gain(0.22),
    note("<[c#3, e3, g#3, b3] [a2, c#3, e3, g#3] [f#2, a2, c#3, e3] [g#2, b#2, d#3]>/2")
      .s("wt_pad").attack(2.5).release(5)
      .lpf(sine.range(600, 1600).slow(16))
      .pan(sine.range(0.35, 0.65).slow(24)).gain(0.3),
    note("<[0 2 4 6 7 4 2 0] [5 7 9 11 12 9 7 5] [0 2 4 6 7 4 2 0] [12 11 9 7 6 4 2 0]>")
      .scale("C#5:minor").s("wt_pluck")
      .lpf(sine.range(800, 2400).slow(8)).resonance(6)
      .delay(0.5).delaytime(0.375).delayfeedback(0.55)
      .pan(0.6).gain(0.32)
  ).room(0.8),
  fade: stack(
    note("c#1").s("sine").slow(4).attack(4).release(14).gain(0.5),
    note("c#2").s("sine").slow(4).attack(6).release(14).detune(9).gain(0.22),
    note("<[0 ~ 2 ~ 4 ~ ~ ~] [7 ~ ~ ~ ~ ~ ~ ~] [4 ~ ~ 2 ~ ~ ~ ~] [0 ~ ~ ~ ~ ~ ~ ~]>")
      .scale("C#5:minor").s("wt_pluck")
      .lpf(1000).delay(0.6).delaytime(0.375).delayfeedback(0.6)
      .pan(0.6).gain(0.24)
  ).room(0.92)
})