Strudelify
Sunday cover art

Everybody Else Is Doing It, So Why Can't We?

Sunday

The Cranberries

KeyE minorTempo107 bpm
0:00/0:00
// Sunday — The Cranberries
// 107 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 30.
setcpm(107/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, A@4 for four bars: edit a riff to change every repeat.

// chords · pad poly
const pad_poly = note(`<
  ~@14 A@2 B@2 C@2 D@3 E F@4 G@2 ~@3 H@4 I J@3 K@4 I L@3 ~@9 M@2 N@2 O P Q R S@4 I T@3 U V W@2 X@2 Y@2 ~@11
>`.pickRestart({
  A: "[~@8 a4@20 a4@3 ~]/2", B: "[c5@3 ~ e5@17 ~@4 b4@7]/2", C: "[~ c5@3 ~ c5@2 a4@15 ~@4 a4@3 ~ g4@2]/2",
  D: "[~@2 g4@3 ~ e5@35 ~@7]/3", E: "~@12 a4@3 ~",
  F: "[c5@2 c5@4 d5@2 d5@2 e5@12 ~@3 c5@2 c5@2 b4@5 ~ c5@4 d5@3 ~ a4@12 ~@3 g4@2 a4@2 a4@2]/4",
  G: "[~@2 g4@3 ~ g4@3 ~ e5@20 ~@2]/2",
  H: "[~@6 e5@2 f5 e5@2 d5@2 e5 [g4,b4,e5]@7 ~ e5@2 f5 e5@2 d5@2 e5 [a4,b4,e5]@7 ~ d5@2 f5 e5@2 d5@2 e5@2 e5@3 f5 e5@3 e5!2 f5@2 e5 d5@2 e5@2 ~, ~@47 [g4,b4]@7 ~@10]/4", // Em Asus2 G
  I: "[f4,a4,c5]@5 ~ g4@2 a4@2 c5 c5@3 d5@2", // F
  J: "[[g4,c5,e5]@5 ~ d5@2 e5@2 [d5,g5] g5@3 a4@7 ~ c5@2 c5@2 c5 d5 c5@2 [e4,g4,c5]@12 ~@2 d5@2 c5@2]/3", // C G5 C
  K: "[e5@5 ~ e5@2 f5 e5@2 d5@2 e5 [g4,b4,e5]@7 ~ e5@2 f5 e5@2 d5@2 e5 [a4,b4,e5]@7 ~ d5@2 f5 e5@2 d5@2 e5@2 e5@3 f5 e5@3 e5!2 f5@2 e5 d5@2 e5@2 ~, ~@47 [g4,b4]@7 ~@10]/4", // Em Asus2 G
  L: "[[g4,c5,e5]@5 ~ d5@2 e5@2 [d5,g5] g5@3 a4@7 ~ c5@2 c5@2 c5 d5 c5@2 [e4,g4,c5]@7 ~ c5@5 ~@5]/3", // C G5 C
  M: "[~@6 e5!2 f5 e5@2 d5@2 e5 ~@2 [g4,b4]@5 ~ e5@2 d5@3 ~ e5@2 g5@2, ~@14 e5@7 ~@11]/2", // G
  N: "[[a4,b4,e5]@3 ~@3 e5!2 f5 e5@2 d5@2 e5 ~@2 [g4,b4]@5 ~ e5@2 d5@3 ~ e5@2 g5@2, ~@14 e5@7 ~@11]/2", // Asus2 G
  O: "[a4,b4,e5]@5 ~ e5@2 f5 e5@2 d5@2 e5@2 ~", P: "[e4,g4,c5]@5 ~ g4@2 a4 g4@2 a4@2 g4@2 ~",
  Q: "d5@2 e5@5 ~ f5@2 e5 d5@2 e5@2 ~", R: "[e4,g4,c5]@5 ~ d5 c5",
  S: "[e5@3 ~@3 e5@2 f5 e5@2 d5@2 e5 [g4,b4,e5]@7 ~ e5@2 f5 e5@2 d5@2 e5 [a4,b4,e5]@7 ~ d5@2 f5 e5@2 d5@2 e5@2 e5@3 f5 e5@3 e5!2 f5@2 e5 d5@2 e5@2 ~, ~@47 [g4,b4]@7 ~@10]/4", // Em Asus2 G
  T: "[[g4,c5,e5]@5 ~ d5@2 e5@2 [d5,g5] g5@3 a4@7 ~ c5@2 c5@2 c5 d5 c5@2 [e4,g4,c5]@17 ~]/3", U: "[e4,a4]@5 a4 c5 d5",
  V: "[g4,b4,e5]@6 ~@2 b4@3 ~ c5@2 c5@2", W: "[[e4,a4]@6 ~@2 a4@2 g4@2 g4@2 ~@2 [g4,b4]@10 b4@5 ~, ~@7 e5@6 ~@3]/2",
  X: "[[a4,c5,e5]@6 ~@2 a4@2 c5 c5@2 d5 ~@2 [g4,c5]@5 ~ c5!2 b4@2 ~ c5@2 d5@2 ~, ~@14 e5@7 ~@11]/2", // Am C5
  Y: "[[f4,a4]@5 ~ g4!2 a4@2 g4@2 g4@2 ~@2 [g4,c5]@15 ~, ~@14 e5@17 ~]/2", // F C5
})).s("gm_pad_poly").gain(0.48)

// chords · pad poly · soft notes
const pad_poly_soft = note("<~@37 A B@3 ~@4 A C@3 ~@21 A D@3 ~@19>".pickRestart({
  A: "~@6 c5@2 d5@2 e5 e5@3 f5@2", B: "[g5@5 ~ g5@2 a5@2 ~ c6@3 f5@7 ~ f5@2 f5@2 f5 g5 f5@2 e5@12 ~@6]/3",
  C: "[g5@5 ~ g5@2 a5@2 ~ c6@3 f5@7 ~ f5@2 f5@2 f5 g5 f5@2 e5@7 ~@11]/3",
  D: "[g5@5 ~ g5@2 a5@2 ~ c6@3 f5@7 ~ f5@2 f5@2 f5 g5 f5@2 e5@17 ~]/3",
})).s("gm_pad_poly").gain(0.16)

// other · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B@2 C@3 D E@3 F@2 G H I J K L M@3 H N O P Q R S@3 T ~@3 U ~@2 V ~@3 U ~@3 V ~@18 V ~ U ~@3 V ~@3 U ~@18
>`.pickRestart({
  A: "~@5 e4@2 b3@2 f#3@2 e4@2 ~ b3@2", B: "[f#3 e4 b3 f#3 e4@2 b3 e4@2 ~@2 e4 b3 f#3 e4 b3]/2",
  C: "[~ f#3@2 e4@2 b3@2 f#3@2 e4@4 b3@2 e4@4 ~@4 e4@2 b3@2 f#3@2 e4@2 b3@2 f#3@2 e4@2 ~ b3@2 f#3@2 e4@4 b3@2]/3",
  D: "e4@2 ~@2 e4 b3 f#3 e4",
  E: "[b3@2 f#3@2 e4@2 b3@2 ~ f#3@2 e4@4 b3@2 e4@4 ~@4 e4@2 b3@2 f#3@2 e4@2 b3@2 f#3@2 e4@2 b3@2 f#3@2 ~ e4@4]/3",
  F: "[b3@2 e4@4 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4@2]/2", G: "f4@3 f4 f4@3 e4 e4@3 e4 e4@3 e4",
  H: "e4@3 e4 e4@3 e4 e4@3 e4 e4@3 e4", I: "e4@3 ~ e4 e4@3 f4 f4@3 f4 f4@3", J: "f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3",
  K: "f4 f4@3 f4 f4@3 ~ e4 e4@3 e4 e4@2", L: "~ e4 e4@3 e4 e4@3 e4 e4@3 e4 e4@2",
  M: "[~ e4 e4@3 e4 e4@3 f4@2 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 e4 e4@3 ~ e4]/3",
  N: "e4@3 e4 e4@3 e4 e4@3 f4 f4@3 f4", O: "f4@3 ~ f4 f4@3 f4 f4@3 f4 f4@3", P: "f4 f4@3 f4 f4@3 f4 f4@3 e4 e4@3",
  Q: "e4 e4@3 e4@2 e4@3 e4 e4@3 e4 e4@2", R: "~ e4 e4@3 e4 e4@3 e4 e4@3 f4 f4@2",
  S: "[~ f4 f4@3 f4 f4@3 ~ f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 f4 f4@3 e4 e4@3 e4 e4@3 e4 e4@3 e4 e4@3 ~ e4]/3",
  T: "e4@3 e4 e4@3 e4 e4@3 e4 e4@3 ~", U: "[e4,g4]", V: "e4",
})).s("gm_acoustic_guitar_steel").gain(0.22)

// chords · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  A ~ B@2 C@2 D@2 E@2 ~@22 F@3 ~ G@2 ~@2 G@2 ~@2 G@2 ~@17 G@4 ~@2 G@2 ~@2 G@2 ~@18
>`.pickRestart({
  A: "~ [b3,d#4,f#4]@7, ~ f#3@15", B: "[~ [c#4,e4]@8 ~@7]/2", C: "[~@3 [b3,g4]@16 ~@13]/2", D: "[~ [c#4,e4]@4 ~@3]/2",
  E: "[~@5 [b3,g4]@16 ~@11]/2", F: "[~@8 [f3,a3,b3,e4]@7 b3@8 ~, ~@7 [f2,c3]@8 ~@9]/3", G: "[~@7 b3@8 ~]/2",
})).s("gm_acoustic_guitar_steel").gain(0.25)

