Strudelify
Dancing Queen cover art

1976 · Arrival

Dancing Queen

ABBA

KeyA majorTempo100 bpm
0:00/0:00
// Dancing Queen — ABBA
// 100 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  ~@2 A B A C A C D E F G H I J K L M N@2 O P O Q R@2 S T O U O V W X Y Z AA AB A AC A C L B D AD AE AF AG AH AI AJ AK
  AL AK AM AN AO AP C O AQ AR@2 AS AT AU AV O AW O C O C D E AX AY AZ BA BB BC O C O C O C O C O C O C O C O BD
>`.pickRestart({
  A: "a1@2 ~ a1 ~@2 a1@2 ~ a1 e2 f#2 a2@3 ~", B: "a1@2 ~ a1 ~@2 a1@4 e1!2 f#1@2 g#1@2",
  C: "a1@2 ~ a1 ~@2 a1@2 ~ a1 e1@2 f#1@2 g#1@2", D: "a1@2 ~ a1 ~@2 a1@3 a1 a1@2 g#1@3 ~",
  E: "f#1@2 ~ f#1 ~@2 e1@3 ~ e1 ~ e1 f#1 g#1@2", F: "e1@2 ~ e1 ~@2 e1@2 ~ e1 e2 ~ e2 b1@2 c2",
  G: "c#2@2 ~ c#2 ~@2 c#2@2 ~ c#2 d2@2 d#2!2 e2 f2", H: "f#2@3 f#2 ~@2 f#2@2 ~ f#2!2 ~ f#2 e2@3",
  I: "d#2@2 ~ d#2 ~@2 d#2@2 ~ d#2 b2 ~ b2 d#2@3", J: "d2@2 ~ d2 ~@2 d2@4 d2@2 ~ c#2@3",
  K: "b1@2 ~ b1 ~@2 b1@3 ~ b1@2 e1@2 f#1@2", L: "a1@2 ~ a1 ~@2 a1@4 e2 f#2 a2@3 ~",
  M: "a1@2 ~ a1@2 ~ a1@2 ~ a1 e1!2 f#1@2 g#1@2", N: "a1@2 ~ a1 e2 f#2 a2@2 ~ a1 a1@2 a1@2 ~@2",
  O: "a1@2 ~ a1 ~@2 a1@3 ~ a1@2 e2 f#2 a2@2", P: "a1@2 ~@4 a1@3 e1@3 f#1@2 g#1@2",
  Q: "f#2@2 ~ f#2 ~@2 f#2@4 c#2 ~ f#2 e2 f#1 ~", R: "e1@2 ~ e1 ~@2 g#1@4 e2 ~ e2 f#2 a2 ~",
  S: "e2@2 ~ f#2 ~@2 f#2@4 e2 f#2 e2 f#2 f#1 ~", T: "f#1@2 ~ f#1 ~@2 f#1@3 ~ f#1!2 f#1@2 g#1@2",
  U: "a1@2 ~ a1 ~@2 a1@3 e1@3 f#1@2 g#1@2", V: "f#2@2 ~ f#2 ~@2 f#2@3 ~ f#2 e2 f#2@2 f#1@2",
  W: "e2@2 ~ e1 ~@2 e2@3 ~ e2 f#2 a2@2 d3@2", X: "e2@2 ~ e2 ~@2 b1@4 e2 ~ e2@2 b1 c#2",
  Y: "e2@2 ~ f#2 ~@2 f#2@4 a2@2 f#2 ~ f#2@2", Z: "f#1@2 ~ f#1 ~@2 f#1@4 f#2 ~ f#2@2 f#1@2",
  AA: "b1@2 ~ b1 ~@2 b1@2 ~ b1!3 b1@2 f#1@2", AB: "e1@2 ~ e1 ~@2 e1@3 ~ e1 f#1 g#1@2 f#1@2",
  AC: "a1@2 ~ a1 ~@2 a1@3 e1!2 ~ f#1@2 g#1@2", AD: "f#1@2 ~ f#1 ~@2 e1@2 ~ e1@3 e1 f#1 g#1@2",
  AE: "e1@2 ~ e1!2 ~ e1@2 ~ e1 e2 b1 e2@2 b1 c2", AF: "c#2@2 ~ c#2 ~@2 c#2@2 ~ c#2 d#2!2 e2!3 f2",
  AG: "f#2@2 ~ f#2!2 ~ f#2@2 ~ f#2!3 f#2@2 e2@2", AH: "d#2@2 ~ d#2!2 ~ d#2@2 ~ d#2!3 d#2@2 ~ d#2",
  AI: "d2@2 ~ d2 ~@2 d2@3 ~ d2 ~ d2 c#2@3", AJ: "b1@2 ~ b1 ~@2 b1@3 f#1 b1!2 e1@2 f#1@2",
  AK: "a1@2 ~ a1 ~@2 a1@2 ~ a1!2 ~ e2 f#2 a2@2", AL: "a1@2 ~ a1 ~@2 a1@2 ~ a1 e1!2 f#1@2 g#1!2",
  AM: "a1@2 ~ a1 ~@2 a1@3 a1 a1@2 e1@2 f#1@2", AN: "a1@2 ~ a1 ~@6 e2 f#2 a2@2 a1 ~",
  AO: "a1@2 ~ a1 ~@2 a1@3 ~ e2 f#2 a2@2 g#1 ~", AP: "a1@2 ~ a1 ~@2 a1@2 ~ a1 a1@2 e2 f#2 a2@2",
  AQ: "f#2@2 ~ f#2 ~@2 f#2@3 ~ f#2 c#2 f#2@2 g#1@2", AR: "e1@2 ~ e1 g#1@2 e2@4 e2!3 g#2 b2 ~",
  AS: "e1@2 ~ f#1@2 e2 f#2 ~", AT: "f#2@2 ~ f#2 ~@2 f#2@2 ~@2 f#2@3 c#2@3", AU: "b1@5 ~ b1@2 b2 f#2 d2@2 d2@2 g#1@2",
  AV: "e1@4 ~ e1 e2 d2@2 e2 d2@2 ~ d2 ~ g#1", AW: "a1@2 ~ a1 ~@2 a1@2 ~ e1!3 f#1@2 g#1@2",
  AX: "e1@2 ~ e1 ~@2 e1@2 ~ e1 e2 b1 e2 b1@3", AY: "c#2@2 ~ c#2 ~@2 c#2@2 ~ c#2 d2 c#2 d#2 e2 f2@2",
  AZ: "f#2@2 ~ f#2 ~@2 f#2@4 a2 c#3 a2@2 a#2 b2", BA: "d#2@2 ~ d#2 ~@2 d#2@2 ~ d#2 b2 d#2 b2 d#2@3",
  BB: "d2@2 ~ d2 ~@2 d2@3 d3 d2@2 d2 c2@3", BC: "b1@2 ~ b1 ~@2 b1@3 f#1 b1@2 b1@2 e2@2",
  BD: "a1@3 a1 ~@2 a1@2 ~ a1 e1@2 f#1@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · piano · "Bright Piano"
const piano = note(`<
  ~ A B C D C E F G H I J K L M N O M P@2 Q R S T U@2 V W X Y X Z AA@2 AB AC AD AE AF M E AG E C AH AI I J K AJ M@2 E M
  AF M P@2 Q AK Q T AA@2 AL AC AM AE AN C D M E AO AP AI AQ J K AR M@2 E M E M E M E AS E M E M E M E AT
