Strudelify
Ellington Medley cover art

Decades Of Duke

Ellington Medley

Ellington

KeyC majorTempo107 bpm
0:00/0:00
// Ellington Medley — Ellington
// 107 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 14 ms ahead of the beat; the grid follows it, so its parts stay together.
setcpm(107/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  A@2 B ~ C ~ D ~ E F G ~ C ~ D ~ E F G ~ H I J K L M N O C ~ D ~ E F G ~ P Q R S T U V ~ P Q R S T U V W X Y X Z AA AB
  AC ~ AD Q AE S T AF AG AH AI AJ AK AL AM AN AO AP AI AJ AK AL AM AN AQ AR AS AT AU AV AW AX AY AZ BA AJ AK BB AM BC BD
  BE AM BC BF BE AM BG BH BI@2
>`.pickRestart({
  A: "~@2 g2 g1@3 ~@2 g2 g1@3", B: "~@2 g2 g1@3 ~@2 g2 g1@2 c2", C: "~@2 c2@4 d2@3 d#2@2 e2",
  D: "~@2 c2@4 b1@3 a#1@2 a1", E: "d2 e2 f#2 d2", F: "g2@3 d2@3 g2@2 d2 g1@3", G: "c2@2 e2@4 f2@3 f#2@2 g2",
  H: "f2 c3 a2 f2", I: "a#2 g#2 g2 f2", J: "e2 g2 d2 c#2", K: "c2 g2 e2 c2", L: "d2 f#2 a2 c3",
  M: "d3@2 d2 e2@3 f2@3 f#2@3", N: "g2@2 ~@4 g2@3 d2@2 g2", O: "~@2 g1 g#1@3 a1@2 a#1 b1@2 c2", P: "g2 ~@2 d2 ~@2",
  Q: "g1@3 ~@2 d2 g2@3 g1@3", R: "c2@2 ~@4 c2@3 ~@3", S: "f2@3 ~@2 c2 f2@3 f#2@3", T: "g2 g#2 a2 e2",
  U: "d#2@3 ~@2 d#2 d2@2 ~@3 d2", V: "c#2@3 c2@3 b1@2 a#1 ~@2 a1", W: "~@2 e2@4 f2@2 ~ a#1 ~@2", X: "d#2!2 d2!2",
  Y: "c2!2 a#1!2", Z: "c2!2 a#1 g#1", AA: "g1@2 g2 f#2@3 e2@3 d2@3", AB: "b1!2 a#1!2", AC: "a1@3 ~@2 a2 a1@3 a1@2 d2",
  AD: "g2 ~ d2 ~", AE: "c2 ~ c2 ~", AF: "d#2@3 ~@2 d#2 d2@3 ~@2 d2", AG: "c#2@3 c2@3 b1@2 a#1 a1@2 g1",
  AH: "~@2 d#2@4 e2 ~@2 d#2 ~@2", AI: "d2@2 ~@3 d2 g2@2 ~@3 g2", AJ: "d2@3 ~@2 d2 g2@3 f2@3",
  AK: "e2@3 ~@2 e2 a1@3 ~@2 a1", AL: "e2@3 ~@2 e2 a2@4 ~ a2", AM: "d2@3 ~@2 d2 a2@3 d2@3",
  AN: "c#2@3 ~@2 c#2 g#2@3 c#2@2 ~", AO: "c2@2 ~@3 c2 g2@2 ~@3 g2", AP: "c2@3 ~@2 d#2 e2@2 d#2@4",
  AQ: "c2@3 ~@2 c2 g2@3 b1@3", AR: "a1@3 a2@3 g#2@3 g#1@2 ~", AS: "g1 d2 c2 c3", AT: "g2 d2 c2 e2", AU: "f2!2 g2 g#2",
  AV: "a2 g2 f2 a#1", AW: "a1 e2 d2 f#2", AX: "a2 e2 d2 f#2", AY: "g2 d2 g1 g2", AZ: "e2@3 e2@3 a2@3 a1@2 ~",
  BA: "d2@3 ~@2 d2 g2@3 ~@2 g2", BB: "e2@3 ~@2 e2 a2@3 ~@2 a2", BC: "c#2@3 ~@2 c#2 g#2@3 c#2@3",
  BD: "c2@3 ~@2 c2 c3@3 a#2@3", BE: "a2@2 a1 b1@3 c2@3 c#2@3", BF: "c2@3 ~@2 g2 c3@3 a#2@3",
  BG: "c#2@3 ~@2 c#2 g#2@3 c#3@2 c3", BH: "~@2 c3 e2@3 f2@3 f#2@3", BI: "[g2@2 a2 b2@2 c3@2 ~@2 c2@15]/2",
})).s("gm_acoustic_bass").gain(0.49)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A@3 ~ B ~ C ~ D@2 E ~ B ~ C ~ D@2 E F@3 G@2 H@2 I ~ B ~ C ~ D@2 E ~ J K L M N O@2 ~ J K L M N P@2 Q R S@2 T@2 U V ~ J
  K L M N P@2 W X Y@2 Z AA AB@2 AC X Y@2 Z AA AD@2 AE AF@3 AG AH@3 AI X Y@2 Z AA AJ@3 AA AJ@3 AA AK ~ AL@2
>`.pickRestart({
  A: "[[g3,c4,e4]@10 ~ [g#3,c#4,f4]@11 ~ [a#3,d#4,g4]@5 ~ [g#3,c#4,f4]@5 ~ [g3,c4,e4]]/3", // C C# D# C# C
  B: "~@2 [g3,a3,c4,e4]@4 [f3,a3,c4,d4,f4]@3 [f#3,a#3,c#4,d#4,f#4]@2 [g3,b3,d4,e4,g4]", // Am7 Dm7 D#m7 Em7
  C: "~@2 [a3,c4,d4,e4,a4]@4 [g#3,b3,d#4,f#4,g#4]@3 [g3,a#3,d4,g4]@2 [e3,g3,a3,c#4,e4]", // Am G#m7 Gm A7
  D: "[[d3,f#3,a3,c4,e4]@7 ~ [d3,f#3,a3,c4,e4] ~@2 [g3,d4,f4,a4,c5]@6 ~ [g3,f4,a4,c5,e5]@6]/2", // D7 Dm7 Fmaj7
  E: "~@2 [a#3,d4,e4,g4,a#4]@4 [a3,c4,d4,f4,a4]@2 ~ [g#3,c4,d#4,f#4,g#4]@2 [g3,a3,c4,e4,g4]", // Em7b5 Dm7 G#7 Am7
  F: "[~@2 c5 d5@2 c5 e5@2 c5 [d#4,g4,a#4,c#5,d#5]@2 [d4,f4,a4,c5,d5]@6 [c4,d4,f4,a4,c5]@4 [a3,c4,d4,f4,a4]@2 [c4,d#4,f4,g#4,c5]@3 [d4,f4,g4,a#4,d5] [d#4,g4,g#4,c5,d#5]@2 [d#4,g4,g#4,c5,d#5]@2 ~ [d4,f4,g4,a#4,d5] [c4,d4,d#4,f4,g#4,c5]@2 ~]/3", // D#7 Dm7 Fm7 Gm7 G#maj7 Gm7 Fm7
  G: "[~@2 [d4,e4,g4,b4,d5]@4 [c4,d4,f4,a4,c5]@2 ~ [g3,b3,d#4,f4,g4]@2 [e3,g3,a#3,d4,e4]@13]/2", // Em7 Dm7 Gaug Em7b5
  H: "[~@2 [d4,f#4,a4,b4,d5]@4 [c4,e4,g4,a4,c5]@2 ~ [a3,c4,e4,g4,a4]@2 [c4,e4,f#4,a4,c5]@12 ~]/2", // Bm7 Am7 F#m7b5
  I: "~@2 [b3,d4,f4,g4,b4] [b3,d4,f4,g4,b4]@2 [g3,b3,d4,f4,g4] [b3,d4,f4,g4,b4]@2 g4 [a3,c4,e4,f#4,a4]@2 [g3,b3,d4,f4,g4]", // G7 F#m7b5 G7
  J: "[g3,b3,d4,f#4]", K: "[a3,c4,d4,f4] [g3,b3,d4,f4]", L: "[g3,a3,c4,e4]", M: "[f3,c4,d#4,g4]@3 [f#3,a3,c4,f#4]",
  N: "[b3,d4,e4,g4]@3 [g#3,b3,d4,g#4]@2 [a3,c4,e4,g4]@7", // Em7 G#dim Am7
  O: "[[g3,a#3,c#4,f4]@6 [d3,c4,e4,g4]@5 [b3,c#4,e4,g4]@4 [a#3,c4,d#4,g4]@3 [a3,b3,d4,f#4]@2 [g#3,a#3,c#4,f4]@3 [a3,c4,e4,g4]]/2", // Gm7b5 C C#m7b5 Cm7 Bm7 A#m7 Am7
  P: "[[g3,a#3,c#4,f4]@6 [d3,c4,e4,g4]@5 [b3,c#4,e4,g4]@4 [a#3,c4,d#4,g4]@3 [a3,b3,d4,f#4]@2 [g#3,a#3,c#4,f4] [a3,c4,e4,g4]@2 [g3,b3,d4,g4]]/2", // Gm7b5 C C#m7b5 Cm7 Bm7 A#m7 Am7 G
  Q: "~@2 [b3,d4,e4,g4]@4 [g#3,c4,d#4,g4]@2 ~ [b3,d4,f4,g4]@2 ~", R: "[d4,f4,g4,a#4]@11 ~",
  S: "[[a#3,c4,d#4,g4]@2 [c4,d#4,g4,a#4] [a#3,c4,d#4,g4]@2 [a#3,c4,d#4,g4]@3 [a#3,c4,d#4,g4] [a#3,c4,d#4,g4]@2 [c4,d#4,g4,a#4]@12 ~]/2", // Cm7
  T: "[[a#3,c4,d#4,g4]@2 [c4,d#4,g4,a#4] [a#3,c4,d#4,g4]@2 [c4,d#4,g4,a#4]@4 [c4,d#4,g4,c5]@2 [d4,f#4,b4,d5]@11 ~ d4]/2", // Cm7 Cm Bm
  U: "e4@2 g4 b4@2 f#4@4 ~@2 g4, [e3,g3,b3,d4]@5 [a#3,c#4]@7", // Em7 A#m
  V: "a4@2 f4 f#4@2 a4@3 a#4 b4@2 [a3,c4,d4,f#4,d5], [f#3,a3,e4]@5 [g3,b3,d4]@6 ~, ~@5 a2 ~@6", // D7 F#m7 G
  W: "~@2 [a#3,c#4,d#4,f#4]@4 [b3,d4,e4,g4]@2 ~ [a#3,c#4,d#4,g#4]@2 ~", // D#m7 Em7 A#m7
  X: "[c4,d4,f4,a4]@2 [c4,d4,f4,g4] [c4,d4,f4,a4]@2 [b3,d4,f4,g4] ~@2 [c4,d4,f4,a4] ~@3", // Dm7 Csus4 Dm7 G7 Dm7
  Y: "[~@2 [c4,d4,f4,a4]@4 [b3,d4,f4,g4]@2 [d4,f4,g4,a4] ~@2 [d4,e4,g4,b4]@3 [d4,e4,g4,a4] [d4,e4,g4,b4]@2 [c#4,e4,g4,a4] ~@2 [c#4,e4,g4,b4] ~@3]/2", // Dm7 G7 Dm Em7 Dsus4 Em7 A7 C#m7b5
  Z: "~@2 [d4,e4,g4,b4]@4 [c#4,e4,g4,a4]@2 [c#4,e4,g4,b4] ~@3", // Em7 A7 C#m7b5
  AA: "~@2 [d4,f#4,b4,d5]@4 [c4,e4,a4,c5]@2 [d4,f#4,b4,d5] ~@3", // Bm Am Bm
  AB: "[~@2 [a#3,d#4,g4,a#4]@4 [g#3,c#4,f4,g#4]@2 [a#3,d#4,g4,a#4] ~@2 [b3,c4,e4,g4]@13]/2", // D# C# D# Cmaj7
  AC: "~@2 [b3,d4,e4,g4] ~@2 [a#3,c#4,d#4,f#4] [b3,d4,e4,g4]@2 [a#3,c#4,d#4,g#4]@4", // Em7 D#m7 Em7 A#m7
  AD: "[~@2 [a#3,d#4,g4,a#4]@4 [g#3,c#4,f4,g#4]@2 [a#3,d#4,g4,a#4] ~@2 [b3,c4,e4,g4]@10 [g3,b3,d4,e4]@3]/2", // D# C# D# Cmaj7 Em7
  AE: "[a3,c4,e4,g4] [g#3,c4,d#4,g4]", // Am7 G#maj7
  AF: "[[g3,a#3,d4,f4]@5 [g3,a#3,c4,e4]@6 [g3,a#3,d4,f4]@6 [g3,a#3,c#4,e4]@6 [f3,a3,c4,e4]@7 [g3,a#3,d4,f4] ~@2 [g#3,b3,d#4,f#4] ~@2]/3", // Gm7 C7 Gm7 Gdim Fmaj7 Gm7 G#m7
  AG: "[a3,c4,e4,g4]@2 [g#3,b3,d#4,f#4] [g3,a#3,d4,f4]@2 [f3,a3,c4,e4]@2 ~ [g#3,a#3,c#4,f4]@3 ~", // Am7 G#m7 Gm7 Fmaj7 A#m7
  AH: "[[a3,c4,e4,g4]@5 [f#3,a3,c4,e4]@6 [a3,c4,e4,g4]@6 [f#3,a3,c4,e4]@6 [g3,c4,f4,a4]@13]/3", // Am7 F#m7b5 Am7 F#m7b5 F
  AI: "[b3,d4,e4,g4]@5 [c#4,e4,g4,a#4]@5 ~@2", // Em7 C#dim
  AJ: "[~@2 [a#3,d#4,g4,a#4]@4 [g#3,c#4,f4,g#4]@2 [a#3,d#4,g4,a#4] ~@2 [b3,c4,e4,g4]@10 [d4,f4,g4,c5]@2 [c#4,e4,f#4,a#4]@12 ~]/3", // D# C# D# Cmaj7 Dm7 F#7
  AK: "~@2 [a#3,d#4,g4,a#4]@4 [g#3,c#4,f4,g#4]@2 ~ [a#3,d#4,g4,a#4]@2 [b3,d4,e4,g4]", AL: "[~@3 [b3,c4,e4,g4]@5]/2",
})).s("gm_piano").gain(0.3)

