Strudelify

Twist and Shout

Deacon Blue

KeyG majorTempo130 bpm
0:00/0:00
// Twist and Shout — Deacon Blue
// 130 bpm, 4/4, key G major. Source: 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 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 · fretless bass
const bass = note(`<
  ~@8 A B C@2 A B D@2 E F E G H F E G I J K L M N O P Q R S T U V W@2 X Y Z AA AB AC AD AE AF@2 AG@2 AF@2 AG@2 AH@2 AI
  AJ AK@4 AL AM AN@2 AL AM AN@2 Q AO Q AP AQ AR W@2 AS AT AU AV AW AX AY AZ BA AT BB BC AW BD BE AZ BF BG AU BC AS BD BH
  AZ BI BJ AU BK AS BL BH BM BI BJ AU BK AS BL BH BN BO
>`.pickRestart({
  A: "g2", B: "d3", C: "c3", D: "c3/2", E: "g1 ~ g1 ~@4 b1", F: "c2@2 ~@2 c2@2 ~@6 c2 e2 g2 ~", G: "d2 ~ d2 ~@4 f#2",
  H: "g2 ~ g1 ~ g1 ~@2 b1", I: "[b1,b2]@2 d2@2 g2 a2 ~@2 g2@2 [d2,d3]@3 ~ b1@2",
  J: "[c2,c3]@2 b1@2 c2@4 ~@4 a1 ~ a#1@2", K: "[b1,b2]@2 [d2,d3]@2 g2 [a2,a3] ~@2 g2@2 d2@3 ~ [g2,g3]@2",
  L: "a2@2 d2@3 ~@2 b1", M: "b1@2 [d2,d3]@2 [g2,g3] a2 ~@2 g2@2 d2@3 ~ [b1,b2]@2",
  N: "c2@2 b1@2 c2@4 ~@2 [a1,a2] a1 a1@2 [a#1,a#2]@2", O: "b1@2 d2@2 g2 [a2,a3] ~@2 g2@4 ~@2 g2@2", P: "a2@4 d2@9 ~@3",
  Q: "~@2 g1 ~ g1 ~@3 g1@4 ~@4", R: "~@2 c2 ~ c2 ~@3 c2@5 ~@3", S: "~@2 g1@5 ~@5 b1@2 c2@2",
  T: "d2 ~ d2 ~ d2@2 ~@2 d2@7 ~", U: "~@2 g1 ~ g1@2 ~@2 g1@8", V: "~@2 c2 ~ c2@2 ~@2 c2@8",
  W: "[~@2 g1 ~ g1@2 ~@2 g1@10 d2 ~ d2 ~@3 d2@7 ~]/2", X: "[b1,b2]@2 [d2,d3]@2 [g2,g3] a2 ~@2 g2@2 [d2,d3]@3 ~ b1@2",
  Y: "c2@2 b1@2 c2@4 ~@4 a1 ~ a#1@2", Z: "[b1,b2]@2 d2@2 g2 a2 ~@2 g2@2 d2@3 ~ [g2,g3]@2",
  AA: "a2@4 [d2,d3]@5 ~@5 b1@2", AB: "b1@2 [d2,d3]@2 g2 [a2,a3] ~@2 [g2,g3]@2 [d2,d3]@3 ~ b1@2",
  AC: "[c2,c3]@2 [b1,b2]@2 [c2,c3]@3 ~@3 a1 [a1,a2] [a1,a2]@2 [a#1,a#2]@2", // C B C A A#
  AD: "[b1,b2]@2 [d2,d3]@2 [g2,g3] [a2,a3] ~@2 g2@4 ~@2 g2@2", AE: "[a2,a3]@4 [d2,d3]@9 ~@3", AF: "d2/2",
  AG: "[g1@11 d2 g1 a1 b1@2]/2", AH: "[d2@13 a1 c2 b1]/2", AI: "a1!2", AJ: "a1@4 a1@3 b1",
  AK: "[c2@10 g1@2 c2 ~ c2@4 g1@2 c2@2 ~@2 c2@2 g1@2 c2 ~ c2@4 g1@2 c2@2 ~@2 c2@2 g1@2 c2 ~ c2@4 g1@2 c2@2 c2@2 c2@2 g1@2 c2@2 d2@2]/4",
  AL: "g1", AM: "d2", AN: "c2/2", AO: "~@2 c2 ~ c2 ~@3 c2@5 ~ c2@2", AP: "d2 ~@3 d2@4 ~@4 d2@4",
  AQ: "~@2 g1@2 g1 ~@3 g1@8", AR: "~@2 c2@2 c2 ~@3 c2@2 ~@6",
  AS: "[b1,b2]@2 [d2,d3]@2 [g2,a2,g3,a3] ~@3 [g2,g3]@2 [d2,d3]@3 ~ [b1,b2]@2", // B D Gsus2 G D B
  AT: "[c2,c3]@2 [b1,b2]@2 [c2,c3]@4 ~@4 [a1,a2] ~ [a#1,a#2]@2", // C B C A A#
  AU: "[b1,b2]@2 [d2,d3]@2 [g2,a2,g3,a3] ~@3 [g2,g3]@2 [d2,d3]@3 ~ [g2,g3]@2", AV: "[a2,a3]@4 [d2,d3]@5 ~@5 [b1,b2]@2",
  AW: "[b1,b2]@2 [d2,d3]@2 [g2,g3] [a2,a3] ~@2 [g2,g3]@2 [d2,d3]@3 ~ [b1,b2]@2", // B D G A G D B
  AX: "[c2,c3]@2 [b1,b2]@2 [c2,c3]@3 ~@3 [a1,a2]!2 [a1,a2]@2 [a#1,a#2]@2", // C B C A A#
  AY: "[b1,b2]@2 [d2,d3]@2 [g2,g3] [a2,a3] ~@2 [g2,g3]@4 ~@2 [g2,g3]@2", // B D G A G
  AZ: "[a2,a3]@4 [d2,d3]@6 [a1,a2]!2 [a1,a2]@2 [a#1,a#2]@2", // A D A A#
  BA: "[b1,b2]@2 [d2,d3]@2 [g2,a2,g3] a3 ~@2 [g2,g3]@2 [d2,d3]@3 ~ [b1,b2]@2", // B D Gsus2 G D B
  BB: "[b1,b2]@2 [d2,d3]@2 [g2,g3,a3] a2 ~@2 [g2,g3]@2 [d2,d3]@3 ~ [g2,g3]@2", BC: "[a2,a3]@4 [d2,d3]@5 ~@5 [a1,a2]@2",
  BD: "[c2,c3]@2 [b1,b2]@2 [c2,c3]@3 ~@5 [a1,a2] ~ [a#1,a#2]@2", // C B C A A#
  BE: "[b1,b2]@2 [d2,d3]@2 [g2,g3] [a2,a3] ~@2 [g2,g3]@2 [d2,d3]@4 [g2,g3]@2", // B D G A G D G
  BF: "~@4 [c2,c3]@3 ~ [d2,d3]@3 ~ [a2,a3] [b2,b3]@2 ~", // C D A B
  BG: "[g2,g3] [d2,d3] ~ [b1,b2] [c2,c3] [b1,b2] [c2,c3] [a#1,a#2]", // G D B C B C A#
  BH: "[b1,b2]@2 [d2,d3]@2 [g2,a2,g3,a3] ~@3 [g2,g3]@2 [d2,d3]@4 [g2,g3]@2", // B D Gsus2 G D G
  BI: "[b1,b2]@2 [d2,d3]@2 [a2,b2,a3,b3] ~@3 [g2,g3]@4 ~@2 [b1,b2]@2", // B D Asus2 G B
  BJ: "[c2,c3]@2 [b1,b2]@2 [c2,c3]@4 ~@2 [a1,a2]!3 ~ [a#1,a#2]@2", BK: "[a2,a3]@2 [d2,d3]@2 ~ [a1,a2]!2 [a#1,a#2]",
  BL: "[c2,c3] [b1,b2] [c2,c3]@2 [c3,c4]@3 [a1,a2]", BM: "[a2,a3]@3 ~ [d2,d3]@6 [a1,a2]!2 [a1,a2]@2 [a#1,a#2]@2",
  BN: "[a2,a3] [d2,d3]@3", BO: "[g2,g3]",
})).s("gm_fretless_bass").gain(0.4)

