Strudelify

Country Doctor

Bruce Hornsby

KeyE majorTempo96 bpm
0:00/0:00
// Country Doctor — Bruce Hornsby
// 96 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 125 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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.

// chords · piano
const piano = note(`<
  ~@3 A B C D A B C E ~@2 A F ~@2 G H I J I J K L M L N L M O ~@7 P ~@2 A F ~@2 G H I J I J K L M L N L M O ~@6 Q R S T
  Q R S T Q R S T K L M L N L M O ~@8 Q R S T Q R S T Q R S T Q R S T Q R S T Q R S T U V W X U V W X
>`.pickRestart({
  A: "~@2 [a3,d4,f#4]@3 ~@3 [f#3,b3,e4]@3 ~ [f#3,b3,e4] ~ [d3,a3,e4]@2", // D Esus2 Dsus2
  B: "~@2 [e3,b3,e4] ~ [e3,a3,d4]@3 ~ e3 f#3 a3 c#4 b3 g#3 e3 [a3,d4,f#4]", // E5 Dsus2 D
  C: "~@2 [f#4,a4,d5]@3 ~@3 [e4,a4,c#5]@3 ~ [a3,d4,f#4] ~ [a3,c#4,e4]@2", // D A D A
  D: "~@3 e3 ~ e3 ~ [e3,a3]@2 ~ [e3,a3] ~ [f#3,b3]@3 ~", // A5 B5
  E: "~@2 [a3,d4,f#4] ~ [a3,c#4,e4]@3 ~ d4 c#4 b3 c#4 b3 a3 g#3 f#3", // D A
  F: "~@2 [e3,b3,e4] ~ [e3,a3,d4]@3 ~ d4 e4 f#4 d4 e4 c#4 a3 f#3", // E5 Dsus2
  G: "~@2 [a3,d4,f#4]@3 ~@3 [f#3,b3,e4]@3 ~ [d3,a3,e4] [f#3,b3]@2 ~", // D Esus2 Dsus2 B5
  H: "[e3,b3,e4] ~ [d3,a3] [e3,b3,e4]@2 ~ [e3,b3,e4] ~ [f#3,c#4] [e3,b3,e4]@2 ~ [e3,b3,e4] ~ [e3,b3,e4] ~", // E5 D5 E5 F#5 E5
  I: "[e4,a4,c#5]@3 ~ [d4,f#4,a4]@3 ~ [e4,a4,c#5]@5 ~@3", J: "[d4,f#4,b4]@3 ~ [e4,a4,c#5]@3 ~ [e4,g#4,b4]@5 ~@3",
  K: "~@2 [e3,a3,c#4] ~ [f#3,b3,d4]@3 ~ [e3,a3,c#4]@2 ~ [f#3,b3,d4]@3 ~@2", // A Bm A Bm
  L: "[e3,a3,c#4]@2 ~ [f#3,b3,d4]@3 ~@2 [f#3,a3,d4]@3 ~ [g#3,b3,e4]@3 ~", // A Bm D E
  M: "~@2 [f#3,b3,d4]@4 ~@2 [e3,a3,c#4]@2 ~ [f#3,b3,d4]@3 ~@2", // Bm A Bm
  N: "~@2 [f#3,b3,d4]@3 ~ [e3,a3,c#4] ~ [e3,a3,c#4]@2 ~ [f#3,b3,d4]@3 ~@2", // Bm A Bm
  O: "[a3,d4,f#4]@3 ~ [c#4,f#4,a4]@3 ~ [b3,e4,g#4]@5 ~@3", P: "~@8 d4 c#4 b3 c#4 b3 a3 g#3 f#3",
  Q: "e4 f#4@3 ~@2 [e4,b4]@4 ~@2 g#4 a4 b4 ~, [a4,c#5] ~@3", // E5 A
  R: "[e4,a4]@3 ~ g#4 ~ [a3,d4,f#4]@3 ~ [g#3,b3,e4]@3 ~ a4 b4", S: "[e4,a4,c#5]@3 ~ b4 a4 [e4,b4]@4 ~@2 g#4 a4 b4 ~",
  T: "[e4,a4]@3 ~ g#4 ~ [a3,d4,f#4]@3 ~ [g#3,b3,e4]@4 ~@2", U: "~@2 [d3,b3]@3 ~@3 [d3,a3]@3 ~@5",
  V: "~@2 [d3,a3,e4]@4 ~@3 [d3,a3,e4]@2 ~ [f#3,b3,e4]@3 ~", // Dsus2 Esus2
  W: "[d3,a3,e4] ~ [e3,b3,e4] ~ [d3,a3,e4] ~@3 [b3,f#4] ~ [a3,d4,a4] ~@5", // Dsus2 E5 Dsus2 B5 D5
  X: "~@2 [e3,a3,e4] [f#3,b3,e4]@2 ~ [f#3,b3,e4]@2 ~ [e3,a3,e4]@2 ~ [f#3,b3,e4]@3 ~", // A5 Esus2 A5 Esus2
})).s("gm_piano").gain(0.4)