// chords · acoustic guitar steel
const acoustic_guitar_steel_3 = note(`<
  ~@33 A B A B C D C B A B A B C D C B C E F E F E F E F G B A B A B G B A B A B C D C B A B A B A D C D C E F E F E F E
  F H@2
>`.pickRestart({
  A: "[f3,a3,b3,e4]@2 [f3,a3,b3,e4]!2 [f3,a3,b3,e4]@2 ~ [f3,a3,b3,e4]@2 [f3,a3,b3,e4]!3 [f3,a3,b3,e4]@2 [f3,a3,b3,e4]@2", // Fmaj7
  B: "[e3,g3,b3,e4]@2 [e3,g3,b3,e4]!2 [e3,g3,b3,e4]@2 ~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4]!3 [e3,g3,b3,e4]@2 [e3,g3,b3,e4]@2", // Em
  C: "[f3,a3,c4,f4]@2 [f3,a3,c4,f4]!2 [f3,a3,c4,f4]@2 ~ [f3,a3,c4,f4]@2 [f3,a3,c4,f4]!3 [f3,a3,c4,f4]@2 [f3,a3,c4,f4]@2", // F
  D: "[e3,g3,c4,e4]@2 [e3,g3,c4,e4]!2 [e3,g3,c4,e4]@2 ~ [e3,g3,c4,e4]@2 [e3,g3,c4,e4]!3 [e3,g3,c4,e4]@2 [e3,g3,c4,e4]@2", // C
  E: "[e3,g#3,b3,e4]@2 [e3,g#3,b3,e4]!2 [e3,g#3,b3,e4]@2 ~ [e3,g#3,b3,e4]@2 [e3,g#3,b3,e4]!3 [e3,g#3,b3,e4]@2 [e3,g#3,b3,e4]@2", // E
  F: "[e3,a3,c4,e4]@2 [e3,a3,c4,e4]!2 [e3,a3,c4,e4]@2 ~ [e3,a3,c4,e4]@2 [e3,a3,c4,e4]!3 [e3,a3,c4,e4]@2 [e3,a3,c4,e4]@2", // Am
  G: "[f3,a3,c4,e4]@2 [f3,a3,c4,e4]!2 [f3,a3,c4,e4]@2 ~ [f3,a3,c4,e4]@2 [f3,a3,c4,e4]!3 [f3,a3,c4,e4]@2 [f3,a3,c4,e4]@2", // Fmaj7
  H: "[~ e4@28 ~@3, [e3,g#3,b3]@7 ~]/2", // E
})).s("gm_acoustic_guitar_steel").gain(0.19)

