Strudelify
I'll Be Your Baby Tonight cover art

1990 · Don't Explain

I'll Be Your Baby Tonight

Robert Palmer

KeyE♭ majorTempo96 bpm
0:00/0:00
// I'll Be Your Baby Tonight — Robert Palmer
// 96 bpm, 4/4, key D# 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: Full arrangement: all 80 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/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
const bass = note(`<
  ~@5 A B C D E@2 F G H I J K E@2 F G H I J L M N O P E@2 F G H I J K E@2 F G H I J L M N O P E@2 F G H I J K E@2 F G H
  I J K E@2 F G H I J K H I J K H I Q
>`.pickRestart({
  A: "eb2 ~@2 c2 eb2 ~@2 c2 eb2 eb2@2 bb1 ~@2 c2@2", B: "eb2@2 ~ c2 eb2@2 ~ c2 eb2!2 ~ bb1 ~@2 c2@2",
  C: "eb2 ~@2 c2 eb2@2 ~ c2 eb2!2 ~ bb1 ~ bb1 c2@2", D: "eb2@2 ~ c2 eb2@2 ~ c2 eb2!2 ~ bb1@2 ~ c2@2",
  E: "eb2@2 ~ c2 eb2@2 ~ c2 eb2 eb2@2 bb1 ~@2 c2@2", F: "f2@2 ~ c2 f2@3 c2 f2 f2@2 c2 ~@2 c2@2",
  G: "f2@2 ~ c2 f2@2 ~ c2 f2!2 ~ c2 ~@2 c2 ~", H: "ab1@2 ~ eb2 ab1@2 ~ ab1 eb2!2 ~ ab1 ~@2 ab1@2",
  I: "bb1@2 ~ f2 bb1@2 ~ bb1 f2 f2@2 bb1 ~@2 bb1@2", J: "eb2@2 ~ c2 eb2@3 c2 eb2 eb2@2 bb1 ~@2 bb1 ~",
  K: "f2@3 bb1 f2@3 bb1 f2!2 ~ bb1 ~@2 bb1 ~", L: "eb2@3 c2 eb2@3 c2 eb2!2 ~ bb1 ~@2 bb1 ~",
  M: "ab1@2 ~ ab1@2 ~ ab1@2 ab1@2 ~ ab1@2 ~ ab1@2", N: "eb2@2 ~ eb2@2 ~ eb2@2 eb2@2 ~ eb2@2 ~ eb2 e2",
  O: "f2@2 ~ f2@2 ~ f2@2 f2@2 ~ f2@2 ~ f2 ~", P: "bb1@2 ~ bb1@2 ~ bb1@2 bb1@2 ~ bb0@5",
  Q: "eb2@2 ~ c2 eb2 bb1!2 ~ eb2@2 ~@6",
})).s("gm_acoustic_bass").gain(0.45)