// bass · fretless bass · soft notes
const bass_soft = note("<~@24 A B C D E F G H ~@8 I J K L M N O ~@74>".pickRestart({
  A: "~@2 d3@2 g3 a3 ~@2 g3@2 ~@4 b2@2", B: "~@2 b2@2 c3@4 ~@4 a2 ~ a#2@2", C: "~@8 g3@2 d3@3 ~@3",
  D: "a3@2 d3@3 ~@2 b2", E: "b2@2 ~@3 a3 ~@2 g3@2 d3@3 ~@3", F: "c3@2 b2@2 c3@4 ~@3 a2 a2@2 ~@2",
  G: "b2@2 d3@2 g3 ~@3 g3@4 ~@2 g3@2", H: "a3@4 d3@9 ~@3", I: "~@5 a3 ~@2 g3@2 ~@4 b2@2",
  J: "c3@2 b2@2 c3@4 ~@4 a2 ~ a#2@2", K: "~@2 d3@2 g3 a3 ~@2 g3@2 d3@3 ~@3", L: "a3@2 ~@5 b2",
  M: "b2@2 ~@2 g3 ~@9 b2@2", N: "~@10 a2 ~@5", O: "~@4 g3@2 ~ g3",
})).s("gm_fretless_bass").gain(0.25)

