Strudelify

Baby I Need Your Lovin'

Four Tops

KeyE♭ majorTempo124 bpm
0:00/0:00
// Baby I Need Your Lovin' — Four Tops
// 124 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(124/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 · piano
const piano = note(`<
  ~ A B A B A B C D C E F@2 G D G H I J C K L M N O P Q R S T@2 U@6 V@2 L M N O P Q R W X Y X Y X Z X AA T@2 U@4 AB@2
  AC@2 AD AE AD AE AF AG L M N O P Q R AH L M N O P Q R AH ~
>`.pickRestart({
  A: "[eb5,ab5,c6,eb6]@15 ~", B: "[gb5,bb5,db6,gb6]@3 ~ [db5,gb5,bb5,db6] ~ [f5,ab5,db6,f6] ~",
  C: "[c5,eb5,ab5,c6]@15 ~", D: "[db5,f5,ab5,c6]@15 ~", E: "~@3 [bb3,bb4,bb5], [db5,f5,ab5,c6]@15 ~",
  F: "[~ c6@14 ~ [f5,ab5,c6]@15 ~, [c5,eb5,ab5]@15 db5@16 ~]/2", G: "[c5,eb5,ab5], c6@7 ~",
  H: "c6@14 bb5 ~, [db5,f5,ab5]", I: "[c5,eb5,ab5,c6]", J: "[db5,f5,ab5,c6]@14 bb5 ~",
  K: "[db5,f5,ab5,c6]@11 ~ [bb4,db5,f5,bb5]@4", L: "[bb4,db5,gb5]@7 ~", M: "[gb4,bb4,eb5]@15 ~", N: "[f4,ab4,db5]@7 ~",
  O: "[db4,f4,bb4]@11 ~ [db4,f4,bb4]@3 ~", P: "[bb4,db5,gb5]@15 ~", Q: "[gb4,bb4,eb5]@11 ~ [gb4,bb4,eb5]@3 ~",
  R: "[f4,ab4,db5]@11 ~ [f4,ab4,db5]@3 ~", S: "[db4,f4,bb4]@11 ~ [f4,bb4,db5]@4",
  T: "[~ ab5@14 ~ [c5,f5,ab5]@9 ~ [bb3,bb5]@2 [c4,c6]@2 [bb3,bb4,bb5]@2, [c5,eb5]@14 ~@12 bb4 ~ c5 ~@3, ~ c6@25 ~@6]/2", // Fm Bb C Bb Cm
  U: "[~ ab5@14 ~ [c5,f5,ab5]@9 ~ [bb3,bb5]@2 [c4,c6]@2 [bb3,bb4,bb5]@2, [c4,c5,eb5]@14 ~@12 bb4 ~ c5 ~@3, ~ c6@25 ~@6]/2", // Fm Bb C Bb Cm
  V: "[~ ab5@14 ~ [c5,f5,ab5]@7 ~ [bb3,bb4,f5,bb5]@3 ~ [bb3,bb4,f5,bb5]@4, [c4,c5,eb5]@7 ~@9, ~ c6@22 ~@9]/2", // Fm Bb5 Cm
  W: "[db4,f4,bb4]@7 ~ [gb4,bb4,db5,gb5]@3 ~ [f4,bb4,db5,f5]@4", X: "[eb4,ab4,c5]@15 ~",
  Y: "[db4,gb4,bb4]@7 ~ [eb4,ab4,c5]@3 ~ [db4,gb4,bb4]@3 ~", Z: "[db4,gb4,bb4]@11 ~ [f4,ab4,db5]@3 ~",
  AA: "[db4,gb4,bb4]@11 ~ [f4,bb4,db5]@3 ~", // Gb Bbm
  AB: "[~ ab5@14 ~ [c5,f5,ab5]@9 ~ [bb3,bb4,bb5]@3 [c4,c5,c6] ~ [bb3,bb4,bb5], [c5,eb5]@7 ~@9, ~ c6@25 ~@6]/2", // Fm Bb C Bb Cm
  AC: "[[c4,c5,eb5,ab5]@14 ~@2 [c5,f5,ab5]@7 ~ [bb4,db5,gb5]@2 ~@2 [ab4,db5,f5]@2 ~@2, c6@23 ~@9]/2", // Ab Fm Gb Db
  AD: "[ab4,c5,eb5]@15 ~", AE: "[gb4,bb4,db5]@7 ~ [ab4,c5,eb5]@3 ~ [gb4,bb4,db5]@3 ~", AF: "[ab4,c5,eb5]@13 ~@3",
  AG: "[f4,ab4,c5,f5]@7 ~ [bb4,db5,f5,bb5]@8", AH: "[db4,f4,bb4]@11 ~ [f4,bb4,db5,f5]@4",
})).s("gm_piano").gain(0.32).pan(0.7)

