Strudelify

It Don't Come Easy

Ringo Starr

KeyD majorTempo130 bpm
0:00/0:00
// It Don't Come Easy — Ringo Starr
// 130 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 7 "RINGO STAR" electric guitar jazz (copy of ch 1 "GUITAR" electric guitar clean)
// note: Full arrangement: all 82 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 · [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 · electric bass finger · "BASS"
const bass = note(`<
  A B C D E F G D H I J H E B C E@2 F G A K@2 L@2 K@2 M@2 A F G A@2 F N D A F O E@2 B N D E F O D A F C D K@2 L@2 K@2 M
  P E F O E A F O A@2 B O E@2 F N D A B N A Q R
>`.pickRestart({
  A: "d2@13 ~ d2 ~", B: "a1@13 ~ a1 ~", C: "c2@8 g2@5 ~ g2@2", D: "d2@5 a2 d3 a2", E: "d2@13 ~ d2@2", F: "a1@13 ~ a1@2",
  G: "c2@5 ~ c2@2 g2@8", H: "d2@5 ~ d2@2 d2@6 d2@2", I: "a1@5 ~ a1@2 a1@6 a1@2", J: "c2@3 c2 g2@3 g2",
  K: "f2@5 ~ f2 ~ f2@5 ~ f2 ~", L: "g2@5 ~ g2 ~ g2@5 ~ g2 ~", M: "a1@5 ~ a1 ~ a1@5 ~ a1 ~",
  N: "c2@5 ~ c2@2 g2@5 ~ g2@2", O: "c2 g2", P: "a1@5 ~ a1@2 b2@2 a2@2 f2@2 e2 ~", Q: "d2@5 ~ d2 ~ d2@5 ~ d2 ~",
  R: "d2@7 ~",
})).s("gm_electric_bass_finger").gain(0.35)

// other · electric guitar clean · "GUITAR"
const electric_guitar_clean = note("<A B C@2 A D E F ~@28 A D E G A D E H ~@24 A I J@2 A D K@2 ~@6>".pickRestart({
  A: "d4 f#4@2 e4@2 d4@3", B: "~ d4@2 c4@3 a3@4 g3@2 f3@3 ~, e4 ~@7",
  C: "[f3@2 g3@4 f3@4 e3@4 d3@5 ~@3 f#4 g4 f#4@5 ~@3]/2", D: "e4@2 d4@2 c4@2 a3@4 g3@2 f3@3 ~", E: "f3 g3@2 f3@5",
  F: "d3@6 [f#4,g4] f#4@6 ~@3", G: "d3@3 ~@3 f#4 g4 f#4@8", H: "d3@3 ~@3 f#4 g4 f#4@7 ~",
  I: "e4@2 ~ c4@2 ~ a3@4 g3@2 f3@3 ~, ~ d4 ~@6", J: "[f3@2 g3@4 f3@4 e3@4 d3@5 ~@3 f#4 g4 f#4@8]/2",
  K: "[f3@2 g3@4 f3@4 e3@4 d3@4 ~@4 f#4 f#4@7 ~@2, ~@23 g4 ~@8]/2",
})).s("gm_electric_guitar_clean").gain(0.41)

