Strudelify
KeyC majorTempo120 bpm
0:00/0:00
// Calypso — Jean Michel Jarre
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 228 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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(`<
  ~ A@5 B C D E D B@2 A B C D E F B@2 D G A H I@2 ~@4 J K L M@2 K L M N O P A B C D E D B@2 A B C D E F B@2 D G A H I@2
  ~@4 J K L M@2 K L M N Q R I S T E U D V E A I W X@2 Y@4 Z AA M Z@2 AA M Z@2 AA M Z ~@18 B@2 E AB B@2 E@2 AC@4 AD@2
  AC@2 AE@3 AF AG AH AI AJ ~@21 B@2 E@2 AC@4 AD@2 AC@2 AE@3 AF AG AH AI ~@4 AC AK AL AC@2 AK AL AC ~@6 B@2 E@2 AC@4 AD@2
  AC@2 AE@3 AF AG AH AI AJ
>`.pickRestart({
  A: "f1 f2 f1 f2@2 f2 f1@2 ~ f1 f2 f1 c1 f1 f2@2", B: "c2 c3 c2 c3@2 c3 c2@2 ~ c2 c3 c2 g1 c2 c3@2",
  C: "c#2 c#3 c#2 c#3@2 c#3 c#2@2 ~ c#2 c#3 c#2 g#1 c#2 c#3@2",
  D: "g#1 g#2 g#1 g#2@2 g#2 g#1@2 ~ g#1 g#2 g#1 d#1 g#1 g#2@2",
  E: "a#1 a#2 a#1 a#2@2 a#2 a#1@2 ~ a#1 a#2 a#1 f1 a#1 a#2@2",
  F: "f#1 f#2 f#1 f#2@2 f#2 f#1@2 ~ f#1 f#2 f#1 c#1 g#1 g#2@2",
  G: "d#1 d#2 d#1 d#2@2 d#2 d#1@2 ~ d#1 d#2 d#1 a#0 d#1 d#2@2",
  H: "c#1 c#2 c#1 c#2@2 c#2 c#1@2 ~ c#1 c#2 c#1 g#1 c#1 c#2@2", I: "g1 g2 g1 g2@2 g2 g1@2 ~ g1 g2 g1 d1 g1 g2@2",
  J: "g1!2 g2 g1 d2 g1 c2@2 ~ g1 g2 g1 d2 g1 c2@2", K: "c2!2 c3 c2 a2 c2 g2@2 ~ c2 c3 c2 a2 c2 g2@2",
  L: "f1!2 f2 f1 d2 f1 c2@2 ~ f1 f2 f1 d2 f1 c2@2", M: "g1!2 g2 g1 e2 g1 d2@2 ~ g1 g2 g1 e2 g1 d2@2",
  N: "f1 f2!2 f1!2 f2@2 f2 f1 f2!2 f1 [c2,f2] f2 f1 [f1,a#1], ~@13 c2@2 ~", O: "a#1!5 a#1@2 a#1!5 f1!3 c2",
  P: "c1 c2!2 c1!2 c2@2 c2 c1 c2!2 c1!2 c2@2 c2", Q: "a#1!5 a#1@2 a#1!5 a1!3 d2",
  R: "d1 d2!2 d1!2 d2@2 d2 d1 d2!2 d1!2 d2@2 d1", S: "d2 d3 d2 d3@2 d3 ~@3 d2 d3 d2 a1 d2 d3@2",
  T: "d#2 d#3 d#2 d#3@2 d#3 d#2@2 ~ d#2 d#3 d#2 a#1 d#2 d#3@2", U: "c2 c3 c2 c3@2 c3 c2@2 ~ c2 c3 c2 a1 c2 c3@2",
  V: "d2 d3 d2 d3@2 d3 d2@2 ~ d2 d3 d2 a1 d2 d3@2", W: "d#1 d#2 d#1 d#2@2 d#2 d#1@2 ~ d#1 d#2 d#1 a#0 d#1 a#1@2",
  X: "a1 a2 a1 a2@2 a2 a1@2 ~ a1 a2 a1 e1 a1 a2@2", Y: "~ d2@2 d2@3 ~@2",
  Z: "a1!2 a2 a1 f#2 a1 e2@2 ~ a1 a2 a1 f#2 a1 e2@2", AA: "d2!2 d3 d2 b2 d2 a2@2 ~ d2 d3 d2 b2 d2 a2@2",
  AB: "a#1 a#2 a#1 a#2@2 a#2 a#1@2 ~ a#1 a#2 a#1 ~ a#1 a#2@2", AC: "g2 g3 g2 g3@2 g3 g2@2 ~ g2 g3 g2 d2 g2 g3@2",
  AD: "a2 a3 a2 a3@2 a3 a2@2 ~ a2 a3 a2 e2 a2 a3@2", AE: "e2 e3 e2 e3@2 e3 e2@2 ~ e2 e3 e2 b1 e2 e3@2",
  AF: "g#2 g#3 g#2 g#3 g#2!2 g#3 g#2!2 g#3 g#2 g#3 g#2!2 g#3 g#2",
  AG: "d3 d4 d3 d4 d3!2 d4 d3 d#3 d#4 d#3 d#4 d#3!2 d#4 d#3", AH: "e3 e4 d#4 e4!2 e3!5 e4 e3!2 e4 d#4 e4",
  AI: "e4 e3!5 e4 e3!2 e4 e3!3 e4 d#4 e4", AJ: "[a2,a3]", AK: "c3 c4 c3 c4@2 c4 c3@2 ~ c3 c4 c3 g2 c3 c4@2",
  AL: "f2 f3 f2 f3@2 f3 f2@2 ~ f2 f3 f2 c2 f2 f3@2",
})).s("gm_synth_bass_1").gain(0.46)

