Strudelify

Summer Night City

ABBA

KeyD minorTempo132 bpm
0:00/0:00
// Summer Night City — ABBA
// 132 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 8 "Fretless Bass" fretless bass (copy of ch 1 "Synth Bass 1" synth bass 1)
// note: Full arrangement: all 122 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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 · synth bass 1
const bass = note(`<
  ~@4 A B A C A B A C A B A C A D E A@2 D E A F G F H I G F H J K L M N O P Q O E R N S A B A C A B A C A D E A@2 T E U
  F V W H X G F H Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR S AS@2 AT@2 AU@3 AV AW@5 AX AY@4 AZ BA BB@4
  BC@8
>`.pickRestart({
  A: "d2 d3 d2 d3 d2 d3 d2 d3", B: "d2 d3 d2 d3 g2 a2 c3 d3", C: "d2 d3 d2 d3 f2 g2 c2 d2",
  D: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2", E: "c2 c3 c2 c3 c2 c3 c2 c3", F: "d2 d3 d2 d3 c2 c3 c2 c3",
  G: "bb1 bb2 bb1 bb2 g1 g2 g1 g2", H: "bb1 bb2 bb1 bb2 a1 a2 a1 a2", I: "d2@3 d3@3 d2@3 d3@3 c2@3 c3@3 c2@2 ~ c3@3",
  J: "g2@2 ~ g3@3 g2@3 g3@3 g2@3 g3@3 g2@3 g3@3", K: "eb2@3 eb3@3 eb2@3 eb3@3 eb2@3 eb3@3 eb2@2 ~ eb3@3",
  L: "f2@3 f3@3 f2@2 ~ f3@3 f2@3 f3@3 f2@3 f3@3", M: "g2@3 g3@2 ~ g2@3 g3@3 g2@3 g3@3 g2@3 g3@3",
  N: "g2 g3 g2 g3 g2 g3 g2 g3", O: "eb2 eb3 eb2 eb3 eb2 eb3 eb2 eb3", P: "f2 f3 f2 f3 f2 f3 f2 f3",
  Q: "g2@3 g3@3 g2@3 g3@3 g2@3 g3@2 ~ g2@2 ~ g3@3", R: "f2@2 ~ f3@3 f2@3 f3@3 f2@3 f3@3 f2@3 f3@3", S: "g2 ~@7",
  T: "bb1@3 bb2@3 bb1@2 ~ bb2@3 bb1@3 bb2@3 bb1@3 bb2@3", U: "d2@3 d3@3 d2@3 d3@3 d2@3 d3@2 d2@3 ~ d3@3",
  V: "bb1@2 bb2@3 ~ bb1@3 bb2@3 g1@3 g2@3 g1@3 g2@3", W: "d2@3 d3@3 d2@2 ~ d3@3 c2@3 c3@3 c2@2 ~ c3@3",
  X: "d2@3 d3@3 d2@3 d3@3 c2@3 c3@2 c2@3 ~ c3@3", Y: "g2@3 g3@3 g2@2 g3@3 ~ g2@3 g3@2 ~ g2@2 ~ g3@3",
  Z: "eb2@2 ~ eb3@3 eb2@3 eb3@3 eb2@3 eb3@3 eb2@3 eb3@3", AA: "f2@2 ~ f3@3 f2@3 f3@2 ~ f2@2 f3@3 ~ f2@3 f3@3",
  AB: "g2@2 ~ g3@3 g2@3 g3@2 ~ g2@3 g3@3 g2@2 ~ g3@2 ~", AC: "g2@2 g3@3 ~ g2@3 g3@3 g2@3 g3@3 g2@2 ~ g3@3",
  AD: "eb2@3 eb3@3 eb2@2 ~ eb3@3 eb2@3 eb3@3 eb2@2 ~ eb3@3", AE: "f2@3 f3@3 f2@3 f3@3 f2@2 ~ f3@3 f2@2 f3@3 ~",
  AF: "g2@3 g3@3 g2@3 g3@2 ~ g2@2 g3@3 ~ g2@3 g3@2 ~", AG: "g2@3 g3@2 g2@3 ~ g3@3 g2@3 g3@3 g2@3 g3@3",
  AH: "eb2@2 eb3@3 ~ eb2@3 eb3@3 eb2@2 eb3@3 ~ eb2@3 eb3@3", AI: "f2@3 f3@3 f2@3 f3@2 f2@3 ~ f3@3 f2@3 f3@3",
  AJ: "g2@3 g3@2 g2@3 g3@3 ~ g2@3 g3@3 g2@2 g3@3 ~", AK: "g2@3 g3@3 g2@2 g3@3 ~ g2@3 g3@2 g2@3 ~ g3@3",
  AL: "eb2@3 eb3@2 eb2@3 ~ eb3@3 eb2@2 eb3@3 eb2@3 ~ eb3@3", AM: "f2@2 f3@3 ~ f2@3 f3@3 f2@2 f3@3 ~ f2@2 f3@3 ~",
  AN: "g2@2 g3@3 ~ g2@3 g3@2 g2@3 ~ g3@2 g2@3 ~ g3@3", AO: "eb2@3 eb3@3 eb2@3 eb3@3 eb2@2 ~ eb3@3 eb2@2 eb3@3 ~",
  AP: "c2@2 ~ c3@3 c2@3 c3@3 c2@3 c3@3 c2@2 c3@3 ~", AQ: "f2@3 f3@3 f2@3 f3@2 ~ f2@3 f3@3 f2@3 f3@3",
  AR: "g2@2 g3@3 ~ g2@2 g3@3 ~ g2@3 g3@2 ~ g2@2 ~ g3@3",
  AS: "[d2@3 d3@3 d2@3 d3@2 d2@3 ~ d3@3 d2@2 d3@3 d2@3 d3@3 ~ d2@2 d3@3 ~ g2@3 a2@3 c3@2 d3@3 ~]/2",
  AT: "[d2@3 d3@3 d2@2 d3@3 ~ d2@3 d3@2 d2@3 ~ d3@2 d2@3 ~ d3@2 d2@3 d3@3 ~ f2@3 g2@2 c2@3 ~ d2@3]/2",
  AU: "[d2@2 d3@3 ~ d2@3 d3@3 d2@2 d3@3 d2@3 ~ d3@2 d2@3 d3@3 ~ d2@3 d3@3 g2@3 a2@3 c3@3 d3@2 d2@3 ~ d3@3 d2@2 d3@3 d2@3 ~ d3@2 d2@3 d3@3 ~]/3",
  AV: "d2@3 d3@2 d2@3 d3@3 ~ f2@3 g2@3 c2@2 d2@3 ~",
  AW: "[d2@2 d3@3 d2@3 d3@3 ~ d2@2 d3@3 d2@3 ~ d3@2 d2@3 d3@3 d2@3 ~ d3@3 g2@2 a2@3 c3@3 ~ d3@2 d2@3 d3@3 ~ d2@3 d3@2 d2@3 d3@3 ~ d2@2 d3@3 d2@3 ~ d3@3 d2@2 d3@3 f2@3 ~ g2@3 c2@2 d2@3 d2@3 ~ d3@3 d2@2 d3@3 ~ d2@3 d3@2 d2@3 d3@3 ~]/5",
  AX: "d2@2 d3@3 d2@3 d3@3 ~ g2@3 a2@2 c3@3 ~ d3@3",
  AY: "[d2@2 d3@3 d2@3 ~ d3@2 d2@3 d3@3 d2@3 ~ d3@2 d2@3 d3@3 ~ d2@2 d3@3 f2@3 g2@3 ~ c2@3 d2@2 d2@3 d3@3 ~ d2@2 d3@3 d2@3 ~ d3@2 d2@3 d3@3 d2@3 ~ d3@2 d2@3 d3@3 g2@3 ~ a2@3 c3@2 d3@3 ~]/4",
  AZ: "d2@2 d3@3 d2@3 d3@3 ~ d2@2 d3@3 d2@3 d3@3 ~", BA: "d2@2 d3@3 d2@3 ~ d3@3 f2@2 g2@3 c2@3 ~ d2@3",
  BB: "[d2@2 d3@3 d2@3 d3@3 d2@3 d3@3 ~ d2@2 d3@3 d2@3 d3@3 ~ d2@2 d3@3 g2@3 a2@3 ~ c3@2 d3@3 d2@3 ~ d3@2 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 ~ f2@3 g2@2 c2@3 d2@3 ~]/4",
  BC: "[d2@2 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 ~ d3@2 d2@3 d3@3 d2@3 d3@3 g2@3 a2@3 c3@3 d3@3 d2@3 d3@3 ~ d2@2 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 f2@3 ~ g2@2 c2@3 d2@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 ~ g2@2 a2@3 c3@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 d2@3 d3@3 ~ d2@2 d3@3 f2@3 g2@3 ~ c2@2 d2@3 ~]/8",
})).s("gm_synth_bass_1").gain(0.27)

