Strudelify

Special

Garbage

KeyE♭ majorTempo140 bpm
0:00/0:00
// Special — Garbage
// 140 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger
const bass = note(`<
  ~@4 A@2 B@2 A@2 B@2 C@2 D@2 C@2 D@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 D@2 E@2 F@2 E@2 F@2 G E H I ~@2 B@2 ~@2 B@2 J@2 D@2
  J@2 D@2 ~@8 C@2 D@2 C@2 D@2 E@2 F@2 E@2 F@2 E@2 K@2 L M H I N@2 B@2 N@2 B@2 N@2 B@2 N@2 B@2 N@2 B@2 N@2 B@2 N@2 B@2
  N@2 B@2
>`.pickRestart({
  A: "eb2@2 eb3@2 bb2 c3@2 eb3", B: "c2@2 c3@2 g2 bb2@2 c3", C: "f2@2 f3@2 c3 eb3@2 f3", D: "bb1@2 bb2@2 f2 ab2@2 bb2",
  E: "ab1!8", F: "bb1!8", G: "f1!8", H: "d2!6 c2!2", I: "bb1", J: "f1@2 f2@2 c2 eb2@2 f2", K: "c2!8", L: "f2!8",
  M: "eb2!8", N: "ab1@2 ab2@2 eb2 f2@2 ab2",
})).s("gm_electric_bass_finger").gain(0.64)

// other · pad new age
const pad_new_age = note("<~@7 A ~@3 A ~@11 A ~@3 A ~@100>".pickRestart({
  A: "g5 gb5 f5 e5 eb5 d5 db5 c5 b4 bb4 a4 ab4 g4 gb4 f4 e4",
})).s("gm_pad_new_age").gain(0.17)

// other · synth bass 2
const synth_bass_2 = note(`<
  A B C D ~@16 E@2 F@2 E@2 F@2 G@2 H@2 G@2 H@2 I@2 J@2 I@2 J@2 A B C D ~@2 F@2 ~@2 F@2 I@2 J@2 I@2 J@2 ~@2 K@2 ~@2 L@2
  G@2 H@2 G@2 H@2 I@2 J@2 I@2 J@2 M N O P M N C D Q@2 F@2 Q@2 F@2 Q@2 F@2 Q@2 F@2 Q@2 F@2 Q@2 F@2 Q@2 F@2 Q@2 F@2
>`.pickRestart({
  A: "~ [ab3,ab4] [bb3,bb4] ~ [ab3,ab4] [bb3,bb4] ~ [ab3,ab4], [f3,f4]@3 [f3,f4]@3 [f3,f4]@2", // Ab Bb Ab Bb Ab F
  B: "~ [ab3,ab4] [bb3,bb4] ~ [ab3,ab4] [bb3,bb4] ~ [ab3,ab4], [eb3,eb4]@3 [eb3,eb4]@3 [eb3,eb4]@2", // Ab Bb Ab Bb Ab Eb
  C: "~ [ab3,ab4] [bb3,bb4] ~ [ab3,ab4] [bb3,bb4] ~ [ab3,ab4], [d3,d4]@3 [d3,d4]@3 [c3,c4]@2", D: "[bb2,bb3,f4]",
  E: "eb4!8", F: "c4!8", G: "f4!8", H: "bb3!8", I: "ab3@2 c4 g4@3 f4@2", J: "bb3@2 d4 g4@3 f4@2",
  K: "[~@4 g3 a3 g3 bb3@2 f4@2 a3@2 bb3 g3@2]/2", L: "[~@4 g3 a3 g3 bb3@2 f4@2 a3@2 bb3 a3 g3]/2",
  M: "[ab2,ab3]@2 [c3,c4] [g3,g4]@3 [f3,f4]@2", N: "[f3,f4] [ab2,ab3] [f3,f4] [eb3,eb4]@3 ~@2",
  O: "[c3,c4]@2 [eb3,eb4] [g3,g4]@3 [f3,f4]@2", P: "[f3,f4] [c3,c4] [f3,f4] [eb3,eb4]@3 ~@2", Q: "ab3!8",
})).s("gm_synth_bass_2").gain(0.64)

// drums · kick
const kick = s("bd").struct("<~@4 x!44 ~@2 x!2 ~@2 x!74>").gain(0.64)

// drums · clap
const clap = s("cp").struct("<~@48 x ~@79>").gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A@7 B A@7 B A@7 B A@7 B A@7 B A@4 ~@2 A B ~@2 A B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@47 [~@8 x!8] x ~@79>").gain(0.64)

// drums · congas
const congas = s("conga:13").struct("<~@4 [~ x]!44 ~@2 [~ x]!2 ~@2 [~ x]!74>").gain(2.05)

// drums · congas
const congas_2 = s("conga:33").struct("<~@4 [~@9 x ~@6]!44 ~@2 [~@9 x ~@6]!2 ~@2 [~@9 x ~@6]!74>").gain(2.05)

// drums · ht
const ht = s("ht").struct(`<
  ~@4 A@7 B A@7 B A@7 B A@7 B A@7 B A@4 ~@2 A B ~@2 A B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2",
})).gain(0.64)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 [x!16]!44 ~@2 [x!16]!2 ~@2 [x!16]!74>").gain(3.24)

stack(bass, pad_new_age, synth_bass_2, kick, clap, snare, low_tom, congas, congas_2, ht, cabasa)

More by Garbage