Strudelify

Only Happy When It Rains

Garbage

KeyD♭ majorTempo120 bpm
0:00/0:00
// Only Happy When It Rains — Garbage
// 120 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 overdriven guitar (copy of ch 2 slap bass 1); ch 9 slap bass 1 (copy of ch 2 slap bass 1); ch 12 overdriven guitar (copy of ch 2 slap bass 1); ch 13 slap bass 1 (copy of ch 2 slap bass 1)
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · slap bass 1
const bass = note(`<
  ~@2 A B C D E F A B C D E F G@2 H I J K H I J K B L A B C D E F G@2 H I J G H I J G ~ A B C D E F A B C D E F G@2 H I
  J K H I J K H I J K H I J@2 K B L A B C D E F A C D M C D A C D M C D A C D M C D A C D M C D A C D M C D A C D A C D
  M
>`.pickRestart({
  A: "ab1@2 ab1@2 ab1 gb1 ab1 b1", B: "gb1@2 gb1@2 gb1!4", C: "e1@2 e1@2 e1 gb1 ab1 b1",
  D: "db2@2 db2@2 db2 b1 ab1 gb1", E: "e1@2 e1@2 e1!2 e2 e1", F: "gb1@2 gb1@2 gb1 db1 eb1 gb1", G: "b1@2 b1@2 b1!4",
  H: "db2@2 db2@2 db2!4", I: "ab1@2 ab1@2 ab1!4", J: "a1@2 a1@2 a1!4", K: "a1 b1 b1@2 b1!4", L: "gb1 ~@3",
  M: "ab1!3 gb1",
})).s("gm_slap_bass_1").gain(0.62).pan(1)

// chords · viola
const viola = note(`<
  ~@2 A B C A@2 B C B C A@2 B D E ~@10 A B C A@2 B F G H I@7 ~ J K L M L K J K L M L K N@2 O P Q R O P Q R O P Q R O P
  Q@2 R S T P S U V U S P U V P U V P U V P U V P U V P U V P U V P U V P U V P U V P U V P U V W
>`.pickRestart({
  A: "ab4!16", B: "[gb4,ab4] gb4!15", C: "[gb4,ab4] ab4!15", D: "[b3,gb4] b3!15", E: "[eb5,ab5], b3 ~@15",
  F: "[gb4,b4] b4!15", G: "[gb4,b4] gb4!15", H: "gb4 ~@7 db5!8", I: "~@8 db5!8", J: "[b4,ab5]!16", K: "[bb4,gb5]!16",
  L: "[ab4,e5]!16", M: "[ab4,db5]!16", N: "[b4,gb5]!16", O: "[f4,db5]!16", P: "[eb4,ab4]!16", Q: "[e4,a4]!16",
  R: "[gb4,b4]!16", S: "[db4,gb4]!16", T: "[db4,gb4] ~@15", U: "[b3,e4]!16", V: "[ab3,db4]!16", W: "[eb4,ab4]!13 ~@3",
})).s("gm_viola").gain(0.52)

// chords · pad choir
const pad_choir = note("<~@2 A B C D C E A B C D C E F ~@11 A B C D C E G@2 ~@85>".pickRestart({
  A: "[eb4,ab4,b4]", B: "[db4,gb4,bb4]", C: "[b3,e4,ab4]", D: "[e4,ab4,db5]", E: "[gb4,bb4,db5]", F: "[b3,gb4,b4]",
  G: "[eb4,gb4,b4]", // B
})).s("gm_pad_choir").gain(0.06)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@13 A B ~ C@2 D E C@2 D E F ~ G@4 H@2 I ~ J@8 ~@7 K@2 G@2 H@2 I ~ C@2 D E C@2 D E C@2 D E C@2 ~@4 L M@2 N@2 M N M@2 N
  M@2 N M@2 N M@2 N M@2 N M@2 N M@2 N M@2 N M@2 N M@2 N M@2 N M@2 N O
