Strudelify
When I Need You cover art

5 Songs EP

When I Need You

Leo Sayer

KeyD majorTempo120 bpm
0:00/0:00
// When I Need You — Leo Sayer
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 65 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.

// bass · electric bass finger · "Staff-2"
const bass = note(`<
  A@2 B C@2 D E@2 F G@2 H I@3 J@3 K@2 L M@3 N@3 O@3 P Q@2 R S T@2 U@3 V W@2 X Y@2 Z@3 X AA@2 AB@2 AC AD@2 AE AF@2 AG
  AH@2 AI AJ
>`.pickRestart({
  A: "[b2@4 b1@2 d2@4 a2@2 d3 ~@3]/2", B: "a2 d2@3", C: "[d3@3 c#2@2 a2 c#3@2]/2", D: "a2 a1@3",
  E: "[a#1@12 b1@8 f#2@4 b2 ~@5 b2@2]/2", F: "f#2 b1@3", G: "[b2@2 ~@6 b1@4 a1@8 c#2@4 a1 ~@7]/2", H: "~ d2@2 a2",
  I: "[d3 ~@3 a2@2 d2@6 d3@6 c#2@4 a2@2]/3", J: "[c#3@2 a2 a1@3 a#1@3 b1@2 f#2]/3", K: "[b2 ~@3 f#2@2 b1@6 b2 ~@3]/2",
  L: "~ a1@2 c#2", M: "[a2 a1 a#1 b1@3 b1@3 a1@2 e2]/3", N: "[a2@3 b1@3 b1@3 a1@2 c#2]/3",
  O: "[a2 ~ e2 d2@3 b1@3 e2@3]/3", P: "e1@3 e2", Q: "[e2@2 ~@3 e2@2 e2@2 ~@3 a1@2 a1@2]/2", R: "a1 a1@3",
  S: "d2@4 a2@2 d3 ~", T: "[~ a2 d2@3 d3@3]/2", U: "[c#2@2 a2 c#3@2 a2 a1@3 a#1@3]/3", V: "b1@4 f#2@2 b2 ~",
  W: "[~@2 f#2@2 b1@6 b2 ~@5]/2", X: "a1@2 c#2 a2", Y: "[a1 a#1 b1@3 b1@3]/2", Z: "[a1@2 e2 a2@3 b1@3 b1@3]/3",
  AA: "[~ e2 d2@3 b1@3]/2", AB: "[e2@3 e1@3 e2!2]/2", AC: "~ e2!2 ~", AD: "[a1!3 a1@3 d2@2]/2", AE: "a2@2 d3 ~@3 a2@2",
  AF: "[d2@3 d3@3 c#2@2]/2", AG: "a2 c#3@2 a2", AH: "[a1@3 a#1@3 b1@2]/2", AI: "f#2@4 b2@2 ~@2 b2@2 ~ b2 f#2@4",
  AJ: "b1@3 ~",
})).s("gm_electric_bass_finger").gain(0.56)

