Strudelify

Electric Blue

The Cranberries

KeyE minorTempo78 bpm
0:00/0:00
// Electric Blue — The Cranberries
// 78 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// 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 97 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(78/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.

// other · pad poly
const pad_poly = note(`<
  ~@3 A B C D E F G H I ~@10 J K L K M K L K N O P O Q R S R T U V U V U W U X Y@4 Z L Z AA AB L AB AC O P O Q R S R T U
  W U V U W U AD AE@3 AF ~@18
>`.pickRestart({
  A: "~@4 e5 g5 f#5 d5", B: "e5 b4 d5 c5", C: "b4 e5", D: "d5@2 d5 f#5", E: "e5!2", F: "d5@2 d5 c5", G: "b4!2",
  H: "b4@2 a4 g4", I: "e4", J: "~@7 e5", K: "e5@3 ~ d5@3 ~ f#5@3 ~ e5@3 ~", L: "g5@3 ~ e5@2 g5@2 f#5@3 ~ g5@2 f#5@2",
  M: "g5@3 ~ g5@2 g5@2 f#5@5 ~ e5@2", N: "g5@3 ~ e5@2 g5@2 f#5@4 b4@2 d5@2", O: "e5@3 ~ e5@2 f#5@2 d5@3 ~ d5@2 d5@2",
  P: "e5@3 ~ d5@2 c5@2 d5@3 ~ b4@2 d5@2", Q: "e5@3 ~ d5@2 c5@2 d5@3 ~ f#5@2 f#5@2",
  R: "g5@3 ~ g5@2 a5@2 f#5@3 ~ f#5@2 f#5@2", S: "g5@3 ~ g5@2 a5@2 f#5@3 ~ e5@2 f#5@2", T: "g5@3 ~ g5@2 a5@2 f#5@8",
  U: "e5@3 ~ e5@3 ~ f#5@6 ~@2", V: "g5@3 ~ e5@2 g5@2 f#5@4 b5@2 b5@2", W: "g5@3 ~ e5@2 g5@2 f#5@3 ~ b5@2 b5@2",
  X: "g5@3 ~ e5@2 g5@2 f#5@4 g5@2 f#5@2", Y: "e5@4 g5 ~@3 d5@4 g5 ~@3", Z: "e5@3 ~ d5@2 e5@2 f#5@3 ~ e5@2 f#5@2",
  AA: "g5@3 ~ e5@2 g5@2 f#5@8", AB: "e5@3 ~ d5@2 e5@2 f#5@3 ~ e5@3 ~", AC: "g5@3 ~ f#5@3 ~ f#5@4 b4@2 d5@2",
  AD: "g5@3 ~ e5@2 g5@2 f#5@4 e5@2 e5@2", AE: "b5@3 ~ e5@2 e5@2 b5@3 ~ e5@2 e5@2", AF: "b5@3 ~ e5@2 e5@2 b5@3 ~ a5@3 ~",
})).s("gm_pad_poly").gain(0.48)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@15 A B A B A B A B A B A B A B A C D E D E D E D F G H G H G H G I A B A B A B A B A B A B D E D E D E D E G H G H G
  H G H G H G H J K J L M K N@2 A B A B A B A B A O
