Strudelify
Don't Leave Me This Way cover art

1977 · Thelma Houston

Don't Leave Me This Way

Thelma Houston

KeyC majorTempo120 bpm
0:00/0:00
// Don't Leave Me This Way — Thelma Houston
// 120 bpm, 4/4, key C major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · epiano1 · "Words"
const epiano1 = note(`<
  A@2 B@2 C D E@2 F@2 G@3 H I@2 F@2 G@3 H I@2 F@2 G@3 H I@2 J K@3 L@3 M@7 N@2 O P@8 ~@14 Q K@3 L@3 M@7 N@2 O P@8 ~@28
>`.pickRestart({
  A: "[a#4@14 a4 a#4 c5@4 a#4@4 a4@4 a#4@4, [g3,d4]]/2", B: "[[d#4,g4]@6 a#3 c4, d#3]/2", C: "[a#2,f3,d4] [a2,f3,c4]",
  D: "~@12 d4@3 ~, [g2,g3,a#3]", E: "[[d#3,g3,a#3]@15 ~@9 f2 ~@7, c4, f2@3 ~, ~ [g3,a#3,d#4]]/2",
  F: "[a#3 ~@23 f4@8, [g2,d4,g4], ~@8 g3@7 ~]/2", // G5
  G: "[d#2@16 ~@8 g3@7 ~ [a#2,d4]@8 [a2,a3,c4]@8, [d#4,g4]@32 f3@15 ~, a#3@23 ~ a#3@15 ~@9, ~@16 d#3@17 ~@15]/3", // A# Am D#
  H: "~@8 g4@7 ~, [g2,g3,a#3,d4]", I: "[~@3 f3, [f2,g3,a#3,d#4], ~ f4]/2", J: "[d4,a#4] [g4,c5], g3 ~@7 e4@6 ~@2",
  K: "[[f3,c4]@8 c5@6 d5 d#5 [d3,a#4,d5]@8, f4, a4@5 ~@3, ~@16 d#3@17 ~@15]/3", // F5 Gm
  L: "[[f3,a4,c5] [g3,d4,a#4] [c3,c5]@2 [d#3,a#4]@2, f4@6 ~@2 g4@39 ~, ~ d#4@2]/3", // F Gm C D#5
  M: "[[g3,d4,a#4]@8 [c3,e4]@8 a4@12 ~@15 f4@3 g4@2 ~ [d3,a#4]@15 [a3,c4,a4]@8 [g3,d4,a#4]@8 [c3,c4,d#4]@16 [d#3,d#4,a#4]@16, g4@16 f3@33 ~@63, ~@8 c4@20 c5@19 ~ d4@15 ~@49, ~@2 f4@2 d#4@2 f4@3 g4@5, ~@29 a4@20 ~@63]/7", // Gm C Gm Am Gm Cm D#5
  N: "[[g3,d4,a#4]@16 ~@8 c4@7 ~, g4@31 ~, ~ [c3,d#4,c5]]/2", O: "[g3,d4,a#4] [c3,e4,c5], g4, ~@8 a#4 ~@7",
  P: "[a4@10 g4@4 ~@10 c5@7 ~ d4@7 ~ d5@8 [a3,a4,c5]@8 [g3,a#4,d5]@8 [c3,c5]@16 [d#3,a#4]@16 ~@8 d5@5 ~@3 g5 ~@7 g6 ~@7, f3@32 [a#3,a#4]@16 ~@48 g3@27 ~@5, f4@17 d#4@15 ~@32 d#4@31 ~ [d4,b4]@13 ~@19, c4@14 a4@17 f4@24 ~ g4@53 ~@19]/8", // Am Gm C D#5 A# G
  Q: "[d4,a#4] [g4,c5], g3, ~@4 e4@3 ~", // Gm C5
})).s("gm_epiano1").gain(0.27)

