Strudelify

I'm Only Happy When It Rains

Garbage

KeyB majorTempo108 bpm
0:00/0:00
// I'm Only Happy When It Rains — Garbage
// 108 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Piano Right" named as a piano, played on piano (its distortion guitar patch is not one); ch 2 "Piano Left" named as a piano, played on piano (its electric bass pick patch is not one)
// note: Full arrangement: all 118 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(108/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.

// chords · piano · "Piano Right"
const piano = note(`<
  A B@2 C D C E F G H I H J K L M@8 N O P@2 H Q H R S T U@8 V B@2 C D C E F G H I H J K L M@8 W@7 X@2 Y Z B@2 C D AA AB
  AC@36 AD
>`.pickRestart({
  A: "~@5 d4 c#4 b3", B: "[c#4@2 b3@2 c#4@2 b3@2 [g#3,b3,d#4]@15 ~ [f#3,a#3,c#4]@2 d4@2 c#4@2 b3@2]/2",
  C: "c#4@2 b3@2 c#4@2 b3@2 [e3,g#3,d#4]@3 ~ g#3@2 b3@2", D: "~@2 c#4@5 ~ [e3,g#3,c#4]@2 d#4@2 c#4@2 b3@2",
  E: "~@2 c#4@5 ~ [f#3,a#3,c#4]@2 d#4@2 c#4@2 b3@2", F: "c#4@2 b3@2 c#4@2 b3@2 [g#3,b3]@7 ~",
  G: "g#3@7 ~ [f#3,a#3,c#4]@2 d#4@2 c#4@2 b3@2", H: "c#4@2 b3@2 c#4@2 b3@2 d4@3 ~ d4@3 ~, ~@8 [e3,g#3]@7 ~",
  I: "c#4@2 b3@5 ~@3 b3@2 c#4@2 b3@2, ~ [e3,g#3]", J: "c#4@2 b3@5 ~ [f#3,a#3,c#4]@2 d#4@2 c#4@2 b3@2",
  K: "c#4@2 b3@2 c#4@2 b3@2 [f#3,b3,d#4]@7 ~", L: "b3@7 ~ [f#3,b3,d#4]@3 ~ [f#3,b3,d#4]@3 ~",
  M: "[[f#3,b3,d#4]@2 [f#3,b3,d#4]@2 [f#3,b3,d#4]@3 ~ [g#3,c#4,f4]@11 ~ [g#3,c#4,f4]@3 ~ [g#3,b3,d#4]@2 c#4@2 b3@2 f4@5 ~@5 [a3,c#4]@3 ~ [a3,c#4,e4]@7 ~ [a3,c#4,e4]@3 ~ [f#3,b3,d#4]@2 c#4@2 b3@2 f4@5 ~ c#4@3 ~ a#3@2 g#3@2 [g#3,c#4,f4]@7 ~ [g#3,c#4,f4]@3 ~ [g#3,b3,d#4]@2 c#4@2 b3@2 f4@5 ~@5 [a3,c#4]@3 ~ [a3,c#4,e4]@7 ~ [a3,c#4,e4]@3 ~ [f#3,b3,d#4]@2 c#4@2 b3@2 f4@2]/8", // B C# G#m A B C# G#m A …
  N: "~@4 c#4@3 ~ a#3@2 g#3@2 ~@4",
  O: "[f#3,a#3,c#4]@2 [f#3,a#3,c#4]@2 [f#3,a#3,c#4]@3 ~ [f#3,a#3,c#4]@2 d4@2 c#4@2 b3@2", // F#
  P: "[c#4@2 b3@2 c#4@2 b3@2 [g#3,b3,d#4]@15 ~ [f#3,a#3,c#4]@2 b3@2 c#4@2 b3@2]/2", // G#m F#
  Q: "c#4@2 b3@5 ~ [e3,g#3,c#4]@2 d4@2 c#4@2 b3@2", R: "c#4@2 b3@5 ~ [f#3,a#3,c#4]@2 d4@2 c#4@2 b3@2",
  S: "c#4@2 b3@2 c#4@2 b3@2 b3@7 ~", T: "[f#3,b3,d#4]@7 ~ [f#3,b3,d#4]@3 ~ [f#3,b3,d#4]@3 ~",
  U: "[[f#3,b3,d#4]@2 [f#3,b3,d#4]@2 [f#3,b3,d#4]@3 ~ f#4@2 g#4@2 a4@2 g#4@4 [g#4,c#5]@5 ~ f#4@2 g#4@2 a4@2 g#4@4 [g#4,b4,d#5]@5 ~ f#4@2 g#4@2 a4@2 g#4@4 [a4,c#5,e5]@5 ~ f#4@2 g#4@2 a4@2 g#4@4 [b4,d#5,g#5]@5 ~ f#4@2 g#4@2 a4@2 g#4@4 [g#4,c#5]@5 ~ f#4@2 g#4@2 a4@2 g#4@4 [g#4,b4,d#5]@5 ~ f#4@2 g#4@2 a4@2 g#4@4 [a4,c#5,e5]@5 ~ f#4@2 g#4@2 a4@2 g#4@2, ~ c#4 ~ c#4 ~ c#4 ~ c#4 ~ c#4 ~ c#4 ~ c#4 ~ c#4]/8", // B C#5 G#m A G#m C#5 G#m A
  V: "~@2 [b4,d#5,g#5]@5 ~@3 d4@2 c#4@2 b3@2", // G#m
  W: "[~@4 c#4@3 ~ a#3@2 g#3@2 [g#3,c#4,f4]@7 ~ [g#3,c#4,f4]@3 ~ [g#3,b3,d#4]@2 c#4@2 b3@2 f4@5 ~@5 [a3,c#4]@3 ~ [a3,c#4,e4]@7 ~ [a3,c#4,e4]@3 ~ [f#3,b3,d#4]@2 c#4@2 b3@2 f4@5 ~ c#4@3 ~ a#3@2 g#3@2 [g#3,c#4,f4]@7 ~ [g#3,c#4,f4]@3 ~ [g#3,b3,d#4]@2 c#4@2 b3@2 f4@5 ~@5 [a3,c#4]@2 d#4@3 ~ c#4@2]/7", // C# G#m A B C# G#m A
  X: "[~@2 b3@3 ~ a3@3 ~ b3@3 ~ [a3,c#4]@5 ~ [a3,c#4,e4]@3 ~ [f#3,b3,d#4]@2 c#4@3 ~ b3@2]/2", // A B
  Y: "~@2 c#4@3 ~ d#4@2 [f#3,a#3,c#4]@7 ~", Z: "[f#3,a#3,c#4]!5 d4 c#4 b3",
  AA: "c#4@2 b3@2 c#4@2 b3@2 [e3,g#3,d#4]@3 ~ d#4@2 c#4@2", AB: "~@2 b3@5 ~@3 f#4@2 f#4@2 f#4@2, ~ [f#3,a#3]",
  AC: "[f#4@2 e4@2 e4@2 d#4@2 [g#3,b3,e4]@2 d#4@2 [g#3,b3]@7 ~ [g#3,b3]@3 ~ a#3@2 g#3@2 f#3@2 [e3,g#3,b3]@5 ~ a#3@3 ~ a#3@2 [g#3,f#4]@2 f#4@2 f#4@2]/3", // E G#m E G#7
  AD: "f#4 e4!2 d#4 [g#3,b3,e4] d#4 ~@2", // E
})).s("gm_piano").gain(0.22)