// other · brass section · "Brass 1"
const brass_section = note("<~@24 A B C D E F G ~@30 H I J K L M N ~@54>".pickRestart({
  A: "gb4 ~@2 c4 ~@2 d4 ~@2 gb4 ~@5 c4 ~@2 d4 ~@2 gb4 ~@2", B: "g4 ~@2 c4 ~@2 d4@2 ~ g4 ~@5 c4@2 ~ d4 ~@2 g4@2 ~",
  C: "a4 ~@2 d4@2 ~ gb4 ~@2 a4 ~@5 d4 ~@2 gb4 ~@2 a4 ~@2",
  D: "bb4 ~@2 d4 ~@2 gb4 ~@2 bb4 ~@2 a4 ~@2 g4 ~@2 gb4 ~@2 eb4@2 ~",
  E: "d4@2 ~ gb4 ~@2 c4 ~@2 d4@2 ~@4 c4 ~@2 d4 ~@2 gb4 ~@2", F: "g4 ~@2 bb4 ~@2 d4 ~@2 g4 ~@5 c4 ~@2 d4@2 ~ bb4 ~@2",
  G: "a4 ~@2 c5 ~@2 gb4 ~@2 a4 ~@2 d4 ~@2 gb4@2 ~ c4@2 ~ gb4 ~@2",
  H: "gb4@2 ~ c4 ~@2 d4 ~@2 gb4 ~@5 c4 ~@2 d4 ~@2 gb4 ~@2", I: "g4 ~ c4@2 ~@2 d4 ~@2 g4@2 ~@4 c4 ~@2 d4 ~@2 g4 ~@2",
  J: "a4 ~@2 d4 ~@2 gb4@2 ~ a4 ~@5 d4 ~@2 gb4@2 ~ a4 ~@2",
  K: "bb4 ~@2 d4 ~@2 gb4 ~@2 bb4 ~@2 a4 ~@2 g4@2 ~ gb4 ~@2 eb4 ~@2",
  L: "d4 ~@2 gb4 ~@2 c4 ~@2 d4 ~@5 c4 ~ d4@2 ~@2 gb4 ~@2", M: "g4@2 ~ bb4 ~@2 d4 ~@2 g4 ~@5 c4 ~@2 d4 ~@2 bb4 ~@2",
  N: "a4 ~@2 c5 ~@2 gb4 ~@2 a4@2 ~ d4 ~@2 gb4 ~@2 c4 ~@2 gb4 ~@2",
})).s("gm_brass_section").gain(0.27).pan(0.2)