// chords · drawbar organ
const drawbar_organ = note(`<
  ~@11 A B ~@2 A B ~@2 C D C D E F G F H F G I J K J L M N J O A B ~@2 A B ~@2 C D C D E F G F H F G I J K J L M N P Q P
  Q P Q P Q P Q P Q E F G F H F G I J K J L M N J L P Q P Q P Q P Q P Q P Q P Q P Q P Q P Q P Q P Q R@2 S@2 R@2 S@2
>`.pickRestart({
  A: "[b3,e4,g#4]", B: "[e4,g#4,b4]@3 [d4,f#4,b4]", C: "[e4,a4,c#5] [d4,f#4,a4] [e4,a4,c#5]@2",
  D: "[d4,f#4,b4] [e4,a4,c#5] [e4,g#4,b4]@2", E: "~@2 [e3,a3,c#4]@2 [f#3,b3,e4]@4 [e3,a3,c#4]@3 [f#3,b3,d4]@5",
  F: "[e3,a3,c#4]@3 [f#3,b3,d4]@5 [f#3,a3,d4]@4 [g#3,b3,e4]@4", G: "~@2 [f#3,b3,e4]@6 [e3,a3,c#4]@3 [f#3,b3,d4]@5",
  H: "~@2 [f#3,b3,e4]@4 [e3,a3,c#4]@2 [e3,a3,c#4]@3 [f#3,b3,d4]@5", I: "[a3,d4,f#4] [c#4,f#4,a4] [b3,e4,g#4]@2",
  J: "[b3,e4,g#4]@3 [d4,f#4,a4]@3 [c#4,e4,g#4]@2 [d4,f#4,a4]@4 [b3,e4,g#4]@4", // E D C#m D E
  K: "[a3,c#4,e4]@3 [f#3,b3,d4]@3 [e3,a3,c#4]@2 [f#3,b3,d4]@6 ~@2", // A Bm A Bm
  L: "[a3,c#4,e4]@3 [f#3,b3,d4]@3 [e3,a3,c#4]@2 [f#3,b3]@6 ~@2", // A Bm A B5
  M: "[b3,e4,g#4]@3 [d4,f#4,a4]@3 [e4,g#4,b4]@2 [d4,e4,a4,c#5]@4 [b3,e4,g#4,b4]@4", // E D E A E
  N: "[a3,c#4,e4]@3 [f#3,b3,d4]@3 [e3,a3,c#4]@2 [c#4,d4,f#4,a4]@6 ~@2", // A Bm A Dmaj7
  O: "[a3,c#4,e4]@3 [f#3,b3,d4]@3 [e3,a3,c#4]@2 ~@8", P: "[d4,a4,c#5]@3 [b3,e4,g#4]@2 [b3,e4,g#4]@3",
  Q: "[e4,f#4,a4]@3 [d4,e4,a4]@2 [g#3,b3,e4]@3", R: "[[a3,d4,f#4]@6 [d4,f#4,a4] [e4,g#4,b4]]/2",
  S: "[[a3,d4,f#4]@6 [d4,e4,a4] [e4,f#4,b4]]/2", // D Dsus2 Esus2
})).s("gm_drawbar_organ").gain(0.12)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@30 A B C B D E F B G ~@19 A B C B D E H ~@3 I J K L M@2 N O P ~@7 A B C B D E F B Q ~@7 R S T U V W X Y Z AA AB AC
  AD AE AF AG AH AI ~@7
