Strudelify

The Grouch

Green Day

KeyA majorTempo176 bpm
0:00/0:00
// The Grouch — Green Day
// 176 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 4/4 at bar 1, 2/4 at bar 26, 4/4 at bar 26, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(176/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 pick · "Bass"
const bass = note(`<
  ~@4 A B C D E B C F G B C D H I J I K I J I L M N O N P N O Q R N O N P N O Q R S T S U S T S V W X B C F G B C D H I
  J I K I J I L M Y ~@2 Z N O Q R N O N P N O Q R Q R AA AB AC@2
>`.pickRestart({
  A: "~ e1 e2 e1 a1@2 a1 g1", B: "e1@2 e1!2 a1@2 a1 c#2", C: "d2@2 d2 a1 a1@2 a1 g1", D: "e2@2 e2 d2 g1 a1!3",
  E: "g1 a1!3 a1@2 a1 g1", F: "e1@2 e1!2 d2@2 d2 a1", G: "e1!4 a1@2 a1 g1", H: "g1 a1!3 f#1@2 f#1 e1",
  I: "d2@2 d2 a1 a1@2 a1!2", J: "e1!4 f#1@2 f#1 e1", K: "e2!2 d2 c#2 f#1@2 f#1 e1", L: "d#2 e2!7", M: "d#2 e2!5 d2!2",
  N: "a1@2 a1 g1 e1@2 e1!2", O: "a1@2 a1 c#2 d2@2 d2 a1", P: "d2@2 d2 a1 e1!4", Q: "a1@2 a1 g1 e2@2 e2 d2",
  R: "g1 a1!3 g1 a1!3", S: "f#1@2 f#1 e1 d2@2 d2 a1", T: "a1@2 a1!2 e1!4", U: "a1@2 a1!2 e2!2 d2 c#2",
  V: "a1@2 a1!2 d#2 e2!3", W: "e2!4 d#2 e2!3", X: "e2!2 d2!2 a1@2 a1 g1", Y: "a1 ~@3", Z: "~@5 e1 e2 e1",
  AA: "a1@2 a1 g1 e2@2 d2!2", AB: "d2!8", AC: "[a1@6 a1 ~]/2",
})).s("gm_electric_bass_pick").gain(0.54)

// chords · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@4 A B C D E B C F B@2 C D G H I H I H I H J K L M L N L M O P L M L N L M O P Q R Q R Q R Q S T U V W X Y Z AA AB AC
  AD AE AF AG AD AE AH J AI ~@4 L M O P L M L N L M O P O P AJ AK AL@2