>`.pickRestart({
  A: "~@12 [a5,b5,c6,d6,e6,f6] [b4,c5,d5,e5,f5,g5] [b3,c4,d4,e4,f4,g4,a4] [d3,e3,f3,g3,a3]", // Dm7 Cmaj7 Bm7b5 Dm
  B: "~ [a3,c#4,e4,a4] ~@2 [a3,e4,a4] ~@2 [a3,c#4,e4]@2 ~ [a3,c#4,e4,a4]@3 ~@3, ~@4 c#4@2 ~ a4 ~@8", // A A5 A
  C: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,f#4]@2 ~ [a3,d4,f#4,a4]@5 ~, ~@7 [d4,a4] ~@8", // D D5
  D: "~ [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4]@5 ~", // A
  E: "~ [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4]@6", // A
  F: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,d4,f#4]@2 ~ [a3,d4,f#4,a4]@4 ~@2, ~@7 a4 ~@8", // D
  G: "~ [b3,e4,g#4,b4] ~@2 [b3,g#4,b4] ~@2 [c#4,e4,a4,c#5]@4 ~ [b3,e4,g#4,b4]@3 ~, ~@2 e4 ~@5", // E A E
  H: "[b3,d4,f#4,a4]@2 [b3,d4,f#4,a4] ~@3 [a3,c#4,e4,a4]@8 ~@2", // Bm7 A
  I: "[b3,e4,g#4,b4]@9 ~ [b3,e4,g#4,b4] ~ [b3,e4,g#4,b4]@2 ~@2", // E
  J: "[c#4,f4,g#4,b4]@9 ~ [c#4,f4,g#4,b4] ~ [c#4,f4,g#4,b4]@2 ~@2", // C#7
  K: "[c#4,e4,f#4,a4]@2 ~ [c#4,e4,f#4,a4] ~@2 [c#4,e4,f#4,a4]@8 ~@2", // F#m7
  L: "[b3,d#4,f#4,a4]@2 ~ [b3,d#4,f#4,a4] ~@2 [b3,d#4,f#4,a4]@4 [b3,d#4,f#4,a4] ~ [b3,d#4,f#4,a4]@2 ~@2", // B7
  M: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@6", // D
  N: "~ [a3,d4,f#4,a4] ~@2 [d4,f#4,a4]@2 ~ [a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4]@5 ~, ~@4 a3 ~@11", // D
  O: "~ [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,a4] ~@2 [a3,c#4,e4,a4]@5 ~, ~@7 e4@2 ~@7", // A
  P: "~@10 [a3,d4,f#4,a4] ~ [a3,d4,f#4,a4]@2 ~@2", Q: "[a3,c#4,e4]@5 ~ [a3,c#4,e4]@8 ~@2",
  R: "[a3,d4,f#4]@4 ~@2 [a3,d4,f#4]@5 ~ [b3,e4,g#4]@3 ~", S: "[a3,c#4,e4]@2 ~ [a3,c#4,e4]@4 ~",
  T: "[a3,c#4,f#4]@2 ~ [a3,c#4,f#4]@4 ~", U: "[e2,e3]@2 ~ [e2,e3] ~@2 [e2,e3]@8 ~@2",
  V: "[e2,e3]@2 ~ [f#2,f#3] ~@2 [f#2,f#3]@9 ~", W: "[e3,e4]@3 [f#3,f#4] ~@2 [f#3,f#4]@9 ~",
  X: "[a3,c#4,e4,a4]@2 ~ [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4]@9 ~", // A
  Y: "[a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@9 ~", // D
  Z: "[a3,c#4,f#4]@2 ~ [a3,c#4,f#4] ~@2 [a3,c#4,f#4]@9 ~", // F#m
  AA: "[e2,e3,b3,d4,e4,g#4]@3 [e2,e3,b3,d4,e4,g#4] ~@2 [e2,e3,c#4,e4,a4]@8 ~@2", // E7 A
  AB: "[e2,e3]@2 ~ [f#2,f#3] ~@2 [f#2,f#3]@3 ~@5 c#4 a4, ~@9 f#2@4 a3@2 ~, ~@10 a2@5 ~, ~@11 c#3@4 ~, ~@12 f#3@3 ~", // E F#
  AC: "[b3,e4,g#4]@3 [a3,c#4,f#4] ~@2 [a3,c#4,f#4]@7 ~@3", AD: "[c#4,c#5]@2 ~ [d4,d5] ~@2 [d4,d5]@10",
  AE: "[e3,d4,e4,g#4,b4]@15 ~", // E7
  AF: "~ [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4]@2 ~ [a3,c#4,e4]@2 ~ [a3,c#4,e4,a4]@5 ~, ~@7 a4 ~@8", // A
  AG: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@5 ~", // D
  AH: "~ [b3,e4,g#4,b4] ~@2 [e4,g#4]@2 ~ [c#4,e4,a4,c#5]@3 [c#4,e4,a4,c#5] ~ [b3,e4,g#4,b4]@3 ~, ~@4 [b3,b4] ~@11", // E A E B
  AI: "[a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4] ~@2 [a3,c#4,e4,a4]@8 ~@2", // D A
  AJ: "[b3,d#4,f#4,a4]@2 ~ [b3,d#4,f#4,a4] ~@2 [b3,d#4,f#4,a4]@5 ~ [b3,d#4,f#4,a4]@3 ~", // B7
  AK: "[a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4]@4 ~", // D
  AL: "[e2,e3]@2 ~ [f#2,f#3] ~@2 f#2@3 ~@5 c#4 a4, ~@6 f#3@5 c#3@2 a3@2 ~, ~@9 f#2@5 ~@2, ~@5 a2@2 ~, ~@12 f#3@3 ~", // E F#
  AM: "[c#4,f#4,a4,c#5]@2 ~ [d4,f#4,a4,d5] ~@2 [d4,f#4,a4,d5]@10, b2", // F#m D
  AN: "~ [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4]@4 ~@2", // A
  AO: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@4 ~@2, ~@7 a3@2 ~@7", // D
  AP: "~ [b3,e4,g#4,b4] ~@2 [b3,e4,g#4,b4] ~@2 [c#4,e4,a4,c#5]@5 [b3,e4,g#4,b4]@3 ~", // E A E
  AQ: "[b3,e4,g#4]@4 ~ [b3,e4,g#4]!2 ~", // E
  AR: "[b3,d#4,f#4,b4]@3 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4]@3 ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4]@4", // B
  AS: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4]@3", // D
  AT: "~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4] ~@2 [a3,d4,f#4,a4]@2 ~ [a3,d4,f#4,a4]@3", // D
})).s("gm_piano").gain(0.23).pan(0.4)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@10 A B C D E@3 ~@4 F G ~@6 F G ~@6 H I J K@2 I J L M A B N D E@3 ~@6 F G ~ O P Q ~@2 H I R K@2 I R L M A B S D T@2
  ~@11 U V ~@3
>`.pickRestart({
  A: "g#5@9 f#5 g#5 f#5 g#5 a5@3", B: "g#5@9 a5 b5 a5 b5 c#6@2 ~", C: "a5@3 b5@3 g#5@2 a5@3 b5@3 g#5@2",
  D: "a5@3 b5@3 c#6@2 d#6@3 e6@3 f#6@2", E: "[e6@11 ~]/3", F: "a5 f#5 d5 a5 f#5 d5 a5 f#5 d5 a5 f#5 d5 a5 g#5 e5@2",
  G: "c#5 ~@3", H: "b4 c#5!4 d5!3 e5@2 ~ f#5@2 ~ g#5 ~", I: "g#5@2 ~ a5 ~@2 a5@9 ~", J: "g#5@2 ~ a5 ~@2 a5@4 b5@4 a5@2",
  K: "[g#5@3 a5 ~@2 a5@21 ~ a5 g#5 e5 ~]/2", L: "b5@2 ~ c#6 ~@2 c#6@9 b5", M: "b5@3 a5@2 ~ e5@9 ~",
  N: "a5@3 b5@2 ~ g#5@2 a5@2 ~ b5@2 ~ g#5@2", O: "[e2,e3]@2 ~ [e2,e3] ~@2 [e2,e3]@5 ~@5",
  P: "[e2,e3]@2 ~ [e2,e3] ~@2 [e2,e3]@7 ~@3", Q: "e3@3 f#3 ~@2 f#3@7 ~@3", R: "g#5@2 ~ a5 ~@2 a5@4 b5@4 a5 ~",
  S: "a5@2 ~ b5@2 ~ g#5@2 a5@2 ~ b5@3 g#5@2", T: "e6/2", U: "~@7 [b3,b4] ~ [c#4,c#5] ~ [d4,d5] ~ [e4,e5]!3",
  V: "[g#4,g#5] [a4,a5]!2 a5 [a4,a5]@3 ~@9", // G# A
})).s("gm_string_ensemble_1").gain(0.16)

