Strudelify

Forever Yellow Skies

The Cranberries

KeyG majorTempo143 bpm
0:00/0:00
// Forever Yellow Skies — The Cranberries
// 143 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 144 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(143/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(`<
  ~@28 A@2 B@2 C D C E F G F H I@2 J K C D C E F G F L M N O@2 M N P@6 ~@4 I@2 J K C D C Q@5 M N O@2 M N P@6 ~@3 R M N
  O@2 M N P@6 ~@36
>`.pickRestart({
  A: "[f#5@2 g5@5 ~ g5@10 g5@3 ~ g5@2 g5@3 ~ g5@2 a5 g5]/2", B: "[f#5@2 g5@5 ~ g5@18 ~@6]/2",
  C: "g5@5 ~ f#5@5 ~ d5@3 ~", D: "c5@10 ~@2 f#5@3 ~", E: "e5@6 ~@2 d5@2 c5@5 ~", F: "b4@6 ~@2 b4@2 d5@5 ~",
  G: "g4@6 ~@2 b4@2 c5@5 ~", H: "g4@3 ~@5", I: "[f#5@2 g5@5 ~ g5@10 g5@3 ~ g5@2 a5@3 ~ g5@2 g5@2]/2",
  J: "f#5@2 g5@5 ~ g5@4 g5@4", K: "g5!2 g5@2", L: "g4@3 ~@4 g5", M: "a5@2 g5@11 ~ g5@2",
  N: "a5@2 g5@3 ~ a5@4 b5@3 ~ g5@2", O: "[a5@2 g5@3 ~ f#5@4 d5@3 ~ e5@4 d5@3 ~ c5@5 ~@3 g5@2]/2",
  P: "[a5@2 g5@3 ~ f#5@4 d5@3 ~ e5@4 d5@3 ~ g5@4 f#5@3 ~ d5@4 d5@3 ~ g5@4 f#5@3 ~ e5@4 d5@3 ~ g5@4 f#5@3 ~ d5@4 d5@3 ~ g5@4 f#5@3 ~ e5@4 d5@3 ~ c5@4 b4@5 ~]/6",
  Q: "[e5@4 e5@3 ~ d5@2 c5@4 b4@6 b4@3 ~ b4@2 d5@4 g4@6 g4@3 ~ b4@2 c5@4 b4@6 b4@3 ~ b4@2 d5@4 g4@8 ~@8 g5@2]/5",
  R: "~@7 g5",
})).s("gm_pad_poly").gain(0.48)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@19 A@2 B C D E@3 D F G H G F G H G F G H G F G H G F G H G F G H G I J I J I J I J K L M D K L M D K L M D E@3 D K L
  M D I J I J I J I J K L M D K L M D I J I J I J I J K L M D N O P J N O P J N O P J Q R ~@22
>`.pickRestart({
  A: "[~ d4, ~ [g3,g4]@3]/2", B: "[c3,g3,c4]", C: "[g3,d4,g4]", D: "[c3,a3,c4]", E: "[b2,e3,b3]@3 [c3,g3,c4]@5",
  F: "[b2,d3,g3]", G: "[c3,e3,a3]", H: "[d3,g3,b3]", I: "[b2,d3,g3,b3]", J: "[c3,e3,a3,c4]", K: "d4",
  L: "[c3,c4], g3 ~@15", M: "[d4,g4], g3 ~@15", N: "[b3,d4]", O: "[c3,e3,c4], g3 ~@15", P: "[b3,d4,g4], g3 ~@15",
  Q: "[g3,d4,g4]!4", R: "[g3,d4,g4] ~@3",
})).s("gm_string_ensemble_1").gain(0.09)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@20 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C D C D E ~@23
>`.pickRestart({
  A: "[d3,g3,b3,d4]!8", B: "[e3,g3,a3,c4,e4]!8", C: "[d3,g3,b3,d4]!8, g4 [g4,b4] g4 a4",
  D: "[e3,g3,a3,c4,e4]!8, g4 [g4,b4] g4 [a4,c5]", E: "[g3,d4,g4]@13 ~@3",
})).s("gm_acoustic_guitar_nylon").gain(0.1)

// chords · distortion guitar
const distortion_guitar = note("<~@20 A@8 B ~@35 A@4 B ~@23 A@2 C@8 ~@6 A@8 D@8 ~@20>".pickRestart({
  A: "[[b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4]@3 [b3,d4,g4]@2 [b3,d4,g4] [b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4] g4 [c4,e4,a4]@2 [c4,e4,a4]@2 [c4,e4,a4]@2 ~ [c4,e4,a4] [c4,e4,a4]@2 [c4,e4,a4]!4 [c4,e4,a4]@2, ~@15 [b3,d4]@17]/2", // G Am Bm
  B: "[g3,b3,d4,g4] g4 ~@2", // G
  C: "[[b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4]@3 [b3,d4,g4]@2 [b3,d4,g4] [b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4,g4] g4 [c4,e4,a4]@2 [c4,e4,a4]@2 [c4,e4,a4]@2 ~ [c4,e4,a4] [c4,e4,a4]@2 [c4,e4,a4]!4 [c4,e4,a4]@2 ~@96, ~@15 [b3,d4]@113]/8", // G Am Bm
  D: "[[b3,d4]@2 [b3,d4]@2 [b3,d4,b4]@3 ~@2 [b3,d4] [b3,d4]@2 [b3,d4]@2 [b3,d4] ~ [c4,e4]@2 [c4,e4]@2 [c4,e4]@2 ~ [c4,e4] [c4,e4]@2 [c4,e4]!4 [c4,e4]@2 g4@4 b4@4 g4@4 a4@4 [c4,e4]@2 [c4,e4]@2 [c4,e4]@2 ~ [c4,e4] [c4,e4]@2 [c4,e4]!4 [c4,e4]@2 g4@4 ~@60, g4@4 ~@3 [b3,d4]@2 ~@6 b3@69 ~@44, ~@8 g4@4 a4@3 d4@17 d4@96, ~@16 g4@4 b4@3 ~ g4@4 c5@4 ~@16 g4@4 b4@3 ~ g4@4 c5@4 ~@64]/8", // Bm C Bm
})).s("gm_distortion_guitar").gain(0.14)

// chords · distortion guitar · soft notes
const distortion_guitar_soft = note(`<
  ~@28 A@8 ~@4 B ~ C ~@9 C ~ C ~ C ~ C ~ C ~@7 A@8 ~@4 C ~ C ~ C ~ C ~ C ~@7 C ~ C ~ C ~ C ~ C ~@15 D E ~ F ~ G@2 H I@2
  ~@2 J ~ K L M N ~@6
