Strudelify

Passion Flower

Ellington

KeyD majorTempo60 bpm
0:00/0:00
// Passion Flower — Ellington
// 60 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 62 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/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.

// other · piano
const piano = note(`<
  A B C D ~@3 E F G H I J K L M ~ N O P Q R S T U V W X Y Z AA AB AC AD@3 AE AF AG AH AI AJ AK AL AM AN AO AP AQ@2 AR AS
  AT AU AV AW AX@2 AY AZ BA@2
>`.pickRestart({
  A: "~@23 b5@2 ~@6 b5@2 f#5@2 ~@13, [g2,b3,d4,e4,a4]", // Em7
  B: "~@28 f6 ~ d6 ~ a#5 ~@2 c6 ~@2 g#5@7 ~@3, [d2,a#3,d4,e4,g#4]", C: "~@23 e6@2 ~@6 e6@2 ~@15, [g2,b3,d4,e4,a4]",
  D: "~@12 g#5@2 ~@2 a#6@2 ~@3 f6@13 ~@14, [d2,a#3,d4,e4,g#4]", E: "~@9 b4 ~@2 b5@4 ~@32",
  F: "~@19 f#5 ~@2 d#5 d5, ~@37 f5@2 ~@9", G: "~@2 c#5@8 ~@11 d5@3 d#5@3 e5@3 f5@3 f#5@3 g5@3 g#5@4 a5@2 a#5@3",
  H: "~ b5@17 d6@3 b5 ~@9 d#6 e6@3 d6@5 ~ a5@3 d6@4", I: "~@2 b5@21 ~@13 a#5 a5@4 ~@7",
  J: "~@20 d#5 ~@3 f#5@6 f5@6 e5@6 d#5@6",
  K: "d5@9 ~@11 a4 ~ d5@2 c#5@2 c5 b4@2 a#4@2 a4@2 g#4@2 g4 ~ f#4@2 f4@2 e4@2 f4@3 ~@2",
  L: "c5@12 ~@9 g4@2 ~ c5@12 ~@12", M: "~@14 b4@3 ~ b5@3 b5@2 ~@2 b5@4 b4@3 ~ b4@4 ~@3 b5@8, ~@37 b4@5 ~@6",
  N: "~@19 f#5@2 d5@2 ~ e6@5 ~ d6@6 a5@10 ~@2", O: "~@5 a#5 b5@3 d6@4 a5@8 ~ g#5 ~ f#5@6 a5@6 ~ e5@11, ~@23 g5@2 ~@23",
  P: "d5@10 ~@6 b4@2 d5@2 d#5@2 e5@2 f#5@3 ~ g5@2 a5@3 ~ f#5@3 ~@2 e5@3 f#5@3 ~@3",
  Q: "f5@24 ~@3 g#4@3 ~ a#4@2 a4@3 ~ g#4@11", R: "~@5 f#4 f4@2",
  S: "g4@10 ~@9 a4@2 a#4@2 b4@2 c5@2 c#5@2 d5@2 d#5@2 e5@2 ~ f5@12, ~@9 g4 ~@14",
  T: "~@12 g#5@6 ~@6 f#5@13 ~@5 a#5 a5 g#5 ~ g5 f#5",
  U: "~@13 d#4@2 ~@10 d#5@3 ~@4 c#5@4 d#5@4 c5@4 c#5@4, ~ f5@28 f5@5 ~@14", V: "d5@17 ~@31",
  W: "~@4 d#6@4 g#5@3 ~ f#5 f5 f#5 g#5",
  X: "d#5@7 ~@5 c#5 d#5 c#5 c5@2 ~ b4@3 a#4@3 a4@3 g#4@3 g4@3 f#4@3 f4@3 e4@3 d#4@3 d4@3", Y: "c4@5 ~@7",
  Z: "~@6 g#6 ~ g#6 c#6 d#6 d6", AA: "c6@7 ~@5", AB: "~@19 g#5 ~@3 b4@2 b5@16 ~@7, ~@21 f5@2 ~@25, ~@11 d5 ~@12",
  AC: "f5@4 ~@20 d#5@6 d5@6 c#5@11 ~",
  AD: "[c5@12 ~@7 c5 c#5@2 d5@2 d#5@6 d5@5 ~ c#5@6 ~@6 g5@15 d5@2 ~ a5@6 g5@32 ~@14 g5 ~ a5@2 a#5@2 a5@3 g5@3 a5@2 ~ a#5 b5@3 d6@3 ~ d6@2 ~, ~@7 d5@3 ~@14]/3",
  AE: "~ d6@4 a5@17 ~@26", AF: "~@12 a#5 b5@2 d6@4 c#6@2 c6@3 b5@3 c6@3 c#6@2 ~ d6@3 a6@9 ~@3",
  AG: "f6@16 ~@14 a#5@3 d#5@3 ~ g#5@11", AH: "~@18 g#5@3 c#5@2 ~ f#5@12 f5@11 ~",
  AI: "~@28 d#5 d5 c#5@3 c5@4 b4@3 c5@2 c#5@3 d5@3", AJ: "d#5@13 ~@11 f#5@6 d5@5 ~ a#5@12",
  AK: "~@9 f#5@2 f5@10 ~@15 f5@12", AL: "f#5@17 ~@31",
  AM: "~@4 g#4@4 d#5@4 ~ g#5@3 ~ a#5@3 ~ g#5@3 a#5@4 ~ f5@3 g#5@4 ~@9 g#5@2 ~", AN: "d#5@5 d#5@7 c#5@9 ~@27",
  AO: "~@23 c6@20 ~@5, ~@11 c#6 ~@12", AP: "~@16 b5@4 c#6@4 b5@4 ~@4 b5@4 a#5@4 ~ b5@7, ~@29 d6@5 ~@14",
  AQ: "[~@27 f5@3 f#5@4 c6@3 c5@16 ~@31 g#5@3 a5@3 a#5@3 b5@3, ~@24 c6@7 ~@65]/2", AR: "~ c6@22 ~@7 d6@7 b5@5 d6@6",
  AS: "~ b5@18 ~@2 g#5@2 g5@7 f#5@6 ~ f5@6 e5@5, ~@10 a5 ~@13", AT: "~ d5@18 ~@5 a#4 b4@4 d5@7 ~ a4@4 g4@3 f#4@3 ~",
  AU: "~ g4@3 a4@4 d4@9 ~@19 d5@6 c5@4 ~@2, ~@33 d4@2 a4@2 ~@11, ~@17 f#4 ~@6",
  AV: "~ b4@4 e5@3 e5@3 ~ d5@3 ~ e5@3 ~ b4@4 d5@4 ~ a4@13 ~@6", AW: "~@21 g#4 a4@2 ~ b4 ~ d5@21, ~@12 a#4 ~@11",
  AX: "[~@6 g5@10 f#5@4 d5@10 ~@3 d5@2 ~@2 d5@6 ~@3 g4@13 ~@7 g4@2 g#4 ~ a4 a#4 ~ b4@4 c5@2 ~@5 d5@3 d#5@3 e5@3 f5@3]/2",
  AY: "f#5@5 ~ f#5@3 ~ d5@5 f#5@4 ~ f#5@2 ~@7 d5@4 b4@3 a4@4 ~ d5@4 ~@3", AZ: "~ a4@12 ~@20 c4 [d4,e4]@2 a4@6 ~ g4@5",
  BA: "[f#4@11 ~]/2",
})).s("gm_piano").gain(0.35)