>`.pickRestart({
  A: "~@14 e4 f#4", B: "g#4@3 a4@3 b4@2 a4@4 g#4@4", C: "e4@3 d4@3 c#4@2 d4@6 e4 f#4", D: "e4@3 d4@3 c#4@2 b3@6 e4 f#4",
  E: "g#4@3 a4@3 b4@2 c#5@4 b4@4", F: "e4@3 d4@3 c#4@2 a4@6 e4 f#4", G: "e4@3 d4@3 c#4@2 ~@8",
  H: "e4@3 d4@3 c#4@2 a4@6 ~@2", I: "~@8 f#5!2 e5 d5 c#5!2 b4 a4", J: "f#4@2 ~ a4!2 ~ b4 g#4@2 ~ b4 f#4 e4@3 ~",
  K: "~ d4 c#4 b3 a3 b3 c#4 e4 d4 f#4 a4 b4 g#4 ~ e4 ~", L: "~ f#4 b4 c#5 d5@2 ~ c#5 b4 a4 g#4@2 ~ b4 g#4 f#4",
  M: "[e4@2 ~ f#4 e4@2 ~ f#4 d4 f#4 a4 b4 g#4 ~ e5@4 ~@2 e5 f#5 ~ g#5 a5 g#5 ~ f#5 a5 g#5@3]/2",
  N: "~@2 f#5 e5 f#5 e5 ~ c#5 ~ c#5 ~ b4 c#5 e5 ~ d5", O: "~ c#5 b4 a4 g#4 f#4 b4@2 ~ g#4 ~ c#5 e4 a4 c#5 e5",
  P: "f#5 ~ g#5 a5 ~ g#5 b5@2 ~ g#5 ~ e5 ~ b4 e5 f#5", Q: "e4@3 d4@3 c#4@2 b3@6 ~@2", R: "~@10 d5 ~ c#5 ~ b4 ~",
  S: "a4 ~ f#4 a4 ~ c#5 b4@4 ~ e4 a4 b4 c#5 e5", T: "f#5 ~ f#5!2 ~ a5 g#5 f#5 e5 e5@2 ~ e5 g#5 e5 ~",
  U: "~ d4 f#4 b4 ~ c#5 b4 g#4@2 ~ b4 ~ a4 ~ b4 c#5", V: "~ f#5 ~ c#5 a4 f#4 e4 d#4 d4 f#4 a4 f#4 g#4 ~ e4 ~",
  W: "~ c#4 d4@2 ~ b4 g#4@2 ~ e4 b3 c#4@2 ~ a4 ~", X: "~@3 f#4 e4 ~ d4 f#4 e4 b3 g#3 ~@3 d4 f#4",
  Y: "~ b4 f#4 d5@2 ~ b4 a4 g#4 b4 e4 ~ a4 e4 b4 c#5", Z: "f#5 ~ c#5 e5 ~ c#5 b4@3 ~ g#4 b4 e4 f#4 g#4!2",
  AA: "a4 ~ f#4 d4 a4 f#4 d4 g#4@2 ~ e4 b3 e4 ~ b3 ~", AB: "~ f#3 ~ g#3 a3 b3 g#3 b3 f#3 ~ a3 e3 e3@3 ~",
  AC: "~ b3 e4 d4 ~ f#3 b3 g#3 ~ b3 e4 a3 c#4 e4 c#4 ~", AD: "f#4 a4 a3@3 ~ f#4 a4 d5 e5 f#5 e5 ~ b4 g#4 e4",
  AE: "a4 ~ b4 ~ d5 ~ f#5 ~ a5 ~ g#5 e5@3 ~ c#5", AF: "e5 c#5 f#5 ~ e5 ~ c#5 ~ b4 a4 f#4 a4 g#4 f#4 e4 d#4",
  AG: "d4 ~ c#5 b4 ~ g#4 ~ b4 e4 ~ e4 e5@3 ~ [d5,e5]", AH: "c#5 d5 e5 f#5 g#5!2 f#5 g#5 a5!2 g#5 a5 b5!2 a5 b5",
  AI: "c#6@3 ~@13",
})).s("gm_overdriven_guitar").gain(0.4)

// bass · electric bass pick
const bass = note(`<
  ~@2 A B C B D B C B E F G B H F G B H I J I J B C B K B C B L M N M O M N P Q F G B H F G B H I J I J B C B K B C B L
  M N M O M R S T S T S T S T S T S T B C B K B C B L M N M O M N P U S T S T S T S T S T S T S T S T S T S T S T S T B
  C B V B C B V