// bass · slap bass 1
const bass_2 = note("<~@33 A B ~ C ~@38 D ~@2 E ~@42>".pickRestart({
  A: "~@14 c2 ~", B: "d2 ~@10 g1 ~@4", C: "~@11 b2 b1 ~@3", D: "~@4 d2 ~@7 d2 ~@3", E: "~ g1!2 ~@13",
})).s("gm_slap_bass_1").gain(0.4)

// bass · tuba
const bass_3 = note("<~@15 A B C D E F C G H ~@97>".pickRestart({
  A: "e3", B: "g2@2 ~@2 g1@3 ~@7 b1@2", C: "c2@2 ~@2 c2@2 ~@6 c2 e2 g2 ~", D: "g2 ~@3 g1@2 ~@8 b1@2",
  E: "d2 ~@3 d2@2 ~@8 f#2@2", F: "g2 ~ g1 ~ g1 ~@2 b1", G: "g2 ~ g1 ~@4 b1", H: "d2 ~ d2 ~@4 f#2",
})).s("gm_tuba").gain(0.35)

// chords · reed organ
const reed_organ = note(`<
  ~@8 A B C@2 A B D@2 E F E G@2 F E H I J K L M J N O E P@5 Q R I J K L M J N S T@2 U@2 V@2 W@2 X@2 Y Z AA@4 A B D@2 A B
  D@2 E AB@2 AC@3 AD AE I AF AG AH M J N O I J K L M J N AI AJ J AK L AL J AM S I J K L M J N S I J K L M J N S AN
>`.pickRestart({
  A: "[d4,b4]", B: "[d4,a4]", C: "[c5@13 b4 a4 g4, c4]/2", D: "[c4,c5]/2",
  E: "~@2 [d4,b4] ~@3 [d4,b4] ~@3 [d4,b4] ~@3 [d4,b4] ~", F: "~@2 [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4] ~",
  G: "[~@2 [d4,a4] ~@3 [d4,a4] ~@3 [d4,a4] ~@3 [d4,a4]@4 b4 ~@3 [d4,b4] ~@3 [d4,b4] ~@3 [d4,b4] ~]/2", // D5 G
  H: "~@2 [c4,a4] ~@3 [c4,a4] ~@3 [c4,a4] ~@3 [c4,a4]@2", I: "~@2 [g4,b4] ~@3 [g4,b4]@6 c5@2 [g4,d5] ~",
  J: "~@2 [c4,g4] ~@3 [c4,g4]@4 a4 g4 [c4,e4]@2 g4 ~", K: "~@2 [g4,b4] ~@3 [g4,b4]@6 [g4,a4]@2 g4@2",
  L: "~@2 [c4,a4] ~@3 [c4,a4]@4 b4 a4 [c4,g4]@2 a4 ~", M: "~@2 [g4,b4] ~@3 [g4,b4]@6 [g4,c5]@2 d5 ~",
  N: "~@2 [g4,b4] ~@3 [g4,b4]@6 [g4,a4]@2 g4 ~", O: "~@2 [c4,a4] ~@3 a4@4 b4 a4 g4@2 a4 ~, ~@3 c4@5",
  P: "[~@2 [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4] ~@3 e4@2 d4@2 [d4,g4] ~@3 [d4,g4] ~@3 [d4,g4] ~@3 [d4,g4]@4 [d4,a4] ~@3 [d4,a4] ~@3 [d4,a4] ~@3 a4@2 g4@2 [d4,b4] ~@3 [d4,b4] ~@3 [d4,a4]@2 d4@3 ~ c4 ~ [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4]@4 e4 ~, ~@7 g4@2 ~@14 d4@2 ~@5 g4@3 ~@7]/5", // C5 G5 D5 G D5 C5
  Q: "b3@2 b4 ~@9 [d4,b4]@4, d4 ~@3", R: "[c4,a4]@3 ~ [c4,a4]@3 ~ [c4,a4]@3 ~ [c4,a4]@3 ~",
  S: "~@2 [c4,a4] ~@3 a4@4 c5 b4 a4@2 g4@2, ~@3 c4@5", T: "[[c4,f#4]@7 [c4,g4]]/2", U: "[[d4,g4]@7 [d4,g4]]/2",
  V: "[f#4@7 d4, c4]/2", W: "[[b3,d4]@7 d4]/2", X: "c4/2", Y: "~@8 e4@5 ~ d4@2, c#4@3 ~", Z: "c#4@5 ~ b3@2 a3@8",
  AA: "[g3 g3, c4]/4",
  AB: "[~@2 [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4] ~@3 [e4,g4]@4 [d4,g4] ~@3 [d4,g4] ~@3 [d4,g4] ~@3 [d4,g4] ~]/2", // C5 Em G5
  AC: "[~@2 [d4,a4] ~@3 [d4,a4] ~@3 [d4,a4] ~@3 a4@2 g4@2 [d4,b4] ~@3 [d4,b4] ~@3 [d4,a4]@2 d4@3 ~ c4 ~ [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4] ~@3 [c4,g4] ~, ~@7 d4@2 ~@5 g4@3 ~@7]/3", // D5 G D5 C5
  AD: "~@2 [d4,g4] ~@3 [d4,g4] ~@3 [d4,g4] ~@3 [d4,g4] ~", AE: "~@2 [c4,a4] ~ [c4,a4]@3 ~@3 [c4,a4] ~ [c4,a4]@4",
  AF: "~@2 c4@3 ~ [c4,g4] ~ [c4,g4]@2 a4 g4 [c4,e4]@2 g4 ~, ~@2 g4 ~@13", // C5 C
  AG: "~@2 [g4,b4] ~@3 [g4,b4] ~ [g4,b4]@4 [g4,a4]@2 g4@2", // G Gsus2
  AH: "~@2 [c4,a4] ~@3 a4@4 b4 a4 [c4,g4]@2 a4 ~, ~@3 c4@3 ~@2", // F C5
  AI: "~@2 [c4,a4] ~@3 a4@4 ~ a4 g4@2 a4 ~, ~@3 c4@5, ~@5 b4 ~@2", // F
  AJ: "~@2 [d4,b4] ~@3 [d4,b4]@6 c5@2 [g4,d5] ~, ~@12 e4 ~@3", AK: "~@2 [d4,b4] ~@3 [d4,b4]@6 [d4,a4]@2 g4@2",
  AL: "~@2 [d4,b4] ~@3 [d4,b4]@6 [e4,c5]@2 [g4,d5] ~", AM: "~@2 [d4,b4] ~@3 [d4,b4]@6 [c4,a4]@2 [b3,g4] ~",
  AN: "[b3,g4]", // Em
})).s("gm_reed_organ").gain(0.35).pan(0.7)