>`.pickRestart({
  A: "[~ [g3,b3,d4] [g3,b3,d4,g4] [b3,d4]@29, ~@3 [g3,g4] ~@28]/8", B: "~ [g2,b2,d3,g3]@15",
  C: "~ g3@15, [g2,b2,d3]@15 ~", D: "~ g4!3", E: "g4 ~@3", F: "g3", G: "[~ g4@4 ~@3]/2", H: "~ g4@2 ~",
  I: "[~@3 e4@4 ~]/2", J: "d5", K: "g4", L: "d5!3 d5@2 d5 ~@10", M: "~@14 [d5,d6]!2", N: "[e5,e6] ~@15",
})).s("gm_distortion_guitar").gain(0.09)

// other · lead 1 square
const lead_1_square = note("<~@120 A@16 ~@8>".pickRestart({
  A: "g2/4",
})).s("gm_lead_1_square").gain(0.19)

// bass · acoustic bass
const bass = note(`<
  ~@3 A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C
  B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B
  C D@16 E ~@7
>`.pickRestart({
  A: "~@12 c2@2 b1 a1", B: "g1!8", C: "c2!8", D: "g1!2 a1!2 b1!2 c2!2", E: "g1 ~@7",
})).s("gm_acoustic_bass").gain(0.48)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@135
  [~ x ~ x!7 ~ x!4 ~]
  [~ x ~ x ~ x!3 ~ x!3 ~ x!2 ~]
  [~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~]!6
  [~ x!2 ~@2 x ~@10]
>`).gain(0.03)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@19 A ~@7 A ~@11 A ~@11 A ~@11 A ~@15 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@19 B C D@6 E
>`.pickRestart({
  A: "~@15 x", B: "x!4", C: "x ~@3 x ~@2 x!2 ~ x!6", D: "x!16", E: "x!13 ~@3",
})).gain(0.07)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@135 [~ x!3 ~ x!3 ~ x!3 ~ x!3] [~ x!3 ~ x!2 ~@2 x ~@6] ~@7>").gain(0.02)

// drums · hihat
const hihat = s("hh").struct("<A@91 B A@15 B A@7 B A@4 C@17 D ~@6>".pickRestart({
  A: "x!3 ~ x!3 ~", B: "x", C: "x!16", D: "x!6 ~@10",
})).gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@19 A ~@7 A ~@11 A ~@11 A ~@11 A ~@15 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 B ~@3 B ~@3 B ~@3 B C D@6 E
>`.pickRestart({
  A: "~@13 x!2 ~", B: "~@14 x!2", C: "~@11 x ~@3 x", D: "~@3 x ~@3 x ~@3 x ~@3 x", E: "~@3 x ~ x ~ x ~ x ~ x ~@4",
})).gain(0.09)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@19 A ~@7 A ~@11 A ~@11 A ~@11 A ~@15 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 B ~@3 B ~@3 B ~@3 B ~@8
>`.pickRestart({
  A: "~@3 x", B: "~@13 x ~@2",
})).gain(0.16)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@106 [~ x] ~@12 [~ x] [~@3 x!2 ~@3]!17 ~@7>").gain(0.1)

// drums · ride
const ride = s("rd").struct("<~@52 [x!8]!16 ~@12 [x!8]!40 [x!4]!17 ~@7>").gain(0.1)

// drums · bongos
const bongos = s("bongo:18").struct("<~@119 [~@8 x ~ x ~ x!4] [x!16]!17 ~@7>").gain(0.27)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@136
  [~@4 x ~@3 x ~@3 x ~@2 x]
  [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!6
  [x ~@2 x!2 ~ x!7 ~@3]
>`).gain(0.33)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct(`<
  ~@135
  [x!16]
  [x!4 ~ x!3 ~ x!3 ~ x!2 ~]
  [~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~]!6
  [~ x!2 ~@2 x ~@10]
>`).gain(0.11)