>`.pickRestart({
  A: "~@4 [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // A5 Dsus4
  B: "[e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3] [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // E5 Dsus2 A5 Dsus4
  C: "[d3,a3,d4]@2 [d3,a3,d4] [d3,g3,b3] [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // D5 G A5 Dsus4
  D: "[e3,b3,e4]@2 [e3,b3,e4] [d3,g3,b3] [a2,e3,a3]@2 [a2,e3,a3]!2", // E5 G A5
  E: "[a2,e3,a3]@2 [a2,e3,a3]!2 [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // A5 Dsus4
  F: "[e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3] [d3,a3,d4]@2 [d3,a3,d4] [a2,d3,g3]", // E5 Dsus2 D5 Dsus4
  G: "[a2,e3,a3]@2 [a2,e3,a3]!2 [f#2,c#3,f#3]@2 [f#2,c#3,f#3] [e2,a2,d3]", // A5 F#5 Dsus2
  H: "[d3,a3,d4]@2 [d3,a3,d4] [a2,d3,g3] [a2,e3,a3]@2 [a2,e3,a3] [e2,a2,d3]", // D5 Dsus4 A5 Dsus2
  I: "[e2,b2,e3]!3 [e2,a2,d3] [f#2,c#3,f#3]@2 [f#2,c#3,f#3] [e2,a2,d3]", J: "[d#3,a#3,d#4] [e3,b3,e4]!7",
  K: "[d#3,a#3,d#4] [e3,b3,e4]!5 [d3,a3,d4] [a2,d3,g3]", // D#5 E5 D5 Dsus4
  L: "[a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3] [e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3]", // A5 Dsus4 E5 Dsus2
  M: "[a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3] [d3,a3,d4]@2 [d3,a3,d4] [d3,g3,b3]", // A5 Dsus4 D5 G
  N: "[d3,a3,d4]@2 [d3,a3,d4] [a2,d3,g3] [e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3]", // D5 Dsus4 E5 Dsus2
  O: "[a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3] [e3,b3,e4]@2 [e3,b3,e4] [d3,g3,b3]", // A5 Dsus4 E5 G
  P: "[a2,e3,a3]@2 [a2,e3,a3]!2 [a2,e3,a3]@2 [a2,e3,a3]!2", // A5
  Q: "[f#2,c#3,f#3]@2 [f#2,c#3,f#3] [e2,a2,d3] [d3,a3,d4]@2 [d3,a3,d4] [a2,d3,g3]", // F#5 Dsus2 D5 Dsus4
  R: "[a2,e3,a3]@2 [a2,e3,a3] [e2,a2,d3] [e2,b2,e3]!3 [e2,a2,d3]", // A5 Dsus2 E5 Dsus2
  S: "[a2,e3,a3]@2 [a2,e3,a3] [e2,a2,d3] [d#3,a#3,d#4] [e3,b3,e4]!3", T: "[e3,b3,e4]!4 [d#3,a#3,d#4] [e3,b3,e4]!3",
  U: "[e3,b3,e4]!2 [d3,a3,d4] [b2,d3,g3] e4@2 e4!2", V: "e4@2 e4!2 [e4,f#4]@2 [e4,f#4] e4", W: "e4@2 e4!2 e4@2 e4!2",
  X: "e4@2 e4!2 [d4,e4]@2 [d4,e4] e4", Y: "e4!4 [b3,e4] [c#4,e4] [c#4,e4]@2",
  Z: "[c#4,e4]!2 [b3,e4] [a3,e4] [c#4,e4]@2 [d4,e4]@2", AA: "[d4,e4] [a3,e4] [c#4,e4] [e4,f#4]",
  AB: "e4 [d4,e4] [b3,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]!2", // Dsus2 E5 A
  AC: "[a3,c#4,e4]@2 [a3,c#4,e4] [g3,b3,e4] [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4]!2", // A Em F#m
  AD: "[f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]!2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]!2", // D A
  AE: "[e3,g#3,b3,e4]@2 [e3,g#3,b3,e4]!2 [f#3,a3,c#4,f#4]!4", AF: "[f#3,a3,d4,f#4]!4 [e3,a3,c#4,e4]!3 [a3,c#4,e4]",
  AG: "[a3,e4,g#4] [a3,e4,a4]!3 [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4]!2", AH: "[f#3,a3,d4,f#4]!4 [e3,a3,c#4,e4]!4",
  AI: "[d#3,a#3,d#4] [e3,f#3,b3,e4,f#4]!3 [e3,g#3,b3,e4,g#4]!2 [d3,a3,d4,a4] [a2,d3,g3,a3,a4]", // D#5 Esus2 E D5 Dsus4
  AJ: "[a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3] [e3,b3,e4]@2 [d3,a3,d4]!2", AK: "[d3,a3,d4]!8",
  AL: "[[a2,e3,a3,c#4]@6 [a2,e3,a3] ~]/2", // A A5
})).s("gm_distortion_guitar").gain(0.54)

// chords · overdriven guitar · "Guitar Clean"
const overdriven_guitar = note("<A B C D E ~@64 F G F H ~@18>".pickRestart({
  A: "~@4 [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // A5 Dsus4
  B: "[e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3] [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // E5 Dsus2 A5 Dsus4
  C: "[d3,a3,d4]@2 [d3,a3,d4] [d3,g3,b3] [a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3]", // D5 G A5 Dsus4
  D: "[e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3] [d3,a3,d4]@2 [d3,a3,d4] [a2,d3,g3]", // E5 Dsus2 D5 Dsus4
  E: "[e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3] ~@4", // E5 Dsus2
  F: "[a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3] [e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3]", // A5 Dsus4 E5 Dsus2
  G: "[a2,e3,a3]@2 [a2,e3,a3] [a2,d3,g3] [d3,a3,d4]@2 [d3,a3,d4] [d3,g3,b3]", // A5 Dsus4 D5 G
  H: "[d3,a3,d4]@2 [d3,a3,d4] [a2,d3,g3] [e2,b2,e3]@2 [e2,b2,e3] [e2,a2,d3]", // D5 Dsus4 E5 Dsus2
})).s("gm_overdriven_guitar").gain(0.54).pan(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A B C B C B C B C B C D E B C B C B C B F G B H B H B H B H B H B H B H B I B H B H B H B J K A B C B C B C D E B
  C B L B C B F G ~@3 M B H B H B H B H B H B I B I B ~@3
>`.pickRestart({
  A: "~ x ~ x!2 ~@2 x", B: "x ~@2 x!2 ~@2 x", C: "x!2 ~ x!2 ~@2 x", D: "x ~@2 x!2 ~ x ~", E: "x ~ x!3 ~@2 x",
  F: "x ~@3 x!2 ~ x", G: "x ~@4 x ~ x", H: "x ~@2 x!3 ~ x", I: "x ~ x ~ x ~ x!2", J: "x ~@2 x!2 ~@3",
  K: "x!2 ~ x!2 ~@3", L: "x ~@3 x ~@2 x", M: "~@5 x ~ x",
})).gain(0.54)