// bass · electric bass finger
const bass = note(`<
  ~@15 A B C D E F B G H I C D E F B G H J K L M N O P Q R S M T O U V O W R X M T O Y V Z AA AB AA AB AA AB AA AB AA AB
  AA AB AC AD J K L M N O P Q R S M T O U V O W R X M T O Y V Z AA AB AA AB AA AB AA AB AA AB AA AB AA AB AA AB AA AB AA
  AB AA AB AA AB AC AD AC AE
>`.pickRestart({
  A: "~@12 f2@3 ~", B: "g1 ~ g1@4 ~ g1!2 ~ g1@4 ~ g1", C: "g1 ~ g1@4 ~ g1!2 ~ g1@3 ~ a#1@2",
  D: "d#2 ~ d#2@4 ~ d#2!2 ~ d#2@4 ~ d#2", E: "d#2 ~ d#2@4 ~ d#2!2 ~ d#2@4 f1@2", F: "a#1 ~ a#1@4 ~ a#1 a1 ~ a1@4 ~ a1",
  G: "f1 ~ f1@4 ~ f1!2 ~ f1@4 ~ f1", H: "f1 ~ f1@4 ~ f1!2 ~ f1@3 ~ f1 ~", I: "g1@6 ~ g1!2 ~ g1@4 ~ g1", J: "g1 c2",
  K: "f1@5 ~ f1 ~ f1@6 c2 ~", L: "f2@7 f2!2 ~ f2@3 ~ f1 ~", M: "a#1@5 ~ a#1 ~ a#1@5 ~ a#1 ~",
  N: "f1@5 ~ f1 ~ g1@5 ~ g1 ~", O: "c2@5 ~ c2 ~ c2@5 ~ c2 ~", P: "f2@4 f1@3 f1!2 ~ f1@3 ~ f1 ~",
  Q: "g1@5 ~ g1 ~ c2@5 ~ c2 ~", R: "f1@5 ~ f1 ~ f1@5 ~ c2 ~", S: "f2@6 ~ f2!2 ~ f2@3 ~ f1 ~",
  T: "f1@4 ~@2 f1 ~ g1@5 ~ g1 ~", U: "f2@4 f1@2 ~ f1!2 ~ f1@3 ~ f1 ~", V: "g1@5 ~ g1 ~ g1@5 ~ g1 ~",
  W: "g1@4 ~@2 g1 ~ c2@5 ~ c2 ~", X: "f2@6 ~ f2!2 ~ f2@4 f1 ~", Y: "f2@3 ~ f1@2 ~ f1!2 ~ f1@3 ~ f1 ~",
  Z: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", AA: "g2@5 ~ g2 ~ d2 e2 g2 g2@3 d2 ~",
  AB: "f2@5 ~ f2 ~ c2@2 ~ c2!2 ~ c2 ~", AC: "d2@4 ~@2 d2 ~ d2@5 ~ d2 ~", AD: "d2@5 ~ d2 ~ d2@4 ~@2 d2@2",
  AE: "d2@5 ~ d2 ~ d2@4 ~@2 g1 ~",
})).s("gm_electric_bass_finger").gain(0.44)

// chords · brass section
const brass_section = note(`<
  ~@57 A B A B A B A B A B A B C D ~@25 A B A B A B A B A B A B A B A B A B A B A B A B E F E G
>`.pickRestart({
  A: "~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~ [g4,b4,d5] [g4,b4,d5]@2 ~@2 [g4,b4,d5] ~@3", // G
  B: "~@2 [f4,a4,c5]@3 ~@5 [e4,g4,c5]@3 ~@3", // F C
  C: "[d4,c5,e5,g5]@5 ~ [d4,c5,e5,g5] ~ [d4,c5,e5,g5] ~ [d4,c5,e5,g5]@4 ~@2", // C
  D: "[d4,c5,e5,g5]@4 ~@2 [d4,c5,e5,g5] ~ [d4,c5,e5,g5] ~ [d4,c5,e5,g5]@6", // C
  E: "[c5,e5,g5]@5 ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5]@4 ~@2", // C
  F: "[c5,e5,g5]@4 ~@2 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5]@5 ~", // C
  G: "[c5,e5,g5]@4 ~@2 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5]@4 [g4,d5]@2, ~@14 g5 ~", // C G5
})).s("gm_brass_section").gain(0.33)