// bass · acoustic bass
const bass = note(`<
  ~ A B A C A D E F E F E F G H E I J I K L M N O P Q R S T E U E F E F G H V I M W X Y Q R S Z A B A C A B A C AA AB AC
  F E F G H E AD A B A C A AE AF W AG Y AH AI S AJ AF W AG Y AH AI S AJ ~
>`.pickRestart({
  A: "ab1@3 ~ ab1@3 ~ ab1@3 ~ ab1@3 ~", B: "ab1@3 ~ ab1@3 ~ ab1@4 ab1@3 ~", C: "ab1@3 ~ ab1@4 ab1@3 ~ ab1@3 ~",
  D: "ab1@4 ab1@3 ~ ab1@3 ~ ab1@3 ~", E: "ab1@3 ~ ab1@3 ~ ab1@3 ~ ab1@2 c2@2", F: "db2@3 ~ db2@3 ~ db2@4 db2@2 db2@2",
  G: "ab1@3 ~ ab1@3 ~ ab1@4 ab1@2 c2@2", H: "db2@3 ~ db2@3 ~ db2@4 db2@2 db2 ~",
  I: "db2@3 ~ db2@3 ~ db2@3 ~ db2 ~ db2@2", J: "ab1@3 ~ ab1@3 ~ ab1@4 ab1 ~ c2@2",
  K: "ab1@3 ~ ab1@3 ~ ab1@3 ~ ab1 ~ c2@2", L: "db2@3 ~ db2@3 ~ db2@3 ~ f2@3 ~", M: "gb2@3 ~ gb2@3 ~ gb2@4 gb2 ~ f2@2",
  N: "eb2@3 ~ eb2@3 ~ eb2@3 ~ eb2 ~ d2 ~", O: "db2@3 ~ db2@4 ab1@3 ~ db2@2 c2 ~", P: "bb1@4 bb1@3 ~ db2@3 ~ f2@3 ~",
  Q: "gb2@5 ~ gb2 ~ db2@4 ~@2 f2@2", R: "eb2@5 ~ eb2 ~ bb1@3 ~ eb2 ~ d2 ~", S: "db2@3 ~ db2@3 ~ db2@3 ~ db2 ~ c2 ~",
  T: "bb1@4 bb1@3 ~ bb1@3 ~ db2@2 eb2 ~", U: "db2@3 ~ db2@3 ~ db2@3 ~ db2@2 db2@2",
  V: "ab1@3 ~ ab1@3 ~ ab1@3 ~ ab1@2 c2 ~", W: "eb2@3 ~ eb2@3 ~ eb2@3 ~ eb2@2 eb2@2", X: "db2@3 ~ db2@4 db2@3 ~ c2@3 ~",
  Y: "bb1@4 bb1@3 ~ db2@3 ~ f2@2 f2@2", Z: "bb1@4 bb1@3 ~ bb1@3 ~ bb1@2 f1 ~", AA: "ab1@3 ~ ab1@3 ~ ab1@3 ~ c2@2 c2@2",
  AB: "db2@3 ~ db2@3 ~ db2@3 ~ db2@2 f2@2", AC: "ab2@3 ~ ab2@3 ~ ab2@3 ~ ab2@2 c2@2",
  AD: "db2@3 ~ db2@3 ~ db2@5 ~ f2@2", AE: "db2@3 ~ db2@3 ~ db2@4 bb1@2 f2@2", AF: "gb2@5 ~ gb2@7 ~ f2@2",
  AG: "db2@3 ~ db2@4 db2@3 ~ db2@2 c2@2", AH: "gb2@5 ~ gb2 ~ db2@3 ~ gb2@2 f2@2",
  AI: "eb2@3 ~ eb2@3 ~ bb1@3 ~ eb2 ~ d2 ~", AJ: "bb1@3 ~ bb1@3 ~ bb1@3 ~ db2@2 f2 ~",
})).s("gm_acoustic_bass").gain(0.38)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@7 A B A B A C A D A C A C A E ~@8 A B A B A C A D A C ~@16 A B A B A C A D A F G H G H G B ~@17
>`.pickRestart({
  A: "~@4 [ab3,c4,f4] ~@7 [ab3,c4,f4] ~ [c4,f4] ~", // Fm F5
  B: "~@4 [ab3,c4,f4] ~ [c4,f4] ~@3 [ab3,c4,f4] ~ [ab3,c4,f4] ~ [ab3,c4,f4] ~", // Fm F5 Fm
  C: "~@4 [ab3,c4,f4] ~@5 [ab3,c4,f4] ~ [ab3,c4,f4] ~ [ab3,c4,f4] ~", // Fm
  D: "~@4 [ab3,c4,f4] ~@7 [ab3,c4,f4] ~ [ab3,c4,f4] ~", E: "~@4 [ab3,c4,f4] ~ [c4,f4] ~@9",
  F: "~@4 [ab3,db4,f4] ~ [db4,f4] ~@5 [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Db
  G: "~@4 [ab3,c4,eb4] ~@7 [ab3,c4,eb4] ~ [c4,eb4] ~", // Ab Cm
  H: "~@4 [gb3,bb3,db4] ~ [bb3,db4] ~@3 [gb3,bb3,db4] ~ [gb3,bb3,db4] ~ [gb3,bb3,db4] ~", // Gb Bbm Gb
})).s("gm_electric_guitar_clean").gain(0.27).pan(0.3)

// chords · electric guitar clean · soft notes
const electric_guitar_clean_2 = note(`<
  ~@7 A B A B A ~ A ~ A ~ A ~ A B ~@8 A B A B A ~ A ~ A ~@17 A B A B A ~ A ~ A B A C A C A B ~@17