// other · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note("<~@73 A@3 ~@5 B@3 C@4 D@3 ~@18>".pickRestart({
  A: "[~@11 d4@3 c4 b3@2 b3@9 ~@10]/3", B: "[~@11 d4@3 c4 b3 ~ b3@3 c4 d4@2 c4@11 ~@2]/3",
  C: "[c5@2 a#4 a4@2 g4@3 a4 a#4 ~ c5@3 a#4 a4@2 g4@3 a4 a#4@2 c5@17 ~@4 d5@4]/4",
  D: "[d5@2 c5 b4@2 a4@3 b4 c5@2 d5@3 c5 b4@2 a4@3 b4 c5@2 d5@13]/3",
})).s("gm_acoustic_guitar_nylon").gain(0.35).pan(0.3)

// chords · synth brass 1 · "BRASS 1"
const synth_brass_1 = note(`<
  ~@36 A@2 B@2 C D E ~ A@2 B@2 C D F G H I@2 J@2 K L ~ A@2 B@2 C D F ~@17 M@2 N O P@2 Q R S T@2 U V W@3 V W@3 V X ~ Y@2
>`.pickRestart({
  A: "[~@2 b3 d4@2 f#4@4 d4@2 f4@13]/2", B: "[~@2 g3 c4@2 e4@4 g3@2 d#4@13]/2", C: "~@8 [g3,a3,c4,e4] ~@3",
  D: "[a#3,c#4,d#4,f4]@5 [f#3,a3,c4,e4]@6 ~", // A#m F#m7b5
  E: "~@2 [g4,b4,c#5,e5] [g4,a#4,c5,d#5] ~@2 [f#4,a4,b4,d5]@2 [f4,g#4,a#4,c#5] ~@2 [e4,g4,a4,c5]", // C#m7b5 Cm7 Bm7 A#m7 Am7
  F: "~@2 [g4,b4,c#5,e5] [g4,a#4,c5,d#5] ~@2 [f#4,a4,b4,d5]@2 [f4,g#4,a#4,c#5] [e4,g4,a4,c5]@2 [d4,g4,b4]", // C#m7b5 Cm7 Bm7 A#m7 Am7 G
  G: "~@2 g4@3 ~ g4 ~@2 g4 ~@2", H: "a#4@2 ~", I: "[g4@2 a#4 g4 ~ g4@3 g4 g4@2 a#4@8 ~@5]/2",
  J: "[g4@2 a#4 g4@2 a#4@3 ~ c5@2 d5@11 ~@2]/2", K: "~@11 g4", L: "a4@2 f4 f#4@2 a4@3 a#4 b4@2 d5",
  M: "[[g3,a#3,d4,f4] ~@4 [g3,a#3,c4,e4]@4 ~@2 [g3,a#3,d4,f4]@4 ~@2 [g3,a#3,c#4,e4]@4 ~@3]/2", // Gm7 C7 Gm7 Gdim
  N: "~@2 [c4,e4,f4,a4]@4 [d4,f4,g4,a#4] ~@2 [d#4,f#4,g#4,b4] ~@2", // Fmaj7 Gm7 G#m7
  O: "[e4,g4,a4,c5]@2 [d#4,f#4,g#4,b4] [d4,f4,g4,a#4]@2 [c4,e4,f4,a4] ~@2 [a#3,c#4,g#4]@4", // Am7 G#m7 Gm7 Fmaj7 A#m7
  P: "[[a3,c4,e4,g4] ~@4 [a3,c4,e4,f#4]@4 ~@2 [a3,c4,e4,g4]@4 ~@2 [a3,c4,e4,f#4]@5 ~@2]/2", // Am7 F#m7b5 Am7 F#m7b5
  Q: "~@2 [a3,c4,d4,f4]@3 ~ [c4,d4,f4,a4] ~@2 [d4,f4,a4,c5] ~@2", // Dm7
  R: "[d4,e4,g4,b4]@2 [b3,d4,e4,g4] [d4,e4,g4,a4]@2 [c#4,e4,f#4,a#4]@4 ~@3", S: "a4@4 g4@2 a4@3 ~ g4@2 ~@4 a4@2 ~@6",
  T: "[~@2 a4@4 g4@2 a4 ~@2 b4@3 a4 b4@2 a4@2 ~ b4 ~@3]/2", U: "~@2 b4@4 a4@2 b4 ~@3", V: "~@2 d5@4 c5@2 d5 ~@3",
  W: "[~@4 a#4@8 g#4@4 a#4@2 ~@4 g4@17 ~ a4@2 c5@4 a#4@20 ~@6]/3", X: "~@2 a#4@4 g#4@2 ~ a#4@2 g4", Y: "[~@3 g4@5]/2",
})).s("gm_synth_brass_1").gain(0.3).pan(0.7)