// other · violin
const violin = note("<~ A@5 B@2 C@4 D@8 E@2 F@2 G@7 ~@50 H I J K L M L M L N O@2>".pickRestart({
  A: "[~@2 d#5@16 c#5@16 ~ c#5@6 b4@6 c#5@4 b4@16 b4@6 ~ a4@6]/5", B: "[b4@4 c#5@16 c#5@6 ~ d5@5]/2",
  C: "[~ c#5@4 b4@16 b4@6 ~ a4@6 b4@4 c5@16 c5@6 b4@4]/4",
  D: "[~@3 c5@4 g4@29 a4@4 c5@16 c5@6 b4@6 c5@4 ~ g4@28 a4@4 c5@16 ~ c5@6]/8", E: "[b4@6 c5@4 g4@16 ~ c5@5]/2",
  F: "[~ d5@6 e5@4 f5@16 ~ f5@4]/2", G: "[~@2 e5@6 d5@4 e5@16 ~ e5@6 d5@6 e5@4 f5@16 ~ f5@6 e5@6 d5@4 e5@25 ~@9]/7",
  H: "c5@11 d5@2 e5@3", I: "f5@3 e5@2 d5@3 f5@3 e5@2 d5@3", J: "f5 e5@3", K: "b5@3 a5 a5@4",
  L: "b5@6 b5@2 b5@2 b5!2 b5@2 b5!2", M: "b5 c6 a5@2 a5 g5 a5 b5", N: "b5@2 c6@2 a5@4 a5@3 g5@2 a5@3", O: "[b5@3 ~]/2",
})).s("gm_violin").gain(0.14)