// bass · synth bass 2
const bass_2 = note(`<
  ~ A B A B A C D E F G H I J K L M N O P Q R S A T U V W X Y Z AA AB AC AD AA AB AC AE AF AG AH A C D E F G H I J K L M
  N O P Q R S A T U V AI X AJ Z AA AB AC AD AA AB AC AE AF AK@2 AL AM AN AO AP G AQ AR AS AL AT AU AV AW AX AY AZ BA BB
  BC BD BA BB BC BD BA BB BC BD BE BF ~ BG BH BI ~@24 BJ BK BL BM BN BO BP BQ BR BS@2 BT BU BV BW BX BU BV BW BX BY BZ
  CA CB CC CD CE CF CG CH CI CJ CK@8 ~ BJ BK BL BM BN BO BP BQ BR BS@2 CL@3 CM CN CO CP CN@2 CO ~ CQ CR CS CT ~@11 BJ BK
  BL BM BN BO BP BQ BR BS@2 BT
>`.pickRestart({
  A: "f2@3 ~ f1@2 ~@6 c2@2 f2@2, ~@12 f2 ~@3", B: "f1@3 ~ f1@2 ~@6 f2@2 c2@2, ~@12 c2 ~@3",
  C: "c2@3 ~ c1@2 ~@6 c2 ~ g#1@2", D: "c#2@3 ~ c#1@2 ~@6 g#1@2 c#2@2, ~@12 c#2 ~@3",
  E: "g#1@3 ~ g#1@2 ~@4 g#1@2 g#1 ~ g#1@2", F: "a#1@3 ~ a#1@2 ~@2 a#1 ~ a#1@2 a#1 ~ g#1@2",
  G: "g#1@3 ~ g#1@2 ~@6 g#1 ~ g#1@2", H: "c2@3 ~ c1@2 ~@6 g1@2 c2@2, ~@12 c2 ~@3",
  I: "c1@3 ~ c1@2 ~@4 g1@2 c2@2 c2@2, ~@12 g1 ~@3", J: "f2@3 ~ f1@2 ~@4 f2@2 c2@2 f2@2, ~@12 f2 ~@3",
  K: "c2@3 ~ c1@2 ~@4 c2@2 c2 ~ g1@2", L: "c#2@3 ~ c#1@2 ~@4 c#2 ~ g#1@2 c#2@2, ~@12 c#2 ~@3",
  M: "g#1@3 ~ g#1@2 ~@4 d#2@2 g#2@2 g#1@2, ~@12 d#2 ~@3", N: "a#1@3 ~ a#1@2 ~@6 g#1@2 c#2@2, ~@12 a#1 ~@3",
  O: "f#1@3 ~ f#1@2 ~@6 f#2@2 f#1@2, ~@12 f#1 ~@3", P: "c2@3 ~ c1@2 ~@6 c2 ~ c2@2",
  Q: "c1@3 ~ c1@2 ~@2 c2@2 c2@2 a#1@2 a#1@2", R: "g#2@3 ~ g#1@2 ~@4 g#2@2 g#1@2 g#2@2, ~@12 g#2 ~@3",
  S: "d#2@3 ~ d#1@2 ~@4 d#2@2 d#2 ~ a#1@2", T: "c#2@3 ~ c#2@2 ~@6 c#2 ~ g#1@2",
  U: "g1@3 ~ g1@2 ~@4 g2@2 d2@2 g2@2, ~@12 g2 ~@3", V: "g1@3 ~ g1@2 g1@2 g1@8", W: "~@12 c1!4",
  X: "c1 ~@3 c1@2 ~@6 c1 ~ c1 ~", Y: "c1@3 ~ c1@2 ~@6 c1!4", Z: "c1 ~@3 c1@2 ~@2 c1 ~ c1@4 c1@2",
  AA: "g1@3 ~ d2@4 g1@2 ~@6", AB: "c2@3 ~ g2@4 c2@2 ~@6", AC: "f1@3 ~ c2@4 f1@2 ~@6, e1 ~@15",
  AD: "g1@3 ~ d2@4 g1@2 ~@6, f1 ~@15", AE: "g1@3 ~ d2@4 g1@2 ~@2 c2@3 ~, f1 ~@15", AF: "f1@5 ~@7 c2@3 ~",
  AG: "a#1@5 ~@3 a#1@4 f1@3 ~", AH: "c1@9 ~@7", AI: "~@12 c1 ~ c1 ~", AJ: "c1@3 ~ c1@2 ~@6 c1 ~ c1 ~",
  AK: "[a#1@5 ~@3 c2@4 a1@2 d2@6 ~@12]/2", AL: "g2@3 ~ g1@2 ~@6 d2@2 g2@2, ~@12 g2 ~@3",
  AM: "d2@3 ~ d1@2 ~@6 d2@2 a1@2, ~@12 a1 ~@3", AN: "d#2@3 ~ d#1@2 ~@2 d#2 ~ d#2@2 a#1@2 d#2@2, ~@12 d#2 ~@3",
  AO: "a#1@3 ~ a#1@2 ~@4 a#1@2 a#1 ~ a#1@2", AP: "c2@3 ~ c1@2 ~@6 c2 ~ a#1@2",
  AQ: "d2@3 ~ d1@2 ~@2 d2 ~ d2@2 a1@2 d2@2, ~@12 d2 ~@3", AR: "a#1@3 ~ a#0@2 ~@6 a#1 ~ a#1@2",
  AS: "f2@3 ~ f1@2 ~@6 f2@2 c2@2, ~@12 c2 ~@3", AT: "d#2@3 ~ d#2@2 ~@6 d#2 ~ a#1@2",
  AU: "a1@3 ~ a1@2 ~@6 e2@2 a2@2, ~@12 a1 ~@3", AV: "a1@3 ~ a1@2 ~@2 a1@3 ~ a1@2 ~@2", AW: "d1@4 ~@8 d1 ~ d1 ~",
  AX: "d1 ~@3 d1@2 ~@6 d1 ~ d1 ~", AY: "d1@3 ~ d1@2 ~@6 d1 ~ d1 ~", AZ: "d1 ~@3 d1@2 ~@2 d1 ~ d1 ~ d1 ~ d1 ~",
  BA: "a1@3 ~ e2@4 a1@2 ~@6", BB: "d2@3 ~ a2@4 d2@2 ~@6", BC: "g1@3 ~ d2@4 d2@2 ~@6, d#2 ~@15",
  BD: "a1@3 ~ e2@4 a1@2 ~@6, g1 ~@15", BE: "g2 ~ g2 ~@5", BF: "~@2 c#2@3 ~ d#2@2 e2@3 ~ f2@2 a2@2", BG: "~@7 f2",
  BH: "f2 ~@3 g2@2 g#2@3 ~ a2@3 ~ d2 ~", BI: "d2 ~@15", BJ: "a1@3 a1@3 a1@2 ~@6 a1!2", BK: "a1@3 a1@3 a1@2 ~@8",
  BL: "g2@3 g2@3 g2@2 ~@6 g2 ~", BM: "~@14 e2!2", BN: "e2@3 e2@3 e2!2 e2@3 e2@3 e2!2",
  BO: "e2@3 e2@3 e2!2 e2@3 e2@3 a2 b2", BP: "e2@3 e2@3 e2!2 e2@3 e2@3 e2@2", BQ: "c#2@3 c#2@3 c#2@2 c#2@3 c#2@3 c#2@2",
  BR: "d2@3 d2@3 d2@2 d#2@3 d#2@3 d#2@2", BS: "e2@3 e2@3 e2@2 ~@8", BT: "a2", BU: "a2@3 e2@4 a2", BV: "b2@3 e2@4 e2",
  BW: "b2@3 e2@4 g#2", BX: "a2@3 e2@4 e2", BY: "a2@3 e3@4 a2", BZ: "d3@3 d2@4 a2", CA: "b2@3 f#2@4 d#3",
  CB: "e3@3 e2@5", CC: "c2@3 c2@2 ~@7 c2@2 c2!2", CD: "c2@3 c2@2 ~@7 c2 ~@2 c2", CE: "c2@3 c2@2 ~@4 c2@4 c2@3",
  CF: "c2@3 c2@2 ~@7 g2!4", CG: "a2@3 a2@2 ~@4 a2@4 a2@2 a2", CH: "d2@3 d2@2 ~@4 d2!3 e2@2 d2@2",
  CI: "g2@3 g2@2 ~@10 g2", CJ: "g2@3 g2@2 ~@9 g2@2", CK: "[g2@3 g2@2 ~@5 g2@2 g2@3 g2@113]/8",
  CL: "c1@3 c1 c1@3 c1 c1@2 c1!2 c1@2 c1!2", CM: "c1@3 c1 c1@3 c1 c1@2 c1!2 c1@2 ~@2", CN: "g1@3 d2@3 g1@3 ~@7",
  CO: "c2@3 g2@3 c2@3 ~@7", CP: "f1@3 c2@3 f1@3 ~@6 f1", CQ: "g2@3 d3@4 g2@2 ~@7", CR: "f2@3 f2@2 ~@11",
  CS: "~@2 b2@3 c#3@3 d3@3 d#3 ~@4", CT: "f2@2 ~@4 f2@2 ~@5 f2@2 ~",
})).s("gm_synth_bass_2").gain(0.41)

