Strudelify

You Don't Have to Say You Love Me

Dusty Springfield

KeyF majorTempo72 bpm
0:00/0:00
// You Don't Have to Say You Love Me — Dusty Springfield
// 72 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 66 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(72/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 2 · "SYN BASS 2"
const bass = note(`<
  ~@3 A B C D E F G H I B C D E J K L M N O P Q R S T U V W X Y Z AA AB I B C D E J K L M N O P Q R S T U V W X Y Z AA
  AC AD AE AF AG AH AI AJ
>`.pickRestart({
  A: "bb2@5 db3 f3@3 db3@2 f3", B: "eb2@5 g2 bb2@3 g2@2 bb2", C: "ab2@5 c3 eb3@3 c3@2 eb3",
  D: "db2@5 f2 ab2@3 f2@2 ab2", E: "bb1@5 db2 f2@3 db2@2 f2", F: "g2@10 bb2@2 db3@6 bb2@3 ~ g2@2",
  G: "c2@9 ~ e2@2 g2@6 e2@4 g2@2", H: "f2 ~@7", I: "bb2@5 db3 f3@3 db3 bb2 f2", J: "g2@5 bb2 g2@3 bb2 g2 db2",
  K: "c2@10 c2@2 c2@5 ~ c2@2 d2@2 e2@2", L: "f2@5 f2 d2@3 f2 a2 f2", M: "g2@4 bb2 g2 c2@3 c2 e2 g2",
  N: "f2@9 ~ f2@2 d2@8 a2@2 f2@2", O: "g2@3 g2 bb2 g2 c2@3 c2 e2 g2", P: "f2@7 ~ f2@2 g2@2 a2@6 a2@2 e2@2 c2@2",
  Q: "d2@7 ~ f2@2 a2@2 d2@6 f2@2 a2@2 f2@2", R: "g2@9 ~ bb2@2 d3@6 d3@2 bb2@2 g2@2",
  S: "c2@5 ~ c2@2 e2@2 g2@2 c2@2 e2@2 g2@2 c2@2 e2@2 g2@2", T: "c2 ~@11", U: "bb2@9 ~ db3@2 f3@6 db3@2 bb2@2 f2@2",
  V: "eb2@10 g2@2 bb2@5 ~ g2@2 bb2@2 g2@2", W: "ab2@5 c3 eb3@3 c3 eb3 c3", X: "db2@5 f2 ab2@3 f2 ab2 f2",
  Y: "bb1@5 db2 f2@3 db2 f2 db2", Z: "c2@5 e2 c2@3 e2 g2 e2", AA: "f2@5 f2 f2@3 c3 ab2 c3", AB: "f2 ~@11",
  AC: "f2@7 ~ a2 ~ f2@2 d2@8 f2@2 d2 ~", AD: "g2@8 bb2 g2 d2 ~ c2@6 e2@2 g2 ~ e2 ~",
  AE: "f2@8 a2@2 f2@2 d2@7 ~ f2@2 d2 ~", AF: "g2@8 bb2 g2 d2 ~ c2@8 e2@2 g2 ~",
  AG: "f2@8 a2@2 f2@2 c2@6 eb2@2 c2 ~ eb2@2", AH: "f2@8 a2 f2 c2@2 eb2@2 c2@2 eb2@2 g2@2 eb2 c2 eb2 ~",
  AI: "f2@8 a2 ~ f2 ~ f2@5 c2 a2@2 f2 ~ c2@2", AJ: "f2@5 ~ a2@2 f2@2 c2@2 f2@2 ~@10",
})).s("gm_synth_bass_2").gain(0.57)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A B C ~ D E F G H I J K L M N@2 O P Q@2 R S T U V W ~ X@2 M G Y Z AA AB@6 AC AD Q@2 R S T U V W ~ AE@2 AF AG AH AI AG
  AJ AK AJ AL AM@2 AN@2
