Strudelify

Last Kiss

Pearl Jam

KeyF majorTempo120 bpm
0:00/0:00
// Last Kiss — Pearl Jam
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "Piano" named as a piano, played on piano (its overdriven guitar patch is not one)
// note: Full arrangement: all 71 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// bass · overdriven guitar · "Bass"
const bass = note(`<
  ~ A B C D E F C D A G H I J K E L C M N O C M N L P M A G E O C D A L P D A G H B C D Q L P K G B R M E F R M N L P S
  A S A L C S E O P K G T
>`.pickRestart({
  A: "f2@7 f2", B: "~ d2@21 d2@2", C: "bb1@7 bb1", D: "~ c2@21 c2@2", E: "f2@23 ~", F: "d2@23 ~",
  G: "f2@17 ~ f2@3 f2@3", H: "f2@17 ~ f2@3 c2@3", I: "d2@17 ~ c2@3 a1@3", J: "bb1@17 ~ eb2@3 d2@3", K: "c2@23 ~",
  L: "d2@7 d2", M: "c2@7 c2", N: "f2@7 f1", O: "d2@17 ~ d2@3 d2@3", P: "~ bb1@21 bb1@2", Q: "~ f2@21 f2@2",
  R: "bb1@23 ~", S: "c2@17 ~ c2@3 c2@3", T: "f2@17 ~@7",
})).s("gm_overdriven_guitar").gain(0.72)

// chords · piano
const piano = note(`<
  ~ A B C D E F G H I@2 A B J K A B C H L M C N L O@3 P@2 Q F C H Q F G K I@2 A R J N A F C H A R G H Q F J N S B J H Q
  K T@2 U@2 S R C K A V
>`.pickRestart({
  A: "[a3,c4,f4,a4]@17 ~ c4@5 ~", B: "[a3,d4,f4,a4]@17 ~ a3@5 ~", C: "f3@5 ~ bb3 d4, [bb3,d4,f4]@17 ~@7, ~@15 f3@8 ~",
  D: "[g3,bb3,c4,e4]@5 g3 bb3 [a3,c4,f4,a4]", E: "~@18 c4@5 ~", F: "[a3,d4,f4,a4]@17 ~ d4@5 ~",
  G: "[bb3,d4,f4]@17 ~ bb3@5 ~, f3@23 ~", H: "[bb3,c4,e4,g4]@17 ~ c4@5 ~",
  I: "[[a3,c4,f4,a4]@27 a3@7 c4@5 f4@3 a4@5 ~]/2", J: "f3@17 ~ f3@5 ~, [bb3,d4,f4]@23 ~",
  K: "[g3,bb3,c4,e4]@17 ~ g3@5 ~", L: "[a3,c4,f4,a4]@5 a3 c4 [a3,d4,f4,a4]", M: "~@18 a3@5 ~",
  N: "[g3,bb3,c4,e4]@5 g3 bb3 c4", // C7
  O: "[~@15 a3@3 d4@3 [bb3,d4,f4]@3 ~@21 [g3,bb3,c4,e4]@20 ~ g3@5 ~, ~@21 f3@20 ~ f3@5 ~@25]/3", // Bb C7
  P: "[[a3,c4,f4,a4]@9 a3@2 c4@2 f4@2 a4, f2@47 ~]/2", Q: "[a3,c4,f4,a4]@5 a3 c4 f4", R: "[a3,d4,f4,a4]@5 a3 d4 f4",
  S: "[a3,c4,f4,a4]@17 ~ a3@5 ~", T: "[[a3,c4,f4,a4]@17 ~ a3@3 [a3,d4,f4,a4]@18 a3@3 d4@3 f4@3]/2",
  U: "[f3@17 ~@4 [bb3,c4,e4,g4]@20 ~ c4@5 ~, [bb3,d4,f4]@7 ~@9, ~@18 f3@5 ~@25]/2", V: "[a3,c4,f4,a4]@17 ~@7",
})).s("gm_piano").gain(0.72)

