Strudelify

Keep On Running

The Spencer Davis Group

KeyA majorTempo136 bpm
0:00/0:00
// Keep On Running — The Spencer Davis Group
// 136 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(136/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
const bass = note(`<
  A B C B C B C B D E F G H I J K@2 L M N E F G H I J K@2 L O P Q R S@2 Q R T U V B C B C B C B D E F G H I W@3 L O P Q
  R S@2 Q R X U Y G H I J K@2 L Z B C B C B C B C B AA AB
>`.pickRestart({
  A: "~@2 a1 ~ a1 e1 g1 a1", B: "g1 e1 d2 ~ d2 a1 c2 d2", C: "c2 a1!2 ~ a1 e1 g1 a1",
  D: "c2@2 a1@2 e2@3 ~ e2@2 ~@2 e2@3 ~", E: "e2@2 e2@3 ~ e2@2 e2@3 ~ e2@2 f#2@2", F: "a2 f#2 a2@2 ~ a1 e2 f#2",
  G: "a2 f#2 a2@2 ~ a1 b1 c#2", H: "e2@2 c#2@2 e2@3 ~ e2@2 b1@2 e2@2 e1@2", I: "~ e1@3 ~ e2 e1 f#1",
  J: "a1 b1 f#1@2 ~ c#2 f#2!2", K: "[~ e2 d2@2 ~ d2 a2 a2@2 d2 a1@2 ~ a1 e2 f#2]/2",
  L: "a2@2 f#2@2 d2@5 ~ d2@2 f#2@2 e2@2", M: "d2 b1 a1@2 ~ a1 e2 f#2", N: "a2@2 f#2@2 e2@2 ~@2 e2@2 ~@2 e2@3 ~",
  O: "d2 b1 a1@2 ~ a1 e1 f#1", P: "a1 f#1 a1@2 a1@2 a2 g#2", Q: "~@2 f#2@6 ~@2 f#2@2 c#2 ~ c#2@2",
  R: "~ e2 f#2@2 ~ f#2 c#2!2", S: "[f#2@2 f2@2 e2@4 ~@2 e2@2 b1 ~ b1@4 d2@2 e2@4 e2@4 e2@2 f2@2]/2",
  T: "f#2@2 f2@2 e2@2 e2 ~ e2@2 e2 ~ e2 ~ e2 ~", U: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@4", V: "e2@2 a1 ~ a1 e1 g1 a1",
  W: "[a1 b1 f#1@2 ~ c#2 f#2 f#2@2 e2 d2@2 ~ d2 a2 a2@2 d2 a1@2 ~ a1 e2 f#2]/3",
  X: "f#2@2 f2@2 e2@2 e2@2 e2@2 e2 ~ e2 ~ e2 ~", Y: "e2@2 a2@2 ~ a1 e2 f#2", Z: "d2 b1 a1 ~ a1 e1 g1 a1",
  AA: "c2@2 a1@2 e2@2 ~@2 e2@2 ~@2 e2@3 ~", AB: "e2@2 e2@3 ~ e2@2 e2@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · tenor sax
const tenor_sax = note("<~@30 A B ~@2 A B ~@22 A B ~@2 A B ~@15 C D C E C F@2 ~>".pickRestart({
  A: "~@12 e4 ~ f4@2", B: "~@2 e4@7 ~@7",
  C: "~@6 [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4]@2", D: "~@2 [d4,f#4,a4]@13 ~",
  E: "~ [d4,f#4,a4]@6 ~", F: "[~@12 f4 ~@19, ~@2 [d4,f#4,a4]@17 ~@13]/2",
})).s("gm_tenor_sax").gain(0.45).pan(0.3)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~@2 A B@4 C D E F G H I J K L M N O E F G H I J K L M P Q R S T U V W T X Y ~ A B@4 C D E F G H I J K L M P Q R S T U
  V W T X Z G H I J K L M AA ~ A B@4 C AB C D E
>`.pickRestart({
  A: "~@6 [a2,e3,a3]!2", B: "[~@2 [d3,a3,d4] ~ [d3,a3,d4]@16 ~@8 [a2,e3,a3] ~ [a2,e3,a3]@2]/2",
  C: "~@2 [d3,a3,d4] ~ [d3,a3,d4]@12", D: "~@2 [e3,b3,e4] ~ [e3,b3,e4] ~ [e3,b3,e4] ~",
  E: "[e3,b3,e4] ~ [e3,b3,e4]@2 ~@2 [e3,b3,e4] ~ [e3,b3,e4] ~@7", F: "~@4 [e4,a4]@2 ~@2 [e4,a4] ~ a2@2 e3@2 f#3@2",
  G: "a3 ~ a3@4 ~@2 [e3,f#3]@2 a3@2 [e3,f#3]@2 e3@2, ~ b3@2 ~@13", H: "c#3 a2 [b3,e4] ~ [b3,e4] ~@2 e2",
  I: "~@2 e2@9 ~ e2@2 f#2@2", J: "a2@2 b2@2 c#3@2 f#3@2 c3 b2 a2@2 f#2@2 e2@2",
  K: "~@2 d3@4 d3 ~ e3@2 d3 ~ [e3,f#3]@2 e3@2", L: "d3@2 b2@2 ~@2 a2@2 [b2,c3,c#3] ~ e3@5 ~",
  M: "e3 f#3 a3@4 d3@2 b3 ~ d3@2 a3 ~ d3@2", N: "b3@2 a3 ~@3 a2@2 b2@2 a2@2 b2@4",
  O: "a2 ~ [e3,b3,e4] ~ [e3,b3,e4] ~ [e3,b3,e4] ~", P: "b3@2 a3 ~ a2@5 ~ a2@2 e2@2 f#2@2",
  Q: "a2@2 f#2@2 a2@5 ~@3 [a2,a3]@2 [g#2,g#3]@2", R: "~@2 [f#2,f#3]@5 ~ [c#3,f#3] ~@5 [c#3,f#3] ~",
  S: "~@2 [c#3,f#3]@5 ~ [c#3,f#3] ~@5 c#3 ~", T: "f#3@2 f3@2 ~@4 [b2,e3] ~@5 [b2,e3] ~",
  U: "~@2 [b2,e3]@5 ~ [b2,e3] ~@3 e2@2 f2@2", V: "~@2 f#2@4 ~@2 [c#3,f#3] ~@5 [c#3,f#3] ~",
  W: "~@2 [c#3,f#3]@5 ~ [c#3,f#3] ~@3 a2@2 c#3@2", X: "~@2 [b2,e3]@5 ~ [b2,e3] ~ [b2,e3] ~ [b2,e3] ~ [b2,e3] ~",
  Y: "[b2,e3] ~ [b2,e3] ~@13", Z: "[b2,e3] ~ [b2,e3] ~ [e4,a4]@2 ~@2 [e4,a4] ~ a2@2 e3@2 f#3@2",
  AA: "b3@2 a3@2 [a2,e3,a3] ~@11", AB: "~@12 [a2,e3,a3] ~ [a2,e3,a3]@2",
})).s("gm_distortion_guitar").gain(0.45).pan(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@8 A B C D E F G H I J K L M N D E F G H I J K O P Q R S P Q T U V ~@7 A B W D E F X H I J K O P Q R S P Q T U Y D E
  F G H I J Z ~ AA J K J K J K J AB AC
>`.pickRestart({
  A: "~@2 [e3,g#3,d4,e4] ~ [e3,g#3,d4,e4] ~ [e3,g#3,d4,e4] ~", // E7
  B: "[e3,g#3,d4,e4] ~ [e3,g#3,d4,e4]@2 ~@2 [e3,g#3,d4,e4] ~ [e3,g#3,d4,e4]@2 ~@6", // E7
  C: "~@4 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4]@2 ~@2", // A
  D: "[c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3", // A
  E: "[c#4,e4,a4] ~@3 [g#3,d4,e4] ~@3 [g#3,d4,e4] ~@3 [g#3,d4,e4] ~@3", // A E7
  F: "[g#3,d4,e4] ~@3 [g#3,d4,e4] ~@3 [g#3,d4,e4] ~@3 [g#3,d4,e4] ~@3", // E7
  G: "[g#3,d4,e4]@2 ~@2 [a3,c#4,f#4] ~@3 [a3,c#4,f#4]@2 ~@2 [a3,c#4,f#4] ~@3", // E7 F#m
  H: "[a3,c#4,f#4] ~ [a3,c4,f#4] ~ [a3,c4,f#4] ~ [a3,c4,f#4] ~", // F#m F#dim
  I: "[a3,c4,f#4] ~@3 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4]@2 ~@2", // F#dim A
  J: "[c#4,e4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~", // A D
  K: "[d4,f#4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~", // D A
  L: "[c#4,e4,a4] ~@3 [e3,g#3,d4,e4]@2 ~@2 [e3,g#3,d4,e4] ~@3 [e3,g#3,d4,e4] ~@3", // A E7
  M: "[e3,g#3,d4,e4] ~ [e3,g#3,d4,e4]@2 ~@2 [e3,g#3,d4,e4] ~ [e3,g#3,d4,e4] ~@7", // E7
  N: "~@2 [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~", // A
  O: "[c#4,e4,a4] ~@3 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4] ~ [b3,f4,g#4]@2", // A Fdim
  P: "~@2 [a3,c#4,f#4]@5 ~ [a3,c#4,f#4]@2 ~@2 [a3,c#4,f#4]@2 ~@2", // F#m
  Q: "[a3,c#4,f#4] ~ [a3,c#4,f#4] ~ [a3,c#4,f#4] ~ [a3,c#4,f#4] ~", // F#m
  R: "[a3,c#4,f#4] ~ [g#3,d4,e4] ~ [g#3,d4,e4] ~ [g#3,d4,e4] ~", // F#m E7
  S: "[g#3,d4,e4]@2 ~@2 [g#3,d4,e4]@2 ~@2 [g#3,d4,e4]@2 ~@2 [g#3,d4,e4] ~ [g#3,b3,f4]@2", // E7 Fdim
  T: "[a3,c#4,f#4] ~ [g#3,b3,d4,e4] ~ [g#3,b3,d4,e4] ~ [g#3,d4,e4] ~", // F#m E7
  U: "[g#3,d4,e4] ~ [g#3,d4,e4] ~ [g#3,d4,e4] ~ [g#3,d4,e4] ~", V: "[g#3,d4,e4] ~@7",
  W: "~@4 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~@3", // A
  X: "[g#3,d4,e4] ~@3 [a3,c#4,f#4] ~@3 [a3,c#4,f#4]@2 ~@2 [a3,c#4,f#4] ~@3", // E7 F#m
  Y: "[g#3,d4,e4]@2 ~@2 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4]@2 ~@2", Z: "[d4,f#4,a4] ~ [c#4,e4,a4] ~@5",
  AA: "~@4 [c#4,e4,a4] ~@3 [c#4,e4,a4]@2 ~@2 [c#4,e4,a4]@2 ~@2", // A
  AB: "[d4,f#4,a4] ~@3 [g#3,d4,e4]@2 ~@2 [g#3,d4,e4]@2 ~@2 [g#3,d4,e4]@2 ~@2", // D E7
  AC: "[g#3,d4,e4] ~ [g#3,d4,e4]@2 ~@2 [g#3,d4,e4] ~ [g#3,d4,e4]@2 ~@6", // E7
})).s("gm_electric_guitar_clean").gain(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  A B@8 C A B@9 C A B@8 D E B@2 D E B@3 F ~ A B@6 C A B@8 D E B@2 D E B@11 F ~ A B@8 C
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "x!2 ~ x!2 ~@3", D: "x ~ x ~ x ~ x!2", E: "~ x!2 ~ x ~ x ~", F: "x",
})).gain(0.5)

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

// drums · open hat
const open_hat = s("oh").struct("<~@30 A B ~@2 A B ~@22 A B ~@2 A B ~@23>".pickRestart({
  A: "~@7 x", B: "~ x ~@6",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@31 A ~@3 A ~@23 A ~@3 A ~@23>".pickRestart({
  A: "~ x ~@2",
})).gain(0.4)

stack(bass, tenor_sax, distortion_guitar, electric_guitar_clean, kick, snare, hihat, open_hat, crash)

More by The Spencer Davis Group