// chords · electric guitar clean · "GUITAR"
const electric_guitar_clean_2 = note(`<
  A B C D E B F G H I J K G L F E A L C D M@2 N@2 M@2 O@2 D L F D G L P Q@2 B C Q G R S G E B T D@2 L P D M@2 U@2 V@2
  O@2 D R F A G W T D G L P D G R X A Q Y T A Z AA
>`.pickRestart({
  A: "~@3 e4 f#4 e4 d4 a3, ~ d3@7, ~@3 a3@10 ~@3, ~@4 d4@7 ~@5",
  B: "~@6 b3@3 ~ c4@5 ~, a2@15 ~, c4@4 a3@11 ~, ~@2 e3@13 ~", C: "~@2 g3@4 c4 ~@7 g3 ~, [c3,e4] [g2,a3], ~@5 d3@3",
  D: "e4 ~@5 a4@2, d3, ~@2 a4@7 ~ a3@6, ~ d4@3, ~@3 e4@3 ~@2",
  E: "~@6 e4@3 ~ f#4@5 ~, d3@15 ~, f#4@4 d4@11 ~, ~@2 a3@13 ~", F: "~@6 c4 ~@7 g3 ~, [c3,d4] [g2,a3], ~ g3@3 ~ d3@3",
  G: "~@6 d4 ~, d3@7 ~, f#4@4 d4@7 ~@5, ~ a3@3 ~ a3@2 ~, ~@6 f#4@9 ~", H: "~@3 d4@5, [d3,f#4]",
  I: "~@6 c4 ~, ~@2 a2@13 ~, ~@4 e3@11 ~, ~@3 a3@4 ~", J: "~@2 c4 e4 ~ g2 [d4,g4] ~, ~ g3@2 ~@5",
  K: "~@6 f#4@4 a4@2 f#4@3 ~, d3@15 ~, ~@2 a3@13 ~, ~@4 d4@11 ~",
  L: "~@6 a3 ~, a2@7 ~, c4@4 a3@7 ~@5, ~ e3@3 ~ e3@2 ~, ~@6 c4@9 ~",
  M: "[~@4 c4@21 ~@5 f4 ~, ~ f2@15, ~@4 f4@25 ~@3, ~@13 c4@3]/2",
  N: "[~@4 d4@21 ~@5 g4 ~, ~ g2@15, ~@4 g4@25 ~@3, ~@13 d4@3]/2",
  O: "[~@14 e4 ~, ~ a2@14 ~, ~@3 e3@27 ~@2, ~@2 g3@5 c#4@6 g3@2 ~, ~@3 a3@12 ~]/2",
  P: "~@3 e4 ~@3 b3, c3 g2, e4 c4 b3 g3, ~ g3@3 ~ d3@3", Q: "~@4 d4@2 e4@9 ~, d3@15 ~, e4 ~@3, ~@2 a3@7 ~@7",
  R: "b3 ~@5 e4@2, a2, ~@2 e4@7 ~ e3@6, ~ a3@3, ~@3 b3@3 ~@2",
  S: "~@6 c4 ~@7 b3@2, [c3,d4] g2, ~ g3@3 b3@2 g3@2, ~@5 d3@3", T: "~@2 g3@4 c4 ~@3 d3@4 g3 ~, [c3,e4] [g2,b3]",
  U: "[~@6 [g4,b4]@21 ~ [d4,g4,b4] ~@3, ~ g2@14 ~, ~@2 d4@11 ~@3]/2", // G
  V: "[~@3 g4@2 ~@8 f4 g4 ~, f3@15 ~, a4@3 ~@2 c5@9 ~@2, ~ c4@14 ~, ~@2 f4@5 f5@7 ~@2]/2",
  W: "~@4 a3@2 b3@9 ~, a2@15 ~, b3 ~@3, ~@2 e3@7 ~@7", X: "~@6 c4 ~@3 d3@4 g3 ~, [c3,d4] [g2,b3], ~ g3@3 ~@4",
  Y: "~@3 b3 c4 b3 a3 e3, ~ a2@7, ~@3 e3@10 ~@3, ~@4 a3@7 ~@5", Z: "~@4 [a3,d4,f#4] ~@7 [a3,d4,f#4] ~@3",
  AA: "[a3,d4,f#4]@13 ~@3", // D
})).s("gm_electric_guitar_clean").gain(0.19)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@20 A@8 ~@16 B C@5 D@8 E@3 F G H@2 I J@2 K@6 L@7 M>".pickRestart({
  A: "[~@27 a4@3 ~@15 d5 ~@2 g5@4 ~@2 g4 ~@6 a4@2 ~@14 a4@2 ~@14 a4@2 ~@10 c#4@4 ~ e4@5 ~@3 a4@10, f4@29 ~@2 g3@16 ~ g3@10 g4@5 a4@10 f4@13 c4@6 ~@8 e3@28, a4@23 c5@8 b4@10 g4@11 b3@8 ~@3 f3@27 f4@6 ~@6 a3@25 ~, ~@8 c4@24 ~@6 d4@15 ~ d4@9 ~@6 c4@10 a3@12 ~@4 a2@32 ~, ~@79 c5@16 ~@20 c#4@12 ~]/8",
  B: "~@3 f#4, d4, d3@13 ~@3, ~@8 a3@7 ~",
  C: "[~@9 c4@4 e4@2 ~@11 e4@3 ~@9 g3@3 ~@4 f#4@2 ~ f#4@8 ~@20 e4@4, a2@11 ~@4 c3@14 ~@3 d3@15 ~ d3@15 ~ c3@13 ~@3, ~@4 e3@9 ~@29 f#3@5 ~@9 a4@10 ~@4 c4@10, ~@6 a3@10 ~@6 c4@7 ~ d4@38 g3@10 ~@2]/5",
  D: "[~@10 g4@4 ~@15 f#4 ~ [d3,f#4]@5 ~@10 a4@2 ~@9 a4@4 ~@13 b4@3 ~@17 b4@2 ~@10 a4@5 ~@14 f4@3, g3@15 f#4@10 ~ a4@5 a4@7 ~@10 c5@6 ~@7 c5@7 ~@9 d5@19 ~@6 f4@15 ~ f4@6 ~@4, ~@4 b3@12 d3@15 ~@8 f3@8 ~ f3@13 ~@2 g2@29 ~@30 a4@6, ~@6 d4@6 ~@2 d4@22 ~@2 d4@5 ~ f4@8 ~@2 f4@14 ~@3 g4@10 ~@9 g4@8 ~@2 c4@12 ~@4 c4@9 ~@3, ~@22 a3@9 ~@5 a3@4 ~@2 c4@6 ~@3 c4@9 ~@7 d3@10 ~@9 d3@7 ~@3 f3@15 c5@17]/8", // D
  E: "[~@10 c#4@4 e4@3 ~@4 e3@7 ~ a3@2 ~@7 d4@6 f#4@2 d4@2, a2@7 ~@5, ~@2 e3@19 ~@10 d3@14 ~@3, ~@6 a3@19 ~@11 a3@12, ~@17 a4@14 ~@17]/3",
  F: "c3@3 ~@5 a3@4 ~@2 a3@2, e4@3 e3@3 c4@2, ~ a2@2 ~", G: "~@10 c4 ~ d4@4, ~@3 c3@9 ~@4, ~@3 g3@5",
  H: "[~@13 f#4 ~@16 d4@2, e4@6 a3@9 f#4@7 d4@6 f#4@4, ~@3 d3@11 ~ d3@14 ~@3, ~@10 d4@10 a3@9 ~@3, ~@13 a4@3]/2",
  I: "~@3 a3@3 ~ a3, a2@3 e4, ~@4 e3@9 ~@3",
  J: "[~@6 e4@4 g4@4 c4 ~ f#4@6 d4@10, c3@11 ~@4 d3@16 ~, ~ g3@6 ~@9, ~ c4@2 ~@5]/2",
  K: "[~@12 d4@3 ~@7 a2@8 ~@18 [d3,f#4]@15 ~ a4@6 f#4@4 ~@3 a4@2 ~@10 c4@5 e4@2, d3@13 ~@2 e4@28 a3@34 ~@7 e3@10 ~@2, ~@8 a3@8 ~@23 d3@8 ~ d4 ~@15 d3@14 ~ a2@13 ~@4, ~@74 d4@6 ~@5 a3@10 ~]/6", // D
  L: "[~@3 c4 ~@2 g4@6 ~@2 f#4 ~ d3@15 ~@11 a4@3 d4@2 c3@12 ~ c4@3 ~@10 g4@4 ~@31 f#3@4, c3@5 g3@10 f#4@21 a3@12 ~@15 g3@13 ~@4 d3@15 ~@17, ~@6 d4 ~@5 d4@25 ~ d4@6 ~@3 e4@16 ~@5 b3@12 f#4@11 ~@21, ~@31 d3@14 ~@25 d4@5 ~@2 d4@11 ~@2 d4@21 ~, ~@86 a3@9 ~@17]/7",
  M: "[d3,d4]@11 ~@5", // D
})).s("gm_string_ensemble_1").gain(0.36)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note(`<
  ~@20 A@2 ~@24 B ~ C ~@6 D E@2 ~@4 F G ~ H ~ I J@2 ~ K@2 ~ L ~@4 M@2 ~
>`.pickRestart({
  A: "[f3@7 ~]/2", B: "~ g3@3", C: "~@3 f#4", D: "~ g4@4 ~@3", E: "[~@15 f3@14 ~@3]/2", F: "d3 ~@7, d#3 ~@15",
  G: "c3 ~@7", H: "~@9 c4@3 ~@4", I: "~ a3@3", J: "[~@15 c3@5 ~@12]/2", K: "[~@11 d4@9 f#3@8 ~@4]/2", L: "~@2 c4 ~@13",
  M: "[~@15 d3@16 ~]/2",
})).s("gm_string_ensemble_1").gain(0.2)

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