// chords · distortion guitar
const distortion_guitar = note(`<
  A@8 B C@3 D E F@2 G@16 H@8 G@8 I@2 J@4 K@2 L@2 M@2 E N@3 O P Q@2 R@4 H@8 S@40 ~
>`.pickRestart({
  A: "[~@2 b4@3 a4 ~@12 g4 a4 ~@2 d4@2 c4 c5@2 c5@2 b4 a4 ~@3 b4@3 a4 ~@3 g3 ~@8 g4 a4 ~@2 d4@2 ~ c5@2 c5@2 b4 a4 g4, g3@16 e3@14 g4@6 ~@6 g4@5 ~@21 g4@8 g4@10 g4@6 g3@4 g3@16 [a3,c4]@16, ~@2 d4@6 ~ g3@3 g3@2 g3@2 g3@8 a3@8 g3@8 e3@7 g4@3 ~@3 g4@3 ~@8, ~@2 g4@4 g4@5 g4@2 b4@3 ~@4 b4@5 ~@14 c4@3 c4@3 b4@3 ~@4 b4@5 ~@7, ~@7 c4@3 c4@3 [d4,g4]@2 d4@7 ~@3 c4@5 ~ [d4,g4]@3 d4@6 ~@4 g3 d4@2 d4@7 ~@10]/8", // Am G5
  B: "~ g4@15, d4", C: "[~ g4@5 a4@4 ~@6 g4@21 ~ [c4,g4]@10, d4@6 c4@11 ~@7, ~@5 g4@3 ~@16]/3", D: "~ g4@15, d4@15 ~",
  E: "[c4,g4]", F: "[c4@10 ~ c5@2 b4 a4 g4, g4@15 ~]/2",
  G: "[~@2 b4@3 a4 ~@12 g4 a4 ~@2 d4@2 c4 c5@2 c5@2 b4 a4 ~@3 b4@3 a4 ~@3 g3 ~@8 g4 a4 ~@2 d4@2 ~ c5@2 c5@2 b4 a4 g4, g3@16 e3@14 g4@6 ~@6 g4@5 ~@29 g4@10 g4@6 g3@4 g3@16 [a3,c4]@16, ~@2 d4@6 ~ g3@3 g3@2 g3@2 g3@8 a3@8 g3@8 e3@7 g4@3 ~@3 g4@3 ~@8, ~@6 g4@5 g4@2 b4@3 ~@4 b4@5 ~@14 c4@3 c4@3 b4@3 ~@4 b4@5 ~@7, ~@7 c4@3 c4@3 [d4,g4]@2 d4@7 ~@3 c4@5 ~ [d4,g4]@3 d4@6 ~@4 g3 d4@2 d4@7 ~@10]/8", // Am G5
  H: "[~@3 b4@2 a4 ~@12 g4 a4 ~@2 d4@2 c4 c5@2 c5@2 b4 a4 ~@4 b4@2 a4 ~@3 g3 ~@8 g4 a4 ~@2 d4@2 ~ c5@2 c5@2 b4 a4 g4, g3@16 e3@14 g4@6 ~@6 g4@5 ~@29 g4@10 g4@6 g3@4 g3@16 [a3,c4]@16, ~@2 d4@6 ~ g3@3 g3@2 g3@2 g3@8 a3@8 g3@8 e3@7 g4@3 ~@3 g4@3 ~@8, ~@6 g4@5 g4@2 b4@3 ~@4 b4@5 ~@14 c4@3 c4@3 b4@3 ~@4 b4@5 ~@7, ~@7 c4@3 c4@3 [d4,g4]@2 d4@7 ~@3 c4@5 ~ [d4,g4]@4 d4@5 ~@4 g3 d4@2 d4@7 ~@10]/8", // Am G5
  I: "[g4@9 ~@4 g4@3]/2", J: "[g4@26 ~ d4@5 ~ a4@25 g4@2 a4@4, ~@26 b3@6 d4@31 ~, ~@27 g4@30 ~@7]/4",
  K: "[~ b4@27 ~ [g4,b4]@3, [d4,g4]@28 d4@3 ~]/2", L: "[~ a4@31, [d4,g4]]/2", M: "[b4 a4@3, e4]/2",
  N: "~ c5@15, [c4,g4]", O: "[g3,d4]@3 ~ b4@6 b3@2 a3@2 g3@2, g4@3 ~, ~@2 d4@5 ~",
  P: "~@2 [d4,g4]@3 g4 a4@2, a3@15 ~, ~@5 d4@3", // G5
  Q: "[c4@2 c4@3 [g3,c4,g4]@2 [g3,c4,g4]@2 [g3,c4,g4]@2 g4 c5 b4 a4 g4, g4@5 ~@6 [g3,c4]@5]/2", // C5
  R: "[b4@4 b4@6 b4@4 ~@6 a4@5 ~ c4@4 ~@6 g4@4 ~@2 [c4,g4]@4 [c4,g4]@4 [c4,g4]@4 g4@2 c5@2 b4@2 a4@2 g4@2, d4@5 d4@4 ~@23, ~@14 a4@5 ~@7 a4@3 ~ g4@6 ~@28, ~@16 c4@10 ~@6 c4@9 ~@13 c4@10]/4", // C5
  S: "[~@2 b4@3 a4 ~@12 g4 a4 ~@2 d4@2 c4 c5@2 c5@2 b4 a4 ~@3 b4@3 a4 ~@3 g3 ~@8 g4 a4 ~@2 d4@2 ~ c5@2 c5@5, g3@16 e3@14 g4@6 ~@6 g4@5 ~@29 g4@10 g4@6 g3@4 g3@16 [a3,c4]@16, ~@2 d4@6 ~ g3@3 g3@2 g3@2 g3@8 a3@8 g3@8 e3@7 g4@3 ~@3 g4@3 ~@8, ~@6 g4@5 g4@2 b4@3 ~@4 b4@5 ~@14 c4@3 c4@3 b4@3 ~@4 b4@5 ~@7, ~@7 c4@3 c4@3 [d4,g4]@2 d4@7 ~@3 c4@5 ~ [d4,g4]@3 d4@6 ~@4 g3 d4@2 d4@7 ~@10]/8", // Am G5
})).s("gm_distortion_guitar").gain(0.3).pan(0.3)