// chords · trumpet
const trumpet = note(`<
  ~@47 A ~@7 B C D E D E D E D E D E D E F G ~@15 A ~@7 B C D E D E D E D E D E D E D E D E D E D E D E D E ~@4
>`.pickRestart({
  A: "[c3,c4,d#4,g4] [f2,d#4,g4,a#4]", B: "[g2,g3,b3,d4]@5 ~ [g2,g3,b3,d4] ~ [g2,g3,b3,d4]@5 ~ [g2,g3,b3,d4] ~",
  C: "[g2,g3,b3,d4]@5 ~ [g2,b3,d4,g4] ~ [g2,b3,d4,g4]@8", // G
  D: "~@2 [g3,b3,d4] ~@2 [g3,b3,d4] ~ [g3,b3,d4] [g3,b3,d4]@2 ~@2 [g3,b3,d4] ~@3", // G
  E: "~@2 [f3,a3,c4]@3 ~@5 [e3,g3,c4]@3 ~@3", // F C
  F: "[d3,c4,e4,g4]@5 ~ [d3,c4,e4,g4] ~ [d3,c4,e4,g4] ~ [d3,c4,e4,g4]@4 ~@2", // C
  G: "[d3,c4,e4,g4]@4 ~@2 [d3,c4,e4,g4] ~ [d3,c4,e4,g4] ~ [d3,c4,e4,g4]@6", // C
})).s("gm_trumpet").gain(0.39).pan(0.9)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@15 A B@2 C D E F G@2 H I J K L M N O ~@7 P Q C R S@3 T D U V@2 W X Y Z AA@2 AB AC AD AE AB AC AD AE AB AC AD AF AA@2
  ~@7 P Q C R S@3 T D U V@2 W X Y Z AA@2 AB AC AB AC AB AC AB AC AB AC AB AC AB AC AB AC AB AC AB AC AB AC AB AC AA@2
  AG@2
>`.pickRestart({
  A: "~@12 f5 [d5,d#5] c5 [a4,a#4]", B: "d4/2", C: "d#4", D: "g4 a#4", E: "d5@8 c5@6 a#4 a4", F: "a#4 d5",
  G: "[d5@27 ~ c5 [d5,d#5] f5 [g5,a5]]/2", H: "a#5@6 a5 a#5", I: "c6 a#5 a5 a#5", J: "g5@14 a#4!2",
  K: "a#4@2 d#5!2 d#5@2 g5!2 g5@2 a#5!2 a#5@2 c6@2", L: "d6@6 c6 a#5 c6@8", M: "a#5@6 f5 g5 a#5@4 d6@4", N: "d6",
  O: "c6@3 ~", P: "g4@14 f4 e4", Q: "f4", R: "d4", S: "[f4 g4@3 a#4@2]/3", T: "d4@12 g5 [d5,f5] c5 [a4,a#4]",
  U: "d5@6 c5 d5 e5@6 d5 e5", V: "[f5@22 d#5 d5 d#5@6 d5 c5]/2", W: "d5", X: "f5 g5", Y: "~ g5 a5 a#5",
  Z: "c6@2 d6@2 c6 a#5 a5@2", AA: "g5/2", AB: "b5@14 a5 b5", AC: "c6@2 d6 c6", AD: "b5", AE: "a5 g5", AF: "a5@8 g5@7 ~",
  AG: "[g5@15 g6]/2",
})).s("gm_string_ensemble_1").gain(0.27).pan(0.7)

// other · electric guitar jazz
const electric_guitar_jazz = note("<~@8 A B C D E@2 F@2 ~@2 G H I J K L ~@2 M@3 N O P ~@92>".pickRestart({
  A: "a#4@12 ~ a4 a#4 ~", B: "c5@5 ~ a#4@2 a4@2 ~ a#4@2 ~ c5@2", C: "g4", D: "~@8 a#4@4 c5@3 ~",
  E: "[d5@7 ~ c5@3 ~ d5@2 a#4@9 ~@4 f4@3 g4@2]/2", F: "[a#4@2 ~ c5@2 ~ c5@16 ~@10]/2", G: "~@3 d5@3 f5@2 ~ f5@5 g5 ~",
  H: "~@8 d5@3 c5@3 a#4@2", I: "a#4@7 ~ a4@6 a#4@2", J: "g4@6 ~@2 d4@3 f4@2 ~ g4@2", K: "~ f4@11 ~ d4@3",
  L: "c4@11 ~@5", M: "[~@3 a#5@3 a5@2 ~ g5@2 ~ a#5@2 f5@8 g5 ~@2 d5@3 c5@3 a#4@8 ~@9]/3",
  N: "~@2 d5@3 ~ f5@2 g5@3 ~ f5@2 d5@2", O: "f5@12 ~@2 g5 ~", P: "~ d5@3 c5@8 ~@4",
})).s("gm_electric_guitar_jazz").gain(0.32).pan(0.8)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@16 A@3 B C D@3 A@3 B C E F@2 ~@7 G H@2 I J@2 K L M G H@2 N O@2 P Q@2 R S T S T S T S T S T S U@2 ~@7 G H@2 I J@2 K L
  M G H@2 N O@2 P Q@2 R S T S T S T S T S T S T S T S T S T S T S T S U@2 V@2
>`.pickRestart({
  A: "[d3@2 d#3, [g3,a#3]]/3", B: "[g3,a#3] ~@7 [a#3,d#4] ~@7, d#4 g4", C: "[d4,a#4] [c4,a4], f4",
  D: "[[a#3,d4,g4]@8 [d4,g4] ~@7 d#4@32, ~ a#4@5]/3", E: "[a#3,d4,g4]@8 [d4,g4] ~@7, ~ a#4", F: "[d#4,a#4]/2",
  G: "[a#3,d4] [c4,e4], g3", H: "[f3 d#3, a3, c4 ~@31]/2", I: "[d3,f3,a#3]@15 f3",
  J: "[[a3,c4] [a#3,d4] [c4,d#4]@2, ~ g3@3]/2", K: "[a#3,g4], d#4 ~@15", L: "[d3,g3], a#3 ~@15",
  M: "[c4,d#4]@8 [c4,d#4] ~@7, g3 ~@7 g4@8", N: "[d3,f3,a#3]",
  O: "[[a3,c4]@7 ~ [a#3,d4]@8 [c4,d#4]@16, f3 ~@6 g3@24 ~]/2", P: "[c4,d#4] ~@15, g4", Q: "[b3,d4,g4]/2",
  R: "[b3,d4] ~@15, g3", S: "[f3,a3] [e3,g3], c4", T: "[b3,d4], g3 ~@15", U: "[[a3,e4], c4 ~@31]/2",
  V: "[[a3,e4] ~@29 [d4,g4,g5] ~, c4@15 ~]/2", // A5 G5
})).s("gm_synth_strings_1").gain(0.21).pan(0.3)

