Strudelify
Rescue Me cover art

1965

Rescue Me

Fontella Bass

KeyA majorTempo116 bpm
0:00/0:00
// Rescue Me — Fontella Bass
// 116 bpm, 4/4, key A major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 67 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(116/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 · tenor sax · "Sax"
const tenor_sax = note(`<
  ~@7 A B C D E F G H I J K L M L K N O@2 P D E Q R S T ~@7 A B C D E F G H I J K L M L K N U@6 ~@6
>`.pickRestart({
  A: "~@10 c4@3 ~ a3@2", B: "a3@2 ~@3 f#3 a3 f#3", C: "a3@2 a3@3 ~ b3@4 ~ c4@2 a3@2 ~",
  D: "b3 a3 g3@6 ~@2 g3@2 a3@2 g3@2", E: "c4@2 a3@3 ~ b3@3 ~ c4@2 a3@3 ~", F: "a3@3 ~ a3@4 ~@2 f#3@2 a3@2 b3@2",
  G: "~ f#3@3 ~ f#3 a3 b3", H: "~@2 a3@2 ~@2 f#3@2 c4@2 a3@3 ~ b3@2", I: "~@2 c4@2 b3@2 a3@2 b3@2 a3@3 ~ a3@2",
  J: "~@2 c4@2 b3@2 b3@3 ~ a3@3 ~ f#3@2", K: "a3@2 a3@3 ~ b3@6 ~@4", L: "~@2 c4@2 b3@2 b3@3 ~ a3@2 ~@4",
  M: "a3@2 a3@3 ~ a3@6 ~@4", N: "d4@2 c#4@3 ~ b3@3 ~ f#3@2 a3@3 ~",
  O: "[c4@3 ~ c4@3 ~ c4@2 a3@3 ~ a3@6 ~@6 f#3@2 a3@2 f#3@2]/2", P: "a3@2 a3@3 ~ b3@4 ~ c#4@2 a3@2 ~", Q: "b3 a3@3 ~@4",
  R: "a3@2 a3@3 ~ b3@3 ~ f#3@5 ~", S: "c4@2 b3@3 ~ b3@3 ~ f#3@2 a3@3 ~", T: "c4@3 ~ c4@4 ~@8",
  U: "[c4@3 ~ c4@4 ~@2 g3@2 g#3@2 a3@6 ~@6 g3@2 g#3@2 a3@6 ~@6 g3@2 g#3@2 a3@6 ~@6 g3@2 g#3@2 a3@6 ~@6 g3@2 g#3@2 a3@6 ~@12]/6",
})).s("gm_tenor_sax").gain(0.35).pan(0.3)

// chords · electric guitar clean · "Guitar"
const electric_guitar_clean = note(`<
  ~@2 A B A C D@2 ~@7 E@2 F@2 G@2 H I J ~@6 I K ~@2 A B A C D@2 ~@7 E@2 F@2 G@2 H I L M N M N O P O Q R@2 S
>`.pickRestart({
  A: "c#5@2 b4@2 a4@2 b4@2 c#5@3 ~ b4@2 a4@2", B: "c#5@3 ~ c#5@2 b4@2 c#5@2 b4@2 a4@2 b4@2",
  C: "c#5@3 ~ c#5@2 b4@2 c#5@2 b4@2 a4@3 ~", D: "[[a4,d5]@2 [g#4,c#5]@3 ~ [f#4,b4]@3 ~ [e4,a4]@3 ~ [b3,e4]@10 ~@8]/2",
  E: "[~@7 c#4@7 ~@2]/2", F: "[[f#4,a4]@2 [f#4,a4]@3 ~ [f#4,b4]@3 ~ e4@2 f#4@2 c#4@14 ~@4]/2",
  G: "[[f#4,a4]@2 [f#4,a4]@3 ~ [f#4,a4]@3 ~ e4@2 f#4@2 c#4@14 ~@4]/2", H: "[f#4,a4]@2 [f#4,a4]@3 ~ [f#4,b4]@6 ~@4",
  I: "[a4,d5]@2 [g#4,c#5]@3 ~ [f#4,b4]@3 ~ f#4@2 [e4,a4]@3 ~", J: "[b3,e4] ~", K: "[b3,e4]", L: "b3@13 ~@3, e4 ~",
  M: "[c#4,e4,a4]@13 ~@3", N: "[d4,f#4,a4]@13 ~@3", O: "a4@2 f#4@2 e4@2 f#4@2 a4@3 ~ f#4@2 e4@2",
  P: "a4@3 ~ a4@2 f#4@2 a4@2 f#4@2 e4@2 f#4@2", Q: "a4@3 ~ a4@2 f#4@2 a4@2 f#4@2 e4@3 ~",
  R: "[[a4,d5]@2 [g#4,c#5]@3 ~ [f#4,b4]@3 ~ [e4,a4]@3 ~ [b3,e4]@10 ~@3 [b3,d4,g4]@2 [c4,d#4,g#4]@2 ~]/2", // D5 C#5 B5 A5 E5 G G#
  S: "[c#4,e4,a4]", // A
})).s("gm_electric_guitar_clean").gain(0.72).pan(0.1)

