Strudelify

Kansas City

Wilbert Harrison

KeyC majorTempo117 bpm
0:00/0:00
// Kansas City — Wilbert Harrison
// 117 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 70 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D E F G H I J K L B@2 C D E F C M I J N O G H G H E F G H I P Q L R S T U V W X U Y Z X AA G H G H E F G H I P N
  O I P N O I P AB AC@2 ~
>`.pickRestart({
  A: "~@4 c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2 ~ e2@4 g2@2", B: "c2@2 ~@2 c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2 ~ e2@4 g2@2",
  C: "c2 ~ c2 e2 ~ e2 g2 ~ g2 e2@2 g2", D: "c2 ~@3 c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2@2 e2@4 g2@2",
  E: "f2 ~ f2 a2 ~ a2 c3 ~ c3 a2@2 c3", F: "f2 ~@3 f2@2 a2@2 ~@2 a2@2 c3@2 ~@2 c3@2 a2@4 c3@2",
  G: "c2 ~ c2 e2 ~ e2 g2 ~ g2 a2@2 g2", H: "c2 ~@3 c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2@2 a2@4 g2@2",
  I: "g2@2 ~@2 g2@2 b2@2 ~@2 b2 ~ d3@2 ~@2 d3 ~ b2@4 d3 ~", J: "f2@3 ~ f2 ~ a2@2 ~@2 a2 ~ c3@2 ~@2 c3 ~ a2@2 ~@2 a2@2",
  K: "c2@3 ~ c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2@2 e2@4 g2@2", L: "c2@2 ~@2 c2 ~ e2@2 ~@2 e2 ~ g2@2 ~@2 g2 ~ e2@4 g2 ~",
  M: "c2 ~@3 c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2@2 e2@4 f#2@2", N: "c2@3 ~ c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2@2 a2@4 g2@2",
  O: "c2@2 ~@2 c2 ~ e2@2 ~@2 e2 ~ g2@2 ~@2 g2 ~ a2@4 g2 ~", P: "f2@3 ~ f2 ~ a2@2 ~@2 a2 ~ c3@2 ~@2 c3 ~ a2@3 ~ c3@2",
  Q: "c2@3 ~ c2@2 e2@2 ~@2 e2@2 g2@2 ~@2 g2@2 e2@3 ~ g2@2", R: "c2@2 ~@2 c2 ~ e2@2 f2@2 f#2 ~ g2@2 ~@2 g2@2 e2@4 g2@2",
  S: "c2 ~@3 c2 ~ e2@2 f2@2 f#2 ~ g2@2 ~@2 g2 ~ a2@3 ~ g2 ~",
  T: "c2@2 ~@2 c2 ~ e2@2 f2@2 f#2 ~ g2@2 ~@2 g2@2 a2@3 ~ g2@2",
  U: "c2 ~@3 c2 ~ e2@2 f2@2 f#2 ~ g2@2 ~@2 g2 ~ a2@4 g2@2", V: "f2@2 ~@2 f2 ~ a2@2 a#2@2 b2 ~ c3@4 c3@2 d3@3 ~ c3@2",
  W: "f2 ~@3 f2 ~ a2@2 a#2@2 b2 ~ c3@4 c3 ~ a2@4 c3@2", X: "c2@2 ~@2 c2 ~ e2@2 f2@2 f#2 ~ g2@2 ~@2 g2@2 a2@4 g2@2",
  Y: "g2@2 ~@2 g2 ~ b2@2 c3@2 c#3 ~ d3@2 ~@2 d3@2 b2@4 d3@2",
  Z: "f2 ~@3 f2 ~ a2@2 a#2@2 b2 ~ c3@2 ~@2 c3 ~ a2@3 ~ c3@2",
  AA: "c2 ~@3 c2 ~ e2@2 f2@2 f#2 ~ g2@2 ~@2 g2 ~ a2@3 ~ g2@2", AB: "c2@2 c2 e2@2 e2 f2@2 f2 f#2@2 f#2",
  AC: "[c3@4 a2 ~ g2@4 c2 ~@7 c3@25 ~@5]/2",
})).s("gm_acoustic_bass").gain(0.35)

// chords · piano · "A.PIANO"
const piano = note(`<
  A@2 B C D@2 E@2 F G H@2 I@2 B C J@2 E@2 F G H@2 A@2 B C D@2 E@2 F G H@2 K L M N O@2 P Q R S T U A@2 B C D@2 E@2 F G
  H@2 V W X@2 Y W Z AA@2 ~
