Strudelify

Don't Leave Me This Way

Thelma Houston

KeyG minorTempo120 bpm
0:00/0:00
// Don't Leave Me This Way — Houston Thelma
// 120 bpm, 4/4, key G minor. Source: 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 · "E.PIANO 1"
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: "[bb4@14 a4 bb4 c5@4 bb4@4 a4@4 bb4@4, [g3,d4]]/2", B: "[[eb4,g4]@6 bb3 c4, eb3]/2", C: "[bb2,f3,d4] [a2,f3,c4]",
  D: "~@12 d4@3 ~, [g2,g3,bb3]", E: "[[eb3,g3,bb3]@15 ~@9 f2 ~@7, c4, f2@3 ~, ~ [g3,bb3,eb4]]/2",
  F: "[bb3 ~@23 f4@8, [g2,d4,g4], ~@8 g3@7 ~]/2", // G5
  G: "[eb2@16 ~@8 g3@7 ~ [bb2,d4]@8 [a2,a3,c4]@8, [eb4,g4]@32 f3@15 ~, bb3@23 ~ bb3@15 ~@9, ~@16 eb3@17 ~@15]/3", // Bb Am Eb
  H: "~@8 g4@7 ~, [g2,g3,bb3,d4]", I: "[~@3 f3, [f2,g3,bb3,eb4], ~ f4]/2", J: "[d4,bb4] [g4,c5], g3 ~@7 e4@6 ~@2",
  K: "[[f3,c4]@8 c5@6 d5 eb5 [d3,bb4,d5]@8, f4, a4@5 ~@3, ~@16 eb3@17 ~@15]/3", // F5 Gm
  L: "[[f3,a4,c5] [g3,d4,bb4] [c3,c5]@2 [eb3,bb4]@2, f4@6 ~@2 g4@39 ~, ~ eb4@2]/3", // F Gm C Eb5
  M: "[[g3,d4,bb4]@8 [c3,e4]@8 a4@12 ~@15 f4@3 g4@2 ~ [d3,bb4]@15 [a3,c4,a4]@8 [g3,d4,bb4]@8 [c3,c4,eb4]@16 [eb3,eb4,bb4]@16, g4@16 f3@33 ~@63, ~@8 c4@20 c5@19 ~ d4@15 ~@49, ~@2 f4@2 eb4@2 f4@3 g4@5, ~@29 a4@20 ~@63]/7", // Gm C Gm Am Gm Cm Eb5
  N: "[[g3,d4,bb4]@16 ~@8 c4@7 ~, g4@31 ~, ~ [c3,eb4,c5]]/2", O: "[g3,d4,bb4] [c3,e4,c5], g4, ~@8 bb4 ~@7",
  P: "[a4@10 g4@4 ~@10 c5@7 ~ d4@7 ~ d5@8 [a3,a4,c5]@8 [g3,bb4,d5]@8 [c3,c5]@16 [eb3,bb4]@16 ~@8 d5@5 ~@3 g5 ~@7 g6 ~@7, f3@32 [bb3,bb4]@16 ~@48 g3@27 ~@5, f4@17 eb4@15 ~@32 eb4@31 ~ [d4,b4]@13 ~@19, c4@14 a4@17 f4@24 ~ g4@53 ~@19]/8", // Am Gm C Eb5 Bb G
  Q: "[d4,bb4] [g4,c5], g3, ~@4 e4@3 ~", // Gm C5
})).s("gm_epiano1").gain(0.27)

