Strudelify

Soul Provider

Michael Bolton

KeyF majorTempo84 bpm
0:00/0:00
// Soul Provider — Michael Bolton
// 84 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(84/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 E I J K L M N O P Q P Q P Q P R S T U V W A B C D E F G H E I J K L M N O P Q P Q P Q P R S T U V W X
  Y Z AA AB AC AD AE AF AG AF AG AF AG AF AH AF AG AF AG AF AG AF AH AF AG AF AG AF AG AF AI AJ@3
>`.pickRestart({
  A: "f1@4 ~@2 c2@9 ~", B: "d2@5 ~ d2@7 ~ c2@2", C: "f1@5 ~ c2@9 ~", D: "d2@4 ~@2 d2@7 ~ c2@2", E: "f1@4 ~@2 f1@9 ~",
  F: "a1@2 ~ a1@5", G: "bb1@5 ~ bb1@9 ~", H: "c2@4 ~@2 c2@6 ~ d2 c2@2", I: "a1@4 ~@2 a1@9 ~", J: "bb1@4 ~@2 bb1@9 ~",
  K: "c2@4 ~@2 c2@9 ~", L: "a1@5 ~ a1@9 ~", M: "bb1@2 ~ bb1@4 ~", N: "g1@4 ~@2 g1@9 ~", O: "c2@5 ~ c2@8 ~@2",
  P: "f1@5 ~ a1@7 ~ a1@2", Q: "bb1@5 ~ c2@5 ~ c2 d2 c2@2", R: "bb1@5 ~ c2@5 ~ c2@2 ~@2", S: "d2@4 ~@2 d2@7 ~ d2@2",
  T: "bb1@5 ~ c2@7 ~ c2 ~", U: "d2@4 ~@2 d2@7 ~ d2 ~", V: "g1@2 ~ g1@3 ~ g1", W: "ab1@2 ~ c2@4 ~",
  X: "f2@3 c2@2 ~ f1@2 ~ f1 c2@2 f2@2 f1@2", Y: "bb1@5 ~ c2@10", Z: "d2@7 ~ c2@4 bb1@3 ~",
  AA: "eb2@4 ~@2 ab1@7 ~ ab1@2", AB: "bb1@5 ~ bb1 ~ bb1@6 ~@2", AC: "a2@4 ~@2 a2 ~ bb2@5 ~ bb2 ~",
  AD: "c3@5 ~ d3@4 d2@2 d3@2 d2 ~", AE: "c2@4 ~@2 c3 ~ c3@3 ~ c3 g2 c2 ~", AF: "g1@5 ~ b1@7 ~ b1@2",
  AG: "c2@5 ~ d2@5 ~ d2 e2 d2@2", AH: "c2@5 ~ d2@5 ~ d2@2 ~@2", AI: "c2@6 ~ d2@6 d2@3", AJ: "[~ g1@16 ~@7]/3",
})).s("gm_acoustic_bass").gain(0.64)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B C D E F G H I@2 G J K L M N O@2 P@2 Q R S T U V W X Y@3 Z@2 E F G H I@2 G J K L M N O@2 P@2 Q R S T U V W X AA@3
  AB AC AD AE AF AG AH@2 AI@2 AJ AK AL AM AH@2 AI@2 AJ AK AL AM AH@2 AI@2 AJ AK AL AN AO@3
>`.pickRestart({
  A: "[f2,c4,f4,a4]@3 [c3,c4,e4,g4]@5", B: "~@7 a5, [d3,d4,f4,a4]@5 c6 d6@2, ~ c7@7, ~@3 a6@13, ~@2 f6 d6 f6@4",
  C: "[f2,c4,f4,a4]@5 ~ [c3,c4,e4,g4]@9 ~", D: "~@7 f6, [d3,d4,f4,a4], ~ f6@6 ~, ~@3 g6@13, ~ a6@3", E: "[f2,f3,a3,c4]",
  F: "~@3 [a3,c4,e4]@5, [a2,g3], [c4,e4]@3 ~@5, ~ e3@3", G: "[bb2,f3,bb3,d4]",
  H: "c3@3 ~@3 d4@2, f4, d4@3 ~, bb3@5 bb3@3, ~@3 c3@5",
  I: "[~@6 [a3,c4]@9 ~@7 e4@10, [f2,f3]@15 ~ e4@6 ~@10, [a3,c4]@3 ~@5 [e3,a3,c4]@8, ~@4 c3@11 a2@17, ~@5 a4@3]/2", // Am F Am
  J: "[c3,bb3,d4,f4]@4 [g3,c4,e4]@3 ~", K: "[a2,e3,a3,c4]@15 ~",
  L: "~@8 [f5,a5]@3 [e5,g5]@2 ~ [d5,f5]@2, [bb2,f3,bb3,a4]@15 ~, d4!2, ~@3 g4@12 ~, ~@6 f4@9 ~", // F Em Dm Bbmaj7
  M: "~@12 d4@3 ~, [bb4,d5]@7 ~, ~@6 g2@9 ~, ~@8 g3@7 ~, ~@10 bb3@5 ~", // Bb
  N: "~@4 bb3@2 [bb3,c4,f4]@9 ~, c3@15 ~, ~@2 f3@13 ~, ~@4 f4 ~ db4 ~@9", // Bbsus2
  O: "[[f2,f3,a3,c4]@3 ~@12 g5, ~@3 a2@4 a5@2 f5@7, ~@3 [g3,c4,e4]@3 [g3,c4,e4,c6]@2 ~@8, ~@5 e3@3 [bb2,f3,bb3,d4]@3 [c3,bb3,d4]@5, ~@13 d6@3 ~@16]/2", // F C Bb Gm
  P: "[[f2,f3,a3,c4]@3 ~@4 [bb3,d4] ~@6 e4@2, ~@3 [a2,g3,c4,e4]@5 [bb2,f3,bb3,d4]@8, ~@5 g6@3 ~@8, ~@3 e6 ~ f4@3, ~@7 d6@9]/2", // F Bb Am7 Bb
  Q: "~@2 f5 ~@4 e5, [f2,f3,a3,c4]@3 [a2,g3,c4,e4]@5, ~ a5@2 ~@5", // F Am7
  R: "[bb2,bb3,d4,f4,f5]@3 ~@4 [f3,g5], ~@3 c3@5, ~@5 bb3@3, ~@3 g3", // Bb Fsus2
  S: "~@4 [f3,a5]@2 ~@2 c6 ~@5 d4@2, f2@3 ~@2 e3@3, f3@2 ~ [g3,c4,e4]@3 [g3,c4,e4]@2, ~ c3@2 a2@5", // F C
  T: "[bb2,f3,bb3,d4]@6 [c3,bb3,d4]@9 ~", U: "[a3,d4,f4]@5 ~ [a3,c4,e4]@10", V: "[bb3,d4,f4]@7 ~",
  W: "~@2 [bb4,bb5] [c5,c6], [d3,a3,d4,f4]@15 ~", // Bb C Dm
  X: "g3@2 ~@4 a3@2 bb3@7 ~, [g2,d4]@15 ~, [d5,d6]@13 ~@3, bb3@4 g3@11 ~, c6 ~ d3@13 ~", // G5 D
  Y: "[[ab2,eb3,ab3,eb4,g4,bb4]@6 [d4,f4]@6 [g3,a3,b3,c4,d4] [e4,g4] [a4,b4,c5,d5,e5] [f5,g5,a5] c6@6 c6@12 c5 c6@2 a5@3 g5@4 f5@4, ~@2 [c3,bb3]@3 ~@11, ~@13 [d4,f4]@10 ~@25]/3", // Eb Dm G Em Am F C7 Dm
  Z: "[~@2 c5 c6@2 ~ c6@12 ~@3 a5@3 g5@4 a5@3 ~, ~@5 c5@11 ~@4 c6@4 ~@8]/2",
  AA: "[[ab2,eb3,ab3,eb4,g4,bb4]@6 [d4,f4]@6 [g3,a3,b3,c4,d4] [e4,g4] [a4,b4,c5,d5,e5] [f5,g5,a5] c6 ~@11 f3@3 ~ [eb3,bb3,eb4,g4]@5 ~ [ab3,c4,eb4,g4]@9 ~, ~@6 [c3,bb3]@9 ~ c5@9 c5@9 ~@14, ~@13 [d4,f4]@6 [g4,g5]@9 f4@6 ~@14, ~@22 f5@9 ~@17, ~@22 f4@3 c4@6 ~@17]/3", // Eb Dm G Em Am F Eb Abmaj7 …
  AB: "[bb3,f4,bb4,d5,f5]@6 ~@2 [ab4,bb4,eb5]@4 [bb3,d4,f4]@3 ~, ~@12 db4 ~@3", // Bb Absus2 Bb
  AC: "[eb3,bb3,eb4,g4]@5 ~ [ab3,c4,eb4,g4]@9 ~", // Eb Abmaj7
  AD: "eb4@3 ~ eb4 ~ d4@4 ~@3 bb4@2 ~, bb2, [f4,bb4]@6 [f4,bb4]@5 d4@4 ~, bb3@2 ~ bb3@5 ~@2 bb3@5 ~, ~@12 f4@3 ~", // Bb5
  AE: "[a3,c4,f4]@3 a3 [a3,c4,f4]@4 [bb3,d4,f4]@4 [bb3,d4,f4]@3 ~", // F Bb
  AF: "[c4,f4,a4]@6 [d4,f4]@7 ~ f4 bb4, ~@6 [f3,bb4]@9 ~, ~@6 ab4 ~@6 d4@2 ~", // F Dm Bb5
  AG: "~@11 e4 [e4,g4,c5]@3 ~, c3@15 ~, [e4,g4,c5]@3 [e4,g4,c5]@3 ~@2, ~@3 g3@12 ~, ~@4 c4@6 c4@5 ~", // C
  AH: "[[g2,g3,b3,d4]@3 ~@12 a5, ~@3 b2@4 b5@2 g5@7, ~@3 [a3,d4,gb4]@3 [a3,d4,gb4,d6]@2 ~@8, ~@5 gb3@3 [c3,g3,c4,e4]@3 [d3,c4,e4]@5, ~@13 e6@3 ~@16]/2", // G D C
  AI: "[[g2,g3,b3,d4]@3 ~@4 [c4,e4] ~@6 gb4@2, ~@3 [b2,a3,d4,gb4]@5 [c3,g3,c4,e4]@8, ~@5 a6@3 ~@8, ~@3 gb6 ~ g4@3, ~@7 e6@9]/2", // G C Bm7 C
  AJ: "~@2 g5 ~@4 gb5, [g2,g3,b3,d4]@3 [b2,a3,d4,gb4]@5, ~ b5@2 ~@5", // G Bm7
  AK: "[c3,c4,e4,g4,g5]@3 ~@4 [g3,a5], ~@3 d3@5, ~@5 c4@3, ~@3 a3", // C Gsus2
  AL: "~@4 [g3,b5]@2 ~@2 d6 ~@5 e4@2, g2@3 ~@2 gb3@3, g3@2 ~ [a3,d4,gb4]@3 [a3,d4,gb4]@2, ~ d3@2 b2@5", // G D
  AM: "[c3,g3,c4,e4]@6 [d3,c4,e4]@9 ~", AN: "[c3,g3,c4,e4]@7 [d3,c4,e4]@9", AO: "[~ [g2,d3,g3,b3,d4,gb4]@16 ~@7]/3",
})).s("gm_epiano2").gain(0.56)