// other · steel drums
const steel_drums = note(`<
  ~@42 A B C D E F G@2 A B C H I F G@2 J K L M N ~ O P O Q ~@7 R@4 ~@17 S T U V S T U V S T U W X Y Z AA AB AC ~@16 AD
  AE AF AG AH AI AJ AI AK@2 AL AM AN@2 AO AP AQ AR AS AT AU AV AW AX AY AV AW AX AZ BA BB BC ~@9 AD AE AF AG AH AI AJ AI
  AK@2 AL AM AN@2 AO AP AQ AR AS ~@4 BD BE BF BG BD BE BF BH ~@6 BI AE AF AG AH AI AJ AI AK@2 AL AM AN@2 AO AP AQ AR AS
  AT
>`.pickRestart({
  A: "f4@2 c5@2 a4@2 f4 c5@2 c5@2 c5 a4@2 f4@2", B: "g4@2 g4@2 f#4@2 g4 c5@2 c5@3 ~@4",
  C: "c#5@2 g#4@2 f5@2 d#5 f5@2 f5@2 f5 d#5@2 c#5@2", D: "d#5@2 d#5@2 c5@2 c#5 d#5@2 d#5@2 d#5 c#5@2 c5@2",
  E: "a#4@2 c#5@2 c5@2 f4 c#5@2 c#5@2 c#5 c5@2 a#4@2", F: "c#5@2 c#5@2 c5@2 a#4 c#5@2 c#5@2 c#5 c5@2 a#4@2",
  G: "c5@2 c5@2 ~ c5@2 ~ c5@2 c5@2 ~ c5@2 ~", H: "d#5@2 d#5@2 c5@2 c#5 d#5@2 ~ d#5@2 ~@3 g#4",
  I: "a#4@2 c#5@2 c5@2 a#4 c#5@3 c#5!2 c5@2 f4@2", J: "g#4@2 d#4@2 c5@2 a#4 c5@2 c5@2 c5 g#4@2 d#4@2",
  K: "a#4@2 a#4@2 g4@2 g#4 a#4@2 ~ d#4@2 g4@2 d#4@2", L: "f4@2 g#4@2 g4@2 c4 g#4@2 g#4@2 g#4 g4@2 f4@2",
  M: "g#4@2 g#4@2 g4@2 f4 g#4@2 g#4@2 g#4 g4@2 f4@2", N: "g4", O: "g4@2 e5@2 c5@2 g4 e5@2 e5@2 e5 c5@2 g4@2",
  P: "a4@2 f5@2 c5@2 a4 f5@2 f5@2 f5 c5@2 a4@2", Q: "a4@2 f5@2 c5@2 a4 f5@2 f5@2 ~@5",
  R: "[~@12 [g4,c5,e5]@2 ~ [a4,c5,f5]@2 ~@11 [g4,c5,e5]@2 ~ [f4,a#4,d5]@2 ~@7 [g4,c5,e5]@2 ~@2 [c#5,e5,a5]@2 ~ [a4,d5,f#5]@2 ~@15]/4", // C F C A# C A D
  S: "e4@2 c#4@2 e4@2 c#4@2 ~ e4@2 e4 c#4@2 ~@2", T: "f#4@2 d4@2 f#4@2 d4@2 ~ f#4@2 f#4 d4@2 ~@2",
  U: "g4@2 d4@2 g4@2 d4@2 ~ g4@2 g4 d4@2 ~@2", V: "c#4 e4 c#4 e4 ~@3 c#4", W: "c#4 e4 c#4 e4 ~@4",
  X: "[d4,g4,b4] ~@2 [d4,g4,b4] ~@12", Y: "~@2 [f4,c#5]@3 [f#4,c#5]@3 [g4,c#5]@3 [g#4,c#5]@3 [a4,c#5]@2",
  Z: "~ a3 g#3 a3 b3 a3 g#3 a3 c4 a3 g#3 a3 c#4 a3 g#3 a3", AA: "d4 a3 g#3 a3 d#4 a3 g#3 a3 e4@2 ~@3 [f4,a4]@3",
  AB: "[f4,a#4]@3 [g4,b4]@3 [g#4,c5]@3 [a4,c#5]@3 ~@2 [d4,d5]!2", AC: "[d4,d5] ~@7",
  AD: "c5@2 c5 c5@2 c5 c5@2 c5@2 c5@2 c5 c5@2 c5", AE: "c5@2 c5 c5@2 c5 c5@2 c5 c5@2 c5 c5@2 c5@2",
  AF: "a#4@2 a#4 a#4@2 a#4 a#4@2 a#4 a#4@2 a#4 a#4@2 a#4!2", AG: "a#4@2 a#4 a#4@2 a#4 a#4@2 a#4!2 a#4@2 a#4@2 g4!2",
  AH: "g4@2 g4 g4@2 g4 g4@2 g4@2 g4 g4@2 g4@2 g4", AI: "g4@2 g4 g4@2 g4 g4@2 g4@2 g4 g4@2 g4!3",
  AJ: "g4@2 g4 g4@2 g4 g4@2 g4@2 g4 g4@2 g4 g4@2", AK: "a4@2 a4 a4@2 a4 a4@2 a4@2 a4@2 a4!4",
  AL: "g4@2 g4 g4@2 g4 g4@3 g4@2 g4 g4@2 g4@2", AM: "g4@2 g4 g4@2 g4 g4@2 g4 g4@2 g4 g4@2 e4!2",
  AN: "e4@2 e4 e4@2 e4!3 e4@2 e4 e4@2 e4!3", AO: "e4@2 e4 e4@2 e4!3 e4@2 e4 e4@3 e4!2", AP: "d5!8 [c#5,d5] c#5!7",
  AQ: "[b4,c#5] b4!7 [a4,b4] a4!7", AR: "e5@3 e5@3 e5@2 ~@8, a4 ~@15", AS: "e5@3 e5@3 e5@2 ~@8", AT: "[a3,a4]",
  AU: "[c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~@3 [c4,e4,a4]@2 ~ [c#-1,c4,e4,a4]@2 ~@3", // Am A
  AV: "[d4,e4,g#4]@2 ~ [d4,e4,g#4]@2 ~ [d4,e4,g#4]@2 ~@8", // E7
  AW: "[d4,e4,g#4]@2 ~ [d4,e4,g#4]@2 ~@3 [d4,e4,g#4]@2 ~ [d4,e4,g#4]@2 ~@3", // E7
  AX: "[c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~@8", // Am
  AY: "[c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~@3 [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~@3", // Am
  AZ: "[g4,a4,c#5]@2 ~ [g4,a4,c#5]@2 ~@3 [g4,a4,c#5]@2 ~ [g4,a4,c#5]@2 ~@3", // A7
  BA: "[f4,a4,d5]@2 ~ [f4,a4,d5]@2 ~ [f4,a4,d5]@2 ~@8", // Dm
  BB: "[a4,b4,d#5]@2 ~ [a4,b4,d#5]@2 ~@3 [a4,b4,d#5]@2 ~ [a4,b4,d#5]@2 ~@3", // B7
  BC: "[g#4,b4,d5]@2 ~ [g#4,b4,d5]@2 ~ [g#4,b4,e5]@2 ~@8", BD: "d4@2 b3@2 d4@2 b3@2 ~ d4@2 d4 b3@2 ~@2",
  BE: "e4@2 c4@2 e4@2 c4@2 ~ e4@2 e4 c4@2 ~@2", BF: "f4@2 c4@2 f4@2 c4@2 ~ f4@2 f4 c4@2 ~@2",
  BG: "b3 d4 b3 d4 ~@2 d4 b3", BH: "b3 d4 b3 d4 ~@4", BI: "~@2 c5 c5@2 c5 c5@2 c5@2 c5@2 c5 c5@2 c5",
})).s("gm_steel_drums").gain(0.51)

