Strudelify
(Blues Is) The Healer cover art

1989 · The Healer

(Blues Is) The Healer

Hooker John Lee

KeyD minorTempo104 bpm
0:00/0:00
// (Blues Is) The Healer — Hooker John Lee
// 104 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 142 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(104/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 · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B C D E F C D E B C D E B C D G D H I J D K L M N O P Q R S T M B C D E B C D E B C D E B C D E B C D E B C D E B C
  D E B C D E B C D E B C D E B C D E B C D E F C D E B C D E F C D E B C D E B C D E B C U V B C D E B C D E B C D E B
  C D E B C D E B C D E F C D E F C D E F C D E B
>`.pickRestart({
  A: "~@3 [a4,c5,d5,f5]", B: "[a4,c5,e5]@6 ~@2 [g4,b4,d5] ~ [g4,b4,d5]@4 ~@2, d5 ~@15",
  C: "[f4,a4,c5] ~ [f4,a4,c5]@3 ~ [d4,g4,b4]@7 ~@3", D: "[f4,a4,c5]@6 ~@2 [g4,b4,d5] ~ [g4,b4,d5]@4 ~@2",
  E: "[f4,a4,c5,d5] ~ [f4,a4,c5,d5]@2 ~@2 [a4,c5,d5,f5]@8 ~@2", // Dm7
  F: "[a4,c5,e5]@6 ~@2 [g4,b4,d5] ~ [g4,b4,d5]@5 ~, d5 ~@15", G: "[bb4,d5,g5]!2 ~@2 [a4,c5,d5,f5]!2 ~@2",
  H: "[f4,a4,c5]@4 ~@2 [g4,b4,d5]@5 ~@3 [g4,d5] ~, ~@7 b4", I: "[f4,a4,c5]@6 ~@2 [g4,b4,d5] ~ [g4,b4,d5]@3 ~@3",
  J: "[a4,c5,d5,f5]@4 ~@2 [a4,c5,e5]@7 ~@3", K: "[f4,a4,c5]@5 ~ [g4,b4,d5]@6 ~@4", L: "[a4,d5,f5] ~@7",
  M: "~@12 [a4,d5,f5]@3 ~", N: "[f4,a4,c5,d5]@6 ~@2 [g4,b4,d5] ~ [g4,b4,d5]@4 ~@2",
  O: "[f4,a4,c5,d5] ~ [f4,a4,c5,d5]@3 ~ [g4,b4,d5]@6 ~@2 [g4,b4]@2, ~@14 d5 ~", // Dm7 G
  P: "[f4,a4,c5]@7 ~ [g4,b4,d5] ~ [g4,b4,d5]@3 ~@3", Q: "[a4,d5,f5]@5 ~ [a4,c5,e5]@7 ~@3",
  R: "~@4 [f4,a4,c5]@3 ~ [g4,b4,d5] ~ [g4,b4,d5]@4 ~@2", S: "[f4,a4,c5,d5] ~ [f4,a4,c5,d5]@3 ~ [g4,b4,d5]@6 ~@4",
  T: "[a4,c5,d5,e5,f5] ~@15", U: "[f4,a4,c5,d5] ~@15", V: "~@12 [a4,c5,d5,f5]@3 ~, ~@12 e5 ~@3",
})).s("gm_epiano2").gain(0.3)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D E B F G H I J K L M N D O I J K L I J P ~ D Q R S D T P ~ D Q R S I J K L D Q R S I J K L D Q R S I J K L D Q
  R S I J K E D Q R S I J K L D Q R S I J K L D Q R S I J K L B F U H B F U H I J K L I J ~@2 I J M V W J X Y I J M V W
  J X Y I J M Y W J X Y I J M V W J X Y I J M V W
>`.pickRestart({
  A: "~@8 f3@3 ~@5", B: "d2@5 ~@3 g2 ~ g2@4 ~@2", C: "f2@5 ~ g2@7 ~@3", D: "d2@6 ~@2 g2 ~ g2@4 ~@2",
  E: "bb2 ~ bb2@2 ~@2 a2@5 ~@5", F: "f2 ~ f2@3 ~ g2@6 ~@4", G: "d2@6 ~@2 g2 ~ g2@2 g2@2 a2 ~",
  H: "bb2 ~ bb2@3 ~ a2@5 ~ c3@2 d3@2", I: "d2@7 ~ g2 ~ g2@5 ~", J: "f2 ~ f2@3 ~ g2@8 ~@2",
  K: "d2@6 ~@2 g2 ~ g2@2 ~@2 a2 ~", L: "bb2 ~ bb2@3 ~ a2@5 ~@5", M: "d2@6 ~@2 g2 ~ g2@5 ~",
  N: "f2 ~ f2@3 ~ g2@5 ~@3 d3 ~", O: "bb2 ~ bb2 ~@5 a2 ~ a2 ~@5", P: "a2 ~@7", Q: "f2 ~ f2@2 ~@2 g2@5 ~@5",
  R: "d2@5 ~@3 g2 ~ g2@3 ~ a2@2", S: "bb2@2 ~ a2@2 ~ c3 d3", T: "f2 ~ f2@2 ~@2 g2@2 ~@2 f2@2 g2@2 f2 ~",
  U: "d2@6 ~@2 g2 ~ g2@2 g2@2 a2@2", V: "bb2 ~ bb2@3 ~ a2@2 ~@2 c3@3 ~ d3@2", W: "d2@8 g2 ~ g2@5 ~",
  X: "d2@6 ~@2 g2 ~ g2@3 ~ a2@2", Y: "bb2 ~ bb2@3 ~ a2@3 ~ c3@3 ~ d3@2",
})).s("gm_acoustic_bass").gain(0.33)