// other · alto sax
const alto_sax = note("<A B@3 C ~@26 D@2 C ~@31 E@3 F G@2 H I J@2 K ~@17>".pickRestart({
  A: "~@2 c5@4 a4 ~ g4@4 f4@2 c4 d4",
  B: "[f4@2 d4 c4 f4@2 d4 c4 f4@4 ~@2 f5@8 d5@4 c5@3 ~ c5@6 a4@2 ~@4 f4 g4 a4@2 g4 ~]/3", C: "a4 ~@3",
  D: "[~@2 c5@16 a4@2 g4 f4 d4 f4@2 d4 f4@2 d4@2 c4@2]/2",
  E: "[~@6 g4 ~ g4@14 d5 g5@5 e5 d5 e5 d5@3 e5 ~@7 d5@3 c5 ~@2]/3", F: "b4@2 c5 d5@3 e5 d5@5 ~ c5@3",
  G: "[b4@3 ~@5 c5@2 b4 ~ c5 b4 c5 d5@3 e5 d5@3 ~@7 a4@3]/2", H: "b4@2 c5 b4@2 g4 a4 g4 b4@2 a4 b4@2 c5 d5 ~",
  I: "~ d5@3 e5@2 d5 g5 ~ e5 ~ d5 ~ d5 e5 d5", J: "[~ g5@2 e5 d5 ~@4 a5@3 bb5 a5@2 g5@14 e5@3]/2", K: "d5@2 e5 ~@13",
})).s("gm_alto_sax").gain(0.64)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@16 A B ~@2 A B C@2 D E ~@19 A B ~@2 A B C@2 D E ~@4 F G F H I J K L M ~@2 L M N@2 O@4 P Q@3 R S T@2 U V@5 ~
>`.pickRestart({
  A: "[a3,c4,f4]@5 ~ [g3,c4,e4]@10", B: "[bb3,d4,f4]", C: "[c4@7 ~]/2",
  D: "~@2 d4@2 ~@2 [c4,e4]@7 ~@3, f4@3 ~@5, ~@4 a3@9 ~@3", E: "[bb3,d4,f4,a4]@7 ~",
  F: "[g3,bb3,eb4]@5 ~ [ab3,c4,eb4]@9 ~", G: "[bb3,d4,f4]@7 ~", H: "[bb3,eb4,f4]@6 [bb3,d4,f4]@9 ~",
  I: "[a3,c4,f4]@7 ~ [bb3,d4,f4]@8", J: "[a3,c4,f4]@5 ~ [bb3,d4,f4]@9 ~", K: "[c4,g4,c5]@15 ~",
  L: "[b3,d4,g4]@5 ~ [a3,d4,gb4]@10", M: "[c4,e4,g4]", N: "[d4@7 ~]/2",
  O: "[[b3,d4,g4]@5 ~ [a3,d4,gb4]@10 [c4,e4,g4]@16 ~@32, g5@63 ~]/4", P: "[b3,d4,g4,g5,g6]@5 ~ [a3,d4,gb4,a5,a6]@10",
  Q: "[[c4,e4,g4,g6]@4 d4@7 a5, g5@11 ~]/3", R: "[b3,d4,g4]@5 ~ [a3,d4,gb4]@10, b5", S: "g5@3 a5, [c4,e4,g4]",
  T: "[~@16 g6@15 ~, g5]/2", U: "[b3,d4,g4,g5,g6]@3 [a3,d4,gb4,a5,a6]@5",
  V: "[[c4,e4,g4]@16 ~@12 c6@4 b5@8 ~ a5@8 ~ [d3,d4,gb4,a4]@28 ~@2, g5@49 ~@31, g6@11 ~@29, ~@8 d4@15 ~@17]/5", // C D
})).s("gm_string_ensemble_2").gain(0.28)

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

// drums · rim
const rim = s("rim").struct("<[~ x ~ x]!16 ~@13 [~ x ~ x]!4 ~@60>").gain(0.53)

// drums · snare
const snare = s("sd").struct("<~@16 A@12 B ~@3 C A@7 D A@3 E A@12 B F A@3 D A D G A@15 H A@7 I J ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~@2 x", C: "~@10 x ~@3 x!2", D: "~@4 x ~@7 x ~ x!2", E: "~@4 x ~@8 x!3",
  F: "~@4 x ~@4 x ~@2 x ~@2 x", G: "~@4 x ~@3 x ~ x ~@3 x!2", H: "~@2 x ~ x ~ x!2", I: "~@4 x ~@6 x ~ x ~@2",
  J: "x!2 ~@14",
})).gain(0.67)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@28 A ~@3 B ~@7 C ~@3 D ~@12 A E ~@6 F ~@15 G ~@7 H ~@3>".pickRestart({
  A: "~@11 x ~@2 x ~", B: "~@13 x ~@2", C: "~@10 x!2 ~@4", D: "~@5 x!2 ~", E: "~@7 x", F: "~@6 x!2 ~@4 x!2 ~@2",
  G: "~@6 x!2 ~@8", H: "~@2 x!2 ~@12",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@15 A ~@3 A ~@8 B ~@15 C ~@3 A ~@8 B ~@7 A ~@3 A ~@7 A ~@3 B ~@3 A ~@4 D ~@2
>`.pickRestart({
  A: "~@14 x!2", B: "~@7 x", C: "~ x", D: "x",
})).gain(0.67)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!89 [x ~@3 x ~@4 x ~@3 x ~@2] ~@3>").gain(0.67)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@16 A@7 B ~@9 A@19 B ~@5 A@15 B A@7 B A@7 C ~@3>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~@2 x ~@4 x ~@3 x ~@4",
})).gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@15 A ~@3 A ~@8 A ~@15 B ~@3 A ~@8 A ~@7 C ~@3 A ~@7 A ~@3 D ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@6 x!2 ~@8", C: "~@12 x!2 ~@2", D: "~@3 x",
})).gain(0.67)