// chords · piano
const piano = note(`<
  ~@8 A B C D E F C G H F H B E F ~ I E J K D L J ~ G ~@8 H J M N A B M N O P H J O Q ~ N O R O F E Q O B ~ S A
>`.pickRestart({
  A: "[a3,c#4,e4]@15 ~", B: "[a3,d4,f#4]@6 d3@2 [a3,d4,f#4]@3 ~ [a3,d4,f#4] ~@3",
  C: "g3@8 g3@2 b3@2 d4@2 g4 ~, [b3,d4]@5 ~@3", D: "~@2 [g#3,b3,e4]@2 ~@2 e3@2 [g#3,b3,e4]@2 ~@2 [g#3,b3,e4] ~@3",
  E: "[a3,c#4,e4] ~ [a3,c#4,e4] ~@3 [a3,c#4,e4]@6 ~@4", F: "d4@8 d4@2 f#4@2 a4@2 d5 ~, [a3,f#4]@5 ~@3",
  G: "[g#3,b3,e4] ~ [g#3,b3,e4] ~@3 [g#3,b3,e4]@6 ~@4", H: "a3@8 a3@2 c#4@2 e4@2 a4 ~, [c#4,e4]@5 ~@3",
  I: "~@2 [g#3,b3,e4]@2 ~@2 b2@2 [g#3,b3,e4]@2 ~@2 [g#3,b3,e4] ~@3", // E
  J: "[a3,d4,f#4] ~ [a3,d4,f#4] ~@3 [a3,d4,f#4]@6 ~@4", K: "~@2 [g3,b3,d4]@2 ~@2 g2@2 [g3,b3,d4]@2 ~@2 [g3,b3,d4] ~@3",
  L: "~@2 [a3,c#4,e4]@2 ~@2 a2@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4] ~@3", M: "[g3,b3,d4] ~ [g3,b3,d4] ~@3 [g3,b3,d4]@6 ~@4",
  N: "e4@8 e4@2 g#4@2 b4@2 e5 ~, [g#3,b3]@5 ~@3", O: "[a3,c#4,e4]@6 a2@2 [a3,c#4,e4]@3 ~ [a3,c#4,e4] ~@3",
  P: "~@2 [f#3,a3,d4]@2 ~@2 d3@2 [f#3,a3,d4]@2 ~@2 [f#3,a3,d4] ~@3", Q: "[a3,d4,f#4]@15 ~",
  R: "d4@8 d4@2 f#4@2 a4@2 d5 ~, [f#3,a3]@5 ~@3", S: "~@2 [g3,b3,d4] [g#3,c4,d#4]",
})).s("gm_piano").gain(0.29).pan(0.9)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A B A B A C D@2 E F G H E F G H I J I J I J K L E F G H E F K M A B A B A C D@2 E F G H E F G H I J I J I J K N O P O
  P O P O P Q@2 R
>`.pickRestart({
  A: "a2@2 f#2@2 e2@2 f#2@2 a2@3 ~ f#2@2 e2@2", B: "a2@3 ~ a2@2 f#2@2 a2@2 f#2@2 e2@2 f#2@2",
  C: "a2@3 ~ a2@2 f#2@2 a2@2 f#2@2 e2@3 ~", D: "[d3@2 c#3@3 ~ b2@3 ~ a2@3 ~ [e2,b2,e3]@10 ~@8]/2",
  E: "[a2,e3]!2 f#2 e2 [a2,e3]!2 f#2 e2", F: "[d2,a2]!2 f#2 a2 [d2,a2]!2 f#2 a2", G: "[g2,d3]!2 e2 d2 [g2,d3]!2 e2 d2",
  H: "[e2,b2,e3]!8", I: "a2!2 f#2 e2 a2!2 f#2 e2, e3@15 ~", J: "d2!2 f#2 a2 d2!2 f#2 a2, d3@15 ~",
  K: "d3@2 c#3@3 ~ b2@3 ~ a2@2 a2@3 ~", L: "[e2,b2,e3]@11 ~@3 [g#2,d#3]@2", M: "[e2,b2,e3]@15 ~", N: "[e2,b2,e3] ~",
  O: "a2!2 f#2 e2 a2!2 f#2 e2", P: "d2!2 f#2 a2 d2!2 f#2 a2",
  Q: "[d3@2 c#3@3 ~ b2@3 ~ a2@3 ~ [e2,b2,e3]@10 ~@3 [g2,d3]@2 [g#2,d#3]@2 ~]/2", R: "[a2,e3]",
})).s("gm_electric_bass_finger").gain(0.63).pan(0)

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

// drums · snare
const snare = s("sd").struct("<A@7 B A@7 B A@6 ~ C A@6 ~ D A@7 E A@7 B A@6 ~ F A@8 ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@4 x ~@3 x!4 ~@4", D: "~@4 x ~@5 x!6", E: "x!3 ~ x ~ x ~@5 x ~@3",
  F: "~@4 x ~@5 x!3 ~ x ~",
})).gain(0.64)

// drums · clap
const clap = s("cp").struct("<~@63 [~@2 x!2 ~@4] ~@3>").gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@7 A ~@7 A ~@31 B ~@4 C ~@12 B ~>".pickRestart({
  A: "~@13 x!2 ~", B: "~@7 x", C: "~@5 x ~@2",
})).gain(0.64)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A ~@7 A ~@7 B ~@23 C ~@17 D ~>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@12 x!4", C: "~@3 x ~ x!2 ~", D: "~@5 x!2 ~",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A B A ~ C ~@5 A ~ C ~@3 A ~ A ~@3 A D A ~ A ~@5 A ~@2 D ~@2 A ~@5 E ~ A ~@5 A ~@3 A ~ A ~@3 A ~
>`.pickRestart({
  A: "~@7 x", B: "~@5 x ~@2", C: "~ x ~@2", D: "~@15 x", E: "~@2 x ~@4 x",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@7 A ~@7 A ~@31 A ~@17 A ~>".pickRestart({
  A: "~ x",
})).gain(0.72)

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

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~ A ~ A ~ A ~@3 A ~ A ~ A ~@11 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@11 A ~ A ~ A ~ B ~@3
>`.pickRestart({
  A: "~@3 x", B: "~@10 x!3 ~@3",
})).gain(0.72)

stack(
  tenor_sax, electric_guitar_clean, piano, bass, kick, snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash,
  tambourine
)