// bass · synth brass 1
const bass_3 = note("<~@117 A@8 ~@3 B@2 C@2 B@2 D@2 E@8 ~@27 C@2 B@2 D@2 E@8 ~@22 F C@2 B@2 ~@16>".pickRestart({
  A: "c2/8", B: "a#1/2", C: "c2/2", D: "g2/2", E: "g2/8", F: "~@5 c2@3",
})).s("gm_electric_bass_finger").gain(0.51)

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

// drums · snare
const snare = s("sd").struct(`<
  A B ~ C D B ~ C D B ~ C E B ~ C E B ~ C E B ~ C E C E ~@3 F G@3 H G@3 I J K L B ~ C D B ~ C E B ~ C E B ~ C E B ~ C E
  C E ~@3 F G@3 H G@3 I J K ~ B ~ C D B C M B ~ C D N@2 ~@4 G@3 H G@3 O G@4 P ~@3 Q R ~@2 S G@3 T G@3 T U G@3 H G@3 T
  G@3 T G@3 T G T G@2 T V@2 R ~@20 W G@3 T G@3 T G@3 T G T G@2 T V@2 ~@3 X G@3 H G@3 Y Z AA@4 AB G@3 T G@3 T G@3 T G T
  G@2 T V@2 R
>`.pickRestart({
  A: "x ~@6 x!9", B: "~@11 x!2 ~@3", C: "~@11 x ~@4", D: "~@11 x ~ x!2 ~", E: "~@9 x!6 ~", F: "~@7 x!2 ~@2 x!5",
  G: "~@4 x ~@6 x ~@4", H: "~@4 x ~@6 x ~ x ~@2", I: "~@4 x ~@7 x ~@2 x", J: "~@12 x ~@2 x", K: "~@8 x ~@3 x ~@2 x",
  L: "~@11 x!5", M: "~@10 x ~ x!4", N: "x!5 ~ x!9 ~", O: "~@4 x ~@6 x!5", P: "x ~@2 x ~@12", Q: "~@10 x!3 ~ x!2",
  R: "x", S: "~@6 x ~@2 x ~ x ~ x!3", T: "~@4 x ~@6 x ~@2 x ~", U: "x ~ x!7 ~ x!5 ~", V: "x ~@2 x ~@2 x ~@4 x!2 ~@3",
  W: "~@2 x!4 ~ x ~ x!7", X: "~@9 x!7", Y: "~@4 x ~@3 x!2 ~ x!5", Z: "~ x ~ x!13", AA: "x!16", AB: "x!9 ~@7",
})).gain(0.46)

