Strudelify
I Drove All Night cover art

1989 · A Night To Remember

I Drove All Night

Cyndi Lauper

KeyA♭ majorTempo140 bpm
0:00/0:00
// I Drove All Night — Cyndi Lauper
// 140 bpm, 4/4, key Ab major. Source: mcgill + 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 134 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/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
const bass = note(`<
  ~@2 A@2 B C D@2 A E B F A@2 B G D B A H I B J E K I L@2 M I N O A P M B N O A Q K R@2 K D S A E B F A@2 B G D B A H I
  B J E K I L@2 M I N O A P M B N O A Q B T B@2 O C U V W X G C U Y C X I B J E K I L@2 M I N O A P M B N O E Z O C H V
  C H@2 AA AB AC AD AE AF AA AB AC AD AE AF AG
>`.pickRestart({
  A: "c2@3 ~ c2 ~ c2 ~ c2@3 ~ c2 ~ c2 ~", B: "bb1@3 ~ bb1 ~ bb1 ~ bb1@3 ~ bb1 ~ bb1 ~",
  C: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~", D: "f1@3 ~ f1 ~ f1 ~ f1@3 ~ f1 ~ f1 ~",
  E: "c2@3 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", F: "bb1 ~@3 bb1 ~ bb1 ~ bb1 ~ f1 ~ bb1 ~ f1 ~",
  G: "d2@3 ~ d2 ~ d2 ~ d2@3 ~ d2 ~ d2 ~", H: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  I: "bb1@3 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~", J: "c2@3 ~ c2 ~ c2 ~ c2 ~@3 c2 ~ c2 ~",
  K: "bb1@3 ~ bb1 ~ bb1 ~ bb1 ~@3 bb1 ~ bb1 ~", L: "f1@3 ~ f1 ~ f1 ~ f1 ~@3 f1 ~ f1 ~",
  M: "a1@3 ~ a1 ~ a1 ~ a1@3 ~ a1 ~ a1 ~", N: "f2@3 ~ f2 ~ f2 ~ f2@3 ~ f2 ~ f2 ~",
  O: "d2@3 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", P: "c2@3 ~ c2 ~ c2 ~ c2 ~@3 c2 ~ bb1 ~",
  Q: "c2 ~@3 c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", R: "bb1 ~@3 bb1 ~ bb1 ~ bb1 ~@3 bb1 ~ bb1 ~",
  S: "f1@3 ~ f2@3 ~ f2@3 ~ f2@3 ~", T: "bb1 ~ f1 ~ bb1 ~@3 bb1 ~@3 bb1 ~@3", U: "c2@3 ~ c2 ~@3 c2 ~ c2 ~ c2 ~ c2 ~",
  V: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", W: "bb1@3 ~ bb1 ~@3 bb1 ~ bb1 ~ bb1 ~ bb1 ~",
  X: "c2@3 ~ c2@3 ~ c2 ~ c2 ~ c2 ~ c2 ~", Y: "a1 ~ a2 ~ ab2 ~ g2 ~ gb2 ~ f2 ~ e2 ~ eb2 ~",
  Z: "bb1 ~@2 c2 ~ d2 ~@2 d2 ~@2 c2 ~ bb1 ~@2", AA: "a1 ~@3 a1 ~ a1 ~ a1@3 ~ a1 ~ a1 ~",
  AB: "bb1 ~ bb1 ~ bb1 ~@3 bb1@3 ~ bb1 ~ bb1 ~", AC: "f2@3 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  AD: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", AE: "c2@3 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@3 ~",
  AF: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ bb1 ~ a1 ~", AG: "f1@3 ~@13",
})).s("gm_electric_bass_finger").gain(0.54)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@2 A@2 B@2 C@2 D@2 E@2 D@2 F G H F D@2 I@2 D@2 I@2 J@2 K L H G D@2 K M@2 G D@2 N@4 J@2 D@2 E@2 D@2 F G H F D@2 I@2
  D@2 I@2 J@2 K L H G D@2 K M@2 G D@2 ~@4 G L O K F O G L O K F O I@2 D@2 I@2 J@2 K L H G D@2 K M@2 G D@2 G L O K F D@2
  K L H G D@2 K L H G D@2 P