// other · string ensemble 1
const string_ensemble_1 = note("<~@8 A@2 B@2 A@2 C@2 ~@32 D E F G E D F H D@2 I J ~ K@3 L@4 M N M O ~@49>".pickRestart({
  A: "[g1 d2, g6]/2", B: "[c2,g6]/2", C: "[g6 g5, c2]/2", D: "a4@3 ~ a4 ~ a4 ~ a4@3 ~ a4 ~ a4 ~",
  E: "a4@3 ~ a4 ~ a4 ~ a4@4 a4 ~ a4 ~", F: "b4@3 ~ b4 ~ b4 ~ b4@3 ~ b4 ~ b4 ~", G: "b4@3 ~ b4 ~ b4 ~ b4@2 c5@2 d5@4",
  H: "b4@3 ~ b4 ~ b4 ~ b4@2 c5@2 d5@3 ~", I: "b4@5 ~ a4 ~ a4@3 ~ a4 ~ a4 ~", J: "a4@5 ~ a4 ~ a4@3 ~ a4 ~ a4 ~",
  K: "[~@2 [g5,c6], c5, ~ e5@2]/3", L: "g6/2", M: "g6", N: "a6", O: "g5",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.7)

// chords · fiddle
const fiddle = note(`<
  ~@8 A B C@2 A B D@2 ~@32 E@2 F G H@2 F G H@2 I@2 J K L M N@5 O P@2 ~@8 Q R S T U V W X U Y W Z AA AB AC T AD AE AF AG
  AH AI AJ AK AL AM AF AG AH AI AJ AK AN AM AF AG AH AI AJ AK AO
>`.pickRestart({
  A: "[g4,b4]", B: "[g4,a4]", C: "[c5@13 b4 a4 g4, g4@15 ~]/2", D: "[g4,c5]/2", E: "[a4@22 b4 a4 g4@4 a4@4, d4]/2",
  F: "[d4,b4]!4 [d4,d5] [d4,b4]!3", G: "[d4,b4]@2 [d4,b4]!3 [d4,c5] [d4,d5]@2", H: "[a4@22 b4 a4 g4@4 a4@4, d4@31 ~]/2",
  I: "[b4@3 a4@13, e4]/2", J: "g4", K: "[g4,c5]", L: "[g4,e5]", M: "[g5,c6]",
  N: "[g6@4 ~@32 g6@27 ~@5 g6@12, b4 a4 c5@2 b4, ~@4 g6@16 g6@16 ~@27 g6@5 ~@12]/5", O: "[a4,g6]",
  P: "[g6@8 g5!8, c5]/2", Q: "~@2 [d4,b4] ~@4 b4@5 c5@2 d5 ~, ~@6 d4@9 ~",
  R: "~@2 [c4,g4] ~@3 [c4,g4] ~ g4@2 a4 g4 e4@2 g4 ~, ~@8 c4@7 ~", // C5
  S: "~@2 [d4,b4] ~@3 [d4,b4] ~ b4@4 a4@2 g4 ~, ~@8 d4@7 ~", T: "~@2 [c4,a4] ~@3 a4@4 b4 a4 g4@2 a4 ~, ~@6 c4@9 ~",
  U: "~@2 [d4,b4] ~@3 b4@6 c5@2 d5 ~, ~@6 d4@9 ~", V: "~@2 [c4,g4] ~@3 g4@4 ~ [g4,a4] e4@2 ~ g4, ~@6 c4@9 ~",
  W: "~@2 [d4,b4] ~@3 b4@6 a4@2 g4 ~, ~@6 d4@9 ~", X: "~@2 [c4,a4] ~@3 a4@4 b4 a4 g4@2 a4 ~, ~@3 c4@5",
  Y: "~@2 [c4,g4] ~@3 g4@4 a4 g4 e4@2 g4 ~, ~@3 c4@5", Z: "~@2 [c4,a4] ~@3 a4@4 b4 a4 g4@2 a4 ~, ~@3 c4@4 ~",
  AA: "~@3 [d4,b4] ~@3 b4@5 c5@2 d5 ~, ~@7 d4@9", AB: "~@3 [c4,g4] ~@3 g4@4 a4 e4@2 ~ g4, ~@7 c4@9, ~@12 g4 ~@3",
  AC: "~@3 [d4,b4] ~@3 b4@5 a4@2 g4 ~, ~@7 d4@9", // G
  AD: "~@2 [d4,b4,d5,b5] ~@3 [b4,d5,b5]@6 [c5,c6]@2 [d5,d6] ~, ~@6 d4@9 ~", // G Bm C D
  AE: "~@2 [c4,g4,c5,g5] ~@3 [g4,g5]@4 [a4,g5,a5] g4 e4@2 [g4,g5] ~, ~@3 [c4,c5]@4 ~, ~@11 e5@2 ~@3", // C5 G A7 G C
  AF: "~@2 [d4,b4,d5,b5] ~@3 [b4,d5,b5]@6 [a4,a5]@2 [g4,g5] ~, ~@6 d4@9 ~", // G Bm A G
  AG: "~@2 [c4,a4,c5,a5] ~@3 [a4,a5]@4 [b4,b5] [a4,a5] g4@2 [a4,a5] ~, ~@6 [c4,c5]@9 ~, ~@11 g5@2 ~@3", // F A B A C
  AH: "~@2 [d4,b4,d5,b5] ~@3 [b4,b5]@6 [c5,c6]@2 [d5,d6] ~, ~@6 [d4,d5]@9 ~", // G B C D
  AI: "~@2 [c4,g4,c5,g5] ~@3 [g4,g5]@4 [a4,a5] [g4,g5] [e4,e5]@2 [g4,g5] ~, ~@6 [c4,c5]@9 ~", // C5 G A G E G C
  AJ: "~@2 [d4,b4,d5,b5] ~@3 [b4,b5]@6 [a4,a5]@2 [g4,g5] ~, ~@3 [d4,d5]@4 ~", // G B A G D
  AK: "~@2 [c4,a4,c5,a5] ~@3 [a4,a5]@3 b4 [a4,b5] a5 ~ a4 a5 ~, ~@6 [c4,c5]@9 ~, ~@11 g4@2 ~@3, ~@6 g5 ~", // F A Asus2 C
  AL: "~@2 [d4,b4,d5,b5] ~@3 [b4,d5,b5]@5 [c5,c6]@3 [d5,d6] ~, ~@6 d4@9 ~", // G Bm C D
  AM: "~@2 [c4,g4,c5,g5] ~@3 [g4,g5]@4 [a4,g5,a5] g4 e4@2 [g4,g5] ~, ~@6 [c4,c5]@9 ~, ~@11 e5@2 ~@3", // C5 G A7 G C
  AN: "~@2 [d4,b4,d5,b5] ~@3 [b4,d5,b5]@5 [c5,c6]@2 ~ [d5,d6] ~, ~@6 d4@9 ~", AO: "[d5,b5]",
})).s("gm_fiddle").gain(0.24).pan(0.3)

// drums · rim
const rim = s("rim").struct(`<
  ~@16 A B C D A B E F A B C D A B E F A B C D A B E F A B C D A B E F ~@24 A B C D A B E F ~@41
>`.pickRestart({
  A: "~@7 x", B: "x ~@13 x!2", C: "x ~@6 x", D: "x ~ x ~@11 x!2", E: "x!2 ~@5 x", F: "x",
})).gain(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A@3 ~ A@3 B C@7 D C@7 A C@7 A C@7 A C@16 A@3 ~ A@3 B C@7 A C@7 E C@32 A
>`.pickRestart({
  A: "x", B: "~@2 x!2", C: "x!2", D: "x ~ x!2", E: "x ~@9 x!2 ~@4",
})).gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct("<~@71 A ~@23 B ~@7 B ~@7 B ~@7 B ~>".pickRestart({
  A: "x!7 ~", B: "~@4 x ~ x!2",
})).gain(0.3)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@71 [x!4 ~@4] ~@49>").gain(0.15)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@23 A ~@15 A ~@8 B@15 ~@16 C ~@41>".pickRestart({
// … 33 more lines