// bass · electric bass finger · "FINGERDBAS"
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 ~ bb1@2",
  D: "eb2 ~ eb2@4 ~ eb2!2 ~ eb2@4 ~ eb2", E: "eb2 ~ eb2@4 ~ eb2!2 ~ eb2@4 f1@2", F: "bb1 ~ bb1@4 ~ bb1 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: "bb1@5 ~ bb1 ~ bb1@5 ~ bb1 ~",
  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 · "BRASS 1"
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,eb4,g4] [f2,eb4,g4,bb4]", 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 · "STRINGS"
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,eb5] c5 [a4,bb4]", B: "d4/2", C: "eb4", D: "g4 bb4", E: "d5@8 c5@6 bb4 a4", F: "bb4 d5",
  G: "[d5@27 ~ c5 [d5,eb5] f5 [g5,a5]]/2", H: "bb5@6 a5 bb5", I: "c6 bb5 a5 bb5", J: "g5@14 bb4!2",
  K: "bb4@2 eb5!2 eb5@2 g5!2 g5@2 bb5!2 bb5@2 c6@2", L: "d6@6 c6 bb5 c6@8", M: "bb5@6 f5 g5 bb5@4 d6@4", N: "d6",
  O: "c6@3 ~", P: "g4@14 f4 e4", Q: "f4", R: "d4", S: "[f4 g4@3 bb4@2]/3", T: "d4@12 g5 [d5,f5] c5 [a4,bb4]",
  U: "d5@6 c5 d5 e5@6 d5 e5", V: "[f5@22 eb5 d5 eb5@6 d5 c5]/2", W: "d5", X: "f5 g5", Y: "~ g5 a5 bb5",
  Z: "c6@2 d6@2 c6 bb5 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 · "JAZZ GTR"
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: "bb4@12 ~ a4 bb4 ~", B: "c5@5 ~ bb4@2 a4@2 ~ bb4@2 ~ c5@2", C: "g4", D: "~@8 bb4@4 c5@3 ~",
  E: "[d5@7 ~ c5@3 ~ d5@2 bb4@9 ~@4 f4@3 g4@2]/2", F: "[bb4@2 ~ c5@2 ~ c5@16 ~@10]/2", G: "~@3 d5@3 f5@2 ~ f5@5 g5 ~",
  H: "~@8 d5@3 c5@3 bb4@2", I: "bb4@7 ~ a4@6 bb4@2", J: "g4@6 ~@2 d4@3 f4@2 ~ g4@2", K: "~ f4@11 ~ d4@3",
  L: "c4@11 ~@5", M: "[~@3 bb5@3 a5@2 ~ g5@2 ~ bb5@2 f5@8 g5 ~@2 d5@3 c5@3 bb4@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 · "SYN STR 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 eb3, [g3,bb3]]/3", B: "[g3,bb3] ~@7 [bb3,eb4] ~@7, eb4 g4", C: "[d4,bb4] [c4,a4], f4",
  D: "[[bb3,d4,g4]@8 [d4,g4] ~@7 eb4@32, ~ bb4@5]/3", E: "[bb3,d4,g4]@8 [d4,g4] ~@7, ~ bb4", F: "[eb4,bb4]/2",
  G: "[bb3,d4] [c4,e4], g3", H: "[f3 eb3, a3, c4 ~@31]/2", I: "[d3,f3,bb3]@15 f3",
  J: "[[a3,c4] [bb3,d4] [c4,eb4]@2, ~ g3@3]/2", K: "[bb3,g4], eb4 ~@15", L: "[d3,g3], bb3 ~@15",
  M: "[c4,eb4]@8 [c4,eb4] ~@7, g3 ~@7 g4@8", N: "[d3,f3,bb3]",
  O: "[[a3,c4]@7 ~ [bb3,d4]@8 [c4,eb4]@16, f3 ~@6 g3@24 ~]/2", P: "[c4,eb4] ~@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 · "FR.HORN" · Am Bb Cm Bb Am Bb Cm Bb
const french_horn = note(`<
  ~@42
  [~ f4 bb4 d5]
  [[a4,c5]@6 [bb4,d5] [c5,eb5] [bb4,d5]@8]
  ~@37
  [~ f4 bb4 d5]
  [[a4,c5]@6 [bb4,d5] [c5,eb5] [bb4,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
)