Strudelify
KeyB minorTempo103 bpm
0:00/0:00
// How — The Cranberries
// 103 bpm, 6/8, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (6/8 at bar 1, 9/8 at bar 38, 6/8 at bar 40, 9/8 at bar 75, ...) are rendered on a constant 6/8 grid of one bar per cycle
// note: Full arrangement: all 101 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(103/3)

// 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 · pad poly
const pad_poly = note(`<
  ~@8 A B C D E F G D H I J I H I J K L M L N O P Q R O P S ~@6 T@2 U@4 V W@8 X@2 Y Z AA@2 AB AC@2 AD AB AE@2 ~@6 H I J
  K L M L N O P Q R O P Q ~ O P Q R O P AF ~@3
>`.pickRestart({
  A: "b4@4 ~@2 [g4,c5]@5 ~, d5@6 ~@2 e5@13 ~@3", B: "e5@2 d5@9 ~ e5@3 ~ d5@3 ~ d5@3 ~, [f#4,a4]@5 ~ [f#4,b4]@5 ~",
  C: "~@6 [g4,c5]@5 ~, b4@19 ~@5", D: "[f#4,a4]@3 ~ [f#4,a4]@2 d5@3 ~ [f#4,b4]@12 ~@2",
  E: "d5 ~@5 [g4,c5]@5 ~, b4@5 ~@7, ~@2 e5@13 ~@9", F: "e5@2 d5@5 ~@5 d5@3 ~ d5@3 ~ d5@3 ~, [f#4,a4]@5 ~ [f#4,b4]@5 ~",
  G: "e4@5 ~ [g4,c5]@5 ~, b4@19 ~@5", H: "b4@2 a4@4 g4@3 ~ e4@12 ~@2", I: "[f#4,a4]@2 b4@4 d5@3 ~ [f#4,b4]@12 ~@2",
  J: "b4@2 a4@4 g4@3 ~ f#4@12 ~@2", K: "[f#4,a4]@2 b4@4 d5@3 ~ [f#4,b4]@6 [f#4,b4]@3 ~ [f#4,b4]@3 ~",
  L: "[e4,g4,c5]@6 ~@2 c5@2 c5@2 c5@3 ~ d5@3 ~ e5@3 ~", M: "[f#4,a4,d5]@6 ~@2 d5@2 d5@2 d5@3 ~ e5@3 ~ f#5@3 ~",
  N: "e5 d5@10 ~, [f#4,a4]@19 ~@5", O: "[g4,b4,e5]@10 ~@2 e5@3 ~ d5@3 ~ e5@3 ~, ~@6 [g4,c5]@5 ~",
  P: "b5@2 a5@3 ~ g5@5 ~ f#5@3 ~ g5@3 ~ f#5@3 ~, [c5,e5]@5 ~ [a4,d5]@5 ~", // C D5
  Q: "f#5 ~@5 [a4,c5]@5 ~, [g4,b4]@5 ~@7, ~ e5@10 ~", R: "[a4,c5,f#5]@5 ~ g5 f#5@4 ~, ~@6 [a4,d5]@5 ~",
  S: "f#5 ~@5 [g4,c5]@5 ~, [g4,b4]@5 ~@7, ~ e5@10 ~", // C5 G
  T: "[~@12 b4@8 ~@4 [g4,c5]@10 ~@2 e5@2 d5@5 ~ d5@3 ~, ~@12 d5@6 ~@2 e5@13 ~@3 [f#4,a4]@10 ~@2]/2", // C5 F#m
  U: "[e5@3 ~ d5@3 ~ d5@3 ~@13 [g4,c5]@10 ~@2 [f#4,a4]@3 ~ [f#4,a4]@2 d5@3 ~ [f#4,b4]@12 ~@2 d5@2 ~@10 [g4,c5]@10 ~@2 d5@3 ~ d5@5 ~ d5@2, [f#4,b4]@10 ~@2 b4@19 ~@29 b4@10 ~@14 [f#4,a4]@10 ~@2, ~@62 e5@13 ~@21]/4", // C5 F#m B5 C5 B5 F#m
  V: "d5@3 ~ d5@3 ~ d5@3 ~ [e4,b4]@12, [f#4,b4]@5 ~@7", // E5 B5
  W: "[[g4,c5]@10 ~@2 [f#4,a4]@3 ~ [f#4,a4]@2 d5@3 ~ [f#4,b4]@12 ~@2 b4@2 a4@4 g4@3 ~ e4@12 ~@2 [f#4,a4]@2 b4@4 d5@3 ~ [f#4,b4]@12 ~@2 b4@2 a4@4 g4@3 ~ f#4@12 ~@2 [f#4,a4]@2 b4@4 d5@3 ~ [f#4,b4]@12 ~@2 b4@2 a4@4 g4@3 ~ e4@12 ~@2 [f#4,a4]@2 b4@4 d5@3 ~ [f#4,b4]@12 ~@2 b4@2 a4@4 g4@3 ~ f#4@2]/8", // C5 F#m B5 F#m B5 F#m B5 F#m …
  X: "[~@12 [f#4,a4]@2 b4@4 d5@3 ~ [f#4,b4]@6 [f#4,b4]@3 ~ [f#4,b4]@3 ~ [e4,g4,c5]@6 ~@2 c5@2 c5@2]/2", // F#m B5 C
  Y: "c5@3 ~ d5@3 ~ e5@3 ~ [f#4,a4,d5]@6 ~@2 d5@2 d5@2", Z: "d5@3 ~ e5@3 ~ f#5@3 ~ [e4,g4,c5]@6 ~@2 c5@2 c5@2",
  AA: "[c5@3 ~ d5@3 ~ e5@3 ~ e5@2 d5@20 ~@2 [g4,b4,e5]@10 ~@2, ~@12 [f#4,a4]@19 ~@17]/2", // Em F#m
  AB: "e5@3 ~ d5@3 ~ e5@3 ~ b5@2 a5@3 ~ g5@5 ~, [g4,c5]@5 ~ [c5,e5]@5 ~", // C5 C
  AC: "[f#5@3 ~ g5@3 ~ f#5@3 ~ f#5@2 ~@10 [a4,c5]@10 ~@2 [a4,c5,f#5]@10 ~@2, [a4,d5]@5 ~ [g4,b4]@5 ~@13, ~@7 e5@10 ~@7]/2", // Am F#dim D5 G
  AD: "g5 f#5@4 ~ [g4,b4,e5]@5 ~, [a4,d5]@5 ~@7", // Em D5
  AE: "[f#5@3 ~ g5@3 ~ f#5@3 ~ f#5@2 ~@10 [g4,c5]@10 ~@14, [a4,d5]@5 ~ [g4,b4]@5 ~@13, ~@7 e5@10 ~@7]/2", // C5 D5 G
  AF: "f#5@3 ~ g5@2 e5@5 ~ f#5@3 ~ g5@2 e5@5 ~, ~@6 [g4,c5]@5 ~", // C5
})).s("gm_pad_poly").gain(0.48)

