Strudelify

Ain't No Way to Treat a Lady

Helen Reddy

KeyC majorTempo80 bpm
0:00/0:00
// Ain't No Way to Treat a Lady — Helen Reddy
// 80 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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.

// other · clarinet · "Choir"
const clarinet = note(`<
  ~@12 A@2 B@2 C@2 D E ~@8 F@2 G@2 H@2 D E ~@4 I J K L M ~@7 A@2 G@2 C@2 D N O@2 G@2 C@2 D E ~@4
>`.pickRestart({
  A: "[~@3 a4 a4@2 a4 a4@3 b4 c5@3 d5 d5@3 e5@2 c5 ~ c5@3 ~@2 a4 b4@2 c5@2]/2",
  B: "[b4@2 a4@2 ~@2 b4@2 a4@2 g4@2 b4@2 c5@5 ~@13]/2",
  C: "[~@2 a4 a4@2 ~ a4 a4@3 b4@2 c5@2 d5 d5@3 e5@2 c5 ~ c5@3 ~@6 g4]/2", D: "a4@2 g4 ~ g4@3 f4 f4@2 e4 ~ e4@2 ~ e4",
  E: "e4@3 ~@13", F: "[~@3 a4!2 ~ a4 a4@3 b4 c5@3 d5 d5@3 e5@2 c5 ~ c5@3 ~@2 a4 b4@2 c5@2]/2",
  G: "[b4 a4 ~ b4 a4 g4 b4 c5@2 ~@7]/2", H: "[~@2 a4 a4@2 ~ a4 a4@2 ~ b4@2 c5@2 d5 d5@3 e5@2 c5 ~ c5@3 ~@6 g4]/2",
  I: "g4 f#4", J: "e4 d4", K: "c4@3 c4@5", L: "d4@3 d4@5", M: "b3", N: "e4 ~@3",
  O: "[~@3 a4!2 ~ a4 a4@3 b4 c5@3 d5 d5@3 e5@2 c5 ~ c5@2 ~@3 a4 b4@2 c5@2]/2",
})).s("gm_clarinet").gain(0.27).pan(0.4)

// chords · piano · "Chords"
const piano = note(`<
  A ~@2 B C D E F G H I E J K J L M K J K@2 D E F G H I E J K J L M K J ~@10 D E F G H I E J K J L M K J N J K J L M K J
  O ~ B P@2
>`.pickRestart({
  A: "~ c-1 ~@14", B: "[g3,c4,e4]@4 ~@2 [a3,c4,f4]@7 ~@3", C: "[g3,c4,e4]@2 ~ [a3,c4,f4]@4 ~",
  D: "[c4,e4,g4]@3 ~ [c4,e4,g4]@3 ~ [c4,e4,g4,b4]@3 ~ [c4,e4,g4,b4]@3 ~", // C Cmaj7
  E: "[c4,f4,a4]@3 ~ [c4,f4,a4]@3 ~ [c4,f4,a4]@3 ~ [c4,f4,a4]@3 ~", // F
  F: "[c4,e4,g4]@3 ~ [c4,e4,g4]@3 ~ [c4,e4,g4,a#4]@3 ~ [c4,e4,g4,a#4]@3 ~", // C C7
  G: "[c4,f4,a4]@3 ~ [c4,f4,a4]@3 ~ [c4,f4,g#4]@3 ~ [c4,f4,g#4]@3 ~", // F Fm
  H: "[c4,e4,g4]@3 ~ [c4,e4,g4]@3 ~ [b3,e4,g4]@3 ~ [b3,e4,g4]@3 ~", // C Em
  I: "[c4,e4,a4]@3 ~ [c4,e4,a4]@3 ~ [c4,e4,g4]@3 ~ [c4,e4,g4]@3 ~", // Am C
  J: "[d4,f4,a4] ~ [d4,f4,a4] ~ [d4,f4,a4] ~ [d4,f4,a4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~", // Dm G
  K: "[c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,f4,a4] ~ [c4,f4,a4] ~ [c4,f4,a4] ~ [c4,f4,a4] ~ [c4,f4,a4] ~", // C F
  L: "[c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4,a#4] ~ [c4,e4,g4,a#4] ~ [c4,e4,g4,a#4] ~ [c4,e4,g4,a#4] ~", // C C7
  M: "[c4,f4,a4] ~ [c4,f4,a4] ~ [c4,f4,a4] ~ [c4,f4,a4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4] ~", // F G G5
  N: "[c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [d4,f4,a4] ~ [d4,f4,a4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~", // C Dm C
  O: "[c4,e4,g4]@3 ~@13", P: "[[g3,c4]@9 ~@7]/2",
})).s("gm_piano").gain(0.18).pan(0.3)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@3 A@3 B A B C D E F G H I J K@2 L@2 A B A B C D E F G H I J M H N O P Q R S T U V W A B A B C D E F G H I J K@2 X Y
  G H I J K@2 Z A@3 ~
