Strudelify
Just When I Needed You Most cover art

1979 · Warmer

Just When I Needed You Most

Randy Vanwarmer

KeyA majorTempo91 bpm
0:00/0:00
// Just When I Needed You Most — Randy Vanwarmer
// 91 bpm, 4/4, key A major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "Staff-6" epiano1 (copy of ch 5 "Staff-5" pad new age)
// note: Full arrangement: all 49 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(91/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@4 B@4 C@2 D E F@5 G H I J G H K L M@4 C@2 D E F@5 G H I J G H N@4 ~>".pickRestart({
  A: "[~@2 a2@3 a2 a2@4 a2@3 a2 a2@4 a2@3 a2 a2@4 a2@6]/4",
  B: "[a2@2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2@2 a2]/4",
  C: "[a2@2 d2@3 d2 d2@3 d2 a2@3 a2@2 a2]/2", D: "a2@2 b2@3 b2 b2@2", E: "b2 e2!3",
  F: "[e2@2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 d2@3 d2 d2@2]/5", G: "d2@2 a2@3 a2 a2@2",
  H: "a2@2 e2@3 e2 e2@2", I: "e2@2 a1@3 b1@3", J: "c#2@2 d2@3 d2 d2@2", K: "e2@2 a2@3 a2 a2@2", L: "a2@2 a2@3 a2!3",
  M: "[e2@2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2 a2@3 a2@2 a2]/4",
  N: "[e2@2 a2@3 a2 a2@4 a2@8 a2@8 a2@4 ~@2]/4",
})).s("gm_electric_bass_finger").gain(0.48).pan(0.7)

// chords · string ensemble 1 · "Staff-3"
const string_ensemble_1 = note("<A@3 B@8 C@6 D@6 E@8 F G@7 H@7 ~@3>".pickRestart({
  A: "[a4 b4 c#5@8 [g4,c#5]@8 a4@6]/3", // Gdim
  B: "[d4@2 [c#4,e4]@3 [g#3,b3]@4 ~ a4@8 g4@8 ~@8 d4@8 a4@8 a4@4 ~@2 a4@2 [d4,f#4]@6, ~@5 g#4@5 ~@16 f#4@24 c#5@6 ~@8, ~@27 e4@2 ~@3]/8", // C#m G#m D
  C: "[~ [e4,g#4]@3 [e4,g#4,b4]@6 ~@4 c#5@4 ~@4 c#5@4 [f#4,a4]@8 a4@8 f#5@6, ~@5 a4@4 g4@4 ~@4 d5@7]/6", // E F#m
  D: "[~@2 e5@8 g#4@8 [c#4,a4]@3 [c#4,e4,g4,a4]@5 [d5,f#5]@8 e5@8 [e4,g#4]@6, ~ c#5@8 ~@8 c#5@7, ~@10 e4@11 ~@27]/6", // F#m A7 D E
  E: "[~ [c#4,e4,a4]@4 [c#4,e4,a4]@5 [c#4,e4,a4]@3 [c#4,e4,a4]@5 a4@8 g4@8 ~@8 d4@8 a4@8 a4@4 e4@2, ~@17 f#4@12 c#5@3]/8", // A
  F: "a4 [d4,f#4]@3", // D
  G: "[~ [e4,g#4]@3 [e4,g#4,b4]@6 ~@4 c#5@4 ~@4 c#5@4 [f#4,a4]@8 [a4,d5]@8 [d5,f#5]@8 [c#5,e5]@6, ~@5 a4@4 g4@4 ~@15]/7", // E F#m D5 D C#m
  H: "[~@2 [e4,g#4,c#5]@8 [c#4,e4,a4]@3 [c#4,e4,g4,a4]@5 [d5,f#5]@8 [c#5,e5]@8 [e4,g#4,c#5]@7 [c#4,e4,a4]@3 [a4,c#5] c#5@2 d5 [c#5,e5]@2 ~@6, ~@45 a4@5 ~@6]/7", // C#m A A7 D C#m A C#m
})).s("gm_string_ensemble_1").gain(0.32).pan(0.8)