>`.pickRestart({
  A: "[[e4,g4,c5]@13 ~ [e4,g4,c5]@2]/2", B: "[d4,f4,bb4]/2", C: "[[a3,c4,f4]@7 [f3,a3,c4]]/2", D: "[g3,c4,e4]/2",
  E: "[f3,bb3,d4]/2", F: "[f3,bb3,d4]", G: "[a3,d4,f4]", H: "[a3,c4,f4]", I: "[bb3,d4,f4]/2", J: "[a3,c4,f4]/2",
  K: "[a3,c4,e4]", L: "[bb3,d4,f4]", M: "[[bb3,d4] [a3,c4], f4]/2", N: "[[bb3,d4,f4]@14 [bb3,d4,f4]!2]/4",
  O: "[g3,c4,e4]", P: "[f3,c4,f4] ~@7",
})).s("gm_overdriven_guitar").gain(0.35).pan(0.7)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@2 A@2 B@2 C@2 ~@17 D E@2 F G H@2 I@2 F G H@2 J@2 K@4 L@2 ~@17 D E@2 F G H@2 I@2 F G H@2 J@2 M@4 N G O F G O N G O F
  G O ~@5 D E@2 F G H@2 I@2 F G H@2 J@2 N G O F G I@2 F G H@2 I@2 F G H@2 I@2 P
>`.pickRestart({
  A: "[g3,c4,g4]/2", B: "[f3,bb3,f4]/2", C: "[f3,c4,f4]/2", D: "~@2 [f3,bb3]!2 [f3,bb3]@12", E: "[f2@6 c3 bb2]/2",
  F: "a2", G: "bb2", H: "f3/2", I: "[c3@6 c3 bb2]/2", J: "c3/2", K: "[bb2@14 bb2!2]/4", L: "f2/2", M: "[d3,f3,bb3]/2",
  N: "d3", O: "c3", P: "[f2,f3] ~@7",
})).s("gm_distortion_guitar").gain(0.35).pan(0.3)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@2 A@2 B@2 C@2 A@2 B@2 A@2 B D C B A@2 B@2 A@2 B@2 C@2 D B C D A@2 D B C D A@2 B@4 C@2 A@2 B@2 A@2 B D C B A@2 B@2
  A@2 B@2 C@2 D B C D A@2 D B C D A@2 B@4 D B A D B A D B A D B A B@2 A@2 B@2 C@2 D B C D A@2 D B C D ~@2 D B A D B A@2
  D B C D A@2 D B C D A@2 E
>`.pickRestart({
  A: "g3 ~ g3!3 ~ g3!3 ~ g3!3 ~ g3!2", B: "f3 ~ f3!3 ~ f3!3 ~ f3!3 ~ f3!2", C: "c3 ~ c3!3 ~ c3!3 ~ c3!3 ~ c3!2",
  D: "a3 ~ a3!3 ~ a3!3 ~ a3!3 ~ a3!2", E: "c3 ~@15",
})).s("gm_electric_guitar_muted").gain(0.25).pan(0)

// other · electric guitar muted
const electric_guitar_muted_2 = note(`<
  ~@2 A@2 B@2 C@2 A@2 B@2 A@2 B D C B A@2 B@2 A@2 B@2 C@2 A B C D A@3 B C D A@2 B@4 C@2 A@2 B@2 A@2 B D C B A@2 B@2 A@2
  B@2 C@2 A B C D A@3 B C D A@2 B@4 D B A@2 B A D B A@2 B A B@2 A@2 B@2 C@2 A B C D A@3 B C D ~ E D B A@2 B A@3 B C D
  A@3 B C D A@2 F
>`.pickRestart({
  A: "c3 ~ c3!3 ~ c3!3 ~ c3!3 ~ c3!2", B: "bb2 ~ bb2!3 ~ bb2!3 ~ bb2!3 ~ bb2!2", C: "f2 ~ f2!3 ~ f2!3 ~ f2!3 ~ f2!2",
  D: "d3 ~ d3!3 ~ d3!3 ~ d3!3 ~ d3!2", E: "bb2@3 c3@2 d3@3 d3@3 c3@2 bb2@3", F: "f2 ~@7",
})).s("gm_electric_guitar_muted").gain(0.25).pan(1)

// other · electric guitar muted
const electric_guitar_muted_3 = note(`<
  ~@11
  [~@10 f2@2 bb2@2 c3 d3]
  [c3@3 ~@5]
  ~@36
  [~@10 f2@2 bb2@2 c3 d3]
  [c3@3 ~@5]
  ~@83
>`).s("gm_electric_guitar_muted").gain(0.45).pan(0.3)

// other · distortion guitar
const distortion_guitar_2 = note(`<
  ~@5 A B@2 ~@22 C D ~@4 C D ~@2 E@4 F@2 ~@22 C D ~@4 C D ~@12 G H I J K L ~@10 C D ~@4 C D ~@11 C D ~@4 C D ~@3