// chords · electric guitar jazz · "Staff-4"
const electric_guitar_jazz = note(`<
  A@3 B@2 C D@3 E@2 F G H I J K@2 L M ~ N O@2 P Q R S@3 T U@2 V W X Y Z AA AB AC AD AE ~ AF AG AH AI AJ AK AL@2 AM AN AO
  AP@3 AQ AR@2 AS AT@2 AU
>`.pickRestart({
  A: "[~@3 f#4@3 f#4@3 [d4,f#4] [e4,g4] [f#4,a4]]/3", B: "[[f#4,a4] [e4,g4] [d4,f#4] e4@3 e4@2]/2",
  C: "~ e4 [c#4,e4]@2 [d4,f#4]@2 [e4,g4]@2", // C#m D Em
  D: "[[e4,g4]@2 [d4,f#4]@3 [c#4,e4] [b3,d4]@6 d4@6 [b3,d4]@2 [c#4,e4]@2 [d4,f#4]@2]/3", // Em D C#m Bm C#m D
  E: "[[d4,f#4]@4 ~ [b3,d4]@3 [b3,d4]@4 ~ b3 a3@10 ~@4 [f#4,a4]@4, ~@2 [c#4,e4] ~@3 [a3,c#4] ~@9]/2", // D Bm F#m C#m A
  F: "[e4,g4] f#4@3", G: "f#4@2 ~@3 a3 [d4,f#4]@2", H: "[e4,g4] [f#4,a4]!2 [e4,g4]", I: "[d4,f#4] e4@3",
  J: "e4@2 ~@3 e4 [c#4,e4]@2", K: "[[d4,f#4]@2 [e4,g4]@2 [e4,g4]@2 [d4,f#4]@3 [c#4,e4] [b3,d4]@6]/2",
  L: "d4 ~@2 [b3,d4]", M: "[c#4,e4] [d4,f#4]!2 ~", N: "~@12 [b3,d4]@3 [a#3,c#4]",
  O: "[[b3,d4]@3 [a#3,c#4] [b3,d4]@3 [a#3,c#4] [b3,d4]@4 [d4,f#4]@6 [c#4,e4]@2 [b3,d4]@4 [a3,c#4]@4 b3@4]/2", // Bm A#m Bm A#m Bm D C#m Bm …
  P: "[a4,c#5]@4 [e4,a4]@4 [b3,d4]@2 a3@2 [b3,d4]@3 [a#3,c#4]", // A A5 Bm A#m
  Q: "[b3,d4]@3 [a#3,c#4] [b3,d4]@3 [a#3,c#4] [b3,d4]@4 [d4,f#4]@4", R: "[c#4,e4] [a3,c#4]@2 a4",
  S: "[c#4@2 f#4@2 g4@2 [f#4,a4]@5 [g4,b4] [f#4,a4]@5 [f#4,a4] [e4,g4]@6]/3", T: "~@3 [b3,d4,g4]",
  U: "[[a3,d4,f#4]@2 ~@3 [b3,d4,g4]@2 [a3,d4,f#4]@2 ~@3 [b3,d4,g4]@2 [a3,c#4,f#4]@2]/2", V: "[g3,b3,e4] [d4,g4,b4]@3",
  W: "f#4@3 f#4", X: "~@3 a3 [d4,f#4]@2 [e4,g4]@2", Y: "[f#4,a4]!2 [e4,g4] [d4,f#4]", Z: "e4@3 e4",
  AA: "~@3 e4 [c#4,e4]@2 [d4,f#4]@2", AB: "[e4,g4]@2 [e4,g4]@2 [d4,f#4]@3 [c#4,e4]", AC: "[b3,d4]@3 d4",
  AD: "~@2 [b3,d4] [c#4,e4]", AE: "[d4,f#4]!2 ~@2", AF: "~@8 [b3,d4]@3 [a#3,c#4] [b3,d4]@3 [a#3,c#4]",
  AG: "[b3,d4]@3 [a#3,c#4] [b3,d4]@4 [d4,f#4]@6 [c#4,e4]@2", AH: "[b3,d4] [a3,c#4] b3 [a4,c#5]",
  AI: "[e4,a4]@4 [b3,d4]@2 a3@2 [b3,d4]@3 [a#3,c#4] [b3,d4]@3 [a#3,c#4]", // A5 Bm A#m Bm A#m
  AJ: "[b3,d4]@3 [a#3,c#4] [b3,d4]@4 [d4,f#4]@4 [c#4,e4]@4", AK: "[a3,c#4]@2 a4 c#4",
  AL: "[f#4@2 g4@2 [f#4,a4]@5 [g4,b4] [f#4,a4]@5 [f#4,a4]]/2", AM: "[e4,g4]@3 ~", AN: "~@2 [b3,d4,g4] [a3,d4,f#4]",
  AO: "~ [b3,d4,g4] [a3,d4,f#4] ~", AP: "[[b3,d4,g4] [a3,c#4,f#4] [g3,b3,e4] [d4,g4,b4]@3 f#4@3 f#4@3]/3",
  AQ: "[d4,f#4] [e4,g4] [f#4,a4]!2", AR: "[[e4,g4]@2 [d4,f#4]@2 e4@6 e4@4 ~ e4]/2", AS: "[c#4,e4] [d4,f#4] [e4,g4]!2",
  AT: "[[d4,f#4]@3 [c#4,e4] [b3,d4]@6 d4@6]/2", AU: "[b3,d4] [c#4,e4] [d4,f#4] ~",
})).s("gm_electric_guitar_jazz").gain(0.4).pan(0.8)

// chords · vibraphone · "Staff-5"
const vibraphone = note(`<
  ~ A@2 B C@2 D E F ~ G@2 H@3 I@3 J@2 ~ K@2 L M@2 N O ~@2 P ~@4 Q@2 R S@2 T ~@3 U V W@2 V X@2 ~ Y Z ~@11
>`.pickRestart({
  A: "[~@12 a4 f#4 d4 a3@5 d4@4 f#4@4 a4@4]/2", B: "d5 a4 f#4 [d4,f#4]", C: "[f#4@4 e4@2 e4@3 d4 g4@2 f#4@2 e4@2]/2",
  D: "g4 f#4 e4 [b3,d4]", E: "[c#4,e4] [d4,f#4]!2 [c#4,e4]", F: "[b3,d4] ~@3", G: "[~@4 e4 f#4 ~ e4 c#4@12 ~@12]/2",
  H: "[~@4 a4 f#4 d4 a3@5 [d4,f#4]@12 [f#4,a4]@12 c#4@4 d4@4 e4@4]/3", // D F#m
  I: "[a4 f#4 e4 [c#4,e4]@3 [e4,g4]@3 [b3,d4]@3]/3", J: "[~@3 f#4@2 ~@3]/2", K: "[~@3 [b3,d4]@2 [b3,d4] [b3,d4]@2]/2",
  L: "~ [b3,d4] ~@6", M: "[[a4,c#5]@3 [b3,d4]@2 [b3,d4] [b3,d4]@2]/2", N: "~@2 [b3,d4]@2 ~@8 e4 f#4 ~ e4", O: "c#4@3 ~",
  P: "[b4,d5]@2 [g4,b4]@2 [d4,g4] a3 ~@2", Q: "[~@2 [d4,f#4]@3 [f#4,a4]@3]/2", R: "c#4 d4 e4 a4",
  S: "[f#4 e4 [c#4,e4]@3 [e4,g4]@3]/2", T: "[b3,d4]@3 ~", U: "~ [b3,d4]", V: "[b3,d4]@2 [b3,d4]@4 ~ [b3,d4]",
  W: "[~@3 [a4,c#5]@3 [b3,d4]@2]/2", X: "[~@8 e4 f#4 ~ e4 c#4@12 ~@8]/2", Y: "~@3 [b4,d5]",
  Z: "[g4,b4]@2 [d4,g4] a3 ~@4", // G G5
})).s("gm_vibraphone").gain(0.4).pan(0.2)