// chords · string ensemble 2 · "Staff-4"
const string_ensemble_2 = note("<A@4 B@8 C@8 D@5 B@8 C@8 E@6 F ~>".pickRestart({
  A: "[~@2 c#4@8 g4@8 a4@8 [c#4,e4]@3 [g#3,b3]@3, ~ a3@12 ~@3]/4", // C#m G#m
  B: "[~@2 e3@8 g3@8 ~@16 f#4@8 e3@3 c#3 [c#3,e3]@4 [d3,f#3]@8 [e3,g#3]@6, ~ a3@24 ~@7, ~@9 f#3@12 ~@11, ~@13 d4@8 c#4@4 ~@7]/8", // C#m D E
  C: "[~@2 a3@8 g3@8 a3@11 ~@5 [d3,d4]@8 [a3,c#4]@8 [g#3,e4]@8 a3@3 b2@3, ~@2 c#4@16 f#4@8 ~@3 f#3@13 e3@16 ~@6]/8", // D A C#m
  D: "[c#3 [d3,f#3,d4]@4 [a3,c#4]@4 [g#3,e4]@4 a3@7, ~ e3@3]/5", // D A C#m
  E: "[c#3@2 [d3,f#3,d4]@8 [a3,c#4]@8 [g#3,e4]@8 [c#3,a3]@2 [a3,c#4] c#4@2 d4 [c#4,e4]@2 [g3,c#4]@8 [f#3,a3]@3 [c#3,f#3]@3, ~@10 e3@18 ~ a3@5 ~@14]/6", // D A C#m F#m A C#m Gdim F#m …
  F: "[a2,c#3] [a2,c#3,e3]@2 ~", // A
})).s("gm_string_ensemble_2").gain(0.4).pan(0.2)

// chords · acoustic guitar steel · "Staff-7"
const acoustic_guitar_steel = note(`<
  A B@2 C@2 D E F@4 G H@3 I@2 J K L M J K N@2 O D E F@4 G H@3 P@2 J K L M J K Q R S T@2
>`.pickRestart({
  A: "~@2 [e3,a3]@3 [e3,a3]@3", B: "[[e3,a3]@4 g3@4 c#4@2 f#4@4 e4@4 c#4 b3 [d3,f#3]@6 [d3,f#3]@6, ~ c#3@4 ~@3]/2",
  C: "[[d3,f#3,a3]@2 a3@2 f#3 e3@4 ~ [e3,a3]@3 [e3,a3]@2 e3]/2", D: "[e3,a3]@2 [g3,c#4]@3 [g3,c#4]@2 g3",
  E: "[g3,c#4] g3 f#3 [f#3,c#4]@2 [f#3,c#4]@2 f#3", // Gdim F#5
  F: "[[c#3,f#3]@2 [d3,f#3,a3]@3 [d3,f#3,a3]@2 [d3,f#3,a3]@2 [d3,f#3,a3] [d3,f#3,a3]@3 [d3,f#3,a3]@2 [d3,f#3,a3]@2 [d3,f#3,a3] [e3,a3,c#4] b3 a3 [c#3,e3,a3]@5 [d3,f#3]@3 [d3,f#3]@3]/4", // F#5 D A D
  G: "[d3,f#3]@2 ~ b3@3 b3 g#3, ~ [e3,g#3]@2 ~", // D E
  H: "[e3@2 [a3,c#4]@3 [a3,c#4]@2 [a3,c#4]@3 [g3,c#4]@3 [g3,c#4]@2 [g3,c#4]@2 [g3,c#4] f#3@2 a3 c#4@2 a3]/3", // A Gdim
  I: "[f#3@2 ~ [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 a3 d3 f#3 a3 d4@2 a3]/2", J: "f#3 d3 c#3 e3 a3 c#4@2 a3",
  K: "e3 c#3 e3 g#3 c#4 e4@2 c#4", L: "g#3 e3 c#3 e3 a3 e3 c#3 e3", M: "g3 e3 d3 f#3 a3 d4@2 a3",
  N: "[g#3 e3!2 a3 c#4@6 ~@2 a3 c#4@2 ~]/2", O: "~@2 [e3,a3]@3 [e3,a3]@2 e3",
  P: "[f#3@2 ~ [a3,d4]@4 [a3,d4]@2 a3 d3 f#3 a3 d4@2 a3]/2", Q: "g#3 e3!2 a3 c#4@3 d4", R: "e4@2 ~@3 f#4@3",
  S: "e4@2 ~@2 c#4 a3@2 a3", T: "[f#3 [a2,c#3,e3]@4 ~@3]/2",
})).s("gm_acoustic_guitar_steel").gain(0.32).pan(0.3)

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

// drums · hihat
const hihat = s("hh").struct("<[~ x] [x!2]!3 [x!3 ~] [x!2]!20 [x!3 ~] [x!2]!21 x ~>").gain(0.4)

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

// drums · crash
const crash = s("cr").struct("<~@20 [~ x ~@2] ~@20 [~ x ~@2] ~@7>").gain(0.4)

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

stack(bass, string_ensemble_1, string_ensemble_2, acoustic_guitar_steel, kick, hihat, open_hat, crash, ride_bell)