// chords · percussive organ
const percussive_organ = note(`<
  ~@5 A@6 B@2 C D A E A@2 B@2 C D A F G H I J A@2 B@2 C D A E A K B@2 C D A F L H I J A@2 B@2 C D A E A@2 B@2 C D A E A
  M B@2 N D A O N D A O N D P
>`.pickRestart({
  A: "~ bb4 [eb5,g5] bb4 ~ bb4 [eb5,g5] ~@2 bb4 [eb5,g5] bb4 ~ bb4 [eb5,g5] ~", // Eb
  B: "~ c5 [f5,a5] c5 ~ c5 [f5,a5] ~@2 c5 [f5,a5] c5 ~ c5 [f5,a5] ~", // F
  C: "~ c5 [eb5,ab5] c5 ~ c5 [eb5,ab5] ~@2 c5 [eb5,ab5] c5 ~ c5 [eb5,ab5] ~", // Ab5
  D: "~ d5 [f5,bb5] d5 ~ d5 [f5,bb5] ~@2 d5 [f5,bb5] d5 ~ d5 [f5,bb5] ~", // Bb5
  E: "~ bb4 [d5,f5] bb4 ~ bb4 [d5,f5] ~@2 bb4 [d5,f5] bb4 ~ bb4 [d5,f5] ~", // Dm
  F: "~ bb4 [db5,eb5,g5] bb4 ~ bb4 [db5,eb5,g5] ~@2 bb4 [db5,eb5,g5] bb4 ~ bb4 [db5,eb5,g5] ~", // Eb7
  G: "[ab4,c5,eb5]@2 ~ [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~ [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~", // Ab
  H: "[g4,bb4,eb5]@2 ~ [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~ [g4,bb4,eb5]@2 ~ [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~", // Eb
  I: "[a4,c5,f5]@2 ~ [a4,c5,f5] ~@2 [a4,c5,f5] ~ [a4,c5,f5]@2 ~ [a4,c5,f5] ~@2 [a4,c5,f5] ~", // F
  J: "[bb4,d5,f5]@2 ~ [bb4,d5,f5] ~@2 [bb4,d5,f5] ~ [bb4,d5,f5] ~@7", // Bb
  K: "~ bb4 [eb5,g5] ~ bb4!2 [eb5,g5] ~@2 bb4 [eb5,g5] bb4 ~ bb4 [eb5,g5] ~", // Eb
  L: "[ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~ [ab4,c5,eb5]@2 ~ [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~", // Ab
  M: "~ bb4 [eb5,g5] bb4 ~ bb4 [eb5,g5] ~@2 bb4 [eb5,g5] bb4 ~ bb4 eb5@2, ~@14 g5 ~", // Eb
  N: "~ c5 [eb5,ab5] c5 ~ c5 [eb5,ab5] ~@2 c5 [eb5,ab5] c5 ~ c5 ab5@2, ~@14 eb5 ~", // Ab5
  O: "~ bb4 [d5,f5] bb4 ~ bb4 [d5,f5] ~@2 bb4 [d5,f5] bb4 ~ bb4 f5@2, ~@14 d5 ~", // Dm
  P: "~ bb4 [eb5,g5] bb4 ~ bb4 [eb5,g5] ~ [bb4,eb5,g5]@2 ~@6", // Eb
})).s("gm_percussive_organ").gain(0.4).pan(0.3)