>`.pickRestart({
  A: "[bb3,bb4] [f3,f4,f5] [bb3,bb4] [db4,db5,db6] [bb3,bb4,bb5] [f3,f4,f5,ab5] [db4,db5,db6] [bb3,bb4,bb5] [f3,f4,f5] [db4,db5,db6] [bb3,bb4,bb5] [f3,f4,f5,ab5], bb2@11 ~, bb5@2 bb5@2 ~@2 g5@5 ~", // Bb F Bb Db Bb Fm Db Bb …
  B: "[g3,g4]@2 [db3,db4,db5]@2 [f3,f4,f5]@2 [bb3,bb4]@2 [f3,f4,f5]@2 [db3,db4,db5,ab5]@2 [c3,c4,c5]@2 [db3,db4,db5]@2 [c3,c4,c5]@2 c4@2 ~ ab5@2 ~, g2@11 ~, bb5@2 bb5@2 g5@3 ~, ~@18 [c2,c3]@5 ~", // G Db F Bb F Db5 C Db …
  C: "[f2,f3,f4,f5]@5 ~@19", D: "g4@23 ~", E: "[ab4,eb5]", F: "[ab4,db5]", G: "f4@23 ~", H: "[f4,bb4,db5]@5 [f4,ab4]",
  I: "[e4,g4]@23 ~", J: "[c4,f4] ~@23", K: "bb4@17 ~ ab4@5 ~, db5@23 ~", L: "[g4,bb4,db5]@23 ~", M: "[eb4,ab4,c5]@23 ~",
  N: "[db4,f4]@23 ~", O: "[db4,f4,bb4]@23 ~", P: "[c4,e4,g4,bb4]@11 ~",
  Q: "[~@24 g4@10 ~ [e4,g4]@12 ~, [a4,f5] bb4, c5@11 ~@13, ~ d5@2 ~]/2", R: "[f4,c5]@12 d5@11 ~, a4@23 ~, ~@12 e5 ~@11",
  S: "[f4,bb4,d5]@12 [e4,g4,bb4]@11 ~", T: "[c4,f4,a4]@12 [c4,e4,a4]@11 ~", U: "[d4,f4,a4]@23 ~",
  V: "bb4@18 g4@5 ~, [d4,f4]@23 ~", W: "[c4,e4,g4]", X: "[bb4@17 ~ ab4@6 g4@23 ~, db5@47 ~, f4@23 ~@25]/2",
  Y: "[f4,db5]", Z: "~@12 db5@7 ab4@5, e4@5 ~, g4@3 ~", AA: "f4",
  AB: "[~ [bb3,bb4] [b3,b4] [c4,c5] [db4,db5] [d4,eb4,d5,eb5] [f4,f5]@3 [g4,g5]@2 ~ [ab4,ab5]@5 [c5,c6]@6 [db5,db6]@10 ~ [c5,c6]@2 [bb4,bb5]@18 [eb4,eb5]@3 [f4,f5]@2 ~ [g4,g5]@5 [bb4,bb5]@6 [c5,c6]@10 ~ [bb4,bb5]@2 [ab4,ab5]@18 [db4,db5]@4 [eb4,eb5]@2 [f4,f5]@6 [ab4,ab5]@5 [bb4,bb5]@10 ~ [ab4,ab5]@2 [g4,g5]@10 [ab4,ab5]@2, ~@6 [e4,e5] ~@137]/6", // Bb B C Db Ebmaj7 F G Ab …
  AC: "[bb4,bb5]@9 [ab4,ab5]@2 ~ [g4,g5]@9 [bb4,bb5]@2 ~", AD: "[c5,c6]@23 ~",
  AE: "[[bb3,bb4]@17 ~ [ab3,ab4]@6 [g3,g4]@23 ~, [db4,db5]@47 ~, [f3,f4]@23 ~@25]/2", // Bb Ab G Db F
  AF: "[eb3,ab3,c4,eb4,ab4,c5]@23 ~", AG: "[f3,f4]@23 ~", AH: "[f3,db4,f4,db5]",
  AI: "~@12 [db4,db5]@7 [ab3,ab4]@5, [e3,e4]@5 ~, [g3,g4]@3 ~", AJ: "[c4,f4,a4,c5,f5,a5] [d4,f4,a4,d5,f5,a5]",
  AK: "[d4,g4,bb4,d5,g5,bb5] [c4,e4,g4,bb4,c5,e5,g5,bb5]", AL: "[d4,f4,bb4,d5,f5,bb5] [e4,g4,bb4,d5,e5,g5,bb5,d6]",
  AM: "[f4,a4,c5,f5,a5,c6] [eb4,g4,a4,c5,eb5,g5,a5,c6]", AN: "[[f4,a4,c5,f5,a5,c6]@37 ~@11]/2",
})).s("gm_synth_strings_1").gain(0.65).pan(0.8)

// chords · synth strings 1 · "SYN STR 1" · soft notes
const synth_strings_1_soft = note(`<
  ~@3 A@2 ~@2 B ~ C ~ D ~@2 E F ~@4 G ~@6 H@2 ~ I J K@3 ~@9 G ~@6 L@2 ~ M N O@2 ~@8