// other · synth strings 1 · "Synth Strings"
const synth_strings_1 = note(`<
  ~@9 A ~ B ~ A ~ C@2 D@2 E@2 F@2 G@2 H I J K H K L ~@3 M@2 ~@2 N@2 ~@2 O@2 ~ P@2 B ~ Q@2 R@2 S@2 T@2 U@2 V@2 W K J K W
  I L ~@3 X@2 ~@2 X@2 ~ Y@3 ~@2 Z@2 ~@2 AA@2 ~ AB ~ AC ~ AD ~ AE ~ AF ~ AG ~ AF ~ AH ~ AI ~ AJ ~ AK ~ AL ~ AM ~ AN ~ AM
  ~ AO
>`.pickRestart({
  A: "~@4 [g3,g4] [a3,a4] [c4,c5] [d4,d5]", B: "~@12 [g3,g4]@2 ~ [a3,a4]@3 [c3,c4]@3 [d3,d4]@3",
  C: "[~@12 [g3,g4]@3 [a3,a4]@3 [c3,c4]@3 [d3,d4]@5 ~@22]/2", D: "[~@4 [g3,g4] [a3,a4] [d4,d5] [c4,c5]@5 ~@4]/2",
  E: "[~@4 [g3,g4] [a3,a4] [c4,c5] [d4,d5]@4 ~@5]/2", F: "[~@12 [g3,g4]@3 [a3,a4]@3 [d4,d5]@3 [c4,c5]@16 ~@11]/2",
  G: "[~@4 [g3,g4] [a3,a4] [c4,c5] [d4,d5]@5 [c4,c5]@4]/2", H: "[bb3,bb4]@12 [g3,g4]@11 ~",
  I: "[d4,d5]@11 ~ [c4,c5]@12", J: "[bb3,bb4] [a3,a4]", K: "[d4,d5] [c4,c5]", L: "[bb3,bb4]@12 [a3,a4]@11 ~",
  M: "[[f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@11 ~@16]/2", // F G F G F G
  N: "[[f3,f4] [g3,g4] ~ [f3,f4] [g3,g4] ~ [f3,f4] [g3,g4]@3 ~@6]/2", // F G F G F G
  O: "[[f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@10 ~@17]/2", // F G F G F G
  P: "[~@12 [g3,g4]@3 [a3,a4]@3 [c4,c5]@3 [d4,d5]@5 ~@22]/2", // G A C D
  Q: "[~@12 [g3,g4]@3 [a3,a4]@3 [c4,c5]@3 [d4,d5]@7 ~@20]/2", R: "[~@4 [g3,g4] [a3,a4] [c3,c4] [d3,d4]@2 ~@7]/2",
  S: "[~@12 [g3,g4]@3 [a3,a4]@3 [d4,d5]@3 [c4,c5]@13 ~@14]/2", // G A D C
  T: "[~@12 [g3,g4]@3 [a3,a4]@3 [c4,c5]@3 [d4,d5]@11 ~@16]/2", // G A C D
  U: "[~@12 [g3,g4]@3 [a3,a4]@3 [d4,d5]@3 [c4,c5]@14 ~@13]/2", // G A D C
  V: "[~@12 [g3,g4]@3 [a3,a4]@2 [c4,c5]@3 ~ [d4,d5]@15 [c4,c5]@12]/2", W: "[bb3,bb4] [g3,g4]",
  X: "[[f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@13 ~@14]/2", // F G F G F G
  Y: "[~@8 f3 [g3,g4] ~ [f3,f4] [g3,g4] ~ [f3,f4] [g3,g4]@4 ~@5, ~@23 f4@4 ~@45]/3", // G F G F G
  Z: "[[f3,f4]@3 [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@4 ~ [f3,f4]@4 [g3,g4]@10 ~@17]/2", // F G F G F G
  AA: "[[f3,f4]@3 [g3,g4]@3 ~@2 [f3,f4]@3 ~ [g3,g4]@3 ~@3 [f3,f4]@3 [g3,g4]@9 ~@18]/2", // F G F G F G
  AB: "~@12 [g3,g4]@3 [a3,a4]@3 [c4,c5]@2 [d4,d5]@4", AC: "~@12 [g3,g4]@3 [a3,a4]@2 [c3,c4]@3 ~ [d3,d4]@3",
  AD: "~@11 [g3,g4]@3 ~ [a3,a4]@3 [c4,c5]@2 [d4,d5]@4", // G A C D
  AE: "~@12 [g3,g4]@3 [a3,a4]@2 ~ c3@2 [d3,d4]@3 ~, ~@17 c4@3 ~@4", // G A D
  AF: "~@12 [g3,g4]@2 [a3,a4]@3 [c4,c5]@3 ~ [d4,d5]@3", AG: "~@11 [g3,g4]@3 ~ [a3,a4]@3 [c3,c4]@2 [d3,d4]@3 ~",
  AH: "~@11 [g3,g4]@3 [a3,a4]@3 ~ [c3,c4]@2 [d3,d4]@3 ~", AI: "~@11 [g3,g4]@3 ~ [a3,a4]@2 [c4,c5]@3 [d4,d5]@4",
  AJ: "~@12 g3@2 [a3,a4]@3 [c3,c4]@3 ~ d3@3, ~@11 g4@3 ~@6 d4@3 ~", // A C
  AK: "~@11 [g3,g4]@3 [a3,a4]@3 ~ [c4,c5]@2 [d4,d5]@4", AL: "~@12 [g3,g4]@3 [a3,a4]@2 [c3,c4]@3 [d3,d4]@3 ~",
  AM: "~@11 [g3,g4]@3 [a3,a4]@3 [c4,c5]@3 [d4,d5]@4", AN: "~@11 [g3,g4]@3 ~ [a3,a4]@2 [c3,c4]@3 [d3,d4]@3 ~",
  AO: "~@11 [g3,g4]@3 [a3,a4]@3 ~ c3@2 [d3,d4]@3 ~, ~@17 c4@3 ~@4", // G A D
})).s("gm_synth_strings_1").gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B C A@2 B A C A B A@3 D A@2 E
  B C A@2 B F A G H I J A K L M@2 N O P Q M R S G T M U V O W X W Y T Z W@3 AA T W@2 Z W@3 AA
