Strudelify

Yeats Grave

The Cranberries

KeyG minorTempo197 bpm
0:00/0:00
// Yeats Grave — The Cranberries
// 197 bpm, 12/8, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (6/8 at bar 1, 12/8 at bar 2) are rendered on a constant 12/8 grid of one bar per cycle
// note: Full arrangement: all 102 bars on a 24-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(197/6)

// 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(`<
  ~@16 A B C D E F G H I@2 J@2 K L@3 M N O P M N O Q ~@12 A R S D T R G U V W X@2 Y Z@3 M AA AB AC AD AA AE AF AG@2 AH@2
  AG@2 AH@2 ~@3 AI@4 ~@6 AJ@3 ~@2
>`.pickRestart({
  A: "~@12 c5@3 ~ d5@3 ~ eb5@3 ~, ~@6 g4@5 ~", B: "[d5,f5]@5 ~@3 g5@2 f5 eb5", C: "[bb4,d5]@19 ~@5",
  D: "[g4,bb4,d5]@10 ~@2 eb5@3 ~ f5@6 ~@2", E: "[c5,eb5,g5]@5 ~@5 c5@2 f5@3 ~ f5@3 ~ eb5@3 ~, ~@6 [g4,c5]@5 ~",
  F: "[d5,f5]@10 ~@6 g5@3 ~ f5@3 ~", G: "eb5@3 ~ d5@19 ~, [g4,bb4]@19 ~@5", H: "d5@10 ~@2 eb5@5 ~ d5@5 ~",
  I: "[eb5@10 ~@2 eb5@3 ~ d5@2 c5@3 ~ d5@5 ~ bb4@6 ~@6 d5@3 ~ d5@3 ~, ~@12 g4@31 ~@5]/2",
  J: "[eb5@2 d5@3 ~ c5@3 ~ bb4@5 ~ d5@13 ~@5 f5@2 f5@3 ~ g5@3 ~ ab5@3 ~, g4@29 ~@19]/2",
  K: "g5@10 ~@2 g5@3 ~ f5@2 eb5@5 ~, ~@6 c5@5 ~",
  L: "[f5@3 ~ d5@6 ~@2 bb4@5 ~ [g4,bb4,d5]@35 ~@7 f5@3 ~ bb5@5 ~ f5@2, [g4,bb4]@5 ~@31]/3", M: "g5@19 ~@5",
  N: "~@12 f5@3 ~ bb5@5 ~ f5@2", O: "g5@3 ~ bb5@2 ~@6 f5@3 ~ g5@2 ~@6", P: "eb5@5 ~@7 f5@3 ~ bb5@5 ~ f5@2",
  Q: "eb5@3 ~ f5@2 ~@6 d5@3 ~ eb5@2 ~@6", R: "[g4,bb4,d5,f5]@10 ~@6 g5@3 ~ f5@3 ~",
  S: "eb5@3 ~ d5@13 ~@7, [g4,bb4]@19 ~@5", T: "[c5,eb5,g5]@5 ~@7 f5@3 ~ f5@3 ~ eb5@3 ~, ~@6 g4@5 ~",
  U: "d5@10 ~@2 eb5@5 ~ d5@5 ~, [g4,bb4]@19 ~@5", V: "eb5@2 d5@3 ~ c5@3 ~ c5@7 ~ c5@2 d5@3 ~, g4@19 ~@5",
  W: "eb5@3 ~ d5@2 c5@3 ~ c5@7 ~ c5@2 d5@3 ~, g4@19 ~@5",
  X: "[eb5@3 ~ d5@2 c5@3 ~ bb4@2 c5@3 ~ g4@13 ~@5 f5@2 f5@3 ~ g5@3 ~ ab5@3 ~]/2",
  Y: "g5@10 ~@2 [d5,g5]@3 ~ [c5,f5]@2 [bb4,eb5]@5 ~", // G5 F5 Eb5
  Z: "[[d5,f5]@3 ~ [bb4,d5]@6 ~@2 bb4@5 ~ [bb4,d5]@18 [g4,bb4]@5 ~@19 f5@3 ~ bb5@5 ~ f5@2, ~@9 g4@8 ~@4 [g4,bb4,d5]@12 ~@3]/3", // Dm Bb Gm
  AA: "~@12 [d5,f5]@3 ~ [d5,bb5]@5 ~ [d5,f5]@2", AB: "[eb5,g5]@5 ~@7 [d5,f5]@5 ~@7",
  AC: "[c5,eb5]@5 ~@7 [d5,f5]@3 ~ [d5,bb5]@5 ~ [d5,f5]@2", AD: "[eb5,g5]@19 ~@5",
  AE: "[eb5,g5]@2 [eb5,bb5] ~@3 [d5,f5]@2 [d5,g5] ~@3", AF: "[c5,eb5]@2 [c5,f5] ~@3 [bb4,d5]@2 [bb4,eb5] ~@3",
  AG: "d5@3 ~ f5@2 eb5@3 ~ c5@12 ~@2, g4@19 ~@5",
  AH: "[d5@3 ~ f5@2 eb5@3 ~ c5@2 [g4,eb5]@3 ~ bb4@2 c5@3 ~ g4@12 ~@14, g4@5 ~@19]/2", // Cm
  AI: "[~@10 bb4@2 f5@3 ~ f5@3 ~@5 g4@5 ~@5 bb4@2 f5@3 ~ f5@3 ~@5 g4@5 ~@5 bb4@2 f5@3 ~ f5@3 ~@5 g4@5 ~@5 bb4@2 f5@3 ~ f5@3 ~ eb5@3 ~, ~@20 eb5@9 ~@15 eb5@9 ~@15 eb5@9 ~@19]/4",
  AJ: "[~@10 bb4@2 f5@3 ~ f5@3 ~ eb5@9 ~@5 bb4@2 f5@3 ~ f5@3 ~ eb5@9 ~@5 bb4@2 f5@3 ~ f5@3 ~ eb5@3 ~]/3",
})).s("gm_pad_poly").gain(0.48)

// chords · pad poly · soft notes
const pad_poly_soft = note("<~@76 A@2 B@2 A@2 B@2 ~@18>".pickRestart({
  A: "d6@3 ~ f6@2 eb6@3 ~ c6@12 ~@2", B: "[d6@3 ~ f6@2 eb6@3 ~ c6@2 eb6@3 ~ bb5@2 c6@3 ~ g5@12 ~@14]/2",
})).s("gm_pad_poly").gain(0.16)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A B C@2 A B D@2 E F G F E F G F E F G F E F G F E F G@2 E F G H E F I@2 E F I@2 E F G H J K L H J K L@2 M ~@15 E F I@2
  E F I@2 E F G H E F G H E@2 N E@3 N E O F E H O F E@2 P@2
>`.pickRestart({
  A: "[g3,eb4]@5 ~ [c4,g4]@5 ~ [g3,eb4]@10 ~@2", B: "[f3,d4]@5 ~ [bb3,f4]@5 ~ [f3,d4]@10 ~@2",
  C: "[d3,bb3]@5 ~ [f3,d4]@5 ~ [d3,bb3]@10 ~@2", D: "[[d3,bb3]@5 ~ [f3,d4]@5 ~ [d3,bb3]@31 ~@5]/2",
  E: "[eb3,g3,c4,eb4,g4]@5 ~ [eb3,g3,c4,eb4,g4]@3 ~ [eb3,g3,c4,eb4,g4]@2 [eb3,g3,c4,eb4,g4]@5 ~ [eb3,g3,c4,eb4,g4]@3 ~ [eb3,g3,c4,eb4,g4]@2", // Cm
  F: "[d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@3 ~ [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@3 ~ [d3,g3,bb3,d4,g4]@2", // Gm
  G: "[d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@3 ~ [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@2", // Gm
  H: "[d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@3 ~ [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@4 [d3,g3,bb3,d4,g4]@3 ~ [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@2", // Gm
  I: "[eb3,g3,bb3,eb4,g4]@5 ~ [eb3,g3,bb3,eb4,g4]@3 ~ [eb3,g3,bb3,eb4,g4]@2 [d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@2 [d3,g3,bb3,d4,g4]@2", // Eb Gm
  J: "[f3,ab3,c4,f4]@5 ~ [f3,ab3,c4,f4]@3 ~ [f3,ab3,c4,f4]@2 [f3,ab3,c4,f4]@5 ~ [f3,ab3,c4,f4]@3 ~ [f3,ab3,c4,f4]@2", // Fm
  K: "[g3,bb3,d4,g4]@5 ~ [g3,bb3,d4,g4]@3 ~ [g3,bb3,d4,g4]@2 [g3,bb3,d4,g4]@5 ~ [g3,bb3,d4,g4]@3 ~ [g3,bb3,d4,g4]@2", // Gm
  L: "[g3,c4,eb4,g4]@5 ~ [g3,c4,eb4,g4]@3 ~ [g3,c4,eb4,g4]@2 [g3,c4,eb4,g4]@5 ~ [g3,c4,eb4,g4]@2 [g3,c4,eb4,g4]@2 [g3,c4,eb4,g4]@2", // Cm
  M: "[eb3,g3,c4,eb4,g4]@19 ~@5", // Cm
  N: "[eb3,g3,c4,eb4,g4]@5 ~ [eb3,g3,c4,eb4,g4]@3 ~ [eb3,g3,c4,eb4,g4]@2 [eb3,g3,c4,eb4,g4]@5 ~ [eb3,g3,c4,eb4,g4]@2 [eb3,g3,c4,eb4,g4]@2 [eb3,g3,c4,eb4,g4]@2", // Cm
  O: "[eb3,ab3,c4,eb4,g4]@5 ~ [eb3,ab3,c4,eb4,g4]@3 ~ [eb3,ab3,c4,eb4,g4]@2 [eb3,ab3,c4,eb4,g4]@5 ~ [eb3,ab3,c4,eb4,g4]@3 ~ [eb3,ab3,c4,eb4,g4]@2", // Abmaj7
  P: "[[c4,eb4,g4]@43 ~@5]/2", // Cm
})).s("gm_acoustic_guitar_nylon").gain(0.35)