// other · piano · soft notes
const piano_soft = note(`<
  A B C D ~@3 E F G ~ H@2 I J ~@2 K ~@5 L ~@5 M ~@2 N ~@9 O ~@3 P ~@4 Q ~@4 R S T ~@3
>`.pickRestart({
  A: "~@21 e5 ~@4 e5 ~@3 e5@2 ~ a5@2 ~ b5@6 ~@6, ~@18 b5@2 f#5@2 ~@3 f#5@2 ~ a5@2 ~@18, ~@19 a5@2 ~@3 a5@2 ~ b5@2 f#5@2 ~@4 e5@2 ~@11",
  B: "~@21 f#5 ~ [a#5,c6]@2 ~ f#5 ~@10 g5 ~@10, ~@18 c6@2 g#5@2 ~@3 g#5@2 ~@21, ~@19 a#5@2 ~@27", // A#sus2
  C: "~@21 a5 ~ d6@2 b5@2 ~@3 a5@2 ~@2 a5@2 e6@6 ~@6, ~@18 e6@2 b5@2 ~@3 a5 ~@2 d6@2 ~@18, ~@19 d6@2 ~@6 e6@2 b5@2 ~@2 [b5,d6]@3 ~@12", // Bm
  D: "~@5 c6 ~@18, ~@8 f6@3 ~@37, ~@3 d6 ~@12", E: "~@18 b4 ~@4 g5@12 ~@13", F: "~@39 f5@2 e5@2 ~@5", G: "~@6 c#5 ~@9",
  H: "[~@41 g5@15 ~@40]/2", I: "~@45 f#4@2 ~", J: "~@19 a#4@2 ~@27", K: "~@9 b5 ~@14", L: "~@9 d#5 ~@14",
  M: "~@21 g#6 ~@6 g#6@3 ~@17", N: "~@11 a4 ~@12", O: "~@2 f5 ~@13", P: "~@21 c6 ~@26", Q: "~@19 a#5@2 ~@27",
  R: "~@15 b4@2 ~@4 g4 ~@2", S: "~@17 f#4 ~@15 c#5@2 ~@13", T: "~@24 b4@4 ~@17 a#4@3",
})).s("gm_piano").gain(0.2)