// other · synth strings 2 · "Staff-8"
const synth_strings_2 = note("<~@11 A@3 B@6 C@6 D@5 ~ E@2 F G@2 H@3 I@3 J@3 K@3 L@5 ~ M ~@9>".pickRestart({
  A: "[~ [d4,d5]@9 ~@2]/3", B: "[~ [a4,a5]@9 [a#4,a#5]@3 [b4,b5]@10 ~]/6", C: "[~ [a4,a5]@6 b4@6 a4@6 b4@5]/6",
  D: "[~ a4@6 a4@3 ~@3 [e4,g4]@6 ~, ~@7 [d4,f#4]@6 ~@7, ~@10 b4@9 ~]/5", E: "[~@2 [d4,e4,g4,b4]@3 ~@3]/2", F: "[d4,d5]",
  G: "[~@2 [d4,d5]@3 ~@3]/2", H: "[[a4,a5]@3 [a#4,a#5]]/3", I: "[[b4,b5]@5 ~]/3", J: "[[a4,a5] b4]/3", K: "[a4 b4]/3",
  L: "[a4@6 a4@3 ~@3 [e4,g4]@6 ~@2, ~@3 [d4,f#4]@3 ~@4, ~@9 b4@9 ~@2]/5", M: "[d4,e4,g4,b4]@3 ~",
})).s("gm_synth_strings_2").gain(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  ~ A ~ B A ~ B A ~ B A ~ B A ~ B A ~ B A ~ B A ~ B A ~ B A ~ B C ~ D ~@2 D E ~ D E ~ D E ~ D E ~ D E ~ D E@2 A E ~@2 B
  A ~ B A ~ B
>`.pickRestart({
  A: "~ x", B: "x", C: "x ~@6 x", D: "~ x ~@2", E: "~@3 x",
})).gain(0.48)

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

// drums · low tom
const low_tom = s("lt").struct("<~@21 A ~@2 A ~@2 A ~@2 A ~@2 B ~@8 C ~ D ~@2 E ~@2 D ~@2 D ~ F ~@9>".pickRestart({
  A: "~ x", B: "~ x ~ x ~@8 x ~@3", C: "~@7 x ~@6 x ~", D: "~ x ~@2", E: "~@4 x ~@2 x ~@8", F: "~@9 x ~ x ~@4",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 A ~@2 A ~@2 A ~@2 A ~ B C ~ D ~@6 E ~ F ~@2 G ~@2 F ~@2 F ~ H ~@9>".pickRestart({
  A: "~@2 x!3 ~@3", B: "~@9 x ~ x!3 ~ x", C: "x ~@4 x!2 ~", D: "x ~ x ~ x!2 ~ x ~@8", E: "~@4 x!2 ~@2 x!2 ~ x!2 ~@3",
  F: "x!3 ~@5", G: "x ~ x ~ x!2 ~@10", H: "~ x ~ x!3 ~ x!2 ~@7",
})).gain(0.48)

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

// drums · high tom
const high_tom = s("ht").struct("<~@21 A ~@2 A ~@2 A ~@2 A ~ B ~ C ~@9 D ~@2 D ~@2 D ~@2 D ~ D ~@9>".pickRestart({
  A: "~ x ~@2", B: "~ x", C: "~@13 x ~ x", D: "x",
})).gain(0.48)

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~ A B C A B C A B C A B C A B C A B C A B C A B C A B C A B C ~ D B C A B C A B C A B C A B C A B C A B C E ~ C A B C
  A B C A B ~
>`.pickRestart({
  A: "x ~@2 x", B: "~ x", C: "~ x ~@2", D: "~@3 x", E: "x",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@21 A ~@2 B ~@2 B ~@2 A C D E F D E ~@6 B D ~ A D ~ A D ~@2 D E F ~@9>".pickRestart({
  A: "~@3 x", B: "x", C: "~@5 x ~@2", D: "~ x", E: "~ x ~@2", F: "x ~@2 x",
})).gain(0.32)

stack(
  bass, electric_guitar_jazz, vibraphone, synth_strings_2, kick, snare, hihat, low_tom, mid_tom, open_hat, high_tom,
  ride_bell, crash
)

More by Leo Sayer