// chords · shakuhachi
const shakuhachi = note(`<
  A B@4 C@2 D@2 E@4 F@2 G ~@33 H I ~@5 J K@2 L M@2 N O P Q R ~ S T U V W ~@39 X Y@2 Z@2 AA@2 AB@2 Y@2 AC@2 AD@2 AE@2
  AF@2 AC@2 Y@2 AG@2 Y@2 AH@2 AI
>`.pickRestart({
  A: "~@10 f4@2 ~ gb4 g4@2, ~@10 e4 ~@5",
  B: "[a4@24 ~@2 a4@2 ~ c5@2 d5@25 ~@2 a4@2 ~ c5@2 ~, ab4 ~@25 ab4 ~@2 b4 ~ c5 ~@26 ab4 ~@2 b4 ~@2]/4",
  C: "[a4@25 ~ a4@2 ~ c5@2 ~, ab4 ~@25 ab4 ~@2 b4 ~@2]/2", D: "[e5@23 ~@3 a4@2 ~ c5@2 ~, d5 ~@25 ab4 ~@2 b4 ~@2]/2",
  E: "[a4@25 ~ a4@2 ~ c5@2 d5@25 ~@2 a4@2 ~ c5@2 ab4, ab4 ~@25 ab4 ~@2 b4 ~ c5 ~@26 ab4 ~@2 b4 ~@2]/4",
  F: "[a4@25 ~ a4@2 ~ c5@2 ~, ~@26 ab4 ~@2 b4 ~@2]/2", G: "e5, d5 ~@15", H: "~@13 g6 [g6,ab6] f6", I: "d6 ~",
  J: "~@10 a6@3 ~ c7 ~, ~@10 g6 ~@5", K: "[a6 c7@10 ~ ab6 [f6,g6] d6@9 ~@7 d5 e5]/2", L: "f5@2 g5 ~ g5@2 f5 ~@9",
  M: "[~@10 d6@11 c6 a5 ~ c6!2 a5 ~@5, ~@10 c6 ~@13 d6@2 ~@6]/2", N: "~@14 [c6,d6] ~",
  O: "d6@9 c6 a5 ~ f6@2 d6 c6, c6 ~@11 g6 ~@3", P: "a5 f5 ~@14",
  Q: "~@6 g6@2 ~ g6@2 g6@2 f6 g6@2, ~@6 f6 ~@2 f6 ~ f6 ~@4", R: "g6@2 f6@8 d6 c6 d6 f6 ~@2, f6 ~@15", S: "~@14 a5 ~",
  T: "c6@4 a5 ~ d6@3 c6 a5 ~@3 a5 ~, b5 ~@5 c6 ~@9", U: "c6@4 a5 ~ e6@3 d6 c6 ~@3 a5 ~, b5 ~@5 d6 ~@9",
  V: "d6@6 c6 a5 g5 f5 d5@4 ~@2, c6 ~@15", W: "g5@7 ~ f5@6 ~@2", X: "~@10 a4@2 ~ c5@2 ~, ~@10 ab4 ~@2 b4 ~@2",
  Y: "[a4@24 ~@2 a4@2 ~ c5@2 ~, ab4 ~@25 ab4 ~@2 b4 ~@2]/2", Z: "[d5@24 ~@2 a4@2 ~ c5@2 ~, db5 ~@25 ab4 ~@2 b4 ~@2]/2",
  AA: "[a4@22 ~@4 a4@2 ~ c5@2 d5, ab4 ~@28 b4 ~@2]/2", AB: "[e5@23 ~@3 a4@2 ~ c5@2 ~, ~@26 ab4 ~@2 b4 ~@2]/2",
  AC: "[d5@22 ~@4 a4@2 ~ c5@2 ~, db5 ~@25 ab4 ~@2 b4 ~@2]/2",
  AD: "[a4@22 ~@4 a4@2 ~ c5@2 ~, ab4 ~@25 ab4 ~@2 b4 ~@2]/2",
  AE: "[e5@22 ~@4 a4@2 ~ c5@2 ~, eb5 ~@25 ab4 ~@2 b4 ~@2]/2",
  AF: "[a4@23 ~@3 a4@2 ~ c5@2 ~, ab4 ~@25 ab4 ~@2 b4 ~@2]/2",
  AG: "[e5@23 ~@3 a4@2 ~ c5@2 ~, eb5 ~@25 ab4 ~@2 b4 ~@2]/2",
  AH: "[d5@23 ~@3 a4@2 ~ c5@2 ~, db5 ~@25 ab4 ~@2 b4 ~@2]/2", AI: "a4, ab4 ~@15",
})).s("gm_shakuhachi").gain(0.48)

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