>`.pickRestart({
  A: "x!4", B: "x ~@5 x ~@3 x ~ x ~@2 x ~@2 x ~@5", C: "x ~@5 x ~@5 x ~@4 x ~@6", D: "x ~@5 x ~@3 x ~ x ~ x ~@2 x ~@6",
  E: "x ~@5 x ~@4 x ~@6 x ~@5", F: "x ~@4 x ~@6 x ~@5 x ~@5", G: "x ~@4 x ~@6 x ~@4 x ~@6", H: "x ~@2 x ~ x!3 ~ x ~@2",
  I: "x ~@5 x ~@5 x ~@4 x ~@5 x", J: "~@6 x ~@4 x ~@6 x ~@5", K: "x ~@4 x ~@4 x ~ x ~@2 x ~ x ~@6",
  L: "x ~@4 x ~@6 x ~@5 x ~@4 x", M: "~@6 x ~@4 x ~@6 x ~@4 x", N: "~@6 x ~@5 x ~@4 x ~@6",
  O: "x ~@4 x ~@6 x ~@4 x ~@5 x", P: "~@5 x ~@4 x ~ x ~ x ~@2 x ~@6", Q: "x ~@5 x ~@4 x ~@5 x ~@5 x",
  R: "~@6 x ~@4 x ~@5 x ~@6", S: "x ~@4 x ~@4 x ~ x ~ x ~@2 x ~@6", T: "x ~@4 x ~@5 x ~@5 x ~@5 x",
  U: "~@5 x ~@4 x!2 ~@3 x ~ x ~@5 x", V: "~@5 x ~@6 x ~@4 x ~@6", W: "~@5 x ~@5 x ~@5 x ~@5 x",
  X: "~@6 x ~@3 x!2 ~@2 x ~@3 x ~@4 x", Y: "~@5 x ~@5 x ~@5 x ~@6", Z: "~@5 x ~@4 x!2 ~@2 x ~@2 x ~@5 x",
  AA: "~@5 x ~@4 x!2 ~@2 x ~@2 x ~@6",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A@3 B A@3 B C A@3 C A@3 C@3 D C@3 D A@3 E A@3 B A@3 B ~ A@3 B A@3 B C A@3 C A@2 F C@3 D G C@2 D A@3 E A@3 B A@3 H
  A I A J A I@2 K ~ A I@2 L F A F M I@2 A N I@3 O I@3 M I@3 M I@3 M I@3 M
>`.pickRestart({
  A: "~ x ~ x", B: "~@6 x ~@11 x ~@2 x!2 ~", C: "~@2 x ~@3 x!2", D: "~@2 x ~@2 x!3", E: "~@3 x ~@5 x ~ x",
  F: "~@6 x ~@10 x ~@6", G: "~@6 x ~@10 x ~@3 x ~@2", H: "~@5 x ~@12 x ~@3 x ~", I: "~@5 x ~@11 x ~@6",
  J: "~@6 x ~@10 x ~@3 x!2 ~", K: "~@5 x ~@12 x ~@2 x!2 ~", L: "~@5 x ~@11 x ~@3 x!2 ~", M: "~@5 x ~@11 x ~@2 x ~ x ~",
  N: "~@6 x ~@10 x ~@2 x ~ x ~", O: "~@3 x ~@5 x!3",
})).gain(0.3)