// other · vibraphone
const vibraphone = note(`<
  A@2 B ~@32 C D E D E F G@2 C H E H I J K@2 ~@8 C D L M N F O@2 ~@25 P Q@2 R S T@3 S U@3 V W ~ X@2
>`.pickRestart({
  A: "~@2 c4 g4@2 c5@3 g4 c4 ~@2", B: "~@2 c4 g4@2 c5 g4@2 c4 g4@2 c5", C: "~@2 c5 a4@2 a#4 b4@2 d5 c5@2 a#4",
  D: "b4@11 ~", E: "~@4 c5@4 a4@2 a#4 ~ b4@3 ~ d5@4 c5@2 a#4@2", F: "b4@4 g4 ~ d4@4 c4@14",
  G: "[~@6 a#4@3 ~ b4@6 d4@2 e4@4 g4@24 ~@2]/2", H: "b4", I: "~@2 c5@2 a4 a#4 b4@2 d5 c5@2 a#4", J: "b4@2 g4 d4@2 c4@7",
  K: "[~@4 a#4 ~ a#4@3 ~ b4@6 d4@2 e4@4 g4@23 ~@3]/2", L: "~@4 c5@2 a4@3 ~ a#4@2 b4@3 ~ d5@4 c5@2 a#4@2", M: "b4@5 ~",
  N: "~@4 c5@2 a4@4 a#4@2 b4@3 ~@3 c5 ~@3 a#4@2, ~@4 d5 ~", O: "[~@4 a#4 ~ a#4@3 ~ b4@6 d4@2 e4@4 g4@20 ~@6]/2",
  P: "c6@2 b5 c6@2 b5 ~@2 c6 ~@3", Q: "[~@2 c6@3 ~ b5@2 c6 ~@2 d6@3 c#6 d6 ~ c#6 ~@2 c#6 ~@3]/2",
  R: "~@2 d6@3 ~ c#6@2 c#6 ~@3", S: "~@2 b5@3 ~ a5@2 b5 ~@3", T: "[~@2 g5@4 f5 ~ g5 ~@2 e5@7 ~@3 g5 ~ f#5@2 ~@11]/3",
  U: "[~@2 g5@3 ~ f5@2 g5 ~@2 e5@8 ~@2 g5@2 f#5@8 ~@5]/3", V: "~@2 b5@4 a5@2 b5 ~@3", W: "~@2 g5@4 f5 ~@2 g5 ~ c6",
  X: "[~@9 e5@13 ~@2]/2",
})).s("gm_vibraphone").gain(0.36).pan(0.3)

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