// chords · synth strings 2
const synth_strings_2 = note("<~@12 A@2 B@4 C@4 D@4 E@7 ~@60>".pickRestart({
  A: "[~@7 [g4,c5,e5]@25]/2", B: "[~@8 [f4,a4,c5,e5]@33 [g4,c5,e5]@23]/4", C: "[~@9 [f4,a4,c5,e5]@33 [g4,c5,e5]@22]/4",
  D: "[~@11 [f4,a4,c5,f5]@33 [g3,g4,c5]@20]/4", E: "[~@13 [g3,f4,a4,c5]@33 [g4,c5,e5]@33 [f4,a4,c5,e5]@29 ~@4]/7",
})).s("gm_synth_strings_2").gain(0.25)

// chords · pizzicato strings
const pizzicato_strings = note("<~@49 A B C B C B C B C D ~@34>".pickRestart({
  A: "[f4,a4,c5]@4 [f4,a4,c5]@2 ~ [f4,a4,c5] ~ [f4,a4,c5] [f4,a4,c5]@2 [f4,a4,c5]@4", // F
  B: "[e4,g#4,b4]@4 [e4,g#4,b4]@2 ~ [e4,g#4,b4] ~ [e4,g#4,b4] [e4,g#4,b4]@2 [e4,g#4,b4]@2 [e4,g#4,b4]@2", // E
  C: "[a4,c5,e5]@4 [a4,c5,e5]@2 ~ [a4,c5,e5] ~ [a4,c5,e5] [a4,c5,e5]@2 [a4,c5,e5]@2 [g4,b4,d5]@2", D: "[e4,a4,c5] ~@3",
})).s("gm_pizzicato_strings").gain(0.4)