>`.pickRestart({
  A: "e3 b3 g3@2 d3 f#3 g3@2", B: "c3@2 e3@2 g3@2 b2@4 b2@2 g3@3 ~", C: "c3 e3 g3 b2@2 b2 g3!2",
  D: "e3@2 e3@2 b3@3 ~ d3@2 d3@2 b3@3 ~", E: "c3@2 c3@2 b3@3 ~ d3@2 d3@2 b3@3 ~",
  F: "c3@2 c3@2 a3@3 ~ b2@2 d3@2 f#3@2 a3@2",
  G: "[g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]!2", // Em Esus2
  H: "[g3,c4,e4]@2 [g3,c4,e4]@2 [g3,c4,e4]@2 [g3,c4,e4]@2 [f#3,b3,e4] [f#3,b3,e4]@2 [f#3,b3,e4]!5", // C Esus2
  I: "[g3,c4,e4]@2 [g3,c4,e4]@2 [g3,c4,e4]@2 [g3,c4,e4]@2 [f#3,b3,e4] [f#3,b3,e4]@2 [f#3,b3,e4] [f#3,b3,e4]@3 ~", // C Esus2
  J: "[f#3,b3,d4]@2 [f#3,b3,d4]@2 [f#3,b3,d4]@2 [f#3,b3,d4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]!2", // Bm Esus2
  K: "[f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4] [f#3,b3,e4]@2 [f#3,b3,e4]!5", // Esus2
  L: "[f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,c4,e4] [f#3,c4,e4]@2 [f#3,c4,e4]!5", // Esus2 F#m7b5
  M: "[f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]!2", // Esus2
  N: "[[f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@2 [f#3,b3,e4]@15 ~@3]/2", // Esus2
  O: "c3@2 e3@2 g3@2 b2@4 b2@5 ~",
})).s("gm_acoustic_guitar_nylon").gain(0.35)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A@5 B@6 C@5 ~@15 D E D E F G F G ~@20 D E D E F G F G ~@12 H@2 I@2 J@2 K@2 ~@10
>`.pickRestart({
  A: "[[e1,e2,e3]@9 [d1,d2,d3]]/5", B: "[[e1,e2,e3]@3 [d1,d2,d3]]/2", C: "[[e2,e3]@33 [e2,e3] ~@6, e1@29 ~@51]/5",
  D: "[b2,e3] [a2,d3]", E: "[g2,c3] [a2,d3]", F: "[b2,e3,g3] [a2,d3,f#3]", G: "[g2,c3,e3] [a2,d3,f#3]",
  H: "[[d3,d4]@4 [e3,e4]@3 [f#3,f#4]@3 [f#3,f#4]@2 [f#3,f#4]@2 [f#3,f#4]@2]/2", // D E F#
  I: "[[d3,d4]@4 [e3,e4]@3 [b3,b4]@3 [b3,b4]@2 [c4,c5]@2 [c4,c5]@2]/2", // D E B C
  J: "[[e3,e4]@4 [e3,e4]@3 ~ [f#3,f#4]@3 ~ [f#3,f#4]@2 g3@2 g3@3 ~ [a3,a4]@3 ~ [g3,g4]@3 ~ [f#3,f#4]@3 ~, ~@14 g4@5 ~@13]/2", // E F# A G F#
  K: "[[e3,e4]@3 ~ [f#3,f#4]@3 ~ [g3,g4]@2 [g3,g4]@2 [g3,g4]@2 [f#3,f#4]@12 ~@6]/2", // E F# G F#
})).s("gm_string_ensemble_1").gain(0.29)

// chords · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@15 A ~@23 B C B C B C B C ~@20 B C B C B C B C B C B C ~@18>".pickRestart({
  A: "~@2 [e2,e3]!2 ~@4", B: "[g3,b3] [f#3,b3], e3", C: "[g3,c4] [f#3,b3], e3",
})).s("gm_string_ensemble_1").gain(0.15)

// other · string ensemble 2
const string_ensemble_2 = note("<~@79 A@2 B@2 C@2 D@2 ~@10>".pickRestart({
  A: "[d4@4 e4@3 f#4@3 f#4@2 f#4@2 f#4@2]/2", B: "[d4@4 e4@3 b4@3 b4@2 c5@2 c5@2]/2",
  C: "[[e3,e4]@4 [e3,e4]@3 ~ [f#3,f#4]@3 ~ [f#3,f#4]@2 g3@2 g3@3 ~ [a3,a4]@3 ~ [g3,g4]@3 ~ [f#3,f#4]@3 ~, ~@14 g4@5 ~@13]/2", // E F# A G F#
  D: "[[e3,e4]@3 ~ [f#3,f#4]@3 ~ [g3,g4]@2 [g3,g4]@2 [g3,g4]@2 [f#3,f#4]@12 ~@6]/2", // E F# G F#
})).s("gm_string_ensemble_2").gain(0.19)