>`.pickRestart({
  A: "~@15 b2", B: "b1 ~ b2@2 ~ b2 b1 ~ b2@2 ~ b2 b1 ~ b2@2", C: "~ b2 b1 ~ b2@2 ~ a2 d2@2 ~ b2 e2@2 ~ b2",
  D: "~ b2 b1 b2 ~ b2 ~ d2 ~ d2@2 ~ e2@2 ~ b2", E: "~ b2 b1 b2 ~ b2 ~ b1 b2 a2 g#2 a2 g#2 f#2 e2 d2",
  F: "e2 ~ e2@2 ~ e3 e2 ~ e2@2 ~ e2 ~ e3 e2 ~", G: "e2 ~ e2@2 ~ e3 e2 ~ e2@3 ~ a2@2 ~ b2",
  H: "~ b2 b1 ~ b2@2 ~ a2 b2 c#3 d3 b2 c#3 a2 f#2 d2", I: "c#2@3 ~ d2@3 ~ e2@4 ~@2 a2 ~",
  J: "b2@3 ~ a2@3 ~ g#2@4 ~@2 e2 ~", K: "~ b2 b1 b2 ~ b2 ~ a2 d2@2 ~ b2 e2@2 ~ b2", L: "d2@3 ~ f#2@3 ~ e2@4 ~@2 e2 ~",
  M: "b1@2 ~ f#2@2 ~ a2 ~ b2@3 ~ a2@3 ~", N: "c#2@2 ~ b1@2 ~ f#2 ~ b1@4 ~@2 e2 b1",
  O: "c#2@2 ~ f#2@2 ~ d2 ~ e2@4 ~@2 e2 ~", P: "f#2@2 ~ f#2@2 ~ a2 ~ b2@3 ~ a2@3 ~",
  Q: "c#2@2 ~ b1@2 ~ f#2 ~ b2 a2 g#2 a2 g#2 f#2 e2 d2", R: "c#2@2 ~ b1@2 ~ f#2 ~ b1@4 ~@2 e2 f#2",
  S: "b2@4 ~@2 g#2@3 ~ a2@3 ~@2 c#3", T: "a2@4 ~@2 d2@3 ~ e2 ~ e2@2 ~ a2", U: "c#2@2 ~ b1@2 ~ f#2 ~ e2@4 ~@2 e2 f#2",
  V: "~ b2 b1 b2 ~ c#3 ~ [d2,a2] ~ [d2,a2]@2 ~ [e2,b2]@2 ~ b2", // D5 E5
})).s("gm_electric_bass_pick").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@9 B A@7 C D E D E F@15 G D H D H D H D H D E D E F@13 I F@27 I F@14 I F@9 D@8
>`.pickRestart({
  A: "x ~@4 x ~ x", B: "x", C: "x ~@7 x ~@4 x!2 ~", D: "x ~@2 x!2 ~@3", E: "x ~@4 x ~ x ~@6 x ~", F: "x ~@2 x ~ x ~@2",
  G: "x ~@5 x ~ x!8", H: "x ~@2 x!2 ~@2 x", I: "x ~@2 x ~@4",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  ~@18 A B@12 C B C B C B C D B@20 C B C B C D B@11 E B@8 C B C B C B C D B@7 F B@2 G B@2 H I B@4 J B@12
>`.pickRestart({
  A: "~@11 x!2 ~ x!2", B: "~ x ~ x", C: "~@3 x ~@8 x ~@3", D: "~ x ~@2", E: "~@2 x ~@2 x!2 ~", F: "~@4 x ~@7 x!2 ~ x",
  G: "~@4 x ~@6 x!3 ~@2", H: "~@4 x ~@2 x ~@4 x ~@3", I: "~@4 x ~@6 x!2 ~@3", J: "~@4 x ~@5 x ~ x!3 ~",
})).gain(0.41)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@29 A ~@20 B ~@6 A ~@6 A ~@7 C ~@10 A ~@8 D ~@7 E F@2 G F@3 G H ~@7 I ~@8
>`.pickRestart({
  A: "~@14 x!2", B: "~@13 x ~@2", C: "~@15 x", D: "~@12 x!4", E: "~@11 x ~@4", F: "~@3 x ~@12", G: "~@3 x ~@10 x ~",
  H: "~@3 x ~@2 x!3 ~@7", I: "~@10 x ~@2 x ~@2",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<~@19 [x!16]!4 ~@16 [x!16]!12 ~@66 [x!16]!5 [x!6 ~@10] ~@2>").gain(0.26)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@122 [~@6 x!10] [x!16]!2>").gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@22 A ~@7 B ~@19 C ~@7 B ~@5 D ~@7 E ~@3 F ~@7 B ~@7 G ~@7 H I@5 J I K ~@7 F ~@8
>`.pickRestart({
  A: "~@10 x!2 ~@2 x!2", B: "~@7 x", C: "~@9 x ~ x ~@2 x!2", D: "~@10 x!3 ~@3", E: "~@13 x!2 ~", F: "~@14 x!2",
  G: "~@8 x!4 ~@4", H: "~@5 x ~@2", I: "~ x ~@14", J: "~ x ~@12 x ~", K: "~ x ~@8 x!2 ~@2 x!2",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@64 [~@8 x!2 ~@6] ~@60>").gain(0.51)

// drums · crash
const crash = s("cr").struct(`<
  ~@19 A B@2 ~ B ~@3 B ~@2 A B ~ B ~ B ~ B ~@9 C B@2 ~ B ~@3 B ~@2 A B ~ B ~ B ~ B ~ B ~@3 B ~ B ~ B ~ B ~@3 B ~@2 A B ~
  B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@3 B ~@3 B ~@3 B ~@3
>`.pickRestart({
  A: "x!3 ~", B: "x", C: "x!2",
})).gain(0.41)

// drums · ride bell
const ride_bell = s("rd").struct("<~@23 A@15 B ~@12 A@13 B A@27 B A@24 ~@8>".pickRestart({
  A: "x!4", B: "x!2 ~@2",
})).gain(0.41)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 A@21 B@8 A@7 C A@12 B@8 A@18 B@8 A@7 C A@24 B@8>".pickRestart({
  A: "x!8", B: "x!16", C: "x ~ x ~ x ~ x ~ x!8",
})).gain(0.2)

// drums · congas
const congas = s("conga:18").struct(`<
  ~
  [x ~@3 x!3 ~ x ~ x ~ x ~@3]!9
  [x ~@3 x!3 ~ x!8]
  [x ~@3 x!3 ~ x ~ x ~ x ~@3]!8
  ~@106
>`).gain(1.31)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  [~@12 x!4]
  [x ~ x!2 ~@10 x!2]
  [~@2 x!2 ~@10 x!2]!8
  [~@2 x!2 ~@12]
  [~@2 x!2 ~@10 x!2]!8
  ~@106
>`).gain(1.31)

// drums · agogo bells
const agogo_bells = s("agogo:4").struct("<~@117 [~ x ~@2]!8>").gain(1.96)

// drums · claves
const claves = s("clave:2").struct("<~@117 [~ x ~@2]!8>").gain(1.51)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@117 [~ x ~@6]!8>").gain(0.45)

stack(
  piano, drawbar_organ, overdriven_guitar, bass, kick, snare, low_tom, hihat, hihat_soft, mid_tom, high_tom, crash,
  ride_bell, tambourine, congas, congas_2, agogo_bells, claves, woodblocks
)

More by Bruce Hornsby