// drums · rim
const rim = s("rim").struct("<A@7 ~@5 A@7 ~@9 A@7 ~ A@7 ~ A@7 ~@9 A@7 ~ A@3 ~ A@7 ~@3>".pickRestart({
  A: "~ x ~ x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@7 A B@3 ~@8 C B@7 C ~@7 C ~@7 D ~@7 A B@7 A ~@7 D ~@3 D ~@7 A B ~>".pickRestart({
  A: "x ~@2 x ~@2 x!2", B: "~ x ~ x", C: "x ~@7 x ~@3 x!2 ~@2", D: "~@8 x!2 ~@2 x ~ x!2",
})).gain(0.57)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@7 A ~@11 B ~@7 B ~@7 B ~@15 A ~@7 A ~@19 A ~@2>".pickRestart({
  A: "~ x!2 ~ x!2 ~@2", B: "~@11 x ~@4",
})).gain(0.36)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!81 ~>").gain(0.43)

// drums · low tom
const low_tom = s("lt").struct("<~@11 A ~@7 B ~@7 B ~@7 B ~@44 C ~>".pickRestart({
  A: "~@5 x!2 ~", B: "~@7 x", C: "~@5 x ~@2",
})).gain(0.57)

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

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@6 A ~@7 A ~@15 A ~@11 A B ~@3 C ~@7 D ~@7 C ~@3 B ~@2 A B ~@2 A ~@7>".pickRestart({
  A: "~@3 x ~@4", B: "~@2 x!2 ~@4", C: "~@7 x", D: "~ x ~@6",
})).gain(0.43)

// drums · high tom
const high_tom = s("ht").struct("<~@11 A ~@7 B ~@7 B ~@7 B ~@46>".pickRestart({
  A: "~ x!2 ~@5", B: "~ x ~@6",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct("<A ~@7 A ~@2 B A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@3 A ~@7 C A>".pickRestart({
  A: "x", B: "~@7 x", C: "x ~@6 x",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A@7 B C D C B A@7 B C D C D C D C D A@7 B A@7 B A C@3 A@3 B C D C D C D C D A@7 B A@3 B A@4 E@3 B A ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~ x!3 ~", C: "~@2 x!2 ~@2 x ~", D: "~@2 x!5 ~", E: "~@2 x ~@3 x!2",
})).gain(0.64)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!4]!81 x>").gain(2.9)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<[~ x ~ x ~ x ~ x]!81 ~>").gain(1.81)

stack(
  bass, electric_guitar_clean, electric_guitar_clean_2, string_ensemble_1, string_ensemble_1_soft, kick, rim, snare,
  snare_soft, clap, low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom, crash, tambourine, cabasa, cabasa_soft
)

More by Ringo Starr