Strudelify

Find the River

R.E.M.

KeyD majorTempo150 bpm
0:00/0:00
// Find the River — R.E.M.
// 150 bpm, 3/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 197 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(150/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · synth bass 2
const bass = note(`<
  ~@6 A B C@3 D E@2 F ~ G@2 H I J ~ A B K@2 ~ D L@2 F M G@2 H N ~ O P Q@3 R S K@2 A ~ T@2 U V W@2 P N X@2 ~@6 G@2 H N J
  ~ A B K@2 ~ D L@2 F M G@2 H N ~ O P Q@3 R S K@2 A ~ T@2 U V W@2 P N X@2 ~@6 G@2 H N J ~ A B K@2 ~ D L@2 F M G@2 H N
  ~@2 A B Y@3 D E@2 F ~ T@2 U V Z@2 P N X@2 AA AB AC AD A AE AF@2 F D ~ O P Q@3 R S K@2 A ~ T@2 U V W@2 P N X@2 ~ D E@2
  F M G@2 H N ~
>`.pickRestart({
  A: "d2@11 ~@5", B: "~@3 e2@2 f2@9 ~@2", C: "[~@11 a2@7 ~@11 a2@7 ~@12]/3", D: "~@5 d2@11",
  E: "[~@8 e2@3 f2@9 ~@12]/2", F: "a2@7 ~@9", G: "[~@11 d2@11 ~@7 e2@3]/2", H: "f2@9 ~@7", I: "~@3 f2@2 a2@7 ~@4",
  J: "~@8 a2@7 ~", K: "[~@11 a2@7 ~@14]/2", L: "[~@8 e2@3 f2@9 ~@9 f2@3]/2", M: "~@3 a2@7 ~@6", N: "~@5 a2@7 ~@4",
  O: "~@5 d2@3 e2@3 f#2@5", P: "g2 ~", Q: "[~@5 a2@5 ~ a2@7 ~@3 g2@5 ~ d2@11 ~@10]/3", R: "e2@5 ~@3",
  S: "e2@5 g2@8 ~@3", T: "[d2@3 e2@2 f#2@5 ~ g2@8 ~@13]/2", U: "a2@5 a2@7 ~@4", V: "g2@5 d2@11",
  W: "[~@11 e2@10 ~@11]/2", X: "[~@11 d2@11 ~@10]/2", Y: "[~@8 f2@3 a2@7 ~@11 a2@7 ~@12]/3",
  Z: "[~@11 e2@10 ~@6 e2@5]/2", AA: "~@11 d2@2 e2@3", AB: "f#2@5 g2@8 ~@3", AC: "~@11 a2@5", AD: "a2@7 ~@4 g2@5",
  AE: "~@5 e2@10 ~", AF: "[~@5 e2@5 ~ g2@8 ~@13]/2",
})).s("gm_synth_bass_2").gain(0.51)

// drums · snare
const snare = s("sd").struct(`<
  ~@38 A ~ B C A ~ B C A ~@2 C A ~ B C A ~ B ~@29 A ~ B C A ~ B C A ~@2 C A ~ B C A ~ B ~@40 C A ~ B C A ~ B C ~@2 B C A
  ~ B C A ~ B ~ A ~ B C A ~ B C A ~@2 C A ~ B C A ~ B ~@12
>`.pickRestart({
  A: "~@11 x ~@4", B: "x", C: "~@5 x ~@10",
})).gain(0.51)

// drums · crash
const crash = s("cr").struct(`<
  ~@37 A ~@5 B ~@4 C ~@4 A ~@31 A ~@5 B ~@4 C ~@4 A ~@42 C ~@4 A ~@5 B ~@4 C ~@4 A ~@5 B ~@4 C ~@4 A ~@15
>`.pickRestart({
  A: "~@11 x ~@4", B: "x", C: "~@5 x ~@10",
})).gain(0.51)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  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 C D@19 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 C D@19 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 D@41 B A B A B
  A B A B A B A
>`.pickRestart({
  A: "x ~@10 x ~@4", B: "~@5 x ~@10", C: "~@5 x ~@5 x ~@4", D: "x ~@4 x ~@5 x ~@4",
})).gain(2.08)

stack(bass, snare, crash, cabasa)

More by R.E.M.