Strudelify

The One I Love

R.E.M.

KeyE minorTempo130 bpm
0:00/0:00
// The One I Love — R.E.M.
// 130 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 3/4 at bar 103) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 104 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/4)

// 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 · electric bass finger · "Darin Driscoll"
const bass = note(`<
  ~ A@8 B C B@3 C B D E@2 F@2 B C B@2 A@8 B C B@3 C B D E@2 F@2 B C B@2 A@8 E@2 F@2 B C B@3 C B@3 C B D E@2 F@2 B C B@2
  A@16 G H@6
>`.pickRestart({
  A: "[e2@5 ~ e2@2 g2@2 a2@4 d2@6 ~@2 d2@2 g2@2 f#2@4 e2@7 ~ e2@2 g2@2 a2@4 e2@8 b1 ~ e2@6 b1@2]/4",
  B: "e2@2 ~ e2 b1@2 ~ b1", C: "a2@2 ~ a2 d2@2 ~ d2", D: "e2@2 ~ e2 b1 ~ d2 ~", E: "[g2@2 ~ g2 f2 e2@2 d2@6 e2@3]/2",
  F: "[g2@6 a1@4 b1@4 c2@17 ~]/2", G: "e2@3 g2", H: "[a2@4 d3@5 d2@12 d#2@13 ~ e2@54 ~@7]/6",
})).s("gm_electric_bass_finger").gain(0.25)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@8 A ~@7 A ~@3 A ~@3 B ~@7 A ~@7 A ~@3 A ~@3 B ~@7 A ~@3 A ~@3 B ~@7 A ~@3 A ~@3 B ~@7 A ~@7 A ~ C D ~@4
>`.pickRestart({
  A: "~@7 x", B: "~@5 x!3", C: "~ x ~@2", D: "~@12 x!3 ~",
})).gain(0.42)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B ~@6 C A C A C A C A ~@4 C A C A@2 B ~@6 C A C A C A C A ~@4 C A C A@2 B ~@10 C A C A C A C A C A C A ~@4 C A C A
  ~@23
>`.pickRestart({
  A: "~ x ~@6", B: "~@3 x ~@4", C: "~ x ~@5 x",
})).gain(0.18)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A B@2 ~@2 B@2 ~@2 B ~ B ~ B ~@7 B ~@2 A B@2 ~@2 B@2 ~@2 B ~ B ~ B ~@7 B ~@2 A B@2 ~@2 B@2 ~@6 B ~@3 B ~ B ~ B ~@7 B
  ~@25
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@7 x",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@2 B A ~@11 C ~@7 A ~@2 B A ~@11 C ~@7 A ~@2 B A ~@3 C ~@15 C ~@7 A ~@2 B A ~@3 A ~@2 B A ~@3 C D E F ~@3
>`.pickRestart({
  A: "x ~@6 x", B: "~ x", C: "x", D: "~@9 x ~@6", E: "~@5 x ~@10", F: "~@3 x ~@12",
})).gain(0.42)

// drums · ride
const ride = s("rd").struct(`<
  ~@17 A B@2 C ~@20 A B@2 C ~@12 A B@2 C ~@12 A B@2 C ~@4 A B@2 C A B@2 C A B@2 C A B@2 C ~@7
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~@4",
})).gain(0.36)

stack(bass, kick, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat, crash, ride)

More by R.E.M.