// chords · pad poly · soft notes
const pad_poly_soft = note(`<
  ~@11 A ~ B C D E F G F E F G H ~@4 I J K ~ I J K ~@8 L@3 ~ M N@8 O@2 ~@3 P Q R@2 P Q R@2 ~@6 E F G H ~@4 I J K ~ I J K
  ~ I J K ~ I J S ~@3
>`.pickRestart({
  A: "a5@3 ~@7 b5@9 ~@5, ~ a5@2 ~@3, ~@3 d6@4 ~@5", B: "~@12 f#5@3 ~ f#5@3 ~ f#5@3 ~", C: "e5@19 ~@5",
  D: "a5@3 ~ a5@2 d6@3 ~ b5@12 ~@2", E: "b5@2 a5@4 g5@3 ~ e5@12 ~@2", F: "a5@2 b5@4 d6@3 ~ b5@12 ~@2",
  G: "b5@2 a5@4 g5@3 ~ f#5@12 ~@2", H: "a5@2 b5@4 d6@3 ~ b5@6 ~@8", I: "b5@10 ~@2 b5@3 ~ a5@3 ~ b5@3 ~",
  J: "~@6 b5@5 ~ b5@3 ~ c6@3 ~ b5@3 ~", K: "c6 b5@10 ~", L: "[~@12 e5@19 ~@5 a5@3 ~ a5@2 d6@3 ~ b5@12 ~@14]/3",
  M: "~ e5",
  N: "[~@12 a5@3 ~ a5@2 d6@3 ~ b5@12 ~@2 b5@2 a5@4 g5@3 ~ e5@12 ~@2 a5@2 b5@4 d6@3 ~ b5@12 ~@2 b5@2 a5@4 g5@3 ~ f#5@12 ~@2 a5@2 b5@4 d6@3 ~ b5@12 ~@2 b5@2 a5@4 g5@3 ~ e5@12 ~@2 a5@2 b5@4 d6@3 ~ b5@12 ~@2 b5@2 a5@4 g5@3 ~ f#5@2]/8",
  O: "[~@12 a5@2 b5@4 d6@3 ~ b5@6 ~@20]/2", P: "~@6 b5@5 ~", Q: "b5@3 ~ a5@3 ~ b5@3 ~@7 b5@5 ~",
  R: "[b5@3 ~ c6@3 ~ b5@3 ~ c6@2 b5@20 ~@14]/2", S: "b5@3 ~ c6@2 a5@5 ~@13",
})).s("gm_pad_poly").gain(0.16)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A B A B A C A C A C A C A C A C A C A C A C A C ~@11 D@3 E F E F E F E F E F E F E F E F E F E G ~@10 H I@2 A C A C A
  C A C ~@11 J ~@7 K@2 L