// chords · percussive organ · Dm Eb Ebsus2 Eb Ebsus2 Eb Ebsus2
const percussive_organ_2 = note(`<
  ~@5
  [~@13 [d4,f4] [eb4,g4] f4]
  [~@13 [eb4,g4] [eb4,f4] ~]
  [~@13 [eb4,g4] [eb4,f4]@2]
  [~@13 [eb4,g4] [eb4,f4] ~]
  ~@71
>`).s("gm_percussive_organ").gain(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@13 A@3 ~@5 A@3 ~@9 A@3 ~ B@3 C A@3 ~@9 A@3 ~ B@3 C A@3 ~ B@3 C A@3 ~ A@3 ~ D@3
>`.pickRestart({
  A: "[[c5,eb5,ab5]@12 [c5,eb5,ab5]@2 [bb4,d5,f5]@10 ~@3 [eb5,g5]@2 [eb4,g4] [g4,c5] [ab4,bb4]@2 [g4,bb4] [eb4,g4]@13 ~]/3", // Ab Bb Eb C5 Absus2 Gm Eb
  B: "[~@8 [g4,g5]@2 [f4,f5] ~ [f4,f5]@2 [eb4,eb5]@4 ~@6 [g4,g5]@2 [f4,f5] ~ [f4,f5]@2 [eb4,eb5]@4 ~@6 [g4,g5]@2 [f4,f5] ~ [f4,f5]@2 [eb4,eb5]@2]/3", // G F Eb G F Eb G F …
  C: "~@8 [g4,g5]@2 [f4,f5] ~ [f4,f5]@2 [eb4,eb5]@2", // G F Eb
  D: "[[c5,eb5,ab5]@12 [c5,eb5,ab5]@2 [bb4,d5,f5]@10 ~@3 [eb5,g5]@2 [eb4,g4] [g4,c5] [ab4,bb4]@2 [g4,bb4] [eb4,g4]@4 ~@10]/3", // Ab Bb Eb C5 Absus2 Gm Eb
})).s("gm_string_ensemble_1").gain(0.4)

// other · electric guitar clean
const electric_guitar_clean = note(`<
  ~@9 A@2 B C D E F G A@2 B C D E F H I J K L A@2 B C D E F G A@2 B C D E F H I J K L A@2 B C D E F G A@2 B C D E F G
  A@2 B C D E F G D E F G D E M
>`.pickRestart({
  A: "eb3!2 ~ eb3!3 ~ eb3!3 ~ eb3!3 f3 eb3", B: "f3!2 ~ f3!3 ~ f3!3 ~ f3!3 g3 f3", C: "f3!2 ~ f3!3 ~ f3!3 ~ f3!4 g3",
  D: "ab3!2 ~ ab3!3 ~ ab3!3 ~ ab3!3 g3 ab3", E: "bb3!2 ~ bb3!3 ~ bb3!3 ~ bb3!2 ab3 g3 f3",
  F: "eb3!2 ~ eb3!3 ~ eb3!3 ~ eb3!3 d3 eb3", G: "f3!2 ~ f3!3 ~ ab3 bb3!2 ~ bb3!2 ab3 g3 f3",
  H: "eb3!2 ~ eb3!3 ~ eb3!3 ~ eb3!2 f3 g3 ab3", I: "ab3@2 ~ ab3@2 ~ ab3@2 ab3@2 ~ ab3@2 ~ ab3@2",
  J: "eb3@2 ~ eb3@2 ~ eb3@2 eb3@2 ~ eb3@2 ~ eb3 e3", K: "f3@2 ~ f3@2 ~ f3@2 f3@2 ~ f3@2 ~ f3 ~",
  L: "bb3@2 ~ bb3@2 ~ bb3@2 bb3@2 ~@2 bb3 ab3 g3 f3", M: "eb3!2 ~ eb3!3 ~ eb3!2 ~@7",
})).s("gm_electric_guitar_clean").gain(0.3)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~@5 A@6 B@2 C D A E A@2 B@2 C D A F G H I J A@2 B@2 C D A E A@2 B@2 C D A F G H I J A@2 B@2 C D A E A@2 B@2 C D A E
  A@2 B@2 C D A E C D A E C D K
>`.pickRestart({
  A: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~", // Eb
  B: "~@2 [c4,f4,a4] ~@3 [c4,f4,a4] ~@3 [c4,f4,a4] ~@3 [c4,f4,a4] ~", // F
  C: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~", // Ab
  D: "~@2 [d4,f4,bb4] ~@3 [d4,f4,bb4] ~@3 [d4,f4,bb4] ~@3 [d4,f4,bb4] ~", // Bb
  E: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~", // Bb
  F: "~@2 [bb3,db4,eb4,g4] ~@3 [bb3,db4,eb4,g4] ~@3 [bb3,db4,eb4,g4] ~@3 [bb3,db4,eb4,g4] ~", // Eb7
  G: "[ab3,c4,eb4] ~@2 [ab3,c4,eb4] ~@2 [ab3,c4,eb4] ~ [ab3,c4,eb4] ~@2 [ab3,c4,eb4] ~@2 [ab3,c4,eb4] ~", // Ab
  H: "[g3,bb3,eb4] ~@2 [g3,bb3,eb4] ~@2 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~@2 [g3,bb3,eb4] ~@2 [g3,bb3,eb4] ~", // Eb
  I: "[a3,c4,f4] ~@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~ [a3,c4,f4] ~@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~", // F
  J: "[bb3,d4,f4] ~@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~ [bb3,d4,f4] ~@7", // Bb
  K: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~ [bb3,eb4,g4]@2 ~@6", // Eb
})).s("gm_electric_guitar_muted").gain(0.4).pan(0.7)