// bass · fretless bass
const bass = note("<~@21 A@3 ~ B C@2 ~ D@3 ~@18 E F E F E F E F ~@20 G H G I ~ E F E F E F E J@3>".pickRestart({
  A: "[~@11 f3@4 e3@2 f3@4 e3@2 f3@2 e3@2 c3@16 ~@5]/3", B: "~@7 e3@2 f3@2 e3@2 f3@3",
  C: "[~ e3@2 f3@4 e3@2 f3@2 e3@2 c3@16 ~@3]/2", D: "[~@15 f3@4 e3@2 f3@4 e3@2 f3@2 e3@2 c3@16 ~]/3",
  E: "e3@3 d3@3 c3@2 c3@2 ~ c3@3 c3@2", F: "a2@15 ~", G: "f3@2 e3 f3@2 e3 f3 e3", H: "c3@3 c3 b2 c3 d3 e3", I: "c3",
  J: "[a2@12 a2@31 ~@5]/3",
})).s("gm_fretless_bass").gain(0.45).pan(1)

// bass · fretless bass
const bass_2 = note(`<
  A B@2 C@2 D@7 E@2 F@4 G@2 H@2 I@2 J@2 K@7 L M L M L M L N L M L M L M L N O P Q P Q P Q P Q R M L M L M L S L M L M L
  M L T L M L M L M L N L P U P U P U P U V@2
>`.pickRestart({
  A: "~ b1@15", B: "[~ b1@2 b1 c#2@2 b1@3 a1@7]/2", C: "[~@2 a1@4 ~ a1@2 b1@4 a1@6 g1@13]/2",
  D: "[~@3 g1@4 ~@2 a1@4 ~ g1@6 a1@16 a1@4 a1@2 b1@4 ~ a1@6 g1@16 g1@4 ~@2 a1@4 g1@6 ~ f1@26, ~@4 g1 ~@32 g1 ~@18]/7",
  E: "[~@3 f1@4 c2@25]/2", F: "[~@3 c2 ~@4 f1@29 f1@4 c2@23]/4", G: "[~@5 c2 ~@3 f1@23]/2", H: "[~@3 f1@2 c2@11]/2",
  I: "[~@7 c2 ~@3 f1@21]/2", J: "[~@2 f1 c2@5]/2", K: "[~@9 c2 ~@3 f1@29 f1@4 c2@29 c2 ~@3 f1@33]/7",
  L: "f1@4 f1@3 f1@3 f1@2 g1@2 g1@2", M: "c2@4 c2@3 c2@3 c2@2 d2@2 d2@2", N: "c2@3 c2@3 c2@2 c2@3 c2 d2@2 c2@2",
  O: "f1@4 f1@3 f1@3 f1@2 g1@2 f1@2", P: "e1@4 e1@3 e1@3 e1@2 e1@2 e1@2", Q: "a1@4 a1@3 a1@3 a1@2 a1@2 g1@2",
  R: "f1@6 f1@2 f1@3 f1 g1@2 g1@2", S: "c2@3 c2@3 c2@2 c2@3 c2 d2@4", T: "c2@7 g2@2 f2@3 e2@2 d2@2",
  U: "a1@4 a1@3 a1@3 a1@2 a1@2 a1@2", V: "e1/2",
})).s("gm_fretless_bass").gain(0.4)

// other · tremolo strings
const tremolo_strings = note("<~@49 A B C D C D C D C E F G@2 ~@19 H I J K L M L M L N O@2>".pickRestart({
  A: "c5 ~@3 c5 ~@2 c5 ~ c5!2 ~ c5 ~@3", B: "b4 ~@2 a#4 b4 ~@2 a#4 b4@4 ~@4", C: "e5 ~@3 e5 ~@2 e5 ~ e5!2 ~ e5 ~ d5 ~",
  D: "c5 ~@3 c5 ~@3 c5@4 ~@4, ~@3 b4@2 ~@2 b4@2 ~@7", E: "c5@6 a4@2 b4@3 c5@3 a4@2", F: "b4@3 c5@3 a4@2 b4@3 c5@5",
  G: "[d5@3 e5@6 ~@7]/2", H: "c5@11 d5@2 e5@3", I: "f5@3 e5@2 d5@3 f5@3 e5@2 d5@3", J: "f5 e5@3", K: "b5@3 a5 a5@4",
  L: "b5@6 b5@2 b5@2 b5!2 b5@2 b5!2", M: "b5 c6 a5@2 a5 g5 a5 b5", N: "b5@2 c6@2 a5@4 a5@3 g5@2 a5@3", O: "[b5@3 ~]/2",
})).s("gm_tremolo_strings").gain(0.4)