// other · pad halo · "Halo-Pad"
const pad_halo = note(`<
  ~@2 A B C@2 A B D E F G H I J K L M ~@13 N ~@5 O P Q L R P S T@2 U V H I J W L X ~@7 N ~@5 O P Q L R P Y Z ~ U V H I J
  W L X AA AB L X AC M ~@8
>`.pickRestart({
  A: "c#4@3 b3", B: "d4@11 ~ c#4 b3 ~ a3", C: "[b3@3 c#4@2 ~ c#4@24 ~@2]/2", D: "b3@3 c#4@2 ~ c#4@10", E: "a3@7 ~",
  F: "e4@3 ~ e4 ~ e4@8 ~@2", G: "f4@3 ~ f4@2 f4@9 ~", H: "a4@3 b4@3 g#4@2 a4@3 b4@3 g#4@2",
  I: "a4 g#4 f#4@6 c#5@2 b4 c#5 b4 a4@2 ~", J: "e4@2 ~ e4 ~@2 e4@8 ~@2", K: "e4@2 ~ e4@2 ~ e4@5 ~ e4 d4 ~ d4",
  L: "d4@2 ~ c#4 ~@2 c#4@10", M: "d4@7 ~", N: "f#4@7 ~", O: "~@8 d4@2 ~ d4 ~@2 d4 ~", P: "d4@2 ~ c#4 ~@2 c#4@8 ~@2",
  Q: "d4@2 ~ d4 ~@2 d4@4 d4@3 ~ d4 ~", R: "d4@15 ~", S: "d4@2 ~ d4@2 ~ d4@3 ~ d4@4 b3@2",
  T: "[[e4,g#4]@2 ~ [e4,a4]@2 ~ [e4,a4]@6 e4@20]/2", U: "g#4@3 ~ g#4 ~ g#4@8 ~@2", V: "g#4@3 ~ g#4 ~ g#4@4 a4@5 ~",
  W: "e4@2 ~ e4 ~@2 e4@5 ~ e4 d4 ~ d4", X: "d4", Y: "d4@2 ~ d4 ~@2 d4@3 ~ d4@3 ~ b3@2",
  Z: "[e4,g#4]@3 [e4,a4] ~@2 [e4,a4]@6 [e4,g#4]@4", AA: "c#4@3 ~@13", AB: "~@12 d4!2 ~ d4", AC: "c#4",
})).s("gm_pad_halo").gain(0.3)