// bass · acoustic bass
const bass = note(`<
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z U AA AB AC AD AE Q AF AG AH AI AH AJ AK AL AM AN AO AP AA AQ AR AS
  AT AU AV AW AX AY K AZ AG BA K BB@2
>`.pickRestart({
  A: "g2!2", B: "d2!2", C: "g2@24 g2@23 ~", D: "d2@7 ~ d2@6 e2 f2", E: "f#2@22 ~@2 f#2@23 ~", F: "f2@23 ~ f2@23 ~",
  G: "f#2@23 ~ f#2@23 ~", H: "f2@11 ~ f2@11 ~", I: "e2@24 d#2@23 ~", J: "d2@23 ~ d2@24", K: "g2 d2",
  L: "g2@23 ~ d2@18 e2@3 f2@3", M: "f#2@7 ~ f#2@7 g#2", N: "f2@22 ~@2 f2@17 ~ e2@3 f2@3",
  O: "f#2@23 ~ f#2@19 ~@2 g#2@3", P: "f2@22 ~@2 f2@17 ~ f2@3 d#2@3", Q: "e2@22 ~@2 d#2@17 ~ d#2@3 f2@3",
  R: "d2@23 ~ d2@16 ~@2 d2@3 e2@3", S: "g2@24 d2@11 ~ d2@11 ~", T: "g2@24 d2@11 ~ d2@6 d2@3 e2@3", U: "c#2@11 ~ c#2@12",
  V: "c2@11 ~ c2@12", W: "b1@11 ~ b1@12", X: "a#1@11 ~ a#1@12", Y: "a1@11 ~ a1@12", Z: "g#1@11 ~ g#1@12", AA: "c#2",
  AB: "f#2@21 ~@3 f#2@22 ~@2", AC: "f2@20 ~@4 f2@18 e2@3 f2@3", AD: "f#2@7 ~ f#2@7 ~",
  AE: "f2@21 ~@3 f2@16 ~@2 f2@3 f#2@3", AF: "d2@23 ~ d2@17 ~ d2@3 e2@3", AG: "g2@23 ~ d2@24", AH: "g2@2 d2!2",
  AI: "g2@23 ~ d2@21 ~@3", AJ: "c#2@23 ~ c#2@21 ~@3", AK: "c2@20 ~@4 c2@21 ~@3", AL: "b1@21 ~@3 b1@23 ~",
  AM: "a#1@7 ~ a#1@8", AN: "a1!2", AO: "g#1!2", AP: "c#2@23 ~ c#2@22 ~@2", AQ: "f#2@23 ~ f#2@13 ~@5 f#2@3 g#2@3",
  AR: "f2@22 ~@2 f2@19 ~@2 f2@3", AS: "f#2@22 ~@2 f#2@15 ~@3 f#2@3 g#2@3", AT: "f2@24 f2@19 ~@2 f2@3",
  AU: "e2@23 ~ d#2@19 ~@2 d#2@3", AV: "d2@23 ~ d2@19 ~@2 d2@3", AW: "g2@18 ~@6 g2@11 ~ d2@12",
  AX: "g2@24 d2@12 d2@11 ~", AY: "g2@23 ~ g2@20 ~ d2@3", AZ: "g2@3 d2", BA: "g2@23 ~ g2@22 ~@2", BB: "[g2@25 ~@7]/2",
})).s("gm_acoustic_bass").gain(0.4)

