Strudelify

Lovers (Live a Little Longer)

ABBA

KeyD majorTempo173 bpm
0:00/0:00
// Lovers (Live a Little Longer) — ABBA
// 173.3 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 7 "Viola" string ensemble 1 (copy of ch 3 "Bass" electric bass finger)
// note: Full arrangement: all 149 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(173.3/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 · electric guitar clean · "Guitar"
const electric_guitar_clean = note(`<
  ~@2 A@2 B@2 C D E F A@2 G H I@2 J K L M J N@2 O P K Q R J N@2 S T U V W X Y Z AA AB@2 AC@2 AD@2 AE AF@2 AG AH@4 AI AJ
  AK AL A@2 AM@2 I@2 J K L M J N@2 O P K AN R J N@2 S T U V W X Y Z AA AB@2 AC@2 AD@2 AE AF@2 AG AH@4 AI AO AP AQ T U V
  W X Y Z AA AB@2 AC@2 AD@2 AE AF@2 AG AH@4 AR AS@3 AC@2 AT@2 AI AJ AK AL AU@2 I@2 ~@5
>`.pickRestart({
  A: "[[d4,b4,d5]@2 [e4,c#5,e5]@4 [e4,c#5,e5]@6 [d4,b4,d5]@2 [e4,c#5,e5]@4 ~@10 b5 a5 f#5 e5, b5@7 ~, ~@9 [e4,c#5,e5]@7]/2", // G C#m G C#m
  B: "[[e4,c#5,e5]@2 [f#4,d5,f#5]@4 [f#4,d5,f#5]@5 ~ [e4,c#5,e5]@2 [f#4,d5,f#5]@4 [f#4,d5,f#5]@14, b4@7 ~@9]/2", // C#m D C#m D
  C: "[b5,d6]@3 [f#5,b5] [d5,f#5]@3 [f#5,b5] [d5,f#5]@3 [b4,d5] [d5,f#5]@3 [b4,d5]", // Bm B5 D B5 D Bm D Bm
  D: "[f#4,b4]@3 [b4,d5] [f#4,b4]@3 [d4,f#4] [f#4,b4]@3 [d4,f#4] [b3,d4]@2 ~@2", // B5 Bm B5 D B5 D Bm
  E: "[b5,d6]@3 [g5,b5] [d5,g5]@3 [g5,b5] [d5,g5]@3 [b4,d5] [d5,g5]@3 [b4,d5]", // Bm G G5 G G5 Bm G5 Bm
  F: "[g4,b4]@3 [b4,d5] [g4,b4]@3 [d4,g4] [g4,b4]@3 [d4,g4] [b3,d4]@2 ~@2", // G Bm G G5 G G5 Bm
  G: "[e4,c#5,e5]@2 [f#4,d5,f#5]@4 [f#4,d5,f#5]@5 ~ [e4,c#5,e5]@2 [f#4,d5,f#5]@2, b4@7 ~", H: "~ [f#4,d5,f#5]@7",
  I: "[[a4,c#5,a5] [b4,d5,b5]@2 [b4,d5,b5]@3 [a4,c#5,a5] [b4,d5,b5]@2 [b4,d5,b5]@7]/2", // A Bm A Bm
  J: "[d4,f#4]@2 [d4,a4]@3 [d4,b4]@3", K: "[f#4,d5]@3 [d4,b4]@3 [d4,a4]@2", L: "[f#4,d5]@2 [d4,b4]@3 [d4,a4]@3",
  M: "[d4,f#4]@3 [d4,a4]@3 [d4,b4]@2", N: "[[f#4,d5]@3 [d4,b4]@3 [d4,f#4,a4]@4 [e4,g#4]@2 ~@2 [d4,g#4]@2, ~@5 b4@3]/2",
  O: "~@4 [c#4,e4]@3 b3 [b3,d4]@3 [b3,d4] [a3,c#4]@3 [a3,c#4], ~ g#4@3", P: "~@2 [d4,a4]@3 [d4,b4]@3",
  Q: "[a4,d5]@2 ~@2 [f#4,b4] d4 d4@2, ~@2 [g4,b4]@2 ~ [f#4,a4]@2 ~, ~@3 d4@2 ~@3", // D5 B5 G F#m
  R: "[d4,f#4]@3 [d4,a4]@2 [d4,a4] [d4,b4]@2", S: "~@4 [c#4,e4,g#4]@3 b3 [b3,d4]@3 [b3,d4] [a3,c#4]@3 [a3,c#4]",
  T: "[f#4,d5]@2 [f#4,d5]@3 [e4,c#5]@3", U: "[d4,b4]@3 [d4,b4]@3 [e4,c#5]@2", V: "[f#4,d5]@3 [f#4,d5]@3 [g4,c#5,e5]@2",
  W: "[a4,d5,f#5]@3 [a4,d5,f#5]@3 ~@2", X: "[a4,f#5]@3 [a4,f#5]@3 [g4,e5]@2", Y: "[b4,d5]@3 [b4,d5]@3 [c#5,e5]@2",
  Z: "[d5,f#5]@3 [d5,f#5]@3 [d5,g#5]@2", AA: "[c#5,a5]@3 a5@4 b5, ~@3 c#5@5",
  AB: "[c#6!6 [c5,a5,c6]@3 [b4,g#5,b5]@3 [a4,f#5,a5]@2 [f#4,a4,f#5]@2, [c#5,a5]!3 ~@5]/2", // F E D F#m
  AC: "[c#6!6 [a5,c6]@3 a5 [b4,g#5,b5]@2 [a4,f#5,a5]@2 ~@2, [c#5,a5]!3 c5@2 ~@3]/2", // Am E D F#m
  AD: "[c#6!6 [c5,a5,c#6]@3 [b4,g#5,b5]@3 [a4,f#5,a5]@2 [f#4,a4,f#5]@2, [c#5,a5]!3 ~@5]/2", // F E D F#m
  AE: "[e5,f#5,a5]@3 [c#5,f#5] [a4,c#5]@3 [c#5,f#5] [a4,c#5]@3 [f#4,a4] [a4,c#5]@3 [f#4,a4]", // F#m7 F#5 A F#5 A F#m A F#m
  AF: "[[c#4,f#4]@3 [f#4,a4] [c#4,f#4]@3 [a3,c#4] [c#4,f#4]@3 [a3,c#4] [f#3,a3]@2 ~@4 c#6@2 c#6@2 c#6@2 c#6@2 c#6@2 [c5,a5,c6]@4, ~@3 [c#5,a5]@2 [c#5,a5] [a4,a5] ~, ~@6 c#6@3 ~@7]/2", // F#5 F#m F#5 A F#5 A F#m F …
  AG: "~ [b4,g#5] [a4,f#5,a5] [f#4,a4,f#5], ~@2 b5@3 ~@3", // E D F#m
  AH: "[c#6!6 [c5,a5,c6]@3 [b4,g#5,b5]@3 [a4,f#5,a5]@2 ~@2, [c#5,a5]!3 ~@5]/2", // F E D F#m
  AI: "[f#5,a5]@3 [c#5,f#5] [f#2,a2,a4,c#5]@3 [c#5,f#5] [a2,c#3,a4,c#5]@3 [f#4,a4] [a4,c#5]@2 ~ [f#4,a4], ~@7 a2", // F#m F#5 F#m F#5 A F#m A F#m
  AJ: "[f#2,d3,c#4,f#4]@3 [f#4,a4] [g#2,e3,c#4,f#4]@3 [a3,c#4] [a2,c#4,f#4]@3 [a3,c#4] [f#2,d3]@4, ~@6 [f#3,a3] ~", // Dmaj7 F#m C#m A F#m A D F#m
  AK: "[f#5,a5]@3 [d5,f#5] [b4,d5]@3 [d5,f#5] [b4,d5]@3 [f#4,b4] [b4,d5]@3 [f#4,b4]", // F#m D Bm D Bm B5 Bm B5
  AL: "[d4,f#4]@3 [f#4,b4] [d4,f#4]@3 [b3,d4] [d4,f#4]@3 [b3,d4] [f#3,b3]@2 ~@2", // D B5 D Bm D Bm B5
  AM: "[[e4,c#5,e5]@2 ~ [f#4,d5,f#5]@4 [f#4,d5,f#5]@5 [e4,c#5,e5]@2 ~ [f#4,d5,f#5]@3 [f#4,d5,f#5]@14, b4@7 ~@9]/2", // C#m D C#m D
  AN: "~ [a4,d5]@2 [d4,g4,b4]@2 [d4,f#4,b4] [d4,f#4,a4]@2", // D5 G Bm D
  AO: "[f#2,d3,c#4,f#4]@3 [f#4,a4] [g#2,e3,c#4,f#4]@3 [a3,c#4] [a2,f#3,c#4,f#4]@3 [a3,c#4] [f#2,d3]@4, ~@6 [f#3,a3] ~", // Dmaj7 F#m C#m A F#m A D F#m
  AP: "[f#5,a#5]@3 [c#5,f#5] [a#4,c#5]@3 [c#5,f#5] [a#4,c#5]@3 [f#4,a#4] [a#4,c#5]@3 [f#4,a#4], c#6", // F# F#5 A#m F#5 A#m F# A#m F#
  AQ: "[c#4,f#4]@3 [f#4,a#4] [c#4,f#4]@3 [a#3,c#4] [c#4,f#4]@3 [a#3,c#4] [f#3,a#3]@2 ~@2, d6 c#6", // F#5 F# F#5 A#m F#5 A#m F#
  AR: "[f#5,a5]@3 [c#5,f#5] [a4,c#5]@3 [c#5,f#5] [a4,c#5]@3 [f#4,a4] [a4,c#5]@3 [f#4,a4]", // F#m F#5 A F#5 A F#m A F#m
  AS: "[[c#4,f#4]@3 [f#4,a4] [c#4,f#4]@3 [a3,c#4] [c#4,f#4]@3 [a3,c#4] [f#3,a3]@2 ~@4 c#6@2 c#6@2 c#6@2 c#6@2 c#6@2 [c5,a5,c6]@6 [b4,g#5,b5]@6 [a4,f#5,a5]@4 [f#4,a4,f#5]@4, ~@3 [c#5,a5]@2 [c#5,a5]!2 ~@5, ~@2 c#6 ~@5]/3", // F#5 F#m F#5 A F#5 A F#m F …
  AT: "[c#6!6 [c5,a5,c6]@3 [b4,g#5,b5]@3 [a4,f#5,a5]@4, [c#5,a5]!3 ~@5]/2", // F E D F#m
  AU: "[[d4,b4,d5] [e4,c#5,e5]@2 [e4,c#5,e5]@3 [d4,b4,d5] [e4,c#5,e5]@2 [e4,c#5,e5]@7]/2", // G C#m G C#m
})).s("gm_electric_guitar_clean").gain(0.18).pan(0.3)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@2 A@2 B@2 ~@4 A@2 B@4 C@6 D E C@6 D E C@3 F@2 G H I J@6 K@2 J@6 L ~@3 A@2 B@4 C@6 D E C@6 D E C@3 F@2 G H I J@6 K@2
  J@6 ~@4 C@3 F@2 G H I J@6 K@2 J@6 ~@2 M@4 J@2 L ~@3 A@2 N@6 ~