>`.pickRestart({
  A: "[c2@4 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@5 ~ [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@7 c3 ~@3 [g3,a3,c4] e3]/2", // Am7
  B: "c2 ~@3 [e3,g3,c4] ~@5 [e3,g3,a3,c4]@5 ~ [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~", // C Am7
  C: "~@4 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@5 ~ [e3,g3,a3,c4] ~ c3 ~@3 [e3,g3,c4] ~", // Am7 C
  D: "[f1 ~@3 [f3,a3,c4] ~@5 [f3,a3,c4] ~@5 f3 ~@5 [f3,a3,c4]@6 [f3,a3,c4] ~@5 [f3,a3,c4] ~@11 [f3,a3,c4] ~]/2", // F
  E: "[c2 ~@9 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@5 ~ [e3,g3,a3] ~@5 [e3,g3,a3,c4] ~@11 [e3,g3,a3,c4] ~]/2", // Am7 A7 Am7
  F: "g1@4 [f3,g3,b3,d4] ~ g2 ~@3 [f3,g3,b3,d4] ~@5 [f3,g3,b3,d4] ~@5 f3 ~", // G7
  G: "f2@4 [f3,a3,c4] ~@5 [f3,a3,c4] ~@5 [f3,a3,c4] ~@5 [f3,a3,c4] ~", // F
  H: "[~@4 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@4 ~@2 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@13]/2", // Am7
  I: "[c2@4 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@5 ~ [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@7 c3 ~@3 [e3,g3,a3,c4] ~]/2", // Am7
  J: "[f1 ~@3 [f3,a3,c4] ~@5 [f3,a3,c4] ~@5 f3 ~@5 [f3,a3,c4]@5 ~ [f3,a3,c4] ~@5 [f3,a3,c4] ~@11 [f3,a3,c4] ~]/2", // F
  K: "[e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~", // Am7
  L: "[d#4,g4,a4,c5] ~ [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4]@2 [e4,g4,a4]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2, ~@2 c5 ~@3", // Am7b5 Am7 A7 Am7
  M: "[g4,a4,c5] [e4,g4,a4,c5]!11, d#4", // Am7
  N: "[d#4,g4,a4,c5] ~ [e4,g4,a4,c5]@2 [e4,g4,a4,c5] ~ [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2", // Am7b5 Am7
  O: "[~@23 [a4,c5,d5], f4!6 f4!6, ~ [a4,d5]@2 [a4,c5,d5]@2 d5@4 ~@15, ~@5 [a4,c5]@2 [a4,c5]@2 [a4,c5,d5]@2 [a4,c5,d5]@2 [a4,c5,d5]@2 [a4,c5,d5]@2 [a4,c5,d5]@2 [a4,c5,d5]@2 [a4,c5,d5]@2 ~]/2", // D7 D5 D7 Am D7
  P: "[e4,g4,c5] ~ [e4,g4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2", // C Am7 C Am7
  Q: "[d#4,g4,a4,c5] ~ [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2 [e4,g4,a4,c5]@2", // Am7b5 Am7
  R: "[g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~", // G
  S: "f4 ~ [a4,c5,d5] ~ f4 ~ [a4,c5,d5] ~ f4 ~ [a4,c5,d5] ~ f4 ~ [a4,c5,d5] ~ f4 ~ [a4,c5,d5] ~ f4 ~ [c5,d5] ~", // D7 Csus2
  T: "[e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [g4,a4]@2 [d#4,g4,a4]@2 [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5]@2 [e4,g4,a4,c5] ~, ~@5 [e4,c5]@2 ~@5", // Am7 Gsus2 Am7b5 Am7 C
  U: "[d#4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5] ~ [e4,g4,a4,c5]@4 ~@8", // Am7b5 Am7
  V: "~@4 [g3,b3,d4] ~@5 [g3,b3,d4] ~@5 [g3,b3,d4] ~@5 [g3,b3,d4]@2", // G
  W: "~@4 [f3,a3,c4] ~@5 [f3,a3,c4] ~@5 [f3,a3,c4] ~@5 [f3,a3,c4] ~", // F
  X: "[~@4 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@5 ~ [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4] ~@5 [g3,a3,c4] ~]/2", // Am7
  Y: "~@4 [g3,b3,d4] ~@5 [g3,b3,d4] ~@5 [g3,b3,d4] ~@5 [f3,a3,c4] ~", // G F
  Z: "[g5,c6] ~ [g5,c6] ~ [g5,c6] ~ [g5,a#5] ~ [g5,a#5] ~ [g5,a#5] ~ a5 f5 [f5,a5] ~ [f5,a5] ~ g#5 f5 [f5,g#5] ~ [f5,g#5] ~", // C5 Gm F Fm
  AA: "[[e5,g5]@3 ~ d5@2 [e5,b5]@3 ~ [e4,g4,c5,d5,c6]@8 ~ [g4,a#4,e5,c6]@25 ~@4, ~@4 a5 ~@13 a#6@25 ~@5]/2", // Em E5 C C7
})).s("gm_piano").gain(0.4)

// drums · kick
const kick = s("bd").struct("<[~ x] [x!2]!65 [x!4] [x ~@2 x!3 ~@3 x ~@2] ~@2>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<A@35 B C A@9 D E A@18 F G ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@5 x!3", C: "x!2 ~ x", D: "x!2", E: "x ~@5 x ~ x!2 ~@2", F: "~@2 x ~ x!2 ~@2 x!4",
  G: "x!5 ~ x ~@3 x ~@13",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@35 [~@5 x!4 ~@3] ~@10 [~ x!5 ~ x!5] [~ x!5 ~ x ~@4] ~@18 [~ x ~@5 x ~@4] ~@3>")
  .gain(0.25)

// drums · ride
const ride = s("rd").struct("<[x ~ x!2 ~@2 x ~ x!2 ~@2]!66 [x ~ x!2 ~@2 x ~ x!2 ~ x] [x ~ x!2 ~@8] ~@2>").gain(0.15)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<[~@5 x ~@5 x]!47 [~@5 x ~@6] [~@5 x ~@5 x]!18 [~@5 x ~@6] ~@3>").gain(0.1)

stack(bass, piano, kick, snare, snare_soft, ride, ride_soft)