// other · piccolo
const piccolo = note("<~@15 A B A C D E D F ~@28 G H G I ~@24 J@2 K@2 L@2 M@2 D E D F N O N P ~@2>".pickRestart({
  A: "e4 d4", B: "c4@3 b3@3 c4 d4", C: "c4@3 b3@5", D: "e4@2 d4 e4 f#4@2 e4 f#4", E: "g4@2 e4 g4 f#4@2 g4 f#4",
  F: "g4@2 e4 g4 f#4@4", G: "e5@2 d5 e5 f#5@2 e5 f#5", H: "g5@2 e5 g5 f#5@2 g5 f#5", I: "g5@2 e5 g5 f#5@4",
  J: "[[d3,d4]@4 [e3,e4]@3 [f#3,f#4]@3 [f#3,f#4]@2 [f#3,f#4]@2 [f#3,f#4]@2]/2", // D E F#
  K: "[[d3,d4]@4 [e3,e4]@3 [b3,b4]@3 [b3,b4]@2 [c4,c5]@2 [c4,c5]@2]/2", // D E B C
  L: "[[e3,e4]@4 [e3,e4]@3 ~ [f#3,f#4]@3 ~ [f#3,f#4]@2 g3@2 g3@3 ~ [a3,a4]@3 ~ [g3,g4]@3 ~ [f#3,f#4]@3 ~, ~@14 g4@5 ~@13]/2", // E F# A G F#
  M: "[[e3,e4]@3 ~ [f#3,f#4]@3 ~ [g3,g4]@2 [g3,g4]@2 [g3,g4]@2 e5@18]/2", N: "e4 d4 e4@12 d4@2", O: "e4 d4 e4@12 ~@2",
  P: "e4 d4 e4@6 ~@8",
})).s("gm_piccolo").gain(0.05)

// other · piccolo · soft notes
const piccolo_soft = note("<~@55 A B A C D@3 E F G H I ~@18 J@2 ~@7 K L M>".pickRestart({
  A: "b5@2 a5 g5 a5@2 g5 a5", B: "b5@2 a5 g5 a5@2 g5@2", C: "b5@2 b5@2 d6@2 d6!2", D: "e6@2 d6 b5 d6@2 b5 d6",
  E: "e6@2 d6 b5 d6@2 f#6!2", F: "g6@2 g6 a6 f#6@2 f#6!2", G: "g6@2 g6!2 a6@2 g6 a6",
  H: "b6@3 b6 a6@2 g6@2 a6@4 g6@3 a6", I: "b6@3 b6 a6@2 g6@2 a6@4 f#6@3 ~", J: "[~@7 [f#3,f#4]@5 ~@4]/2",
  K: "~@4 e4@2 d4 e4", L: "a4 g4@3 f#4@4", M: "e4@3 d4@3 ~@2",
})).s("gm_piccolo").gain(0.03)

// bass · acoustic bass
const bass = note(`<
  ~@19 A B A B A B A B A B A B C D C D C D C E A F A F A F A F A B A B A B A B A B A B C D C D C D C E A F A F A F A F A
  F A F G@2 H@2 I J@3 A B A B A B A B A B
>`.pickRestart({
  A: "e2@2 g2@2 e2@4 b1@2 b1@3 ~ b1!2", B: "c2 d2 c2 b1@5", C: "e2@2 g2@2 e2@4 d2@2 d2@3 ~ d2!2",
  D: "c2@2 d2@2 c2@3 ~ d2@6 ~@2", E: "c2@2 d2@2 c2@3 ~ d2@2 d2@2 d2@2 d2@2", F: "c2 d2 c2 b1@2 b1!3",
  G: "[a1@6 ~@2 b1@5 ~ e1@5 ~ e1@2 e1@4 e1@2 e1@2 e1@2]/2",
  H: "[g1@2 a1@2 a1@3 ~ b1@5 ~ e1@5 ~ e1@2 e1@4 e1@2 e1@2 e1@2]/2", I: "g1@2 a1@2 a1@3 ~ b1@5 ~ e1@2",
  J: "[e1@4 e1@2 e1@4 e1@2 e1@2 ~@2 g1@2 a1@2 a1@3 ~ b1@5 ~@19, ~@14 e1@33 ~]/3",
})).s("gm_acoustic_bass").gain(0.48)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@38 A ~@3 B ~@3 C ~@19 A ~@3 D E ~@2 C ~@3 C ~@3 F ~@14>".pickRestart({
  A: "x!8", B: "~@11 x ~ x!3", C: "~@11 x ~ x!2 ~", D: "~@11 x ~ x ~ x", E: "x!4 ~@12", F: "~@15 x",
})).gain(0.1)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@18 A B C B C B C B C B C B C B C B C B C B ~ D@3 E D@3 E B C B C B C B C B C B C B C B C B C B ~ D@3 E F D@2 E D@3 E
  D@7 ~ B C B C B C ~@4