>`.pickRestart({
  A: "[[f4,db5] db5, bb4]/2", B: "[bb4,db5]@23 ~", C: "bb4 ~@23", D: "f4@23 ~", E: "ab4@23 ~", F: "bb4@23 ~", G: "~ f4",
  H: "[~@23 bb4@24 ~]/2", I: "[ab4,db5]@23 ~", J: "bb4", K: "[bb4@12 bb4@7 ~@5 f3@26 ~@22, ~@5 e4@5 ~@8]/3",
  L: "[~@23 [bb3,bb4]@24 ~]/2", M: "[ab3,db4,ab4,db5]@23 ~", N: "[bb3,bb4]",
  O: "[[bb3,bb4]@12 [bb3,bb4]@7 ~@5 f2@24, ~@5 [e3,e4]@5 ~@2]/2", // Bb E
})).s("gm_synth_strings_1").gain(0.44).pan(0.8)

// other · piano · "A.PIANO 2"
const piano = note(`<
  ~@3 A B C D E F G H I J K L M N O P Q P Q R S T U V W X Y Z W AA AB AC AD AE AF AG AH AI AJ P Q P Q R S T U V AK AL AM
  AN AK AO AP AQ AR AQ AS AT AU AV AW
>`.pickRestart({
  A: "~@2 f3 bb3 db4@2 f4@2 db4 ~ bb3 ~@3 f3 db4@2 ~ f4@2 db4@2 bb3 ~, ~@15 bb3 ~@8",
  B: "~@2 g3 bb3 db4@2 eb4@2 db4 ~ bb3 ~@3 g3 bb3 db4@2 eb4@2 db4@2 bb3 ~",
  C: "~@2 ab3 c4 eb4@2 ab4@2 eb4@2 c4 ~@3 ab3 c4 eb4@2 ab4@2 eb4@2 c4 ~",
  D: "~@2 f3 ab3 db4@2 f4@2 db4@2 ab3 ~@3 f3 ab3 db4@2 f4@2 db4@2 ab3 ~",
  E: "~@2 f3 bb3 db4@2 f4@2 db4@2 bb3 ~@3 f3 bb3 db4@2 f4@2 ~ bb3 ~@2, ~@10 db4 ~",
  F: "~@2 g3 bb3 db4@2 f4@2 db4@2 bb3 ~@3 g3 bb3 db4@2 f4@2 d4@2 b3 ~",
  G: "~@2 c3 e3 g3@2 bb3@2 g3@2 e3 ~@3 c3 e3 g3@2 bb3@2 g3@2 e3 ~", H: "f3 ~@23",
  I: "~@2 f3 bb3 db4 ~ f4@2 db4 ~ bb3 ~@3 f3 bb3 db4@2 f4@2 db4@2 ab3 ~",
  J: "~@2 g3 bb3 db4@2 eb4@2 db4@2 bb3 ~@3 g3 bb3 db4@2 eb4@2 db4 ~ bb3 ~",
  K: "~@2 ab3 c4 eb4@2 ab4@2 eb4 ~ c4 ~@3 ab3 c4 eb4@2 ab4@2 eb4 ~ c4 ~",
  L: "~@2 f3 ab3 db4 ~ f4@2 db4@2 ab3 ~@3 f3 ab3 db4 ~ f4@2 db4 ~ ab3 ~",
  M: "~@2 f3 bb3 db4@2 f4@2 db4 ~ bb3 ~@3 f3 bb3 db4@2 f4@2 db4@2 bb3 ~",
  N: "~@2 g3 bb3 db4@2 f4@2 db4@2 bb3 ~@3 g3 bb3 db4@2 f4@2 db4 ~ bb3 ~",
  O: "[e3,bb3] ~ [e3,bb3] ~ [e3,bb3] ~ [e3,bb3] ~ [e3,bb3] ~ [e3,bb3] ~ [e3,g3,bb3] ~ [e3,g3,bb3] ~ [e3,g3,bb3] ~ [e3,g3,bb3] ~ [e3,g3,bb3] ~ [e3,g3,bb3] ~", // Edim
  P: "f3 a3 c4 f4 c4 a3 d3 f3 a3 d4 a3 f3", Q: "g3 bb3 d4 f4 d4 bb3 c3 e3 g3 bb3 g3 e3",
  R: "f3 a3 c4 f4 c4 a3!2 c4 e4 a4 e4 c4", S: "d3 f3 a3 d4 a3 f3 d3 f3 a3 d4 a3 f3",
  T: "g3 bb3 d4 f4 d4 bb3 g3 bb3 d4 f4 d4 bb3",
  U: "[g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~", // C
  V: "[g3,c4,e4] ~@23", W: "~@2 db4 f4 db4 bb3 ~@2 db4 f4 db4 bb3, ~ f3 ~@5 f3 ~@4, ~@3 bb3@2 ~@10 bb3@2 ~@7",
  X: "~@2 db4 eb4 db4 bb3 ~@2 db4 eb4 db4 bb3, ~ g3 ~@5 g3 ~@4, ~@3 bb3@2 ~@10 bb3@2 ~@7",
  Y: "~@2 eb4 ab4 eb4 c4 ~@2 eb4 ab4 eb4 c4, ~ ab3 ~@5 ab3 ~@4, ~@3 c4@2 ~@10 c4@2 ~@7",
  Z: "~@2 db4 f4 db4 ab3 ~@2 db4 f4 db4 ab3, ~ f3 ~@5 f3 ~@4, ~@3 ab3@2 ~@10 ab3@2 ~@7",
  AA: "~@2 g3 bb3 g3 e3 db4 bb3 g3 bb3 ab3 e3, ~ c3 ~@10, ~@3 e3@2 ~@19",
  AB: "f3 ~ c4 f4 c4 ab3 f3 ~ c4 f4 c4 ab3, ~ f3 ~@5 f3 ~@4, ~@3 ab3@2 ~@10 ab3@2 ~@7", AC: "[f3,ab3,c4,f4] ~@11",
  AD: "~@2 [f3,f5] [bb3,bb5] [db4,db6] ~ [f4,f6]@2 [db4,db6] ~ [bb3,bb5] ~@3 [f3,f5] [bb3,bb5] [db4,db6]@2 [f4,f6]@2 [db4,db6]@2 [ab3,ab5] ~", // F Bb Db F Db Bb F Bb …
  AE: "~@2 [g3,g5] [bb3,bb5] [db4,db6]@2 [eb4,eb6]@2 [db4,db6]@2 [bb3,bb5] ~@3 [g3,g5] [bb3,bb5] [db4,db6]@2 [eb4,eb6]@2 [db4,db6] ~ [bb3,bb5] ~", // G Bb Db Eb Db Bb G Bb …
  AF: "~@2 [ab3,ab5] [c4,c6] [eb4,eb6]@2 [ab4,ab6]@2 [eb4,eb6] ~ [c4,c6] ~@3 [ab3,ab5] [c4,c6] [eb4,eb6]@2 [ab4,ab6]@2 [eb4,eb6] ~ [c4,c6] ~", // Ab C Eb Ab Eb C Ab C …
  AG: "~@2 [f3,f5] [ab3,ab5] [db4,db6] ~ [f4,f6]@2 [db4,db6]@2 [ab3,ab5] ~@3 [f3,f5] [ab3,ab5] [db4,db6] ~ [f4,f6]@2 [db4,db6] ~ [ab3,ab5] ~", // F Ab Db F Db Ab F Ab …
  AH: "~@2 [f3,f5] [bb3,bb5] [db4,db6]@2 [f4,f6]@2 [db4,db6] ~ [bb3,bb5] ~@3 [f3,f5] [bb3,bb5] [db4,db6]@2 [f4,f6]@2 [db4,db6]@2 [bb3,bb5] ~", // F Bb Db F Db Bb F Bb …
  AI: "~@2 [g3,g5] [bb3,bb5] [db4,db6]@2 [f4,f6]@2 [db4,db6]@2 [bb3,bb5] ~@3 [g3,g5] [bb3,bb5] [db4,db6]@2 [f4,f6]@2 [db4,db6] ~ [bb3,bb5] ~", // G Bb Db F Db Bb G Bb …
  AJ: "[e3,bb3,e5,bb5] ~ [e3,bb3,e5,bb5] ~ [e3,bb3,e5,bb5] ~ [e3,bb3,e5,bb5] ~ [e3,bb3,e5,bb5] ~ [e3,bb3,e5,bb5] ~ [e3,g3,bb3,e5,g5,bb5] ~ [e3,g3,bb3,e5,g5,bb5] ~ [e3,g3,bb3,e5,g5,bb5] ~ [e3,g3,bb3,e5,g5,bb5] ~ [e3,g3,bb3,e5,g5,bb5] ~ [e3,g3,bb3,e5,g5,bb5] ~", // Edim
  AK: "~@2 [db4,db6] [f4,f6] [db4,db6] [bb3,bb5] ~@2 [db4,db6] [f4,f6] [db4,db6] [bb3,bb5], ~ [f3,f5] ~@5 [f3,f5] ~@4, ~@3 [bb3,bb5]@2 ~@10 [bb3,bb5]@2 ~@7", // Db F Db Bb Db F Db Bb …
  AL: "~@2 [db4,db6] [eb4,eb6] [db4,db6] [bb3,bb5] ~@2 [db4,db6] [eb4,eb6] [db4,db6] [bb3,bb5], ~ [g3,g5] ~@5 [g3,g5] ~@4, ~@3 [bb3,bb5]@2 ~@10 [bb3,bb5]@2 ~@7", // Db Eb Db Bb Db Eb Db Bb …
  AM: "~@2 [eb4,eb6] [ab4,ab6] [eb4,eb6] [c4,c6] ~@2 [eb4,eb6] [ab4,ab6] [eb4,eb6] [c4,c6], ~ [ab3,ab5] ~@5 [ab3,ab5] ~@4, ~@3 [c4,c6]@2 ~@10 [c4,c6]@2 ~@7", // Eb Ab Eb C Eb Ab Eb C …
  AN: "~@2 [db4,db6] [f4,f6] [db4,db6] [ab3,ab5] ~@2 [db4,db6] [f4,f6] [db4,db6] [ab3,ab5], ~ [f3,f5] ~@5 [f3,f5] ~@4, ~@3 [ab3,ab5]@2 ~@10 [ab3,ab5]@2 ~@7", // Db F Db Ab Db F Db Ab …
  AO: "~@2 [g3,g5] [bb3,bb5] [g3,g5] [e3,e5] [db4,db6] [bb3,bb5] [g3,g5] [bb3,bb5] [ab3,ab5] [e3,e5], ~ [c3,c5] ~@10, ~@3 [e3,e5]@2 ~@19", // G Bb G E Db Bb G Bb …
  AP: "[f3,f5] ~ [c4,c6] [f4,f6] [c4,c6] [ab3,ab5] [f3,f5] ~ [c4,c6] [f4,f6] [c4,c6] [ab3,ab5], ~ [f3,f5] ~@5 [f3,f5] ~@4, ~@3 [ab3,ab5]@2 ~@10 [ab3,ab5]@2 ~@7", // F C F C Ab F C F …
  AQ: "[c4,c5,f5,a5] ~ [c4,c5,f5,a5] ~ [c4,c5,f5,a5] ~ [c4,c5,f5,a5] ~ [c4,c5,f5,a5] ~ [c4,c5,f5,a5] ~ [d4,d5,f5,a5] ~ [d4,d5,f5,a5] ~ [d4,d5,f5,a5] ~ [d4,d5,f5,a5] ~ [d4,d5,f5,a5] ~ [d4,d5,f5,a5] ~", // F Dm
  AR: "[d4,d5,g5,bb5] ~ [d4,d5,g5,bb5] ~ [d4,g4,d5,g5,bb5] ~ [d4,g4,d5,g5,bb5] ~ [d4,g4,d5,g5,bb5] ~ [d4,g4,d5,g5,bb5] ~ [c4,e4,bb4,e5,bb5] ~ [c4,e4,bb4,c5,e5,bb5] ~ [c4,e4,e5,bb5] ~ [c4,e4,bb4,e5,bb5] ~ [c4,e4,c5,e5,bb5] ~ [c4,e4,bb4,e5,bb5] ~", // Gm C7
  AS: "[d4,f4,bb4,bb5] ~ [d4,f4,bb4,bb5] ~ [d4,f4,bb4,bb5] ~ [d4,f4,bb4,f5,bb5] ~ [d4,f4,bb4,f5,bb5] ~ [d4,f4,bb4,f5,bb5] ~ [d5,e5,g5,d6] ~ [d5,e5,g5,d6] ~ [d5,e5,g5,d6] ~ [d5,e5,g5,d6] ~ [d5,e5,g5,d6] ~ [d5,e5,g5,d6] ~", // Bb Em7
  AT: "[c5,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~", // F Adim
  AU: "[f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~ [eb4,a4,eb5,a5,c6] ~", // F Adim
  AV: "[f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~", // F
  AW: "[f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~ [f4,f5,a5,c6] ~@11", // F
})).s("gm_piano").gain(0.45).pan(0.4)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@2 A ~@7 B ~@14 C ~@8 D ~@6 E ~@17 B ~@6>".pickRestart({
  A: "~@19 x ~@4", B: "~@3 x", C: "~@12 x!2 ~@10", D: "~@18 x!2 ~@4", E: "~@19 x!2 ~@3",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~ A ~@7 B C ~@6 D ~@7 E F ~@6 G ~@3 H ~@3 I ~@8 J ~@6 F ~@3 K ~@4>".pickRestart({
  A: "~@12 x!4 ~@8", B: "x!6 ~@18", C: "x ~@11 x!4 ~@8", D: "x!4 ~@16 x!4", E: "~ x", F: "~@6 x!6 ~@12", G: "~@18 x!6",
  H: "~@12 x!6 ~@6", I: "~@4 x!2 ~@4 x!2 ~@4 x!2 ~@4 x!2", J: "~@18 x!2 ~@4", K: "~@6 x!7 ~@11",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<A@2 ~ A@7 ~ A@7 B@8 ~ A@7 ~ B@6 ~ A@8 C B@14 D>".pickRestart({
  A: "x!12", B: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", C: "x!9 ~@3", D: "x ~ x!3 ~ x ~ x ~ x ~ x ~@11",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A B ~@6 C A ~@6 D ~@3 E ~@3 F G ~@10 E ~@12 H ~@6 G ~@3 G ~@4>".pickRestart({
  A: "~@16 x!4 ~@4", B: "x ~@11 x!6 ~@6", C: "~@6 x!6 ~@12", D: "~@4 x!4 ~@8 x!4 ~@4", E: "~@18 x!6", F: "x!6 ~@18",
  G: "~@12 x!6 ~@6", H: "~@20 x!2 ~@2",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@2 A ~@7 B ~@6 C D@8 E ~@7 F D@6 F ~@9 D@6 G D@6 H I>".pickRestart({
  A: "x ~@2 x", B: "x", C: "~@6 x!6", D: "~@3 x", E: "x!4", F: "~@2 x!2 ~@4 x!2 ~@4 x!2 ~@4 x!2 ~@2", G: "~@18 x!6",
  H: "~@9 x!3", I: "x!7 ~@5",
})).gain(0.45)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@18 A@8 ~@9 A@6 ~@10 A@6 ~ A@6 ~@2>".pickRestart({
  A: "~@10 x!2",
})).gain(0.15)

// drums · high tom
const high_tom = s("ht").struct("<~ A ~@7 B ~@7 C ~@7 D E ~@23 F ~@6 E ~@3 E ~@4>".pickRestart({
  A: "~@20 x!4", B: "~@12 x!6 ~@6", C: "~@8 x!8 ~@8", D: "~@6 x!6 ~@12", E: "~@18 x!6", F: "~@22 x!2",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@34 [~@12 x!12] ~@31>").gain(0.5)

// drums · crash
const crash = s("cr").struct("<A@2 B A ~@6 A@2 ~@10 C A ~@2 D A@7 D A@6 D A@9 ~@7 A@6 B E>".pickRestart({
  A: "x", B: "x ~@2 x", C: "x!2", D: "x!4", E: "x!7 ~@5",
})).gain(0.5)

// drums · claves
const claves = s("clave:2").struct("<~@18 [~@8 x!2 ~@2]!8 ~@9 [~@8 x!2 ~@2]!6 ~@10 [~@8 x!2 ~@2]!14 ~>").gain(1.46)

stack(
  bass, synth_strings_1, synth_strings_1_soft, piano, kick, snare, snare_soft, low_tom, hihat, mid_tom, open_hat,
  open_hat_soft, high_tom, tambourine, crash, claves
)

More by Dusty Springfield