>`.pickRestart({
  A: "~@14 ab3 ~", B: "~@6 ab3 ~@9", C: "~@6 gb3 ~@9",
})).s("gm_electric_guitar_clean").gain(0.11).pan(0.3)

// chords · flute
const flute = note(`<
  ~ A@6 ~@14 B@2 C@2 B@2 C@2 ~@10 B@2 C@2 B@2 C@2 ~@24 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 ~
>`.pickRestart({
  A: "[~@3 ab3 c4 db4 c4 eb4@4 db4 c4 ab3@3]/2",
  B: "[~@2 [gb3,bb3,gb4,db5]@3 [gb3,bb3,gb4,db5]!2 [bb3,db4,bb4,f5]@3 [bb3,db4,bb4,f5]@2 [ab3,c4,ab4,eb5]@2 [gb3,bb3,gb4,db5]@2]/2", // Gb Bbm Ab Gb
  C: "[~@2 [f3,ab3,ab4,f5]@3 [f3,ab3,f4,bb4] [f3,ab3,ab4,db5] [f3,bb3,bb4,eb5]@3 [f3,bb3,f4,db5]@2 [f3,eb4,c5,eb5]@2 [f3,db4,bb4,db5]@2]/2", // Fm Bb7 Db Ebsus2 Bbm F7 Bbm
})).s("gm_flute").gain(0.15).pan(0.4)

// other · flute
const flute_2 = note(`<
  ~@12 A B A B A B A B A ~@8 C D C D C D C D C E ~@8 F@2 G@6 ~ H I H I H I H I H I J I J I H ~@17