// drums · clap
const clap = s("cp").struct("<~@16 A@28 ~@9 A@7 B A@4 B A@14 C A@3 B A@4 ~@33>".pickRestart({
  A: "~ x ~ x", B: "~@6 x ~@10 x ~@6", C: "~@5 x ~@12 x ~@5",
})).gain(0.42)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~ A B C D A B C D A B C D A B C E
  A F C D G B C D H B C D A I J K L M C D H N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ
  AR AS AT AQ AU AV AW AQ AR AX
>`.pickRestart({
  A: "x ~ x!2 ~ x!3", B: "x!2 ~ x!2 ~@2 x ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2", C: "x!4 ~@2 x!2",
  D: "x!2 ~ x!2 ~@2 x ~ x ~@2 x!2 ~ x ~@2 x ~@2 x ~@2", E: "x!2 ~ x!2 ~@2 x ~ x ~@2 x!2 ~ x ~ x ~@3 x ~@2",
  F: "x!3 ~ x ~@2 x ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2", G: "x ~@5 x ~@2 x ~@5 x ~ x ~@3 x ~@2",
  H: "x ~@5 x ~ x ~@6 x ~@2 x ~@2 x ~@2", I: "x!2 ~ x!2 ~@2 x ~ x ~ x ~@3 x ~@2 x ~@2 x ~@2",
  J: "x ~@2 x ~@2 x ~@2 x ~@8 x ~ x ~@3", K: "x!2 ~ x!2 ~@2 x ~ x ~@2 x!3 ~@3 x ~@2 x ~@2",
  L: "x ~@4 x ~@3 x ~@5 x ~@2 x ~@2 x ~@2", M: "x!2 ~ x!2 ~@2 x ~ x ~@2 x ~ x ~@3 x ~@2 x ~@2",
  N: "x!2 ~ x!2 ~@2 x ~ x ~@2 x ~@2 x ~ x ~@3 x ~@2", O: "x ~ x ~@3 x ~@2 x ~@8 x ~ x ~@3",
  P: "x!3 ~ x ~@2 x ~ x ~@2 x!2 ~ x ~ x ~@3 x ~ x", Q: "~@6 x ~ x ~@6 x ~@2 x ~ x ~@3",
  R: "x!2 ~ x!2 ~@2 x!2 ~@3 x ~@2 x ~ x ~@2 x ~@3", S: "x ~@2 x ~ x ~@3 x ~@7 x ~@3 x ~@2",
  T: "x!2 ~ x!2 ~@2 x!2 ~@3 x!3 ~@3 x ~@2 x ~@2", U: "~@23 x", V: "~@6 x ~ x ~@6 x ~@2 x ~ x ~@2 x",
  W: "~ x!2 ~ x ~@2 x!2 ~@3 x ~@2 x ~ x ~@2 x ~@3", X: "x ~@2 x ~ x ~@2 x ~@8 x ~@3 x ~ x",
  Y: "~ x!2 ~ x ~@2 x!2 ~@3 x!3 ~@2 x ~@3 x ~@2", Z: "x ~@5 x ~@2 x ~@4 x ~@2 x ~@3 x ~ x",
  AA: "~ x!2 ~ x ~@2 x!2 ~@2 x ~@3 x ~@2 x ~ x ~@2 x", AB: "~@3 x ~@2 x ~ x ~@9 x ~ x ~@3",
  AC: "x!2 ~ x!2 ~@2 x!2 ~@3 x!2 ~ x ~ x ~@2 x ~@3", AD: "x ~@4 x ~@2 x ~@5 x ~@2 x ~@3 x ~@2",
  AE: "x!3 ~ x ~@2 x ~ x ~ x ~@2 x ~@2 x ~@2 x ~@2 x", AF: "~@2 x ~@3 x ~ x ~@9 x ~ x ~@2 x",
  AG: "~ x ~ x!2 ~@2 x!2 ~@2 x ~ x ~ x ~@2 x ~ x ~@2 x", AH: "~@5 x ~@2 x ~@5 x ~@2 x ~@2 x ~@3",
  AI: "x!3 ~ x ~@2 x!2 ~@3 x ~ x ~@2 x ~@3 x ~@2", AJ: "x ~ x ~@2 x ~@3 x ~@7 x ~@2 x ~@2 x",
  AK: "~ x!2 ~ x ~@2 x!2 ~@2 x ~ x!2 ~@3 x ~ x ~@2 x", AL: "~@5 x ~@2 x ~@6 x ~ x ~@2 x ~@2 x",
  AM: "~ x ~ x!2 ~@2 x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~@3", AN: "x ~ x ~@2 x ~@2 x ~@8 x ~@2 x ~@2 x",
  AO: "~ x!2 ~ x ~@2 x ~ x ~ x ~ x!2 ~@2 x ~@3 x ~ x", AP: "~@5 x ~@2 x ~@5 x ~@3 x ~ x ~@2 x",
  AQ: "~ x!2 ~ x ~@2 x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x", AR: "~@2 x ~@2 x ~@2 x ~@8 x ~@2 x ~@2 x",
  AS: "~ x!2 ~ x ~@2 x!2 ~@3 x!3 ~@2 x ~@2 x ~@3", AT: "x ~@4 x ~@2 x ~@5 x ~@2 x ~@2 x ~@2 x",
  AU: "~@2 x ~@3 x ~ x ~@8 x ~@2 x ~@2 x", AV: "~ x!2 ~ x ~@2 x!2 ~@2 x ~ x!2 ~@2 x ~@2 x ~@2 x",
  AW: "~@5 x ~@2 x ~@5 x ~@2 x ~@2 x ~@2 x", AX: "~ x!2 ~ x ~@2 x!2 ~@2 x ~ x!2 ~@2 x ~@2 x ~@3",
})).gain(0.42)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@4 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@2 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~
  A ~ B ~ A ~ B ~ A ~ C ~ A ~ B ~ A ~ D ~ A ~ C ~ E ~ B ~@2 E ~ B ~ F ~ D ~ G ~ H ~ A ~ H ~ F ~ H ~ F ~ H ~ F ~ H ~ F ~
  H ~
>`.pickRestart({
  A: "~ x ~@2 x ~@3", B: "~@4 x!2 ~@2", C: "~@6 x!2 ~@4", D: "~@11 x ~@3 x ~@8", E: "~@3 x ~@7 x ~@12",
  F: "~@2 x ~@8 x ~@12", G: "~ x ~@4 x ~@5", H: "~@11 x ~@2 x ~@9",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@32 A@12 ~@25 B A C A@3 B C A@3 D A@2 E F G H C I ~@33>".pickRestart({
  A: "x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~", B: "x!2 ~ x!2 ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~",
  C: "x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!3 ~ x ~ x!2 ~ x!2 ~", D: "x!2 ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~",
  E: "x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!3 ~ x ~", F: "x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!3 ~ x ~ x!2 ~",
  G: "x!2 ~ x!2 ~ x!3 ~ x!2 ~ x ~ x!2 ~ x!2 ~ x!2 ~", H: "x!2 ~ x!2 ~ x!3 ~ x ~ x!2 ~ x!2 ~ x!3 ~ x ~",
  I: "x!2 ~ x!2 ~ x!3 ~ x ~ x!3 ~ x ~ x!2 ~ x!2 ~",
})).gain(0.3)

stack(bass, brass_section, synth_strings_1, kick, snare, clap, hihat, hihat_soft, tambourine)

More by ABBA