>`.pickRestart({
  A: "c2", B: "f2", C: "c2 b1", D: "a2 g2", E: "f2@5 ~ f2@6 a2 g2 f2 e2", F: "d2@4 ~@2 d2@2 g2@4 g2@3 ~",
  G: "c2@3 ~ c2@2 f2@5 ~ f2@3 ~", H: "d2@5 ~ d2@2 g2@3 ~ g2@4", I: "c2@4 ~@2 c2 ~ c3 a#2@3 a#2@2 c3@2",
  J: "f2@5 ~ f2@2 g2@3 ~ g2@3 ~", K: "[c2@3 ~ c2@2 f2@4 ~@2 f2 ~ f2 ~ d2@5 ~ d2@2 g2@3 ~ g2@4, ~@15 e2@2 ~@15]/2",
  L: "c2@3 ~ c2@2 f2@4 ~@2 f2@3 ~", M: "c2@3 ~ c2@2 f2@4 ~@2 f2 ~ f2 e2", N: "c2@3 ~ c2@2 ~@2 c2@3 ~ e2@3 ~",
  O: "a2@5 ~ a2 ~ a2@5 ~@3", P: "a2@5 ~ a2 ~ a2@3 ~ f#2@4", Q: "g2@5 ~ g2 ~ f2@5 ~ f2@2",
  R: "e2@5 ~ e2 ~ d#2@5 ~ d#2@2", S: "d2@5 ~ d2 ~ d2@4 ~@2 d2@2", T: "e2@4 ~@2 e2 ~ d2@5 ~ d2 ~",
  U: "c2@4 c2 ~ c2@7 ~@3", V: "d2@3 d2!2 ~ d2@7 ~ d2@2", W: "g2@4 ~@2 g2@2 a2@4 b2@3 ~", X: "c2@5 ~ c2 ~ d2@3 ~ e2@3 ~",
  Y: "d2@4 ~@2 f2@2 g2@4 g2@3 ~", Z: "c2@15 ~",
})).s("gm_fretless_bass").gain(0.23).pan(0.4)

// chords · piano
const piano_2 = note(`<
  ~ A@3 B C D E F G H I J ~@6 A@2 C D E F G H I J ~@6 K ~@9 C D E F G H I J ~@6 L J ~@6 M@3 N ~