// other · guitar harmonics
const guitar_harmonics = note(`<
  ~@41
  [e3 ~@3 d3 ~@2 e3 ~ e3 ~ e3!2 ~ c4 ~]!8
  ~@25
  [e3 ~@3 d3 ~@2 e3 ~ e3 ~ e3!2 ~ c4 ~]!8
  ~@11
>`).s("gm_guitar_harmonics").gain(0.22)

// chords · distortion guitar
const distortion_guitar = note("<~@82 A ~@7 B@2 ~>".pickRestart({
  A: "~ f4@15", B: "[~@6 [g#3,b3] [g#3,b3]@8 ~]/2",
})).s("gm_distortion_guitar").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@33 A B A B A B A B A B A B A B A C A D A D A D A D A@2 B A@3 B A E A B A B A B A C A B A B A B A F A D A D A D A D A
  F ~
>`.pickRestart({
  A: "x ~@4 x ~ x", B: "x ~@6 x ~@2 x ~@3 x ~", C: "x ~@2 x!2 ~@3", D: "x ~@4 x ~@2", E: "x ~@2 x!3 ~ x", F: "x",
})).gain(0.14)

// drums · snare
const snare = s("sd").struct(`<
  ~@33 A@15 B A C D C D C D C D A@3 E A@3 F A@3 E A@3 G A@3 E A@3 G A E A E A E A E A ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@7 x ~@4", C: "~@4 x ~@6 x!2 ~ x ~", D: "x!2 ~ x", E: "~@4 x ~@6 x!2 ~@3",
  F: "~@3 x ~@7 x!2 ~@3", G: "~@3 x ~@6 x!2 ~@4",
})).gain(0.16)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@48 A ~ B ~ B ~ B ~ B ~@16 C ~@9 D ~ D ~ D ~ D ~@3>".pickRestart({
  A: "~@5 x ~@2", B: "~@13 x ~@2", C: "~@7 x", D: "~@13 x!3",
})).gain(0.09)

// drums · low tom
const low_tom = s("lt").struct("<~@52 A ~@3 A ~@25 A ~@2 A ~@3 A ~@3>".pickRestart({
  A: "x",
})).gain(0.17)

// drums · hihat
const hihat = s("hh").struct("<~@91 x ~>").gain(0.14)

// drums · open hat
const open_hat = s("oh").struct("<~@33 [x ~ x ~ x ~ x!7 ~ x ~]!58 x ~>").gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct("<~@48 A ~@2 B ~@3 B ~@25 A ~@2 B ~@3 B ~@4>".pickRestart({
  A: "~@14 x!2", B: "~@7 x",
})).gain(0.17)

// drums · high tom
const high_tom = s("ht").struct("<~@53 A ~@3 A ~@28 A ~@3 A ~@2>".pickRestart({
  A: "~@7 x",
})).gain(0.17)

// drums · ride
const ride = s("rd").struct("<A B@3 C@2 D@2 E@2 F@2 G@2 ~ H@3 I@2 J@2 K@2 L@2 M@2 N@3 ~@62>".pickRestart({
  A: "~@9 x ~@6", B: "~@5 x ~@2", C: "~@11 x ~@4", D: "~@3 x", E: "~@13 x ~@2", F: "~@7 x", G: "~@15 x", H: "x",
  I: "~ x ~@14", J: "~ x ~@6", K: "~@3 x ~@12", L: "~ x ~@2", M: "~@5 x ~@10", N: "~@3 x ~@4",
})).gain(0.1)

// … 42 more lines

More by The Cranberries