// chords · french horn · Am A# Cm A# Am A# Cm A#
const french_horn = note(`<
  ~@42
  [~ f4 a#4 d5]
  [[a4,c5]@6 [a#4,d5] [c5,d#5] [a#4,d5]@8]
  ~@37
  [~ f4 a#4 d5]
  [[a4,c5]@6 [a#4,d5] [c5,d#5] [a#4,d5]@8]
  ~@41
>`).s("gm_french_horn").gain(0.33).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~@24 A@8 B@22 A C D B@36 A C D B@27 E>".pickRestart({
  A: "x ~@6 x!2 ~@7", B: "x ~@2 x!2 ~@3", C: "x!8", D: "x!7 ~", E: "x ~@2 x!2 ~@2 x",
})).gain(0.54)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@45 A ~@10 A ~@27 A ~@10 A ~@28>".pickRestart({
  A: "~@7 x",
})).gain(0.6)

// drums · mid tom
const mid_tom = s("mt").struct("<~@56 [x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2] ~@38 [x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2] ~@28>")
  .gain(0.6)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@23 A ~@8 B C@12 ~ B ~ B C@5 ~@3 D@11 E D F B C@12 ~ B ~ B C@5 ~@3 D@25 F D E
>`.pickRestart({
  A: "~@2 x!2", B: "x ~@6 x", C: "~@7 x", D: "~ x ~ x ~ x ~ x", E: "~ x ~ x ~@4", F: "~ x ~ x ~@3 x",
})).gain(0.54)

// drums · crash
const crash = s("cr").struct("<~@55 A ~ A ~@11 A ~@24 A ~ A ~@7 A ~@7 A ~@7 A B ~ B>".pickRestart({
  A: "x", B: "~@7 x",
})).gain(0.54)

// drums · congas
const congas = s("conga:13").struct("<[x!2]!123 [x ~@3 x ~@2 x]>").gain(1.54)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  A@7 B A@7 B A@7 B A@7 B A@15 B A@8 B A@13 B A@15 B A@8 B A@7 B A@7 B A@7 B A B A B
>`.pickRestart({
  A: "~@3 x!2 ~@6 x!2 ~@3", B: "~@3 x!2 ~@6 x!3 ~@2",
})).gain(1.54)

// drums · congas
const congas_3 = s("conga:33").struct("<[~@3 x ~@3 x]!123 [~@3 x ~@4]>").gain(1.54)

stack(
  epiano1, bass, brass_section, trumpet, string_ensemble_1, electric_guitar_jazz, synth_strings_1, french_horn, kick,
  snare, hihat, low_tom, mid_tom, open_hat, crash, congas, congas_2, congas_3
)