// chords · pad poly · "Polysynth Pad"
const pad_poly = note(`<
  ~@2 A B A B A B C D E F G H I@2 J K L@2 A B A G M N O@2 A P A Q N M O@2 P R S K J K J K T D R F G H I@2 J K J K U@2 A
  P A G V N O W B R A B A B X B C D R F G H I@2 Y P J Z J K J K J K J K J K J K
>`.pickRestart({
  A: "[a3,c#4,e4]@15 ~", B: "[a3,d4,f#4]@7 ~", C: "[b3,e4,g#4]@3 [c#4,e4,a4] ~@2 [c#4,e4,a4]@6 [b3,e4,g#4]@4",
  D: "[a3,d4,f#4]@5 ~ [a3,c#4,e4]@8 ~@2", E: "[g#3,b3,e4]@13 ~@3", F: "[b3,c#4,f4]@7 ~", G: "[a3,c#4,f#4]@7 ~",
  H: "[b3,d#4,f#4]@7 ~", I: "[a3,d4,e4]@15 ~", J: "[a3,c#4,e4]@2 ~ [a3,c#4,e4] ~@2 [a3,c#4,e4]@9 ~",
  K: "[a3,d4,f#4]@3 [a3,d4,f#4] ~@2 [a3,d4,f#4]@8 ~@2", L: "[a3,c#4,e4]@2 ~ [a3,c#4,e4] ~@2 [a3,c#4,e4]@4 ~@6",
  M: "[g#3,b3,e4]@3 [g#3,b3,e4] ~@2 [a3,c#4,e4]@9 ~", N: "[g#3,b3,e4]@3 [g#3,b3,e4] ~@2 [a3,c#4,e4]@8 ~@2",
  O: "[g#3,b3,e4]@3 [a3,c#4,f#4] ~@2 [a3,c#4,f#4]@9 ~", P: "[a3,d4,f#4]@15 ~", Q: "[a3,c#4,f#4]@15 ~",
  R: "[g#3,b3,e4]@15 ~", S: "[a3,c#4,e4]@3 [a3,c#4,e4] ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@5 ~",
  T: "[b3,e4,g#4]@4 ~@2 [c#4,e4,a4]@5 ~ [b3,e4,g#4]@3 ~", U: "[a2,e3,c#4,e4]@11 ~@5",
  V: "[g#3,b3,e4]@4 ~@2 [a3,c#4,e4]@9 ~", W: "[b3,e4,g#4]@2 ~ [c#4,f#4,a4] ~@2 [c#4,f#4,a4]@9 ~", X: "[a3,c#4,e4]@7 ~",
  Y: "[a3,e4]@2 ~@2 [a3,c#4,e4] ~ [a3,c#4,e4]@9 ~, c#4 ~@15", Z: "[a3,d4,f#4]@3 [a3,d4,f#4] ~@2 [a3,d4,f#4]@10",
})).s("gm_pad_poly").gain(0.25)

