Strudelify

Undertow

R.E.M.

KeyA majorTempo188 bpm
0:00/0:00
// Undertow — R.E.M.
// 187.5 bpm, 3/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 241 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(187.5/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · "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 · piano
const bass = note(`<
  A B C D@2 E@2 F A G@2 H@2 I@3 A B C D@2 J@3 A G@2 D@2 J@3 A G@2 D@2 J@3 A K@4 L M ~ N O P@3 L M ~ N O P@3 L M Q A B C
  D@2 E@2 F A G@2 H@2 I@3 A B C D@2 J@3 A G@2 D@2 J@3 A G@2 D@2 J@3 A K@4 L M ~ N O P@3 L M ~ N O P@3 L M Q R S@2 T@5
  U@2 V T@5 R W@4 X@2 F A G@2 H@2 I@3 A B C D@2 E@2 F A G@2 D@2 J@3 A G@2 D@2 J@3 A G@2 D@2 J@3 N O P@3 L M ~ N O P@3 L
  M ~ N O Y@3 Z@3 R S@2 AA@4 AB@5 AC@8 AD@5
>`.pickRestart({
  A: "d2@5 e2@3 e2@8", B: "a1@11 a1@5", C: "a1@3 b1@2 d2@5 ~ d2@5", D: "[e2@3 e2@8 a1@19 ~@2]/2",
  E: "[~@5 d2@5 ~ e2@2 e2@8 a1@11]/2", F: "a1@5 a1@3 b1@3 d2@5", G: "[a1@19 ~@8 d2@5]/2",
  H: "[e2@3 e2@8 a1@10 a1@5 ~ a1@2 b1@3]/2", I: "[d2@5 d2@5 ~ e2@2 e2@8 a1@19 ~@8]/3",
  J: "[~@5 d2@5 ~ e2@2 e2@8 a1@19 ~@8]/3", K: "[a1@19 ~@8 e2@8 e2@2 e2@5 ~ a2@9 ~@12]/4", L: "~@5 e2@8 e2@3",
  M: "e2@5 a2@9 ~@2", N: "e2@8 e2@3 e2@5", O: "a2@9 ~@7", P: "[~@11 e2@8 e2@2 e2@5 ~ a2@9 ~@12]/3", Q: "a1@11 g1@5",
  R: "f#1@5 f#1@3 f#1@5 f#1@3", S: "[d1@27 f#1@5]/2",
  T: "[f#1@3 f#1@5 f#1@3 d1@26 f#1@5 ~ f#1@2 f#1@5 ~ f#1@2 d1@27]/5", U: "[c#1@27 c#1@5]/2", V: "a1@5 e1@5 ~ f#1@5",
  W: "[d1@27 c#1@26 c#1@5 ~ a1@5]/4", X: "[e1@5 d2@5 ~ e2@2 e2@8 a1@11]/2", Y: "[~@11 e2@8 e2@2 e2@5 ~ a2@9 ~ a1@11]/3",
  Z: "[g1@5 f#1@5 ~ f#1@2 f#1@5 ~ f#1@2 d1@27]/3", AA: "[f#1@3 f#1@5 f#1@3 d1@26 c#1@27]/4",
  AB: "[c#1@5 a1@5 ~@6 c#1@21 c#1@21 ~ c#1@21, ~@11 e1@25 ~@44]/5", AC: "[c#1@21 c#1@21 ~ c#1@21]/4",
  AD: "[c#1@21 c#1@21 ~ c#1@30 ~@7]/5",
})).s("gm_piano").gain(0.51)

// other · overdriven guitar
const overdriven_guitar = note("<~@136 A@2 B@2 ~@6 C@3 D ~@71 E@3 F@2 G@2 H I J K F@2 G@2 H I J L@2>".pickRestart({
  A: "[c#5@11 e5@8 g#5@2 g#5@5 ~ e5@5, c#4@15 ~]/2", B: "[g#5@5 e5@13 ~@14]/2",
  C: "[~@11 c#5@10 e5@8 g#5@3 g#5@5 e5@5 ~ g#5@5, ~@11 c#4@30 ~@7]/3", D: "e5@5 ~@11",
  E: "[~@5 c#5@11 e5@8 g#5@3 g#5@5 e5@5 g#5@5 ~ e5@5, ~@5 c#4@30 ~@13]/3", F: "[c#5@11 e5@8 g#5@2 g#5@5 ~ e5@5]/2",
  G: "[g#5@5 e5@5 ~ c#5@10 e5@8 g#5@3]/2", H: "g#5@5 e5@5 ~ g#5@5", I: "e5@5 c#5@11", J: "e5@8 g#5@3 g#5@5",
  K: "e5@5 g#5@5 ~ e5@5", L: "[e5@5 g#5@5 ~ e5@13 ~@8]/2",
})).s("gm_overdriven_guitar").gain(0.51)

// other · guitar harmonics
const guitar_harmonics = note(`<
  ~ A@3 B ~ C@4 ~@2 D@4 ~ A@3 B ~ E@2 ~ F ~@2 G ~ H@2 ~ I ~@2 B ~ E@2 ~ F ~@23 A@3 B ~ C@4 ~@2 D@4 ~ A@3 B ~ E@2 ~ F ~@2
  G ~ H@2 ~ I ~@2 B ~ E@2 ~ F ~@44 C@4 ~@2 D@4 ~ A@3 B ~ C@4 ~@2 G ~ H@2 ~ I ~@2 B ~ E@2 ~ F ~@2 G ~ H@2 ~@49
>`.pickRestart({
  A: "[~@5 c5@43]/3", B: "a4@11 ~@5", C: "[~@11 c5@42 a4@11]/4", D: "[c5@43 a4@11 ~@10]/4", E: "[~@11 c5@11 ~@10]/2",
  F: "~@5 a4@11", G: "c5@11 ~@5", H: "[~@11 a4@11 ~@10]/2", I: "~@5 c5@11",
})).s("gm_guitar_harmonics").gain(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@23 A ~@2 B ~@2 C ~ A ~@2 B ~@2 C
  ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@45 C ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@2 B ~@2 C ~ A ~@2 B
  ~@2 C ~ A ~@2 B ~@2 C ~@49
>`.pickRestart({
  A: "~@13 x ~@2", B: "~ x", C: "~@3 x ~@12",
})).gain(0.51)

// drums · snare
const snare = s("sd").struct(`<
  A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ D C E ~ B F A G B C A H I C A ~ D
  C E ~ J K A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ D C E ~ B F A G B C A H
  I C A ~ D C E ~ J K A G B C A H I C ~ L M C E ~ B F A G B ~ N B@2 C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A ~ B C A
  ~ B C A ~ B C A ~ B C A ~ B F A G B C A H I C A ~ D C E ~ B F A G B C N B I C A ~ D C E ~ A K ~@17
>`.pickRestart({
  A: "~@11 x ~@4", B: "x", C: "~@5 x ~@10", D: "x ~@4 x ~@2 x ~@7", E: "x ~@2 x ~@7 x ~@4", F: "~@5 x ~@5 x ~ x ~@2",
  G: "~@5 x ~@2 x ~@7", H: "x ~@2 x ~@12", I: "x ~@10 x ~ x ~@2", J: "x ~@10 x ~@4", K: "x ~@4 x ~@2 x ~@2 x ~@4",
  L: "~@5 x ~@5 x ~@4", M: "x ~@2 x ~ x ~@10", N: "x ~@4 x ~@5 x ~ x ~@2",
})).gain(0.51)

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

stack(bass, overdriven_guitar, guitar_harmonics, kick, snare, china)

More by R.E.M.