// drums · clap
const clap = s("cp").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~@18 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~@18 A ~@2 A ~@3 A ~@139
>`.pickRestart({
  A: "~@3 x",
})).gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@207 [~@3 x] ~@20>").gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<~ A ~@37 B C@2 ~@34 B@3 A ~@69 D ~@40 E F@3 ~@8 E G H I@2 J ~@19 D>".pickRestart({
  A: "x ~ x!2 ~@12", B: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x!2", C: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x", D: "x",
  E: "~ x!2 ~ x!12", F: "x!3 ~ x!12", G: "x!2 ~ x!2 ~ x ~ x ~ x!6", H: "~ x!5 ~ x!6 ~ x!2", I: "x!4",
  J: "x ~@3 x ~@9 x!2",
})).gain(0.46)

// drums · mid tom
const mid_tom = s("mt").struct("<~@115 A B C D ~@2 C D ~@84 E ~@20>".pickRestart({
  A: "~@3 x ~ x!3 ~ x!7", B: "x!6 ~ x!2 ~ x!2 ~ x!3", C: "x!6 ~@10", D: "~@3 x", E: "~@5 x ~@2",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A@15 B@4 A B A B A C@4 D@8 ~@3 A@13 B@4 A B A B A C@4 D@8 ~@4 A@3 ~ A D A@10 D@7 ~ D@4 C E F G H F@32 ~@2 I@2 ~ D
  ~ D ~ D ~ D ~ D ~ D J D ~@8 F@15 ~@2 I@2 C F@3 D@8 C K L ~@3 F@15 ~@2 I@2 ~
>`.pickRestart({
  A: "~@3 x!2 ~@11", B: "x ~@2 x!2 ~@11", C: "x ~@2 x ~@12", D: "x", E: "~@2 x ~@5 x ~@2 x ~@2 x ~", F: "~@3 x ~@12",
  G: "~@3 x ~@9 x ~@2", H: "x ~@2 x ~@2 x ~@2 x ~@6", I: "~@3 x ~@2 x ~@9", J: "x ~@2 x ~@2 x ~@9",
  K: "~@2 x ~@2 x ~ x ~ x ~@6", L: "x ~@5 x ~@6 x ~@2",
})).gain(0.46)

// drums · crash
const crash = s("cr").struct("<~@207 [~ x] ~@20>").gain(0.46)

// drums · ride
const ride = s("rd").struct("<~@31 A@8 ~@29 A@8 ~@20 A@7 ~ A@4 ~@86 A@7 B ~@26>".pickRestart({
  A: "~ x!7", B: "~ x!5 ~@2",
})).gain(0.46)
// … 25 more lines

More by Jean Michel Jarre