// chords · french horn
const french_horn = note(`<
  ~@4 A B C D E F G@2 A B C D E F H I ~@8 A B C D E F J@2 K@2 ~@8 A B C D E F J@2 L@2 J@2 L@2 M@2
>`.pickRestart({
  A: "[f#3,a#3,c4,e4,g#4]", B: "[f3,a3,b3,d#4,g4]", C: "[a#3,c#4,e4,g#4]", D: "[f3,b3,d#4,g4]",
  E: "[g#3,c4,d4,f4] [g3,b3,c#4,f4]", F: "[f#3,a3,c4,e4] [f#3,a3,c4,d#4]",
  G: "[[a3,b3,d4,e4] [g3,a3,b3,d4]@2 [g#3,a#3,c4,e4]@2 [g#3,a#3,c4,d4]@2 [a3,b3,e4]@2 g3@2 f#3@2 [g3,f4]@3, ~@9 [a3,b3]@7, ~@9 d4@4 ~@3]/2", // Asus4 G G#aug A#7 Asus2 G7 Asus2
  H: "~@2 [d3,g3,a3,d4] [e3,a3,b3,e4] [d3,g3,a3,d4] [e3,a3,b3,e4] [d3,g3,a3,d4] [e3,a3,b3,e4]", // Dsus4 Esus4 Dsus4 Esus4 Dsus4 Esus4
  I: "~@2 [d3,g3,a3,d4] [e3,a3,b3,e4] [d3,g3,a3,d4] [e3,a3,b3,e4] ~@2", // Dsus4 Esus4 Dsus4 Esus4
  J: "[~@6 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [g#3,a#3,d4,f#4]@16 ~@2, g2@3 d3]/2", // Bm7 Daug
  K: "[~@6 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@9 [d3,g#3,a#3,d4,f#4]@16, g2@3 ~]/2", // Bm7 Daug
  L: "[~@6 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@7 [a3,b3,d4,f#4]@5 ~@9 d3@16, g2@36 ~@3 [g#3,a#3,d4,f#4]@8 ~]/2", // Bm7 Daug
  M: "[[g2,a3,b3,d4,f#4]@3 ~]/2", // Gmaj7
})).s("gm_french_horn").gain(0.25).pan(0.4)

// chords · alto sax
const alto_sax = note("<~@20 A B C D E F G H ~@10 I J ~@22>".pickRestart({
  A: "~@6 [f#2,d#3,a#3]@6 [g2,e3,b3]@6 [g#2,f3,c4]@25 ~@5", // D#m Em Fm
  B: "~@2 [d#3,c#4,f4] [d3,c4,e4] [c#3,b3,d#4]@2 [c3,a#3,d4]@9 ~", // C# C G#m Gm
  C: "c#3@18 ~@2 c#3@2 c3@2 b2@23 ~, [a3,c#4,g#4]@47 ~, ~@19 d3@2 ~@27", // Amaj7
  D: "[g#3,a#3,d4,a#4]@18 ~ f#4 [d#3,b3] [d3,a#3]@2 [c#3,a3,e4]@13 [d3,g#3,a#3,f4]@12, ~@18 [e3,c4,g4]@2 f4@2 ~ a#2@25", // A#7 G#m Gm A A#7 C
  E: "a2@3 [g#3,a#3,d4,f#4,c#5]@2 [g3,a3,c#4,f4,a4]@7", // F# C#aug
  F: "[g#2,a3]@3 [a#2,a#3]@3 [b2,b3] [c3,c4] [c#3,c#4] [d3,d4]@3, f#3, d3@2 ~, ~ g#2@3", // Amaj7 A# B C C# D
  G: "~@2 [a#3,c4,g#4,d#5] [g#3,a#3,f#4,c#5] [f3,g#3,f4,c5] [d#3,f#3,d#4,a#4] [c#3,f3,c#4,g#4] [c3,d#3,c4,f#4]", // G# F# Fm D#m C# Cdim
  H: "[c3,c#3,a#3,f4]@2 ~ [b2,c3,a3,e4] ~@2 [a#2,b2,g#3,d#4] ~@2 [a2,a#2,g3,d4] ~@2 [g2,b2,g3,c#4]@30 ~@6", // A#m Am G#m Gm C#m7b5
  I: "~@8 f3@4 f3@7 ~ f3@20 e3@3 ~ d#3@4", J: "d3",
})).s("gm_alto_sax").gain(0.35).pan(0.6)