>`.pickRestart({
  A: "~@7 x", B: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", C: "x ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2", D: "x!8", E: "x!5 ~@3", F: "~@2 x!6",
})).gain(0.03)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@93
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]
  [x ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2]
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]
  [x ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2]
>`).gain(0.02)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@38 A ~ B ~ C ~ B ~ C ~@3 D E F E F E F E F E F E F E F G A ~ B ~ H I B ~ C ~ B ~ C ~ B ~ B ~ B ~@2 E F E F E F ~@4
>`.pickRestart({
  A: "x!8", B: "~@13 x ~@2", C: "~@5 x!2 ~", D: "~@3 x", E: "x ~ x ~ x!3 ~", F: "x!4 ~@2 x ~", G: "x ~@3 x!3 ~",
  H: "~@5 x!3", I: "x!4 ~@12",
})).gain(0.12)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@93 [x ~ x ~ x!3 ~] [x!4 ~@2 x ~] [x ~ x ~ x!3 ~] [x!4 ~@2 x ~]>").gain(0.03)

// drums · high tom
const high_tom = s("ht").struct("<~@65 [~ x ~@2] ~@31>").gain(0.12)

// drums · crash
const crash = s("cr").struct(`<
  ~@18 A ~@3 B ~ B ~ B ~ B ~ B ~@8 C B C D C E C F C ~@10 B ~@8 C B C G H E C I J K J I L@6 M N ~@10
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@4", C: "x", D: "x ~@2 x ~@3 x", E: "~@6 x ~@3 x ~@2 x ~@2", F: "x ~@2 x!2 ~@3",
  G: "x ~@2 x ~@4", H: "~ x ~@2", I: "x ~@5 x ~ x ~@6 x", J: "x!2 ~ x", K: "~@4 x ~ x ~@3 x ~@2 x ~@2", L: "x!8",
  M: "x!4 ~@3 x", N: "~@3 x!2 ~@3 x ~@3 x!2 ~@2",
})).gain(0.1)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@31 [~ x ~ x]!7 ~@9 [~ x ~ x]!19 ~@20 [~ x!2 ~@13] [~ x ~ x]!10>").gain(0.03)

// drums · ride
const ride = s("rd").struct(`<
  ~@18 A B C B C B C B C B C B C B C B C B C B D@9 B C B C B C B C B C B C B C B C B C B D@20 E B C B C B C ~@4
>`.pickRestart({
  A: "~@12 x!3 ~", B: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", C: "x ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2", D: "x!8",
  E: "~@3 x!2 ~@3 x ~@3 x!2 ~@2",
})).gain(0.1)

// drums · ride · soft notes
const ride_soft = s("rd").struct(`<
  ~@86
  [~ x!2 ~@13]
  ~@6
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]
  [x ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2]
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]
  [x ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2]
>`).gain(0.03)

// drums · tambourine
const tambourine = s("tb").struct("<~@86 [~ x!4 ~@3 x ~@3 x!2 ~@2] ~@10>").gain(0.1)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@18 [~@7 x] ~@78>").gain(0.66)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@39 [x!8]!8 ~@20 [x!8]!19 ~@11>").gain(0.53)

stack(
  pad_poly, acoustic_guitar_nylon, string_ensemble_1, string_ensemble_1_soft, string_ensemble_2, piccolo, piccolo_soft,
  bass, kick, snare, low_tom, hihat, hihat_soft, mid_tom, mid_tom_soft, high_tom, crash, crash_soft, ride, ride_soft,
  tambourine, agogo_bells, cabasa
)

More by The Cranberries