>`.pickRestart({
  A: "bb3@3 a3@3 g3@2", B: "[a3@7 ~]/2", C: "~@8 f3@2 ~ g3@2 a3@2 ~", D: "d3", E: "[f3@14 f3!2]/4", F: "[c3,f3]/2",
  G: "~@8 a3@2 ~ bb3@2 c4@2 ~", H: "bb3@8 bb3@2 ~ bb3@2 a3@2 ~", I: "g3@8 e3@2 ~ f3@2 g3@2 ~", J: "a3",
  K: "bb3@6 ~@2 bb3@2 ~ c4@2 d4@2 ~", L: "c4",
})).s("gm_distortion_guitar").gain(0.35).pan(0.7)

// other · synth strings 1
const synth_strings_1 = note("<~@20 A B C D E@3 F ~@30 A B C D E@3 F ~@28 A B C D E@3 F ~@32>".pickRestart({
  A: "[f3,f4] [g3,g4]", B: "[a3,a4] [bb3,bb4]", C: "[c4,c5] [d4,d5]",
  D: "[e4,e5]@6 [f4,f5]@2 [g4,g5]@2 ~ [f4,f5]@2 [e4,e5]@2 ~", E: "[[f4,f5]@47 ~]/3",
  F: "f6 c6 a5 f5 c6 a5 f5 c5 a5 f5 c5 a4 f5 c5 a4 f4",
})).s("gm_synth_strings_1").gain(0.5)

// other · pad new age
const pad_new_age = note("<~@20 A B C D E@3 F ~@30 A B C D E@3 F ~@28 A B C D E@3 F ~@32>".pickRestart({
  A: "f5 g5", B: "a5 bb5", C: "c6 d6", D: "e6@6 f6@2 g6@2 ~ f6@2 e6@2 ~", E: "[f6@47 ~]/3",
  F: "f6 c6 a5 f5 c6 a5 f5 c5 a5 f5 c5 a4 f5 c5 a4 f4",
})).s("gm_pad_new_age").gain(0.4)

// chords · pad choir
const pad_choir = note("<~@30 A@4 ~@2 A@4 ~@28 A@4 ~@2 A@4 ~@26 A@4 ~@2 A@4 ~@20>".pickRestart({
  A: "[~@16 [f5,a5]@14 ~@2 [e5,g5]@29 ~@3, ~@15 d5@15 ~ c5@30 ~@3]/4", // F Em
})).s("gm_pad_choir").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@2 A@5 B A@3 B A@37 C A@63 D A@19 E>".pickRestart({
  A: "x!2", B: "x ~@3 x ~@2 x", C: "x ~@3 x!2 ~@2", D: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", E: "x",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A@17 B A@7 C A@4 B@2 A@4 B@2 A@2 B A@14 B A@7 D A@4 B E A@4 B@2 A@2 B F A@5 G A@3 H A@3 F A F A@3 I A@4 B E A@4 B
  ~ A@6 H A@4 B I A@4 B I J
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x!2 ~@2 x ~", C: "~@2 x!14", D: "~ x!15", E: "~@2 x!3 ~ x!3 ~ x!6", F: "~@4 x ~@5 x!6",
  G: "~ x ~@2", H: "~@2 x ~@2 x!2 ~", I: "x!2 ~ x!2 ~ x!2 ~ x!7", J: "x",
})).gain(0.35)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@30 A ~@2 B ~@2 A ~@8 A ~@22 A ~@2 B ~@2 A ~@3 A ~@2 C ~@2 B ~@2 B ~@3 D ~ B ~@10 A ~@2 B ~@2 A ~@2 E ~ A ~@4 F ~@2 A
  ~@2 A ~@2 A ~@2 A ~
>`.pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~@14 x!2", D: "~@13 x!3", E: "x ~@4 x ~@2 x ~@4 x ~@2", F: "~@12 x!4",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<A B C@5 D C@105 ~ C@12 E C@5 E ~>".pickRestart({
  A: "x!2", B: "x!4", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", D: "x ~ x!3 ~ x!3 ~ x!3 ~ x ~", E: "x",
})).gain(0.3)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@33 A ~@37 A ~@12 B ~@2 C ~@3 D ~ E ~@10 F ~@2 A ~@12 G ~@2 H ~@5 H ~@4
>`.pickRestart({
  A: "~ x", B: "~@10 x!2 ~@4", C: "~@3 x!2 ~@3", D: "x!7 ~@9", E: "~@5 x ~@2", F: "~@12 x!2 ~@2", G: "x!4 ~@12",
  H: "~@3 x",
})).gain(0.35)

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

// drums · ride
const ride = s("rd").struct("<~@44 [~@2 x!3 ~ x!3 ~ x!3 ~ x!2] [x ~ x!3 ~ x!3 ~ x!3 ~ x!2] ~@88>").gain(0.4)

stack(
  bass, overdriven_guitar, distortion_guitar, electric_guitar_muted, electric_guitar_muted_2, electric_guitar_muted_3,
  distortion_guitar_2, synth_strings_1, pad_new_age, pad_choir, kick, snare, low_tom, hihat, mid_tom, high_tom, crash,
  ride
)

More by Cyndi Lauper