>`.pickRestart({
  A: "~@15 [b2,gb3]", B: "[b2,gb3,b3,eb4]", C: "~@2 ab3 eb4@2 db4@3", D: "~@2 a3 eb4@2 db4@3", E: "~@2 gb3 eb4@2 db4@3",
  F: "gb3", G: "[~@4 ab4 ab3@2 db4@3 ~@6]/2", H: "[~@4 ab4 ab3@2 db4@9]/2", I: "b3", J: "[eb4,ab4]",
  K: "[~@4 ab3@3 db4@3 ~@6]/2", L: "~ eb4@6 ab4", M: "ab4@2 ab4 eb4@4 ab4", N: "ab4@2 ab4 db4@4 ab4",
  O: "ab4@2 ab4 eb4@4 ~",
})).s("gm_distortion_guitar").gain(0.64).pan(1)

// other · slap bass 2
const slap_bass_2 = note("<~@38 A B@3 ~@23 A B@3 A B ~@48>".pickRestart({
  A: "f5 eb5 db5 b4@2 db5@2 db5", B: "e5 eb5 db5 b4@2 db5@2 db5",
})).s("gm_lead_8_bass_lead").gain(0.78).pan(0)

// other · overdriven guitar
const overdriven_guitar = note("<~@96 A B ~ C D ~ A B ~ C D@3 B D@2 B D@2 B D@2 B>".pickRestart({
  A: "~@4 ab3 ab4@2 db4", B: "db4", C: "~@4 ab3 ab4@2 gb4", D: "gb4",
})).s("gm_overdriven_guitar").gain(0.62)

// drums · kick
const kick = s("bd").struct("<~@2 A@22 B C A@7 B A@7 B ~ A@31 B C A@17 B A@11 B A@13>".pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x!2", C: "x",
})).gain(0.78)

// drums · snare
const snare = s("sd").struct("<~@2 A@13 B A@8 B C A@7 D A@7 D ~ A@13 B A@17 B C A@17 B A@11 B A@13>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "x", D: "~@2 x ~@2 x!3",
})).gain(0.78)

// drums · clap
const clap = s("cp").struct("<~@42 x ~@76>").gain(0.78)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@13 A ~@8 A@2 ~@7 A ~@7 A@2 ~@13 A ~@7 A ~@9 A@2 ~@5 A ~@11 A ~@11 A ~@12
>`.pickRestart({
  A: "x",
})).gain(0.78)

// drums · ride
const ride = s("rd").struct("<A@2 B@23 ~ B@16 ~ B@32 ~ B@12 C B@11 C B@11 C B@2 C B@2 D>".pickRestart({
  A: "x!8", B: "x!16", C: "~ x!15", D: "x!15 ~",
})).gain(0.78)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B C D A B A B A B A E A B A B A B A E D A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A C D A B A B A B A B A B A B A B A B A C A B A B A B A B A B A C A B A B A B A B A@2 B A
  B
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2", B: "x ~@2 x ~@2 x ~", C: "~@2 x ~@2 x!2 ~", D: "x", E: "x ~@2 x ~ x!3",
})).gain(2.04)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<A@2 B@14 C@9 D B@16 D B@14 C@18 D B@43>".pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x!16", D: "x",
})).gain(3.93)

// drums · shaker
const shaker = s("sh").struct("<~@2 [x!8]!23 x [x!8]!16 x [x!8]!32 x [x!8]!43>").gain(0.78)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B C D A B A B A B A E A B A B A B A E D A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A C D A B A B A B A B A B A B A B A B A C A B A B A B A B A B A C A B A B A B A B A@2 B A
  B
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2", B: "x ~@2 x ~@2 x ~", C: "~@2 x ~@2 x!2 ~", D: "x", E: "x ~@2 x ~ x!3",
})).gain(1.12)

stack(
  bass, viola, pad_choir, distortion_guitar, slap_bass_2, overdriven_guitar, kick, snare, clap, crash, ride, bongos,
  cabasa, shaker, woodblocks
)

More by Garbage