>`.pickRestart({
  A: "[e3,b3]@2 [e3,b3]@4 [e3,b3]@3 ~ [e3,b3]@2 [c3,g3]@3 ~ [c3,g3]@3 ~ [c3,g3]@3 ~", // E5 C5
  B: "[d3,f#3]@2 [d3,f#3]@4 [d3,f#3]@3 ~ [d3,f#3]@2 [b2,f#3]@3 ~ [b2,f#3]@3 ~ [b2,f#3]@3 ~", // D B5
  C: "[d3,f#3]@2 [d3,f#3]@4 [d3,f#3]@3 ~ [d3,f#3]@2 [b2,f#3]@3 ~ c3@3 ~ d3@3 ~", // D B5
  D: "[[a3,c4,e4]@10 ~@2 [f#3,a3,d4]@38 ~@10 [e3,b3]@2 [e3,b3]@4 [e3,b3]@3 ~ [e3,b3]@2]/3", // Am D E5
  E: "[c3,g3]@3 ~ [c3,g3]@3 ~ [c3,g3]@3 ~ [d3,f#3]@2 [d3,f#3]@4 [d3,f#3]@3 ~ [d3,f#3]@2", // C5 D
  F: "[b2,f#3]@3 ~ c3@3 ~ d3@3 ~ [e3,b3]@2 [e3,b3]@4 [e3,b3]@3 ~ [e3,b3]@2", G: "[b2,f#3]@3 ~ c3@3 ~ d3@3 ~@13",
  H: "~@6 [a3,c4,e4]@5 ~", I: "[[f#3,a3,d4]@17 ~@7]/2", J: "[a3,c4,e4]@5 ~ [a3,d4,f#4]@5 ~",
  K: "[[a3,c4,e4]@5 ~ [a3,d4,f#4]@17 ~]/2", L: "[a3,d4,f#4] ~@7",
})).s("gm_acoustic_guitar_nylon").gain(0.48)

// other · distortion guitar
const distortion_guitar = note(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@17 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@16 A ~ A ~ A ~@24
>`.pickRestart({
  A: "~@16 b4@3 ~ a4@3 ~", B: "~@4 b4@3 ~ a4@3 ~@13",
})).s("gm_distortion_guitar").gain(0.25)