>`.pickRestart({
  A: "c4 bb3 ab3 f3", B: "ab3 ~@3", C: "[eb4,ab4,c5]", D: "[f4,ab4,c5]@6 [f4,bb4] [eb4,ab4]", E: "[f4,ab4,c5]@3 ~",
  F: "[~@3 ab3 c4 db4 c4 eb4@4 db4 c4 ab3@3]/2",
  G: "[~@3 [ab3,ab4] [c4,c5] [db4,db5] [c4,c5] [eb4,eb5]@4 [db4,db5] [c4,c5] [ab3,ab4]@3]/2", // Ab C Db C Eb Db C Ab
  H: "~ f4 c5 bb4@2 ab4!2 f4", I: "ab4@3 ~ f4@3 ~ ab4@3 ~@5", J: "~ f4 c5 bb4@2 ab4!2 gb4",
})).s("gm_flute").gain(0.15)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@3 A B A C ~@13 D E F G@2 E F H@2 I J I J I J I J I K L F G@2 E F H@2 M N M N M O M P I J I J I J I J I Q M N M N M R
  S@2 T@2 U@2 V@2 S@2 T@2 U@2 V@2 ~
>`.pickRestart({
  A: "~@3 ab4 c5 db5 c5 db5", B: "eb5", C: "ab4", D: "~@12 db4 eb4 f4 ab4", E: "bb4@4 bb5!2 gb5 f5",
  F: "eb5@5 gb5 eb5@2", G: "[ab4@16 ~@14 f5 db5, f4, db5@15 ~, ~ bb4]/2", H: "[ab4 bb4, [f4,db5]]/2", I: "~ eb5 ab5 c6",
  J: "c6 ab5 f5 db5", K: "c6@2 ab5@2 f5@2 db5@6 bb4 ab4 f4 db4", L: "~@4 bb5!2 gb5 f5", M: "[c5,eb5]",
  N: "[bb4,db5]@2 [c5,eb5] [bb4,db5]", O: "[bb4,db5]@3 [db5,f5]", P: "[bb4,db5]", Q: "ab5@2 gb5 f5",
  R: "ab4 [bb4,db5], f4", S: "[~@4 bb5!2 gb5 f5 eb5@5 gb5 eb5@2, [bb3,gb4], db4 eb4]/2",
  T: "[[ab3,db4,f4,ab4]@16 ~@14 f5 db5, db5@15 ~, ~ [bb3,db4,f4,bb4]]/2", // Db Bbm
  U: "[bb4@4 bb5!2 gb5 f5 eb5@5 gb5 eb5@2, [bb3,gb4], db4 eb4]/2", V: "[[ab3,db4,f4,ab4] [bb3,db4,f4,bb4], db5]/2",
})).s("gm_string_ensemble_1").gain(0.33).pan(0.4)

// other · trumpet
const trumpet = note(`<
  ~ A B A B A B C D ~ E ~ F ~ D ~ F ~ F ~ G H ~ I@2 H ~ J@2 C D ~ D ~ F ~ D ~ K H ~ I@2 H ~ J@2 A L A L A M A N C D ~ D
  ~ F ~ D ~ O P Q P R P S H ~ I@2 H ~ J@2 H ~ I@2 H ~ J@2 ~
>`.pickRestart({
  A: "eb4@15 ~", B: "gb4@7 ~ db4@2 ~@2 f4@2 ~@2", C: "eb4@13 ~@3", D: "~@10 c4 ~@5", E: "~@6 c4 ~@3 c4 ~@3 c4 ~",
  F: "~@6 c4 ~@3 c4 ~@5", G: "~@8 f4@3 ~ f4@4", H: "db4", I: "[~@6 db4@2 ~@2 db4@2 db4 ~ db4@13 ~ db4@3 ~]/2",
  J: "[~@6 db4@2 ~@2 db4 ~ db4@2 db4@13 ~ db4@3 ~]/2", K: "~@4 c4 ~ c4 ~", L: "db4@7 ~ eb4@3 ~ db4@3 ~",
  M: "db4@11 ~ f4@3 ~", N: "db4@11 ~ f4@4", O: "~@10 db4 ~@5", P: "[eb4,ab4]", Q: "[db4,gb4]@2 [eb4,ab4] [db4,gb4]",
  R: "[db4,gb4]@7 ~ [eb4,ab4]@4 [db4,gb4]@4", S: "f4@15 ~",
})).s("gm_trumpet").gain(0.36).pan(0.4)