>`.pickRestart({
  A: "e5@2 c5@2 g4@2 [f2,a4]@6 f5 g5 f5@2, c3@3 ~@5", B: "e5 c5 g4 [f2,a4]@3 g4 f4, c3@3 ~@5",
  C: "~ e4 c4 e4 g4 e4 b4 e4, g4@5 ~@3 c4@6 ~@2", D: "~@2 a4@2 f4@2 c4@2 [f4,a4]@2 c4 ~ [c4,f4] ~ g4@2, c4@4 ~@10 c4 ~",
  E: "c4 e4 g4 e4 c4 e4 g4 e4, ~@4 c4 ~@3 e4 ~@7", F: "~@2 f4@2 a4@3 ~ [g#4,c5]@3 [b4,d5]@2 [c5,f5]@3, c4@5 ~@11",
  G: "c4 e4 g4 c5 b3 e4 g4 b4", H: "a3 c4 e4 a4 g4 e4 c4 g3",
  I: "a3@2 c4@2 f4@2 [c4,a4]@5 ~ [f5,a5] [e5,g5] [d5,f5] [c5,e5]", J: "[f4,a4,d5] ~@3",
  K: "e5 c5 g4 e5 c5@2 [b4,d5,e5]@2", L: "[c4,e4,g4]@6 ~@2 [d4,f4,a4]@3 ~ [e4,g4,c5]@4",
  M: "e5@2 c5@2 g4@2 [f4,a4]@5 ~ f5 g5 f5@2", N: "[g4,c5,e5]@15 ~",
})).s("gm_piano").gain(0.24).pan(0.2)

// chords · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  ~@12 A B A C D E A B@2 F G H I F J K A B A C D E A L M N O P Q R S T U F G H I F J K A B A C D E A V A B A C D E A ~@5
>`.pickRestart({
  A: "[d4,f4,a4] [d4,f4,g4,b4]", B: "[c4,e4,g4]@3 [c4,f4,a4]@5", C: "[c4,e4,g4] [c4,e4,g4,a#4]",
  D: "[c4,e4,f4,a4] [d4,f4,g4,b4]", E: "[c4,e4,g4]@3 [f4,a4]@4 ~, ~@3 c4@5", F: "c6 b5", G: "a5", H: "c6 a#5",
  I: "a5 g#5", J: "a5 g5", K: "f5", L: "[c4,e4,g4]@3 [b3,d4,e4,g#4]", M: "[c4,e4,a4] [c4,e4,g#4]",
  N: "[c4,e4,g4] [c4,d4,f#4,a4]", O: "[d4,g4,b4] [d4,f4,g4,b4]", P: "[c4,e4,g4] [d#4,g4,a#4]",
  Q: "[d4,g4,b4] [d4,f#4,a4]", R: "[e4,g4,b4] [d4,e4,g4,b4]", S: "[c4,e4,g4]@5 ~ [c4,e4,g4]@10",
  T: "[c4,d4,f#4,a4]@5 ~ [c4,d4,f#4,a4]@10", U: "[d4,g4,b4]@2 [c4,e4,a4] [d4,g4,b4]", V: "c4 e4 d4 e4",
})).s("gm_synth_strings_1").gain(0.13)

// other · epiano2 · "Lead"
const epiano2 = note("<~@15 A B ~@14 A B ~@3 C D E F ~@15 A B ~@6 A B ~@7>".pickRestart({
  A: "~@6 c5 d5 e5 d5 c5 d5 ~ d5 c5 d5, ~@6 e5 ~", B: "a4 ~", C: "a3 g#3", D: "g3 f#3", E: "g3 f3", F: "e3 d#3",
})).s("gm_epiano2").gain(0.35).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@12 [x!2]!55 ~@5>").gain(0.28)

// drums · snare
const snare = s("sd").struct("<~@12 [~ x ~ x]!55 ~@5>").gain(0.24)

// drums · hihat
const hihat = s("hh").struct("<~@12 [x!8]!55 x!3 ~@2>").gain(0.33)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@13 A ~@3 A ~ A@2 ~@8 A ~@3 A ~ A ~@6 A@2 ~@9 A ~@3 A ~@3 A ~@3 A ~ B@3 ~@2
>`.pickRestart({
  A: "~@6 x!2", B: "~@3 x ~@4",
})).gain(0.24)

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

// drums · high tom
const high_tom = s("ht").struct("<~@15 A ~@15 A ~@23 A ~@3 B ~@3 A ~@8>".pickRestart({
  A: "~@8 x!2 ~@2 x!2 ~@2", B: "~@4 x!3 ~",
})).gain(0.28)

// drums · crash
const crash = s("cr").struct(`<
  ~@11 A ~ A ~@3 A ~ A@2 ~@6 A ~ A ~@3 A ~@8 A@2 ~@7 A ~ A ~@3 A ~@3 A ~@3 A ~@6
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.24)

stack(clarinet, piano, bass, piano_2, synth_strings_1, epiano2, kick, snare, hihat, open_hat, mid_tom, high_tom, crash)

More by Helen Reddy