// drums · rim
const rim = s("rim").struct("<~@3 [~@2 x!2] x ~@67 [x!3 ~] ~@18>").gain(0.54)

// drums · snare
const snare = s("sd").struct("<~@4 A@11 B C A@8 D A@15 E A@9 F A@6 B C A@8 D ~@3 C A@11 E A E G H I ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@8 x!2 ~", C: "~@3 x", D: "~ x!3", E: "~@5 x!2 ~@9", F: "x!2 ~ x", G: "~@2 x ~@3 x!2",
  H: "x!8", I: "x",
})).gain(0.54)

// drums · clap
const clap = s("cp").struct("<~@90 [~ x]>").gain(0.54)

// drums · low tom
const low_tom = s("lt").struct("<~@15 A B ~@24 C ~@16 A D ~@24 E ~ E ~ F ~@2>".pickRestart({
  A: "~@3 x", B: "x!3 ~ x!4 ~@8", C: "~@4 x ~@6 x!5", D: "~@3 x!5 ~@8", E: "~@4 x ~@3 x!3 ~ x!4", F: "x!8",
})).gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct("<~@41 [~@8 x!3 ~@5] ~@17 [x!3 ~@13] ~@31>").gain(0.54)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A B@2 C D B@2 C D B C E ~@8 F E F B@2 D F B@2 D F B@2 D F B D ~@8 A C A B@2 C D B@2 G ~@8 F E ~@4 F B@2 D F B@2 D
  F B D ~ D ~ E ~@3
>`.pickRestart({
  A: "~@3 x", B: "x!4", C: "x!2 ~ x", D: "~ x ~ x", E: "~ x ~@2", F: "~ x!3", G: "x!2 ~@2",
})).gain(0.54)

// drums · high tom
const high_tom = s("ht").struct("<~@90 [~ x]>").gain(0.54)

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

// drums · ride bell
const ride_bell = s("rd").struct("<~@16 A B C@2 D B C@2 ~@18 E C@2 F E C@2 G ~@9 H I C@2 D B C@2 ~@24>".pickRestart({
  A: "~@3 x", B: "x ~ x!6", C: "x!8", D: "x!2 ~@4 x ~", E: "~@2 x ~ x ~ x!2", F: "x!6 ~@2", G: "x!4 ~@4", H: "~@6 x!2",
  I: "x ~ x!3 ~ x!2",
})).gain(0.54)

stack(
  bass, distortion_guitar, overdriven_guitar, kick, rim, snare, clap, low_tom, mid_tom, open_hat, high_tom, crash,
  ride_bell
)

More by Green Day