// chords · brass section
const brass_section = note("<~@38 A B C D E F G H ~@16>".pickRestart({
  A: "~@8 [f#3,a3,d#4,f4,g#4,c5,f5,g#5]@3 ~ [f#3,a3,d#4,f4,g#4,c5,f5,g#5]@7 ~ [f#3,a3,d#4,f4,g#4,c5,f5,g#5]@28", // F7
  B: "~@12 [g#4,a#4,g#5,a#5]@2 ~ [g4,a4,g5,a5]@2 ~ [f#4,g#4,f#5,g#5]@2 ~ [f4,g4,f5,g5]@2 ~ [e4,g#4,a#4,e5,g#5,a#5]@3 ~@3 [e4,g#4,a#4,e5,g#5,a#5]@3 ~@15, d3@47 ~", // G#sus2 Gsus2 F#sus2 Fsus2 A#m7b5
  C: "~ a4, ~ [g#2,d3,g#3,e4]@7, ~@2 g#4@5 c#5@9, ~ g#5@3, ~@3 d#5@5", // E7
  D: "~@8 [d3,f#3,g#3,d4,g#4,d5,f#5,a#5]@4 [d3,f#3,g#3,d4,g#4,d5,f#5,a#5]@7 ~ [d3,f#3,g#3,d4,g#4,d5,f#5,a#5]@28", // Daug
  E: "~@6 [b4,d#5,f5]@2 ~ [b4,d#5,g5]@2 ~ [b4,d#5,f5]@4 ~@2 [b4,d#5,f5]@4 ~@8 [b4,d#5,f5]@2 ~ [b4,d#5,g5]@2 ~ [b4,d#5,f5]@3 ~@3 [b4,d#5,f5]@4 ~@2, [a2,a3]@12 ~@12 [a2,a3]@13 ~@11", // Fm7b5 Baug Fm7b5 Baug Fm7b5 A
  F: "~@6 [e5,g#5,a#5]@3 c6@2 ~ [e5,g#5,a#5,c6]@4 ~@2 [e5,g#5,a#5,c6]@4 ~@8 [e5,g#5,a#5]@3 c6@2 ~ [e5,g#5,a#5,c6]@4 ~@2 [e5,g#5,a#5,c6]@6, [g#2,g#3]@12 ~@12 [g#2,g#3]@13 ~@11", // A#m7b5 Eaug A#m7b5 Eaug G#
  G: "~@6 [d#3,c#4,g#4,c5,d#5]@41 ~, c#2@47 ~", // G#
  H: "[b2,f3,b3,f4]@2 ~ [a#2,e3,a#3,e4] ~@2 [a2,d#3,a3,d#4] ~@2 [g#2,d3,g#3,d4] ~@2 [g2,c#3,g3,c#4]@33 ~@3", // Bdim A#dim Adim G#dim Gdim
})).s("gm_brass_section").gain(0.4).pan(0.4)

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

// drums · clap
const clap = s("cp").struct(`<
  ~@3 A ~@7 B ~@3 C D E ~@3 F ~@6 G H I J@2 ~ K J ~ A ~@7 L ~@3 M ~@5 N ~ O ~@4
>`.pickRestart({
  A: "~@3 x", B: "~@20 x ~@2 x", C: "~@3 x ~@4", D: "~@11 x ~@12", E: "~@4 x ~ x!2", F: "~@7 x ~@4",
  G: "~@8 x ~@2 x ~@11 x", H: "~@14 x ~@5 x ~@2 x", I: "~@8 x ~@3 x ~@4 x ~@2 x ~@3", J: "~@5 x ~@18",
  K: "~@5 x ~@12 x ~ x ~ x ~", L: "~@6 x ~@7 x!2 ~ x ~@6", M: "~@3 x ~ x ~@2", N: "~@15 x ~@5 x!2 ~", O: "~@21 x ~ x",
})).gain(0.33)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@3 A ~@8 B A C ~@40 D ~@6>".pickRestart({
  A: "~@5 x ~@2", B: "~@23 x", C: "~@11 x ~@12", D: "~ x",
})).gain(0.16)

// drums · hihat
const hihat = s("hh").struct("<~@4 [~ x ~ x]!7 [~@3 x ~@4 x!2 ~@2] ~@50>").gain(0.33)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@4 A B A B C B ~@51 D>".pickRestart({
  A: "~@17 x ~@6", B: "~@5 x ~@11 x ~@6", C: "~@5 x ~@18", D: "~@25 x ~@22",
})).gain(0.16)

// drums · open hat
const open_hat = s("oh").struct("<~@61 [~ x]>").gain(0.16)

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

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~ A ~@31 A ~@12 A ~@13 B C>".pickRestart({
  A: "~@3 x ~@4", B: "~@31 x!2 ~ x!3 ~ x!3 ~ x ~@2 x ~@2", C: "x",
})).gain(0.11)

// drums · splash
const splash = s("cr").struct("<~@18 A ~ A ~@19 A ~@3 B ~@17>".pickRestart({
  A: "x", B: "x ~@2 x",
})).gain(0.27)

stack(
  piano, piano_soft, bass, french_horn, alto_sax, brass_section, snare, clap, clap_soft, hihat, hihat_soft, open_hat,
  ride, ride_soft, splash
)

More by Ellington