// chords · overdriven guitar · "Guitar"
const overdriven_guitar = note(`<
  ~ A B C D E F G H E I A J K L E M G N E M K N O P@2 N Q R E F S@3 B C T A U V B C N E W X L A W X D A J Y@2 O F G N Z
  H V M K H AA@2 AB@2 O AC
>`.pickRestart({
  A: "[a3,c4,f4] f3@5 a3 [c4,f4]@3 [a3,c4,f4]@2 a3 f3@2 a3@3 [a3,c4,f4]@3 a3 f3@2", // F F5 F
  B: "a3 f3@4 a3 [d4,f4]@5 ~@4 [f3,d4]@3 a3@3 [f3,f4]@3", C: "f3 d3@4 f3 [bb3,d4]@5 ~@4 [d3,bb3]@3 f3@3 [d3,d4]@3",
  D: "[g3,bb3,c4] e3@5 g3 [bb3,c4]@3 [g3,bb3,c4]@2 g3 e3@2 g3@3 [g3,bb3,c4]@3 g3 e3@2", // C7 Bbsus2 C7
  E: "[f3,a3]@5 ~ [a3,c4,f4]@3 c4 a3@2 f3@3 [c4,f4]@3 a3@3 a3@3", // F F5
  F: "[a3,d4,f4] f3@5 a3 [d4,f4]@3 [a3,d4,f4]@2 a3 f3@2 a3@3 [a3,d4,f4]@3 a3 f3@2", // Dm
  G: "~ [d3,f3,bb3,d4]@5 ~ [d3,f3,bb3,d4]@3 [d3,f3]@2 [d3,bb3,d4] f3@2 [d3,f3,bb3,d4]@7 [d3,f3]@2", // Bb Dm Gm Bb Dm
  H: "[e3,g3]@5 ~ [g3,bb3,c4]@3 bb3 g3@2 e3@3 [bb3,c4]@3 g3@3 g3@3", // Em C7 Bbsus2
  I: "[f3,a3]@3 a3@3 [a3,f4] c4@2 a3@3 f3@3 f4 [a3,c4]@2 ~ f3@5", // F Dm Am
  J: "~ [f3,a3,d4,f4]@5 ~ [f3,a3,d4,f4]@3 [f3,a3]@2 [f3,d4,f4] a3@2 [f3,a3,d4,f4]@7 [f3,a3]@2", // Dm F Dm F
  K: "[d3,f3,bb3]@5 ~@2 bb3@3 d3@2 bb3 f3@2 bb3@8 ~", L: "[e3,g3,bb3]@5 ~@2 bb3@3 e3@2 bb3 g3@2 bb3@8 ~",
  M: "[f3,a3]@5 ~ [a3,d4,f4]@3 d4 a3@2 f3@3 [d4,f4]@3 a3@3 a3@3", // F Dm
  N: "~ [e3,g3,bb3,c4]@5 ~ [e3,g3,bb3,c4]@3 [e3,g3]@2 [e3,bb3,c4] g3@2 [e3,g3,bb3,c4]@7 [e3,g3]@2", // C7 Em C7 Em
  O: "[f3,a3,c4]@5 ~@2 c4@3 f3@2 c4 a3@2 c4@8 ~", // F
  P: "[~ [f3,a3,d4,f4]@5 ~ [f3,a3,d4,f4]@3 [f3,a3]@2 [f3,d4,f4] a3@2 [f3,a3,d4,f4]@6 [d3,f3,bb3]@8 ~@2 bb3@3 d3@2 bb3 f3@2 bb3@8 ~]/2", // Dm F Dm Bb
  Q: "[f3,a3,c4]@5 ~ [a3,c4]@3 [a3,c4]@3 [f3,a3]@3 [a3,c4]@3 a3 f3@2 [a3,c4]@3, f2@11 ~@13", // F Am F Am
  R: "f2@5 ~ [a3,c4]@3 c4 a3@2 a3 f3@2 [a3,c4]@3 ~ [f3,a3]@2 c4 a3@2", // Am F
  S: "[~ [d3,f3,bb3,d4]@5 ~ [d3,f3,bb3,d4]@3 [d3,f3]@2 [d3,bb3,d4] f3@2 [d3,f3,bb3,d4]@6 [e3,g3]@8 ~ [g3,bb3,c4]@3 bb3 g3@2 e3@3 [bb3,c4]@3 g3@3 a3 f3@7 a3 [c4,f4]@5 ~@4 [f3,c4]@3 a3@3 [f3,f4]@3]/3", // Bb Dm Gm Bb Em C7 Bbsus2 F5 …
  T: "g3 e3@4 g3 [bb3,c4]@5 ~@4 [e3,bb3]@3 g3@3 [e3,c4]@3", // Bbsus2 Edim C
  U: "[a3,c4,f4]@4 a3@2 a3 c4@2 [a3,c4,f4]@3 a3 f3@2 a3@3 [a3,c4,f4] f3@5", // F
  V: "a3 f3@4 a3 [c4,f4]@5 ~@4 [f3,c4]@3 a3@3 [f3,f4]@3", W: "[f3,a3,d4]@5 ~@2 d4@3 f3@2 d4 a3@2 d4@8 ~",
  X: "[d3,f3]@5 ~ [f3,bb3,d4]@3 bb3 f3@2 d3@3 [bb3,d4]@3 f3@3 f3@3", // Dm Bb
  Y: "[~ [d3,f3,bb3,d4]@5 ~ [d3,f3,bb3,d4]@3 [d3,f3]@2 [d3,bb3,d4] f3@2 [d3,f3,bb3,d4]@6 [e3,g3,bb3]@8 ~@2 bb3@3 e3@2 bb3 g3@2 bb3@8 ~]/2", // Bb Dm Gm Bb Edim
  Z: "~ [f3,a3,c4,f4]@5 ~ [f3,a3,c4,f4]@3 [f3,a3]@2 [f3,c4,f4] a3@2 [f3,a3,c4,f4]@7 [f3,a3]@2", // F F5 F
  AA: "[a3 f3@4 a3 [c4,f4]@5 ~@4 [f3,c4]@3 a3@3 a3 f3@7 a3 [d4,f4]@5 ~@4 [f3,d4]@3 a3@3 [f3,f4]@3]/2", // F5 Dm F
  AB: "[[d3,f3]@5 ~ [f3,bb3,d4]@3 bb3 f3@2 d3@3 [bb3,d4]@3 f3@3 [e3,g3,bb3]@8 ~@2 bb3@3 e3@2 bb3 g3@2 bb3@8 ~]/2", // Dm Bb Edim
  AC: "[a3,c4,f4] f3@5 ~@18", // F
})).s("gm_overdriven_guitar").gain(0.72)

// drums · kick
const kick = s("bd").struct("<~ A@15 B A B A@9 B A B A@5 B A@11 B A@3 B A@9 B A@7 C>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!3 ~ x", C: "x ~@2 x!2 ~@3",
})).gain(0.72)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!31 [~ x ~@2] [~ x ~ x]!27 [~ x ~@2] [~ x ~ x]!9 [~ x ~@2]>").gain(0.72)

// drums · snare
const snare = s("sd").struct("<~@32 [~@15 x ~@2 x ~ x ~@3] ~@27 [~@15 x ~@2 x ~ x ~@3] ~@10>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<~ A@17 B A C A@3 C A@3 C A B A D A@3 C A@11 B A@3 B A@7 D A B A@7 E>".pickRestart({
  A: "x!8", B: "x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~ x", C: "x ~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2",
  D: "x!7 ~", E: "x!5 ~@3",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A ~@3 A ~@15 B ~@3 C ~@19 A ~@3 B ~@10>".pickRestart({
  A: "~@11 x ~@12", B: "~@7 x", C: "~@23 x",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "x",
})).gain(0.72)

stack(bass, piano, overdriven_guitar, kick, rim, snare, hihat, open_hat, crash)

More by Pearl Jam