Strudelify

Rock Me

ABBA

KeyB majorTempo133 bpm
0:00/0:00
// Rock Me — ABBA
// 133 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 32, 4/4 at bar 32, 2/4 at bar 66, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "Guitar 2" electric guitar clean (copy of ch 4 "Guitar" distortion guitar)
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(133/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 · "Bass"
const bass = note(`<
  ~@9 A@2 B@2 C@6 ~ D@2 E@3 F G H G I J K L M@2 N O P Q R S T U V O P Q W X@6 Y D Z E@2 AA AB K AC K AD G AE AF AG ~
  AH@2 AI@2 AJ@2 AK AL A@2 B@2 AM@3 A@2 B@2 AM@3 A@2 B@2 AM@3 A@2 B@2
>`.pickRestart({
  A: "[b2@3 b2 b2@3 b2@2 b2@2 b2 b2@2 b2@2]/2", B: "[a#2@3 a#2 a#2@3 a#2@2 a#2@2 a#2 a#2@2 a#2@2]/2",
  C: "[e2@3 e2!2 g#2 b2 c#3@2 c#3@2 c#3@2 c#3 e2 f#2@2 f#2@2 f#2@2 f#2!2 b2@7 ~ b2@7 ~ b2@7 ~ b2]/6", D: "f#2!4",
  E: "c#3!4", F: "g#2!4", G: "e3!4", H: "d#3@2 d#3@2 c#3 g#3@3", I: "d#3@4 d#3@4 c#3@3 g#2 b2@3 g#2", J: "b2 c#3 e3!2",
  K: "e3!2 d#3!2", L: "d#3!2 c#3@2", M: "[b2 a2@2 ~]/2", N: "~@4 b2@3 b2", O: "b2@3 b2@2 b2@2 b2",
  P: "b2@2 b2@2 a#2@3 a#2", Q: "a#2@3 a#2@2 a#2@2 a#2", R: "a#2@2 a#2@2 a2@3 a2", S: "a2@3 a2@2 a2@2 a2",
  T: "a2@2 a2@2 e3@3 e3", U: "e3@4 e2@4 f#2@3 f#2 f#2@4", V: "f#2@2 f#2@2 b2@3 b2", W: "a#2@2 a#2@2 e2@3 e2",
  X: "[e2 g#2 b2 c#3@2 c#3@2 c#3@2 c#3 e2 f#2@2 f#2@2 f#2@2 f#2!2 b2@7 ~ b2@7 ~ b2@7 ~ b2 ~@4]/6", Y: "~@2 f#2!2",
  Z: "f#2!2 c#3!2", AA: "c#3!2 g#2!2", AB: "g#2!2 e3!2", AC: "c#3 g#3@3 e3@2 e3@2", AD: "c#3@3 g#2 b2@3 g#2 b2@4 c#3@4",
  AE: "d#3!4", AF: "c#3 b2", AG: "a2", AH: "[f3@4 f#3@4 f3@4 f#3@2 f3@5 f3 f#3@4 g#3@4 [b2,f#3]@4, b2@7 ~]/2",
  AI: "[f3@4 f#3@4 f3@4 f#3@2 f3@5 f3 f#3@4 g#3@4 [a#2,f#3]@4, a#2@7 ~]/2", // D#m
  AJ: "[f3@4 f#3@4 f3@4 f#3@2 f3@5 f3 f#3@4 g#3@4 [a2,f#3]@4, a2@7 ~]/2", AK: "e2", AL: "f#2@3 f#3",
  AM: "[e2@3 e2!2 g#2 b2 c#3@2 c#3@2 c#3@2 c#3 e2 f#2@2 f#2@2 f#2@2 f#2 f#2@2]/3",
})).s("gm_electric_bass_finger").gain(0.35).pan(0.3)

// chords · piano
const piano = note(`<
  ~@8 A B C D E F G@2 H@4 I J@4 K L M N O P Q@2 R@2 S B T D U V W X Y B T D Z AA AB AC AD@2 AE AF AG@2 AH AI AJ AK AL AM
  AN AO N AP AQ AR A B C D E V AS AT@2 B C D E F AU@2 B C D E AV@3 B C D E AV@3 AW C AX@2
>`.pickRestart({
  A: "~@8 f#4!2 ~ f#4!3 ~ f#4", B: "[b3,d#4,f4] [b3,d#4,f#4] [b3,d#4,f4] [b3,d#4,f#4]",
  C: "[b3,d#4,f4] [b3,d#4,f#4] [b3,d#4,g#4] [b3,d#4,f#4]", D: "[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,f4] [a#3,c#4,f#4]",
  E: "[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,g#4] [a#3,c#4,f#4]", F: "[e4,g#4,b4] [g#3,b3,e4]!3",
  G: "[[g#3,b3,d#4]@2 [g#3,b3,c#4]@2 d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2 b3!2 [g#3,b3,c#4] b3, ~@4 g#3@2 ~ [g#3,b3]@5 g#3@2 ~@2]/2", // G#m C#7 G#m
  H: "[b3@4 [b3,d#4,f#4]@3 [b3,d#4,f#4] [b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@6 [b3,d#4,f#4]@3 [b3,d#4,f#4] [b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@6 [b3,d#4,f#4]@3 [b3,d#4,f#4] [b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b2,d#3,f#3,d#4,f#4]@4 ~@14]/4", // B E B E B E B
  I: "[a#3,c#4]@2 [a#3,c#4]@2 [a#3,c#4] [a#3,c#4]@2 [a#3,c#4]", // A#m
  J: "[[a#3,c#4]@4 [a#3,c#4]@2 c#4@4 d#4@2 [a#3,c#4]@2 [g#3,c#4]@6 [g#3,c#4,d#4]@4 [g#3,c#4]@4 [g#3,c#4,e4]@2 [g#3,c#4,f#4]@4 [a#3,c#4,f#4]@2 [g#3,c#4]@4 [g#3,c#4]@3 ~ [g#3,c#4,e4]@4 [g#3,c#4,e4]@4 [g#3,c#4,e4]@4 [g#3,c#4,e4]@4 [g#3,c#4,e4]@4, ~@6 a#3@6 ~@2 e4@2 ~@27 g#4@9 ~@12]/4", // A#m C#5 G#sus4 C#5 C#m C#sus4 F# C#5 …
  K: "[c4,d#4]!4", L: "[b3,e4,g#4]@2 [b3,e4,g#4]@2 g#4!2 [e4,g#4] e4, ~@2 [b3,e4] b3",
  M: "f#4 ~ d#4!2 c#4 [c#4,e4]@2 ~, [b3,d#4] b3 ~@2, ~ f#4@2 ~@5", // C#m B
  N: "[b3,e4,g#4]@2 [b3,e4,g#4]@2 g#4 f#4 [e4,g#4] e4, ~@2 [b3,e4] b3", // E E5
  O: "f#4@2 ~@2 d#4@2 d#4@2 [g#3,c#4]@3 g#3 b3@3 g#3, [b3,d#4] b3 ~@2, ~ f#4@2 ~@5", P: "b3 c#4 [b3,e4,g#4]!2",
  Q: "[g#4 f#4 [e4,g#4] e4 [b3,d#4,f#4]@2 [b3,d#4,f#4] [b3,d#4,f#4]@3 [b3,d#4]@2 e4!2 e4@2, [b3,e4] b3 ~@4 g#3@2]/2", // E B E5
  R: "[d#4@2 d#4@2 d#4@4 c#4!2 c#4@14 ~@8, g#3 [e3,a3]@2 ~]/2", S: "f#4!2 ~ f#4!3 ~ f#4 [b3,d#4,f4]@4 [b3,d#4,f#4]@4",
  T: "[b3,d#4,g#4] [b3,d#4,f#4] [a#3,c#4,f4] [a#3,c#4,f#4]", U: "[a#3,c#4,g#4] [a#3,c#4,f#4] [a3,c#4,f4] [a3,c#4,f#4]",
  V: "[a3,c#4,f4] [a3,c#4,f#4] [a3,c#4,f4] [a3,c#4,f#4]", W: "[a3,c#4,g#4] [a3,c#4,f#4] [e4,g#4,b4] [g#3,b3,e4]",
  X: "~ e4!2 d#4@3 c#4!2, ~ [g#3,b3]@2 [g#3,b3]@5", // G#m
  Y: "d#4!2 [a#3,c#4,e4]@2 [b3,d#4,f4]@2 [b3,d#4,f#4]@2, [g#3,b3] ~@3", // A#dim Fm7b5 B G#m
  Z: "[a#3,c#4,g#4] [a#3,c#4,f#4] [e4,g#4,b4] [g#3,b3,e4]", AA: "[g#3,b3,e4]!2 [g#3,b3,d#4] [g#3,b3,c#4]",
  AB: "d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2, g#3@2 ~ [g#3,b3]@5", // C#7 G#m
  AC: "b3@2 b3@2 [g#3,b3,c#4]@2 b3@2 b3@4 [b3,d#4,f#4]@3 [b3,d#4,f#4], g#3 ~@3", // C#7 B
  AD: "[b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@6 [b3,d#4,f#4]@3 [b3,d#4,f#4]", // E B
  AE: "[b3,e4,g#4]!2 ~ [b2,d#3,f#3,d#4,f#4]@2 ~@3, ~@3 b3 ~@4", AF: "~@2 [a#3,c#4]!2",
  AG: "[[a#3,c#4] [a#3,c#4]@2 [a#3,c#4] [a#3,c#4]@2 [a#3,c#4] c#4@2 d#4 [a#3,c#4] [g#3,c#4]@3 [g#3,c#4,d#4]@2, ~@7 a#3@3 ~ e4 ~@4]/2", // A#m C#5 G#sus4
  AH: "[g#3,c#4]@2 [g#3,c#4,e4] [g#3,c#4,f#4]@2 [a#3,c#4,f#4] [g#3,c#4]@2", // C#5 C#m C#sus4 F# C#5
  AI: "[g#3,c#4]@3 ~ [g#3,c#4,e4]@4 [g#3,c#4,e4]@4 [g#3,c#4,e4]@4, ~@3 g#4@9 ~@4", AJ: "[g#3,c#4,e4]!2 [c4,d#4]!2",
  AK: "[c4,d#4]!2 [b3,e4,g#4]!2", AL: "g#4!2 [e4,g#4] e4 f#4 ~ d#4!2, [b3,e4] b3 [b3,d#4] b3, ~@5 f#4@2 ~",
  AM: "c#4 [c#4,e4]@2 ~ [b3,e4,g#4]@2 [b3,e4,g#4]@2", // C#m E
  AN: "g#4 f#4 [e4,g#4] e4 f#4 ~ d#4!2, [b3,e4] b3 [b3,d#4] b3, ~@5 f#4@2 ~", AO: "[g#3,c#4]@3 g#3 b3@3 g#3 b3@4 c#4@4",
  AP: "[b3,d#4,f#4]@2 [b3,d#4,f#4] [b3,d#4,f#4]@3 [b3,d#4]@2", AQ: "e4!2 e4@2 d#4!2 d#4@2, g#3!2",
  AR: "c#4!2 c#4@14, [e3,a3]", AS: "[a3,c#4,f4] [a3,c#4,f#4] [a3,c#4,g#4] [a3,c#4,f#4]",
  AT: "[[e4,g#4,b4]@2 [g#3,b3,e4]@2 ~ e4!2 d#4@3 c#4!2 d#4!2 [a#3,c#4,e4]@2, ~@5 [g#3,b3]@2 [g#3,b3]@5 [g#3,b3]@2 ~@2]/2", // E A#dim G#m
  AU: "[[g#3,b3,d#4]@2 [g#3,b3,c#4]@2 d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2 d#4!2 [g#3,b3,e4]@2, ~@4 g#3@2 ~ [g#3,b3]@5 [g#3,b3]@2 ~@2]/2", // G#m C#7 E G#m
  AV: "[[e4,g#4,b4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4] d#4@3 c#4@2 b3!2 [g#3,b3,c#4] d#4@3 c#4@2 d#4!2 [g#3,b3,e4]@2, ~@7 [g#3,b3]@5 g#3@2 ~ [g#3,b3]@5 [g#3,b3]@2 ~@2]/3", // E C#7 E G#m
  AW: "[b3,d#4,f4]@4 [b3,d#4,f#4]@4 [b3,d#4,f4]@3 ~ [d#4,f#4]@4, ~@11 b3@5", // Fm7b5 B Fm7b5 D#m
  AX: "[[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,f4] f#4 f4 [a#3,c#4,f#4] [a#3,c#4,g#4] [a#3,c#4,f#4], ~@12 [a#3,c#4]@7 ~@13]/2", // A#m F# A#m F# A#m7 F# A#m
})).s("gm_piano").gain(0.51).pan(0.3)

// chords · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@13 A@3 B@3 C@3 D@2 E F G H I J K L@2 M@2 N O P Q R S T U V O P Q W X Y Z@4 AA AB@6 AC AD AE AF I AG AH AI ~@9 O AJ Q
  AK AL AM@2 O AJ Q AK AN@3 O AJ Q AK AN@3 AO AJ AP@2
>`.pickRestart({
  A: "[~@6 e3 d#3@3 c#3@2 b2!2 c#3 d#3@3 c#3@2 b2!2 c#3 b2]/3",
  B: "[[b2,d#3,f#3]@6 ~ [b2,d#3,f#3]@7 ~ [d#3,f#3]@6 ~@2 [b2,d#3,f#3], ~@15 b2@8 ~]/3", // B D#m B
  C: "[~@4 d#4 ~ e4 d#4 e4 ~ d#4 f#4@13 ~@6 [e4,g#4]@4 [e4,g#4]@2 [a#3,c#4]@11 ~]/3", // E A#m
  D: "[[g#3,c#4,d#4]@13 ~ [g#3,c#4,f#4]@4 [a#3,c#4,f#4]@2 [g#3,c#4]@11 ~]/2", E: "[g#3,c#4,e4]@15 ~",
  F: "[c4,d#4]@15 ~", G: "[b3,e4,g#4]@2 [b3,e4,g#4]@2 g#4!2 [e4,g#4] e4, ~@2 [b3,e4] b3",
  H: "f#4 ~ d#4!2 ~ [c#3,f#3,c#4,e4]@2 ~, [b3,d#4] b3 ~@2, ~ f#4@2 ~@5", // F#7 B
  I: "[b3,e4,g#4]@2 [b3,e4,g#4]@2 g#4 f#4 [e4,g#4] e4, ~@2 [b3,e4] b3", // E E5
  J: "f#4@2 ~@2 d#4@2 d#4@2 [g#3,c#4]@3 g#3 b3@3 g#3, [b3,d#4] b3 ~@2, ~ f#4@2 ~@5", K: "b3 c#4 [b3,e4,g#4]!2",
  L: "[g#4 f#4 [e4,g#4] e4 [b3,d#4,f#4]@2 [b3,d#4,f#4] [b3,d#4,f#4]@3 [b3,d#4]@2 e4!2 e4@2, [b3,e4] b3 ~@4 g#3@2]/2", // E B E5
  M: "[d#4@2 d#4@2 d#4@4 c#4!2 c#4@14 ~@8, g#3 [e3,a3]@2 ~]/2", N: "~@2 [b3,d#4,f4] [b3,d#4,f#4]",
  O: "[b3,d#4,f4] [b3,d#4,f#4] [b3,d#4,f4] [b3,d#4,f#4]", P: "[b3,d#4,g#4] [b3,d#4,f#4] [a#3,c#4,f4] [a#3,c#4,f#4]",
  Q: "[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,f4] [a#3,c#4,f#4]", R: "[a#3,c#4,g#4] [a#3,c#4,f#4] [a3,c#4,f4] [a3,c#4,f#4]",
  S: "[a3,c#4,f4] [a3,c#4,f#4] [a3,c#4,f4] [a3,c#4,f#4]", T: "[a3,c#4,g#4] [a3,c#4,f#4] [e4,g#4,b4] [g#3,b3,e4]",
  U: "~ e4!2 d#4@3 c#4!2, ~ [g#3,b3]@2 [g#3,b3]@5", // G#m
  V: "d#4!2 [a#3,c#4,e4]@2 [b3,d#4,f4]@2 [b3,d#4,f#4]@2, [g#3,b3] ~@3", // A#dim Fm7b5 B G#m
  W: "[a#3,c#4,g#4] [a#3,c#4,f#4] [e4,g#4,b4] [g#3,b3,e4]", X: "[g#3,b3,e4]@2 e3 d#3@3 c#3@2, ~ [g#3,b3,e4] ~@2",
  Y: "b2!2 c#3 d#3@3 c#3@2",
  Z: "[b2@2 b2@2 c#3@2 b2@2 [b2,d#3,f#3]@14 [b2,d#3,f#3]@16 [d#3,f#3]@12 ~@4 [b2,d#3,f#3]@4 ~@2 d#4 ~ e4 d#4, ~@19 b2@8 ~@5]/4", // B D#m B
  AA: "e4 ~ d#4 f#4@13",
  AB: "[~@6 [e4,g#4]@4 [e4,g#4]@2 [a#3,c#4]@11 ~ [g#3,c#4,d#4]@12 ~@2 [g#3,c#4,f#4]@4 [a#3,c#4,f#4]@2 [g#3,c#4]@11 ~ [g#3,c#4,e4]@15 ~ [c4,d#4]@15 ~ [b3,e4,g#4]@4 [b3,e4,g#4]@4]/6", // E A#m G#sus4 C#sus4 F# C#5 C#m Cm …
  AC: "g#4!2 [e4,g#4] e4 f#4 ~ d#4!2, [b3,e4] b3 [b3,d#4] b3, ~@5 f#4@2 ~", // E E5 B
  AD: "~ [c#3,f3,c#4,e4]@2 ~ [b3,e4,g#4]@2 [b3,e4,g#4]@2", // C# E
  AE: "g#4 f#4 [e4,g#4] e4 f#4 ~ d#4!2, [b3,e4] b3 [b3,d#4] b3, ~@5 f#4@2 ~", AF: "[g#3,c#4]@3 g#3 b3@3 g#3 b3@4 c#4@4",
  AG: "[b3,d#4,f#4]@2 [b3,d#4,f#4] [b3,d#4,f#4]@3 [b3,d#4]@2", AH: "e4!2 e4@2 d#4!2 d#4@2, g#3!2",
  AI: "c#4!2 c#4@14, [e3,a3]", AJ: "[b3,d#4,f4] [b3,d#4,f#4] [b3,d#4,g#4] [b3,d#4,f#4]",
  AK: "[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,g#4] [a#3,c#4,f#4]", AL: "[e4,g#4,b4] [g#3,b3,e4]!3",
  AM: "[[g#3,b3,d#4]@2 [g#3,b3,c#4]@2 d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2 d#4!2 [g#3,b3,e4]@2, ~@4 g#3@2 ~ [g#3,b3]@5 [g#3,b3]@2 ~@2]/2", // G#m C#7 E G#m
  AN: "[[e4,g#4,b4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4] d#4@3 c#4@2 b3!2 [g#3,b3,c#4] d#4@3 c#4@2 d#4!2 [g#3,b3,e4]@2, ~@7 [g#3,b3]@5 g#3@2 ~ [g#3,b3]@5 [g#3,b3]@2 ~@2]/3", // E C#7 E G#m
  AO: "[b3,d#4,f4]@4 [b3,d#4,f#4]@4 [b3,d#4,f4]@3 ~ [d#4,f#4]@4, ~@11 b3@5", // Fm7b5 B Fm7b5 D#m
  AP: "[[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,f4] f#4 f4 [a#3,c#4,f#4] [a#3,c#4,g#4] [a#3,c#4,f#4], ~@12 [a#3,c#4]@7 ~@13]/2", // A#m F# A#m F# A#m7 F# A#m
})).s("gm_distortion_guitar").gain(0.22).pan(1)

// chords · vibraphone
const vibraphone = note(`<
  ~@8 A B C D E F G@2 H@3 ~@16 I B J D K L M N O B J D P Q R S T@2 U ~@15 A B C D E L V W@2 B C D E F X@2 B C D E Y@3 B
  C D E Y@3 Z C AA@2
>`.pickRestart({
  A: "~@8 f#4!2 ~ f#4!3 ~ f#4", B: "[b3,d#4,f4] [b3,d#4,f#4] [b3,d#4,f4] [b3,d#4,f#4]",
  C: "[b3,d#4,f4] [b3,d#4,f#4] [b3,d#4,g#4] [b3,d#4,f#4]", D: "[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,f4] [a#3,c#4,f#4]",
  E: "[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,g#4] [a#3,c#4,f#4]", F: "[e4,g#4,b4] [g#3,b3,e4]!3",
  G: "[[g#3,b3,d#4]@2 [g#3,b3,c#4]@2 d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2 b3!2 [g#3,b3,c#4] b3, ~@4 g#3@2 ~ [g#3,b3]@5 g#3@2 ~@2]/2", // G#m C#7 G#m
  H: "[b3@4 [b3,d#4,f#4]@3 [b3,d#4,f#4] [b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@6 [b3,d#4,f#4]@3 [b3,d#4,f#4] [b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@6 [b3,d#4,f#4]@3 [b3,d#4,f#4] [b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@2]/3", // B E B E B E B
  I: "f#4!2 ~ f#4!3 ~ f#4 [b3,d#4,f4]@4 [b3,d#4,f#4]@4", J: "[b3,d#4,g#4] [b3,d#4,f#4] [a#3,c#4,f4] [a#3,c#4,f#4]",
  K: "[a#3,c#4,g#4] [a#3,c#4,f#4] [a3,c#4,f4] [a3,c#4,f#4]", L: "[a3,c#4,f4] [a3,c#4,f#4] [a3,c#4,f4] [a3,c#4,f#4]",
  M: "[a3,c#4,g#4] [a3,c#4,f#4] [e4,g#4,b4] [g#3,b3,e4]", N: "~ e4!2 d#4@3 c#4!2, ~ [g#3,b3]@2 [g#3,b3]@5",
  O: "d#4!2 [a#3,c#4,e4]@2 [b3,d#4,f4]@2 [b3,d#4,f#4]@2, [g#3,b3] ~@3", // A#dim Fm7b5 B G#m
  P: "[a#3,c#4,g#4] [a#3,c#4,f#4] [e4,g#4,b4] [g#3,b3,e4]", Q: "[g#3,b3,e4]!2 [g#3,b3,d#4] [g#3,b3,c#4]",
  R: "d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2, g#3@2 ~ [g#3,b3]@5", // C#7 G#m
  S: "b3@2 b3@2 [g#3,b3,c#4]@2 b3@2 b3@4 [b3,d#4,f#4]@3 [b3,d#4,f#4], g#3 ~@3", // C#7 B
  T: "[b3,e4,g#4]@2 [b3,e4,g#4]@2 ~@2 [b3,d#4,f#4]@6 [b3,d#4,f#4]@3 [b3,d#4,f#4]", // E B
  U: "[b3,e4,g#4]!2 ~ [b3,d#4,f#4] ~@4", V: "[a3,c#4,f4] [a3,c#4,f#4] [a3,c#4,g#4] [a3,c#4,f#4]",
  W: "[[e4,g#4,b4]@2 [g#3,b3,e4]@2 ~ e4!2 d#4@3 c#4!2 d#4!2 [a#3,c#4,e4]@2, ~@5 [g#3,b3]@2 [g#3,b3]@5 [g#3,b3]@2 ~@2]/2", // E A#dim G#m
  X: "[[g#3,b3,d#4]@2 [g#3,b3,c#4]@2 d#4 b3 [g#3,b3,c#4] d#4@3 c#4@2 d#4!2 [g#3,b3,e4]@2, ~@4 g#3@2 ~ [g#3,b3]@5 [g#3,b3]@2 ~@2]/2", // G#m C#7 E G#m
  Y: "[[e4,g#4,b4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4] d#4@3 c#4@2 b3!2 [g#3,b3,c#4] d#4@3 c#4@2 d#4!2 [g#3,b3,e4]@2, ~@7 [g#3,b3]@5 g#3@2 ~ [g#3,b3]@5 [g#3,b3]@2 ~@2]/3", // E C#7 E G#m
  Z: "[b3,d#4,f4]@4 [b3,d#4,f#4]@4 [b3,d#4,f4]@3 ~ [d#4,f#4]@4, ~@11 b3@5", // Fm7b5 B Fm7b5 D#m
  AA: "[[a#3,c#4,f4] [a#3,c#4,f#4] [a#3,c#4,f4] f#4 f4 [a#3,c#4,f#4] [a#3,c#4,g#4] [a#3,c#4,f#4], ~@12 [a#3,c#4]@7 ~@13]/2", // A#m F# A#m F# A#m7 F# A#m
})).s("gm_vibraphone").gain(0.27).pan(0.7)

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

// drums · snare
const snare = s("sd").struct(`<
  A B C@2 D@2 E@2 F G@6 H G@3 I G@5 F G F G F G J K G L K G@6 J K G@6 M G@2 N O G@4 J K J K J K G@3 P Q ~@4 R S ~ T G@6
  F G@5 U F G@6 F G@4
>`.pickRestart({
  A: "~@7 x!2 ~ x ~@5", B: "x!2", C: "~ x ~@7 x ~@6", D: "~ x ~@3 x ~@2", E: "~@3 x ~@7 x ~@4",
  F: "x ~@3 x ~@3 x!3 ~ x!3 ~", G: "~ x ~ x", H: "x ~@3 x ~@3 x ~@2 x!4 ~", I: "~@9 x ~@3 x ~@2", J: "~ x!3",
  K: "x!3 ~ x!3 ~@5 x ~@3", L: "x ~@7 x ~@2 x ~@4", M: "~@3 x!2 ~ x!2 ~@4 x ~@3", N: "~ x ~@2",
  O: "x ~@3 x!2 ~@6 x ~@3", P: "~ x!2 ~", Q: "x ~@2 x ~@4 x!3 ~ x!3 ~", R: "~@15 x", S: "x",
  T: "x!3 ~ x!3 ~ x!3 ~ x!3 ~", U: "x ~@3 x ~@6 x!4 ~",
})).gain(0.56)

// drums · clap
const clap = s("cp").struct("<~ A B@2 C@2 D@2 E@11 ~ E@14 F E@18 G ~ E@13 G H ~@8 E@25>".pickRestart({
  A: "x!2", B: "~ x ~@7 x ~@6", C: "~ x ~@3 x ~@2", D: "~@3 x ~@7 x ~@4", E: "~ x ~ x", F: "x ~@7 x ~@2 x ~@4",
  G: "~ x ~@2", H: "~@3 x ~@8 x ~@3",
})).gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<[~ x ~@2] ~@70 [~@2 x!2] x [~ x!3] x [~@8 x ~ x!2 ~@2 x!2] ~@27>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@9 A B A B A B A B A B C D B A B A B A B A B A@2 E A C F A E A E A E A E A E A E A E A E A G H A E A E A E A E A E A
  B A B ~@9 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
>`.pickRestart({
  A: "x!4", B: "x!3 ~", C: "x", D: "~ x ~@2 x ~@3 x ~@3 x ~@3", E: "x ~ x!2", F: "~@2 x!2", G: "x!2", H: "~ x",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@70 B C D C E C ~@26>".pickRestart({
  A: "~@3 x ~@12", B: "~@3 x!2 ~@6 x ~@4", C: "x", D: "~@3 x ~@7 x ~@4", E: "~@4 x ~@2 x ~ x ~ x ~@4",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@10 A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~@6 B ~ B ~@2 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@2 B ~ B ~ B ~ B ~ B ~ A ~ A
  ~@10 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@3 x", B: "~ x ~@2",
})).gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~@14 A@3 B@2 A C ~@3 A@3 ~ A D E ~ F A ~@9 F ~@4 F@3 D@2 F@2 ~@3 F@3 ~ G ~ H A ~ I A ~ A ~ A ~ A ~ A ~ A ~@4 A@3 ~@3
  A@4 ~ A ~ A@5 ~ A
>`.pickRestart({
  A: "x", B: "~ x ~@2", C: "~ x ~@14", D: "~@3 x", E: "x!2 ~@2", F: "~ x", G: "~ x!2 ~", H: "~ x!3", I: "x!2",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@70 [x!4]!8 ~@25>").gain(0.4)

// … 1 more lines

More by ABBA