// chords · distortion guitar
const distortion_guitar = note("<~@35 A ~@3 A ~@31 A ~@3 A ~@11 B ~@3 B C D E F C D ~ G ~@2>".pickRestart({
  A: "~@4 [g3,bb3,d4] ~", B: "~@16 [g3,c4,eb4]@4 [g3,c4,eb4]@3 ~", C: "~ [ab3,c4,eb4,g4]!2 ~@9",
  D: "~ [bb3,d4,g4]!2 ~@9", E: "~ [c4,eb4,g4]!2 ~@9", F: "~@2 [bb3,d4,g4]@2 [bb3,d4,g4]@2 ~@12 [bb3,d4,g4]@5 ~",
  G: "~@7 [c4,eb4,g4]!2 ~ [c4,eb4,g4] ~", // Cm
})).s("gm_distortion_guitar").gain(0.15)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@16 A B C B A B C B A B C B A B C B A B D E A B D E ~@4 F B A B F B A@3 B C B A B C B A B C B A B C B A B D E A B D E
  A B C B A B C B A G A G ~@14
>`.pickRestart({
  A: "[g3,c4,eb4]", B: "[g3,bb3,d4]", C: "[g3,bb3], d3@2 ~", D: "[eb3,g3,bb3] [d3,g3,bb3]",
  E: "[g3,bb3,eb4] [g3,bb3,d4]", F: "[f3,ab3,c4]", G: "[eb3,g3,c4]",
})).s("gm_string_ensemble_1").gain(0.12)

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

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

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

// drums · hihat
const hihat = s("hh").struct("<~@16 [x!12]!84 x ~>").gain(0.14)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@8 [x!6 ~ x!5]!2 [~ x!5 ~ x!5] [x!6 ~ x!5] [~ x!5 ~ x!5]!3 ~@87>").gain(0.07)

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@15 B ~@3 B ~@3 B ~@11 B ~@15 B ~@3 B ~@3 B ~@7 B ~@7 B ~@10>".pickRestart({
  A: "~ x", B: "~@3 x!2 ~",
})).gain(0.21)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~ x]!2 [x!2] [~ x] [x!2]!3 x ~@86>").gain(0.12)

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

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

// drums · ride
const ride = s("rd").struct("<~@16 [x!4]!84 x ~>").gain(0.14)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@16 [x!12]!84 x ~>").gain(0.72)

stack(
  pad_poly, pad_poly_soft, acoustic_guitar_nylon, distortion_guitar, string_ensemble_1, bass, kick, snare, hihat,
  hihat_soft, mid_tom, open_hat, high_tom, crash, ride, cabasa
)

More by The Cranberries