// drums · rim
const rim = s("rim").struct("<~ A@14 B ~ A@6 ~@2 A@6 ~@2 A@15 B A@7 B A@7 B A@3 B A@27 B A@6 ~@2 A@37>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct("<~@32 [~@11 x!2 ~@3] ~@70 x [x!2 ~@2] ~@37>").gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<~@15 A ~@16 A ~@15 A ~@15 A ~@3 A ~@27 B ~@45>".pickRestart({
  A: "~@7 x", B: "~@12 x!3 ~",
})).gain(0.36)

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

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

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<[~@7 x] ~@25 [~@7 x ~@6 x ~] ~@71 [~@7 x ~@6 x ~] ~@5 [~@7 x] ~@37>").gain(0.18)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  A ~@14 B C ~ D ~ E ~@3 F ~ G ~@5 F ~@15 B ~@15 B ~@3 B ~@3 F ~ H ~@23 G ~ I ~@3 J K L ~ M ~@3 N ~@7 O ~@9 P ~@3 O ~@7
>`.pickRestart({
  A: "~ x", B: "~@5 x!2 ~", C: "~@11 x!4 ~", D: "~@2 x ~ x ~ x!4 ~@6", E: "~@9 x!2 ~ x!2 ~@2", F: "~ x!2 ~ x!2 ~@2",
  G: "x!3 ~@5 x!3 ~@5", H: "~@7 x!2 ~@2 x!2 ~@3", I: "x!14 ~@2", J: "~@4 x!2 ~@2", K: "~@10 x ~ x!2 ~@2",
  L: "~@9 x ~@2 x ~@3", M: "~@14 x!2", N: "~@8 x!2 ~@2 x!2 ~@2", O: "x!3 ~ x!2 ~@2 x!6 ~@2", P: "x!2 ~@2 x!2 ~@10",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A ~@7 A ~ A ~ A ~@3 A ~ A ~@5 A ~@7 A ~ A ~@5 A ~@7 A ~@7 A ~@7 A ~ A ~ A ~@3 A ~@7 A ~@7 A ~ A ~ A ~@3 A@3 ~
  A ~@3 A ~@3 A ~@3 A ~@7 A ~ A ~@3 A ~@5 A
>`.pickRestart({
  A: "x",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct(`<
  ~@69 A@8 B A@3 C A@7 C A@6 D B A C A C A ~@2 C@2 B A B A@3 C A@3 C A@3 B A@7 B A@5 B A@5 B
>`.pickRestart({
  A: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~", B: "~@2 x ~ x ~ x ~ x!3 ~ x ~ x ~", C: "~ x!7", D: "x!6 ~@2",
})).gain(0.3)

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

// drums · congas
const congas = s("conga:13").struct(`<
  ~ A B C A B C A@2 B C A@2 B C A ~ B C A@2 B C ~@2 B C A@2 B C ~@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@2 B C A@2 B C A@2 B C A@2 B
  C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~ x!2 ~",
})).gain(0.96)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~ A B C D B C E A B C E A B C E ~ B C E A B C ~@2 B C E A B C ~@2 B C E A B C E A B C E A B C E A B C E A B C E A B C
  E A B C E A B C E A B C E A B C E A B C E A B C E A B C E A B C E A B C E A B C E A B C ~@2 B C E A B C E A B C E A B
  C E A B C E A B C E A B C E A B C E A B C E A B
>`.pickRestart({
  A: "x ~@3 x!3 ~", B: "x!2 ~ x!2 ~@3", C: "x!2 ~@3 x!3", D: "x ~@2 x!4 ~", E: "x ~@2 x ~ x!2 ~",
})).gain(0.96)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~ A@15 ~ A@6 ~@2 A@6 ~@2 A@70 ~@2 A@37>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2",
})).gain(0.44)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct("<~ A@15 ~ A@6 ~@2 A@6 ~@2 A@70 ~@2 A@37>".pickRestart({
  A: "~ x ~ x",
})).gain(0.44)

stack(
  epiano2, bass, shakuhachi, kick, rim, snare, low_tom, hihat, mid_tom, mid_tom_soft, open_hat, high_tom, crash, ride,
  cowbell, congas, congas_2, woodblocks, woodblocks_2
)

More by Hooker John Lee