// chords · trombone
const trombone = note(`<
  ~ A B A C A B D E ~ F ~ G ~ E ~ G ~ G ~ H I ~ J@2 I ~ J@2 D E ~ E ~ G ~ E ~ K I ~ J@2 I ~ J@2 A L A M A N A O D E ~ E
  ~ G ~ E ~ P Q R Q R Q S I ~ J@2 I ~ J@2 I ~ J@2 I ~ J@2 ~
>`.pickRestart({
  A: "[ab3,c4]@15 ~", B: "[ab3,db4]@7 ~ [ab3,bb3]@2 ~@2 [ab3,db4]@2 ~@2", C: "[ab3,db4]@4 [ab3,bb3] ~ [ab3,db4] ~",
  D: "[ab3,c4]@13 ~@3", E: "~@10 [eb3,ab3] ~@5", F: "~@6 [eb3,ab3] ~@3 [eb3,ab3] ~@3 [eb3,ab3] ~",
  G: "~@6 [f3,ab3] ~@3 [eb3,ab3] ~@5", H: "~@2 [db3,ab3,db4]!2", I: "[gb3,bb3]",
  J: "[~@6 [f3,ab3] ~@3 [f3,ab3] ~ f3@2 [f3,bb3]@14 [f3,bb3]@3 ~, ~@12 ab3 ~@19]/2", K: "~@4 [f3,ab3] ~ [f3,ab3] ~",
  L: "[gb3,bb3]@8 [ab3,c4]@3 ~ [gb3,bb3]@3 ~", M: "[gb3,bb3]@7 ~ [ab3,c4]@3 ~ [gb3,bb3]@3 ~",
  N: "[gb3,bb3]@3 [ab3,db4]", O: "[gb3,bb3]@12 [bb3,db4]@3 ~", P: "~@10 [gb3,bb3] ~@5", Q: "[ab3,c4]",
  R: "[gb3,bb3]@2 [ab3,c4] [gb3,bb3]", S: "[f3,ab3]@8 [bb3,db4]@7 ~",
})).s("gm_trombone").gain(0.31).pan(0.2)

// chords · alto sax
const alto_sax = note(`<
  ~ A B A C A B D E ~ F ~ G ~ E ~ G ~ G ~@11 E ~ E ~ G ~ E ~@19 E ~ E ~ G ~ E ~ H ~@23
>`.pickRestart({
  A: "[ab3,c4,eb4]@15 ~", B: "[ab3,db4,gb4]@7 ~ [ab3,bb3,db4]@2 ~@2 [ab3,db4,f4]@2 ~@2",
  C: "[ab3,db4,gb4]@4 [ab3,bb3,db4] ~ [ab3,db4,f4] ~", D: "[ab3,c4,eb4]@13 ~@3", E: "~@10 [eb3,ab3,c4] ~@5",
  F: "~@6 [eb3,ab3,c4] ~@3 [eb3,ab3,c4] ~@3 [eb3,ab3,c4] ~", G: "~@6 [f3,ab3,c4] ~@3 [eb3,ab3,c4] ~@5",
  H: "~@10 [gb3,bb3,db4] ~@5", // Gb
})).s("gm_alto_sax").gain(0.11).pan(0.9)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x ~@3 x]!86 ~>").gain(0.44)

// drums · snare
const snare = s("sd").struct("<[~@8 x ~@2 x ~@2 x ~] [~@2 x ~@2 x!2 ~]!52 [~@2 x ~@2 x ~@2] [~@2 x ~@2 x!2 ~]!33 ~>")
  .gain(0.38)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A@6 ~ A@2 ~ A@11 ~ A@2 ~ A@3 ~ A@2 ~ A@7 ~ A@2 ~ A@4 ~ A@3 ~@2 A@4 ~ A@4 ~ A@2 ~ A@5 ~ A@2 ~ A@4 ~ A@2 ~ A@3 ~
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.22)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B C A ~ D A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~ x ~@6", B: "~@7 x", C: "~ x ~@5 x", D: "~ x ~@3 x ~@2",
})).gain(0.16)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@3 x] ~@87>").gain(0.49)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~ x ~ x]!86 ~>").gain(0.44)

stack(
  piano, bass, electric_guitar_clean, electric_guitar_clean_2, flute, flute_2, string_ensemble_1, trumpet, trombone,
  alto_sax, kick, snare, snare_soft, hihat, hihat_soft, mid_tom, tambourine
)

More by Four Tops