// drums · congas
const congas_2 = s("conga:18").struct("<~@120 [x!14 ~@2]!17 ~@7>").gain(0.33)

// drums · congas
const congas_3 = s("conga:33").struct("<~@119 [~@8 x ~ x ~ x!4] [~@14 x!2]!17 ~@7>").gain(0.33)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@120 [x ~ x ~ x ~@2 x ~@4 x ~ x ~]!16 ~@8>").gain(1.1)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!8]!120 [x!16]!17 [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!6 [x ~@2 x!2 ~ x!7 ~@3]>")
  .gain(0.53)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@137 [~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~]!6 [~ x!2 ~@2 x ~@10]>").gain(0.18)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@119 [~@6 x!2] [x ~ x ~ x ~@2 x ~@4 x ~ x ~]!16 ~@8>").gain(0.15)

stack(
  pad_poly, string_ensemble_1, acoustic_guitar_nylon, distortion_guitar, distortion_guitar_soft, lead_1_square, bass,
  kick, kick_soft, snare, low_tom, low_tom_soft, hihat, mid_tom, mid_tom_soft, high_tom, china, tambourine, ride,
  bongos, congas, congas_soft, congas_2, congas_3, agogo_bells, cabasa, cabasa_soft, woodblocks
)

More by The Cranberries