>`.pickRestart({
  A: "[g2 a2@2 a2@3 g2 a2@2 a2@7]/2", B: "[a2 b2@2 b2@3 a2 b2@2 b2@7]/2", C: "b2", D: "e3!2", E: "e3", F: "d3", G: "g2",
  H: "d3@3 ~", I: "f#3@3 f#3@5", J: "[f#2@3 f#2@3 f#2@2]/2", K: "f#2/2", L: "f#2",
  M: "[f#2@3 f#2@4 f#2@4 f#2@3 f#2@2]/4", N: "[a2@2 b2@4 b2@6 a2@2 b2@4 b2@63 ~@15]/6",
})).s("gm_electric_bass_finger").gain(0.31).pan(0.6)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@3 A B@2 C D E F ~ A B@2 G@2 H ~@5 I J ~@6 I J ~@14 K L ~@6 K L M N ~ A B@2 O@2 H ~@5 I J ~@6 I J ~@14 K L ~@6 K L P
  Q ~@14 K L ~@6 K L ~@6 K L M N ~ A R@7
>`.pickRestart({
  A: "~@13 a5 f#5 e5", B: "b4/2", C: "d6@2 b5 ~ f#5@3 ~ f#5@3 d5 f#5@3 d5", D: "b4@3 d5 b4@3 f#4 b4@3 f#4 d4@2 ~@2",
  E: "d6@2 b5 ~ g5@3 ~ g5@3 d5 g5@3 d5", F: "b4@3 d5 b4@3 g4 b4@3 g4 d4@2 ~@2",
  G: "[[a4,c#5,a5]@2 [b4,d5]@4 [b4,d5]@6 [a4,c#5,a5]@2 [b4,d5,b5]@4 b5@9 ~@2 a5 f#5 e5, ~ b5@5 ~@3 [b4,d5]@7]/2", // A Bm A Bm
  H: "b4", I: "~ e6 ~ d6", J: "~ c#6 ~ b5", K: "a5@3 f#5 c#5@3 f#5 c#5@3 a4 c#5@3 a4",
  L: "f#4@3 a4 f#4@3 c#4 f#4@3 c#4 a3@2 ~@2", M: "a5@3 f#5 d5@3 f#5 d5@3 b4 d5@3 b4",
  N: "f#4@3 b4 f#4@3 d4 f#4@3 d4 b3@2 ~@2",
  O: "[[a4,c#5,a5]@2 [b4,d5]@4 [b4,d5]@6 [a4,c#5,a5]@2 [b4,d5]@4 ~@11 a5 f#5 e5, ~ b5@5 ~ b5@7 ~@2, ~@9 [b4,d5]@7]/2", // A Bm A Bm
  P: "a#5@3 f#5 c#5@3 f#5 c#5@3 a#4 c#5@3 a#4", Q: "f#4@3 a#4 f#4@3 c#4 f#4@3 c#4 a#3@2 ~@2",
  R: "[[a4,c#5,a5] [b4,d5]@2 [b4,d5]@3 [a4,c#5,a5] [b4,d5]@2 [b4,d5]@47]/7", // A Bm A Bm
})).s("gm_string_ensemble_1").gain(0.31).pan(0.6)