// other · piano · "Piano Left"
const piano_2 = note(`<
  ~ A B C D E F G B H D E I J K L M N O L M N O P Q A B C D E F J R L M N O L M N O S A B C D E F G B H D E I J K L M N
  O L M N O L M N O L M N T O P Q A B C D E F U V D W V D W V D W V D W V D W V D W V D W V D W V D W V D W V D W V D X
>`.pickRestart({
  A: "~@8 g#2@3 ~ g#2@3 ~", B: "g#2@2 f#2@2 g#2@2 b2@2 f#2@3 ~ f#2@3 ~", C: "f#2@2 f#2@2 g#2@2 f#2@2 e2@3 ~ e2@3 ~",
  D: "e2@2 f#2@2 g#2@2 b2@2 c#3@3 ~ c#3@3 ~", E: "c#3@2 b2@2 g#2@2 f#2@2 e2@3 ~ e2@3 ~",
  F: "e2@2 e2@2 f#2@2 e2@2 f#2@3 ~ f#2@3 ~", G: "f#2@2 e2@2 f#2@2 g#2@2 g#2@3 ~ g#2@3 ~",
  H: "f#2@2 e2@2 f#2@2 g#2@2 e2@3 ~ e2@3 ~", I: "e2@2 g#2@2 b2@2 g#2@2 f#2@3 ~ f#2@3 ~",
  J: "f#2@2 e2@2 f#2@2 g#2@2 b2@3 ~ b2@3 ~", K: "b2@2 b2@2 b2@3 ~ b2@3 ~ b2@3 ~",
  L: "b2@2 b2@2 b2@2 b2@2 c#3@3 ~ c#3@3 ~", M: "c#3@2 c#3@2 c#3@2 c#3@2 g#2@3 ~ g#2@3 ~",
  N: "g#2@2 g#2@2 g#2@2 g#2@2 a2@3 ~ a2@3 ~", O: "a2@2 a2@2 a2@2 a2@2 b2@3 ~ b2@3 ~",
  P: "b2@2 b2@2 b2@2 b2@2 f#2@3 ~ f#2@3 ~", Q: "f#2@2 f#2@2 f#2@2 f#2@2 f#2@3 ~@5",
  R: "b2@2 b2@2 b2@2 b2@2 b2@3 ~ b2@3 ~", S: "b2@2 b2@2 b2@2 b2@2 b2@3 ~@5", T: "a2@2 a2@2 a2@2 a2@2 a2@3 ~ a2@3 ~",
  U: "f#2@2 f#2@2 g#2@2 f#2@2 g#2@3 ~ g#2@3 ~", V: "g#2@2 f#2@2 g#2@2 b2@2 e2@3 ~ e2@3 ~",
  W: "c#3@2 b2@2 g#2@2 f#2@2 g#2@3 ~ g#2@3 ~", X: "c#3 b2 g#2 f#2 g#2 f#2 ~@2",
})).s("gm_piano").gain(0.45)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<[x ~@3 x ~@2 x ~@8] ~@117>").gain(1.04)

stack(piano, piano_2, woodblocks)

More by Garbage