// drums · open hat
const open_hat = s("oh").struct("<~@23 A ~@28 A ~@20 A ~@7 A ~@8 B ~@2>".pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.67)

// drums · high tom
const high_tom = s("ht").struct("<~@15 [~@5 x ~@2] ~@65 [~@5 x ~@2] ~@7 [~@11 x ~@4] ~@3>").gain(0.67)

// drums · crash
const crash = s("cr").struct("<~@16 A ~@3 A ~@24 A ~@3 A ~@9 A ~@5 A@2 ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@6>".pickRestart({
  A: "x",
})).gain(0.67)

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

// drums · congas
const congas = s("conga:13").struct(`<
  ~@12
  [~@2 x!2 ~@10 x ~]
  [~@3 x ~@8 x!2 ~@2]
  [~@2 x!2 ~@10 x ~]
  [~@3 x ~@8 x ~@3]
  ~@77
>`).gain(2.14)

// drums · congas
const congas_2 = s("conga:33").struct("<~@12 [~@15 x] [~ x ~@5 x] [~@15 x] [~ x ~@6] ~@77>").gain(2.14)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@2 B A B A B A B A B A B A B A B A B A B A B A B A B A B A@3
  B A B A B A@2 B A B A B A B A B A B A B A B A B A B A B A C D ~@2
>`.pickRestart({
  A: "~@5 x!2 ~", B: "~@6 x!2", C: "~@13 x ~@2", D: "x",
})).gain(3.38)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@2 B A B A B A B A B A B A B A B A B A B A B A B A B A B A@3
  B A B A B A@2 B A B A B A B A B A B A B A B A B A B A B A C D ~@2
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@13 x ~ x", C: "~@15 x", D: "~ x ~@14",
})).gain(1.02)

stack(
  bass, epiano2, alto_sax, string_ensemble_2, kick, rim, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, high_tom, crash, ride, congas, congas_2, cabasa, cabasa_soft
)

More by Michael Bolton