// other · distortion guitar · soft notes
const distortion_guitar_soft = note(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@16 B@18 ~@16 A ~ A ~ A ~@23
>`.pickRestart({
  A: "b4@19 ~@5", B: "[~@12 b4@19 ~@17]/2",
})).s("gm_distortion_guitar").gain(0.12)

// bass · acoustic bass
const bass = note(`<
  ~@4 A B A B A B A B A B A B A B A B A B A C D E D E F G F G F G F H@2 I J K J K J K J K J K J K J K J K J K J L M N M
  O P Q P Q P Q P R@2 A B A B A B A C D E D E F G F G F G F G F G F G F G F H@2 S
>`.pickRestart({
  A: "e2@2 e2@4 e2@3 ~ e2@2 c2@3 ~ c2@3 ~ c2@3 ~", B: "d2@2 d2@4 d2@3 ~ d2@2 b1@3 ~ c2@3 ~ d2@3 ~",
  C: "d2@2 d2@4 d2@3 ~ d2@2 b1@3 ~ b1@3 ~ b1@3 ~", D: "c2@5 ~ c2@5 ~", E: "d2@5 ~ d2@5 ~",
  F: "e2@6 ~@2 e2@3 ~ c2@6 ~@2 c2@3 ~", G: "a1@6 ~@2 a1@3 ~ d2@3 ~ d2@3 ~ d2@3 ~", H: "[a1@6 ~@2 a1@3 ~ d2@34 ~@2]/2",
  I: "~@12 e2@2 e2@4 e2@3 ~ e2@2", J: "c2@3 ~ c2@3 ~ c2@3 ~ d2@2 d2@4 d2@3 ~ d2@2",
  K: "b1@3 ~ c2@3 ~ d2@3 ~ e2@2 e2@4 e2@3 ~ e2@2", L: "b1@3 ~ b1@3 ~ b1@3 ~ c2@10 ~@2", M: "c2@5 ~ d2@5 ~",
  N: "d2@5 ~ c2@5 ~", O: "d2@10 ~@2 e2@6 ~@2 e2@3 ~", P: "c2@6 ~@2 c2@3 ~ a1@6 ~@2 a1@3 ~",
  Q: "d2@3 ~ d2@3 ~ d2@3 ~ e2@6 ~@2 e2@3 ~", R: "[d2@17 ~@7]/2", S: "d2 ~@7",
})).s("gm_acoustic_bass").gain(0.48)

// drums · kick
const kick = s("bd").struct("<~@4 A@31 B ~ C D@31 E F A@27 B ~ E>".pickRestart({
  A: "x!7 ~ x ~ x ~", B: "x!7 ~@5", C: "x ~@5 x!6", D: "x ~ x ~ x ~ x!6", E: "x", F: "~ x",
})).gain(0.1)

// drums · snare
const snare = s("sd").struct("<~@23 A B@11 C ~ D ~@18 E F G@11 D H ~@7 A B@19 C ~ D>".pickRestart({
  A: "~ x ~ x ~@4 x!4", B: "x!7 ~ x ~ x ~", C: "x!7 ~@5", D: "x", E: "~@7 x ~ x ~@2", F: "~@2 x!10",
  G: "x ~ x ~ x ~ x!6", H: "~ x",
})).gain(0.1)

// drums · hihat
const hihat = s("hh").struct("<~@24 A@11 B C ~@20 D E@11 C F ~@8 A@19 B C ~>".pickRestart({
  A: "x!7 ~ x ~ x ~", B: "x!7 ~@5", C: "x!2", D: "~@6 x!6", E: "x ~ x ~ x ~ x!6", F: "x",
})).gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A@19 B ~@13 C D@19 E ~@12 F A@7 B ~@21 E>".pickRestart({
  A: "x!7 ~ x ~ x ~", B: "x!7 ~@5", C: "x ~@5 x!6", D: "x ~ x ~ x ~ x!6", E: "x", F: "~ x",
})).gain(0.1)

// drums · china
const china = s("cr").struct(`<
  ~@3 A B ~@3 B ~@3 B ~@2 C ~@4 B ~@2 D E@11 F G ~@4 G ~@3 G ~@3 H ~@3 G ~@3 I J@11 B@3 ~@3 B ~@2 D E@19 F G ~
>`.pickRestart({
  A: "~@4 x!2", B: "x", C: "~@5 x", D: "~@3 x!2 ~", E: "x ~ x", F: "x!2", G: "~ x", H: "~ x ~", I: "x!2 ~ x ~@2",
  J: "~ x ~ x ~@2",
})).gain(0.1)

// drums · tambourine
const tambourine = s("tb").struct("<~@27 A B@7 C ~ D ~@23 E@8 D F ~@11 A B@15 C ~ D>".pickRestart({
  A: "~@4 x!2", B: "x ~@3 x!2", C: "x!2", D: "x", E: "~ x!3 ~@2", F: "~ x",
})).gain(0.1)

stack(
  pad_poly, pad_poly_soft, acoustic_guitar_nylon, distortion_guitar, distortion_guitar_soft, bass, kick, snare, hihat,
  mid_tom, china, tambourine
)

More by The Cranberries