// chords · banjo
const banjo = note(`<
  ~@9 A ~@10 B C B D ~@4 B C B E ~@5 F G H B C B C ~@2 I J K@2 L M B C B N ~@2 B C B O ~@14 I J K@2 L M B C B C B C B C
  B C B C B C B P
>`.pickRestart({
  A: "~ a3!5 ~@10", B: "[c#4,e4]!16", C: "[d4,f#4]!16", D: "[c#4,f#4]!6 c#4 [c#4,f#4]!2 c#4!2 [c#4,f#4]!5",
  E: "[c#4,f#4]!7 c#4 [c#4,f#4]!8", F: "[b3,d4]!16", G: "[c#4,e4] e4 [c#4,e4]!14", H: "d4 [d4,f#4]!15",
  I: "[e4,g#4]!16", J: "[f4,g#4]!16", K: "[f#4,a4]!16", L: "[e4,a4]!16", M: "[d4,a4]!16",
  N: "[d4,f#4]!3 d4 [d4,f#4]!4 ~@8", O: "[c#4,f#4]!5 c#4 [c#4,f#4] c#4 [c#4,f#4]!8", P: "[d4,f#4]!6 d4 [d4,f#4]!7 ~@2",
})).s("gm_banjo").gain(0.07).pan(0.3)