// drums · rim
const rim = s("rim").struct("<~@7 A ~@7 A ~@19 B C@6 ~ B C@6 D ~@8 B C@6 D ~@16 B ~@25>".pickRestart({
  A: "~@8 x!2 ~@2", B: "~@8 x!4", C: "~ x ~ x", D: "~ x ~@4",
})).gain(0.35)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@51 [~@12 x!6 ~@6] ~@35 [~@16 x!4 ~@4] ~@21>").gain(0.15)

// drums · hihat
const hihat = s("hh").struct("<~@36 A B@5 C ~ D B@5 E ~ F ~@7 A B@5 E ~@42>".pickRestart({
  A: "~ x", B: "x!4", C: "x ~@2 x ~@2 x ~ x ~@2 x", D: "x!2", E: "x ~@2 x ~@2 x ~ x!2 ~ x", F: "x",
})).gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@71 A ~@7 A ~@5 A ~@3 A ~@13 A ~@5>".pickRestart({
  A: "~@11 x",
})).gain(0.35)

// drums · mid tom
const mid_tom = s("mt").struct("<~@71 A ~@7 A ~@5 A ~@3 A ~@13 A ~@5>".pickRestart({
  A: "~@5 x",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@52 A ~@19 A ~@2 B ~@4 A ~@7 A ~ A ~@5 A ~@3 A ~@3 A C ~@3>".pickRestart({
  A: "x", B: "~@2 x ~@2 x!2 ~ x ~@3", C: "~@11 x",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@71 A ~@7 A ~@5 B ~@3 A ~@13 B ~@5>".pickRestart({
  A: "~@3 x", B: "~@8 x!2 ~@2",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct(`<
  A B C ~ D ~ D ~ E@2 F ~ D ~ D ~ E@2 F ~ E@6 G ~ D ~ D ~ E@2 F ~@17 E@6 H ~ I ~@6 J E@7 ~ E@10 J K E@2 L E@14 M ~ N ~
>`.pickRestart({
  A: "x ~@10 x", B: "~@11 x", C: "~@5 x ~@5 x", D: "~@2 x ~@3 x ~@2 x ~ x", E: "x ~@2 x ~ x!2 ~@2 x ~ x",
  F: "x ~ x ~@3 x ~@2 x ~ x", G: "x ~ x!2 ~ x!2 ~ x!2 ~ x", H: "x ~ x!2 ~ x ~@2 x!2 ~ x", I: "x",
  J: "~@2 x ~@3 x ~@2 x ~@2", K: "x ~ x!2 ~ x ~@2 x ~@3", L: "x ~ x ~@3 x ~@2 x ~@2", M: "x ~@2 x ~ x!2 ~@2 x ~@2",
  N: "x ~ x!2 ~ x ~@6",
})).gain(0.35)

stack(
  bass, piano, acoustic_guitar_nylon, synth_brass_1, vibraphone, kick, rim, snare, snare_soft, hihat, low_tom, mid_tom,
  crash, high_tom, ride
)

More by Ellington