// chords · brass section
const brass_section = note(`<
  ~@24 A B ~@10 C D E F G H I J A B ~@10 C D E F G H I J C D E F G H I J K H I J K H I L
>`.pickRestart({
  A: "[g4,bb4,db5]@15 ~", B: "[ab4,c5,eb5] ~@15", C: "~@14 [d4,f4]!2",
  D: "[d4,f4] [bb3,eb4] ~ [bb3,eb4]!2 ~@9 [d4,f4]!2", E: "[d4,f4] [bb3,eb4] ~ [bb3,eb4] ~@10 [eb4,g4]!2",
  F: "[eb4,g4] [c4,f4] ~ [c4,f4]!2 ~@9 [eb4,g4]!2", G: "[eb4,g4] [c4,f4] ~ [c4,f4] ~@10 [c5,eb5]!2",
  H: "[c5,eb5] [ab4,c5] ~ [ab4,c5]!2 ~@9 [c5,eb5] [c5,f5]", I: "[c5,eb5] [bb4,d5] ~ [bb4,d5] ~@10 [ab4,c5]!2",
  J: "[ab4,c5] [g4,bb4] ~ [g4,bb4]!2 ~@11", K: "~@14 [c5,eb5]!2",
  L: "[ab4,c5] [g4,bb4] ~ [g4,bb4] ~ [ab4,c5] [g4,bb4] ~ [g4,eb5] ~@7", // Ab Gm Ab Gm Cm
})).s("gm_brass_section").gain(0.6)

// other · trombone
const trombone = note("<~@25 A B C D ~@16 A B C D ~@31>".pickRestart({
  A: "~@13 c4 db4 c4", B: "bb3!2 ~ bb3 ~ bb3!5 ~ bb3 ~ bb3!2 ~", C: "f3!2 ~ a3 ~ a3!3 c4!2 ~ eb4 ~ c4!2 eb4",
  D: "d4!2 ~ d4 ~ d4!3 ~@8",
})).s("gm_trombone").gain(0.5)

// drums · kick
const kick = s("bd").struct(`<
  ~
  [x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~]!27
  [x ~@2 x ~@2 x ~ x ~@5 x!2]
  [x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~]!19
  [x ~@2 x ~@2 x ~ x ~@5 x!2]
  [x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~]!30
  [x ~@2 x!4 ~ x ~@7]
>`).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~ [~@10 x!2 ~@4]!24 ~@4 [~@10 x!2 ~@4]!16 ~@4 [~@10 x!2 ~@4]!30 [~@6 x!3 ~@7]>")
  .gain(0.45)

// drums · clap
const clap = s("cp").struct("<~ A@24 B@2 C D A@16 B@2 C D A@30 E>".pickRestart({
  A: "~ x ~@2", B: "x!2 ~@3 x!5 ~@3 x!3", C: "x!2 ~@3 x!5 ~ x ~ x!3", D: "x!2 ~@3 x!5 ~@6", E: "~@4 x ~@2 x!2 ~@7",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~ [x!16]!78 [x!6 ~@2 x ~@7]>").gain(0.25)

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

// drums · open hat
const open_hat = s("oh").struct("<~@79 [~@3 x ~@4]>").gain(0.45)

// drums · ht
const ht = s("ht").struct("<~ [~@3 x]!24 ~@4 [~@3 x]!16 ~@4 [~@3 x]!30 [~@7 x!2 ~@7]>").gain(0.3)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~ A@24 ~@3 B A@16 ~@3 B A@30 ~>".pickRestart({
  A: "~@14 x!2", B: "~@9 x!2 ~@5",
})).gain(1.9)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~ [~@10 x!2 ~@4]!24 ~@4 [~@10 x!2 ~@4]!16 ~@4 [~@10 x!2 ~@4]!30 ~>")
  .gain(1.9)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [x!2 ~ x ~ x ~ x!3 ~ x ~ x!3]!78 [x!2 ~ x ~ x ~ x!2 ~@7]>").gain(1.01)

stack(
  bass, percussive_organ, percussive_organ_2, string_ensemble_1, electric_guitar_clean, electric_guitar_muted,
  brass_section, trombone, kick, snare, clap, hihat, mid_tom, open_hat, ht, agogo_bells, agogo_bells_2, cabasa
)

More by Robert Palmer