// chords · piano · "Bright Piano"
const piano_2 = note(`<
  ~@4 A B ~@2 C D ~@3 E F ~ A G ~@5 H I J K L ~@3 M I N K L ~@2 O P Q B O ~ R S ~@3 E T ~ A G ~@7 M I N U L ~@2 O V A G
  W X Y Z ~@2 AA E T ~@3 A AB ~@2 A AC ~@2 Q AD ~@2 A AB
>`.pickRestart({
  A: "~@11 [a5,c#6,e6,a6] [a5,c#6,e6,a6]@3 [g#5,b5,e6,g#6]", // A E
  B: "[g#5,b5,e6,g#6]@3 [f#5,a5,d6,f#6] [f#5,a5,d6,f#6]@8 ~@4", C: "~@3 [e5,g#5,b5]",
  D: "[d5,f#5,a5]@3 [c#5,e5,a5]@4 ~", E: "[a4,a5]@3 [b4,b5]@3 [c#5,c#6]@2 [d#5,d#6]@3 [e5,e6]@3 [f#5,f#6]@2",
  F: "[e5,e6]@15 ~", G: "[g#5,b5,e6,g#6]@3 [f#5,a5,d6,f#6] [f#5,a5,d6,f#6]@10 ~@2",
  H: "~@11 [a4,a5] ~ g#4@2 [e4,e5], ~@13 g#5 ~@2", // A E
  I: "[d4,d5]@2 ~ [e4,e5] ~@2 [e4,e5]@4 [a4,a5]!2 ~ [g#4,g#5] ~ [e4,e5]", J: "[d4,d5]@3 [e4,e5]@3 [e4,e5]@10",
  K: "[e4,e5]@3 [f#4,f#5]@3 [f#4,f#5]@10", L: "[e5,e6]@3 [f#5,f#6]@3 [f#5,f#6]@9 ~",
  M: "~@11 [a4,a5] ~ [g#4,g#5] ~ [e4,e5]", N: "[d4,d5]@2 ~ [e4,e5] ~@2 [e4,e5]@3 ~ [e4,e5]@5 ~",
  O: "~@11 [a5,c#6,e6,a6] [a5,c#6,e6,a6]@4", P: "~@11 [a5,d6,a6] [a5,d6,a6]@4",
  Q: "~@11 [c#6,e6,a6] [a5,c#6,e6,a6]@3 [g#5,b5,e6,g#6]", R: "~@11 [c#6,e6,a6,c#7] [c#6,e6,a6,c#7]@3 [b5,e6,g#6,b6]",
  S: "[b5,e6,g#6,b6]@3 [a5,d6,f#6,a6]@3 [e5,c#6,e6]@9 ~", T: "[e5,e6]",
  U: "[e4,e5]@3 f#5@3 f#5@10, ~@3 f#4 ~@2 f#4@8 ~@2", V: "~@11 [b5,d6,b6] [b5,d6,b6]@4",
  W: "~@11 [a5,c#6,e6] [a5,c#6,e6,a6]@4", X: "~@11 [d6,f#6,a6] [a5,d6,f#6,a6]@3 ~",
  Y: "~@11 [e6,a6,c#7] [c#6,e6,a6,c#7]@3 [b5,e6,g#6,b6]", Z: "[b5,e6,g#6,b6]@3 [a5,d6,f#6,a6] ~@2 [e5,a5,c#6,e6]@10",
  AA: "[a4,a5]@3 [b4,b5]@3 [g#4,g#5]@2 [a4,a5]@3 [b4,b5]@3 [g#4,g#5]@2", // A B G# A B G#
  AB: "[g#5,b5,e6,g#6]@3 [f#5,a5,d6,f#6] [f#5,a5,d6,f#6]@12", // E D
  AC: "[g#5,b5,e6,g#6]@3 [f#5,a5,d6,f#6] [f#5,a5,d6,f#6]@11 ~", // E D
  AD: "[g#5,b5,e6,g#6]@3 [f#5,a5,d6] [f#5,a5,d6,f#6]@8 ~@4", // E D
})).s("gm_piano").gain(0.17).pan(0.7)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A B A B A B A B A B A B A B A B A@5 B A@2 B@2 A@3 B A@2 B@2 A@2 C B A B A@3 B A@3 B A@3 B A B A B A@3 B A B@3 A@5
  B A@3 B A@3 B A@3 B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x ~@2 x ~@3", C: "~@2 x ~@2 x!2 ~",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct("x!4").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x ~ x ~ x ~ x]!95 [~ x ~ x ~ x ~@2]>").gain(0.2)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!95 [x ~ x!3 ~ x!3 ~ x!3 ~@3]>").gain(0.75)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@2 [~ x ~@3 x ~@3 x ~@3 x ~@2]!96>").gain(0.5)

// … 3 more lines

More by ABBA