// chords · fiddle · F#m F#5 A F#5 A F#m A F#m …
const fiddle = note(`<
  [[f#5,a5]@3 [c#5,f#5] [a4,c#5]@3 [c#5,f#5] [a4,c#5]@3 [f#4,a4] [a4,c#5]@3 [f#4,a4]]
  [[c#4,f#4]@3 [f#4,a4] [c#4,f#4]@3 [a3,c#4] [c#4,f#4]@3 [a3,c#4] [f#3,a3]@2 ~@2]
  ~@147
>`).s("gm_fiddle").gain(0.05).pan(0.4)

// other · string ensemble 2 · "Slow Strings"
const string_ensemble_2 = note("<~ A@3 ~@6 B@2 ~@46 B@2 ~@89>".pickRestart({
  A: "[~@11 b5@36 ~]/3", B: "b5/2",
})).s("gm_string_ensemble_2").gain(0.23)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@43 A ~@5 A ~ A ~@63 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@13>".pickRestart({
  A: "~@12 x!3 ~",
})).gain(0.21)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A B ~ C@2 B ~ C@15 D C@7 D C@15 ~@2 C@6 ~ C ~ C@13 E C@7 F C@23 ~ C ~ C@15 G ~ C@6 G ~ C@5 ~ H C I C@2 J K ~@5
>`.pickRestart({
  A: "~@3 x!2 ~ x ~", B: "x ~@14 x", C: "x", D: "x!4 ~ x!2 ~", E: "x ~@2 x!2 ~ x ~@4 x!2 ~@3",
  F: "x ~@2 x!2 ~@2 x ~@3 x!2 ~@3", G: "~@3 x", H: "~@14 x!2", I: "~@7 x!2 ~@7", J: "x ~@6 x", K: "~ x ~@6",
})).gain(0.34)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@136 x ~@6 [~ x ~@6] ~@5>").gain(0.34)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~ A ~ B ~ A ~ A ~ A ~ A ~@5 B ~@7 C ~@7 C ~@2 B A B A B A ~@3 A ~ B ~ A ~@11 A ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~
  A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ A ~ A ~@4 B A B A B A B A B A B@3 A ~@2 B A B@3 A ~@2 B A B A B A ~@4 B A D ~@6
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~@3 x", D: "~@2 x ~@3 x!2",
})).gain(0.34)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct(`<
  ~@3 A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@5 A ~ A ~ A ~ A ~@3 A ~
  A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A
  ~@5 A ~@7
>`.pickRestart({
  A: "~@3 x",
})).gain(0.21)

// drums · crash
const crash = s("cr").struct("<~@143 [~ x ~@6] ~@5>").gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C A B A C A B A D ~ E A D A B A C@3 A C A F
  A D A C A F A F A D A C A F A F A F A F A F A F A F A F A F A F A F A F A F A F A F@3 A F A F A F A F A F A F A F A F
  A F A F A F A F A F A F A F ~@6 A F ~@7
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@4 x ~@6 x!2 ~@3", D: "~@4 x ~@5 x ~ x!2 ~@2", E: "~@3 x",
  F: "~@4 x ~@6 x!3 ~@2",
})).gain(0.21)

// drums · shaker
const shaker = s("sh").struct("<~@2 [x!4]!3 [x ~@3 x ~@3 x ~@3 x ~@2 x] [~ x!3] [x!4]!127 ~@6 [x!4]!2 ~@7>").gain(0.34)

stack(
  electric_guitar_clean, bass, string_ensemble_1, fiddle, string_ensemble_2, kick, snare, snare_soft, low_tom,
  pedal_hat, mid_tom, open_hat, open_hat_soft, crash, tambourine, shaker
)

More by ABBA