Strudelify
Lovely Day cover art

1978 · Menagerie

Lovely Day

Bill Withers

KeyE majorTempo98 bpm
0:00/0:00
// Lovely Day — Bill Withers
// 98 bpm, 4/4, key E major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/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 · "FRETLESS"
const bass = note(`<
  A B C D E F G H I J K L I J M N O P Q R S T U V A B C D E F G H I J K L I J M N O P Q R S T U V A B C D E F G H I J K
  L I J M N O P Q V O P Q V O P Q V O P Q V O P Q V ~
>`.pickRestart({
  A: "f1@2 f1 ~@3 f1@2 c2@4 f1@4", B: "d2@2 d2 ~@3 a1@2 d2@8", C: "a#1 ~ a#1 ~@3 a#1 ~ a#1@3 ~ a#1@3 ~",
  D: "a#1 ~ a#1 ~@3 a#1@2 c#2@4 c2@4", E: "f1 ~ f1@2 ~@2 f1@2 c2@4 f1@4", F: "d2!2 ~ d2 a1@2 d2@2",
  G: "a#1@2 a#1@2 ~@2 a#1 ~ a#1@3 ~ a#1@4", H: "c#2 ~ c#2@2 ~@2 c#2 ~ c#2 ~ c#2 ~ c#2@2 d2@2", I: "d#2@7 ~ d#2@6 e2@2",
  J: "f2@2 f1 f2", K: "a#1@7 ~ a#1@3 ~ a#1@2 b1@2", L: "c2@7 ~ c2@3 ~ c2 ~ c2@2", M: "a#1@7 ~ a#1 ~ a#1@4 b1@2",
  N: "c2@7 ~ c2@4 c2@2 c2@2", O: "f1@4 ~@2 f1 ~ f1@8", P: "d1@4 ~@2 d1 ~ d1@8", Q: "a#1@4 ~@2 a#1 ~ a#1@8",
  R: "c#2@4 ~@2 c#2 ~ c#2@8", S: "f1@5 ~ f1 ~ f1@8", T: "d1@5 ~ d1 ~ d1@8", U: "a#1@5 ~ a#1 ~ a#1@8",
  V: "c#2@4 ~@2 c#2 ~ c#2@4 c2@4",
})).s("gm_fretless_bass").gain(0.18)

// other · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E F G H I J K L I J M N O P Q R S T U V A B C D E F G H I J K L I J M N O P Q R S T U V A B C D E F G H I J K
  L I J M N O P Q V O P Q V O P Q V O P Q V O P Q V ~
>`.pickRestart({
  A: "f2@2 f2 ~@3 f2@2 c3@4 f2@4", B: "d3@2 d3 ~@3 a2@2 d3@8", C: "a#2 ~ a#2 ~@3 a#2 ~ a#2@3 ~ a#2@3 ~",
  D: "a#2 ~ a#2 ~@3 a#2@2 c#3@4 c3@4", E: "f2 ~ f2@2 ~@2 f2@2 c3@4 f2@4", F: "d3!2 ~ d3 a2@2 d3@2",
  G: "a#2@2 a#2@2 ~@2 a#2 ~ a#2@3 ~ a#2@4", H: "c#3 ~ c#3@2 ~@2 c#3 ~ c#3 ~ c#3 ~ c#3@2 d3@2", I: "d#3@7 ~ d#3@6 e3@2",
  J: "f3@2 f2 f3", K: "a#2@7 ~ a#2@3 ~ a#2@2 b2@2", L: "c3@7 ~ c3@3 ~ c3 ~ c3@2", M: "a#2@7 ~ a#2 ~ a#2@4 b2@2",
  N: "c3@7 ~ c3@4 c3@2 c3@2", O: "f2@4 ~@2 f2 ~ f2@8", P: "d2@4 ~@2 d2 ~ d2@8", Q: "a#2@4 ~@2 a#2 ~ a#2@8",
  R: "c#3@4 ~@2 c#3 ~ c#3@8", S: "f2@5 ~ f2 ~ f2@8", T: "d2@5 ~ d2 ~ d2@8", U: "a#2@5 ~ a#2 ~ a#2@8",
  V: "c#3@4 ~@2 c#3 ~ c#3@4 c3@4",
})).s("gm_piano").gain(0.3)

// chords · piano · "A.PIANO 1"
const piano_2 = note(`<
  A B C D E@2 F G H I@2 J H K L M N@3 O P@3 Q A B C D E@2 F G H I@2 J H R L M N@3 O P@3 Q A B C D S@2 F G H I@2 J H K T
  U V@3 W V@3 W V@3 W V@3 W V@3 W ~
>`.pickRestart({
  A: "~@6 c5!2 [f4,a4]@2 c5 ~ [f4,a4,c5]@3 c5, [f4,a4]@8 c5 ~@7", B: "a#4@2 a4 f4@9 [a3,c4,f4]@4, c4@11 ~@5",
  C: "~@2 c5!2 [f4,a4] c5 a#4 a4, [f4,a4]@7 ~ c5 ~@3 [d4,f4]@4", D: "~ [a3,d4] [c4,g#4] [a#3,d#4,g4], f4 ~",
  E: "[~@6 c4@2 c5@2 c5 ~ c5 c5@2 a#4@3 a4 ~@5 [a3,c4]@8, [a3,f4]@8 [f4,a4]@6 ~ [c4,f4]@4 f4@9 ~@4]/2", // Am Dm F F5
  F: "~@4 [d4,f4]@2 c5 ~ c5 c5@3 a#4@2 a4@2, ~@8 [d4,f4]@3 ~ [d4,f4]@4", G: "[g#3,c4,f4]@8 [g#3,c4]@7 ~",
  H: "c5@2 a#4@2 g#4 g4@2 f4@5 [g#3,c#4,f4]@4, [c#4,f4] ~", // C#
  I: "[~@8 f4 ~ f4 f4@3 ~@4 g#4@4 g4@2 ~@4 [g#3,c#4]@4, ~@2 [a#3,d#4]@5 a#4@2 ~@7, ~@2 [c#4,f4] f4]/2", // C#5 D#5 C#
  J: "[a#3,d#4,g4]@3 ~ [a#3,d#4,g4]@3 ~ [a#3,d#4,g4]@3 ~ [a#3,d#4,g4]@3 ~", // D#
  K: "~@8 f4 ~ f4 ~ f4@2 a#4 ~, ~@4 [a#3,d#4]@9 ~@3", L: "g#4@2 g4 ~@5 [g#3,c#4]@8, c#4@7 ~@9, ~@3 f4@11 ~@2",
  M: "[a#3,d#4,g4]@3 ~ [a#3,d#4,g4]@4 ~@2 a#4@2 g#4@2 a#4@2, ~@3 [a#3,d#4]", // D# D#5
  N: "[~ [f4,a4] ~ [f4,a4] ~ [f4,a4] ~ [f4,a4] ~ [d4,f4,a4] ~ [d4,f4,a4], c5@19 ~@5]/3", // F Dm
  O: "~@2 [f4,g#4]@2 ~ a#4 [f4,g#4] a#4", // Fm
  P: "[~ [f4,a4] ~ [f4,a4] ~ [f4,a4] ~ [f4,a4] ~ [d4,f4,a4] ~ [d4,f4,a4], c5@5 ~]/3", // F Dm
  Q: "~@4 [f4,g#4]@3 ~ [f4,g#4]@4 [d#4,g4,a#4]@3 ~", R: "~@8 f4 ~ f4 ~ f4@2 a#4@2, ~@4 [a#3,d#4]@9 ~@3",
  S: "[~@6 c4@2 c5 ~ c5 ~ c5 c5@2 a#4@3 a4 ~@5 [a3,c4]@8, [a3,f4]@8 [f4,a4]@6 ~ [c4,f4]@4 f4@12 ~]/2", // Am Dm F F5
  T: "g#4@2 g4 ~@5 [g#3,c#4]@8, c#4@7 ~@9, ~@3 f4@12 ~", // C#5
  U: "[a#3,d#4,g4]@3 ~ [a#3,d#4,g4]@4 ~@2 c5@2 d#5@2 f5@2, ~@3 [g4,a#4]", // D# Gm
  V: "[~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,d5] ~ [a4,d5], f5@47 ~]/3", // Am D5
  W: "~@2 [g#4,c5]@2 ~ c5 [g4,a#4,d#5] f5", // G# D#
})).s("gm_piano").gain(0.3).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A@2 B@2 C@3 D E F E F E F E F A@2 G@2 A@2 H I A@2 B@2 C@3 D E F E F E F E F A@2 G@2 A@2 H I A@2 B@2 C@3 D E F E F E F
  E F A@2 H I A@2 H I A@2 H I A@2 H I A@2 H I ~
>`.pickRestart({
  A: "[a3,c4,f4]/2", B: "[[a3,d4]@6 [g#3,c4] [a#3,d#4,g4], f4@7 ~]/2", C: "[[a3,c4]@2 [a3,d4], f4]/3", D: "[g#3,c4,f4]",
  E: "[g#3,c#4,f4]", F: "[a#3,d#4,g4]", G: "[[a3,d4] [g#3,c4], f4]/2", H: "[a3,d4,f4]", I: "[g#3,c4,f4]@3 [a#3,d#4,g4]",
})).s("gm_string_ensemble_2").gain(0.08).pan(0.3)

// other · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  ~@3 A@2 B@2 C D E F G H I@2 J K L@3 M N O P Q R S T U@2 V W X Y@2 Z X AA AB ~ AC AD AE AF AG AH AI AJ AK R S J AL@2 V
  AM AN AO AP AQ AR ~ AS AT AU AV AW AX AY AZ BA BB BC@2 BD BE BF BG BH BI BJ BK BL BM BN
>`.pickRestart({
  A: "[~@10 a#4 ~ a#4@2 g#4 f4@14 ~@3]/2", B: "[~@10 d#4 ~ f4 g#4 ~ f4@10 ~@7]/2", C: "~@7 f4 g#4 ~ a#4 ~ a#4 ~ a#4@2",
  D: "d#4@12 ~ c4 d#4 ~", E: "d#4 ~ d#4@13 ~", F: "~@11 f4 g#4 ~ a#4 ~", G: "a#4 ~ a#4 ~ a#4@2 c5 d#5 ~ c5@7",
  H: "~@5 d#5@3", I: "[d#5@5 ~ a#4 ~ a#4@2 g#4 ~ a#4@2 g#4 f4@7 ~ c4 d#4 ~ f4 ~ g#4 ~ g#4@2]/2", J: "f4 ~",
  K: "~@4 f4 ~@4 f4 ~ d#4 f4 g#4@3",
  L: "[f4@2 f4 ~@6 f4 ~@2 f4 ~ d#4 f4@2 ~ f4 ~ f4 ~@5 c4 ~ d#4 f4 ~ g#4@3 f4 ~@6 c4 d#4 ~ f4 ~ g#4@2]/3",
  M: "f4 ~ f4 ~@4 f4 ~ f4 ~@3 c4 d#4 ~", N: "f4 ~ f4 ~@4 f4 ~ f4 c4 ~@3 [c4,d#4] ~",
  O: "f4 ~ f4 ~@3 c4 f4 ~ f4 ~@3 c4 f4 ~", P: "[c4,f4] ~ f4 ~@4 c4 f4 ~ f4 ~ g#4 ~ [f4,g4] ~",
  Q: "~@6 c5!3 ~ c5 ~ c5@3 c5", R: "a#4@2 a4 f4@9 ~@4", S: "~@4 c5 ~ c5 ~ c5 ~ c5@2 a#4@2 a4@2", T: "f4@15 ~",
  U: "[~@6 c4 ~ c5 ~ c5 ~ c5 c5@2 a#4@3 a4 f4@12 ~]/2", V: "~@6 c5 ~ c5 c5@3 a#4@2 a4@2", W: "f4@14 ~ f4",
  X: "c5@2 a#4@2 g#4 g4 ~ f4@9", Y: "[~@8 f4@2 f4 f4@2 ~ a#4@4 g#4@4 g4@2 f4@8]/2", Z: "d#4@8 ~ c4 d#4 ~ f4@2 g#4@2",
  AA: "~@8 f4@2 f4 ~ f4@2 a#4@2", AB: "g#4@2 g4 f4@11 ~@2", AC: "~@2 d#4 ~ f4 ~@3 f4!2 ~@3 d#4 f4 ~",
  AD: "g#4@2 f4 ~@6 d#4 f4 ~ f4 ~ f4 ~", AE: "d#4 f4 ~ f4 ~@5 f4 g#4 ~ f4@2 d#4 ~",
  AF: "f4 ~ f4!2 ~@5 f4 ~@2 f4 ~ d#4 ~", AG: "~@2 f4 ~ f4 ~@2 c4 d#4 f4 ~ f4 ~ c4 d#4 ~",
  AH: "d#4 ~ f4 ~ f4 ~@3 f4 ~@4 d#4 f4 ~", AI: "f4 ~ f4 ~@2 f4 ~@5 c4 d#4 ~ f4 c4",
  AJ: "g#4@2 f4 ~@6 f4 g#4 ~ a#4 ~ g#4@2", AK: "f4@5 ~ c5!3 ~ c5 ~ c5@2 ~ c5",
  AL: "[~@6 c4 ~ c5@2 c5@2 c5 c5@2 a#4@2 ~ a4 f4@12 ~]/2", AM: "f4@5 ~@3", AN: "c5@2 a#4@2 g#4 g4 ~ f4@5 ~@4",
  AO: "~@12 f4 ~ a#4@2", AP: "~ g#4@2 g4 f4@4", AQ: "~ c4 d#4 ~ f4 ~ g#4 ~@2 f4 [g#4,a4] a#4 c5 d#5@2 ~",
  AR: "d#5 ~ d#5@10 ~@4", AS: "~@8 a#4 ~ a#4 g#4 a#4 ~ a#4 g#4", AT: "a#4 ~ a#4@10 ~@4",
  AU: "~@2 d#4 ~ f4 ~@2 f4 ~ f4 d#4 ~ f4 ~@3", AV: "~ f4 d#4 ~ f4 ~@2 f4 ~ f4 d#4 ~ f4 ~@3",
  AW: "~ f4 g#4 ~ f4@2 d#4 f4 ~@5 c4 d#4 c4", AX: "f4 ~ f4 ~@3 d#4 f4 ~@3 d#4 f4 d#4 f4 ~",
  AY: "d#4 ~ f4 ~ f4 ~@4 c4 d#4 ~ f4 ~ f4 ~", AZ: "f4@2 ~ f4 ~@5 c4 d#4 ~ f4 ~ g#4 ~",
  BA: "g#4 ~ f4 ~ f4 ~@6 c4 d#4 c4 f4 ~", BB: "g#4@2 f4 ~ f4 ~@4 f4 g#4 [a4,a#4] c5 d#5 ~ b4",
  BC: "[d#5 ~ d#5@6 ~@2 a#4@9 ~ g4 ~ f4 ~@4 c4 d#4 ~ f4 c4]/2", BD: "f4 ~ f4 ~ f4 ~ c4 d#4 ~ f4 ~@3 c4 d#4 c4",
  BE: "f4@2 g#4 ~ f4 ~ d#4 f4 ~@3 f4 g#4 f4 a#4 ~", BF: "f4@2 ~@2 f4 ~@2 f4 ~ f4 d#4 ~ f4!2 g#4@2",
  BG: "f4@2 d#4 ~ f4 ~@2 f4 ~ f4 d#4 ~ f4!2 g#4@2", BH: "f4@2 d#4 ~ f4 ~@2 f4 ~ f4 d#4 ~ f4 ~ g#4@2",
  BI: "f4@2 d#4 ~ f4 ~@4 f4 [g#4,a#4] b4 c5 d#5@2 c5", BJ: "d#5 ~ d#5@6 ~@2 c5@3 ~ c5 ~",
  BK: "f4 ~ f4 ~ f4 ~ d4 f4 ~@5 d#4 f4 ~", BL: "[f4,g#4] ~ f4 ~ f4@2 d#4 f4 ~@5 d#4 f4 ~",
  BM: "g#4@2 d#4 ~ a#4@2 f4 c5 ~ f4 d#5 ~ f4 f5 ~ f4", BN: "d#5 ~@15",
})).s("gm_electric_guitar_jazz").gain(0.14).pan(0.8)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@8 A@3 B C@2 D E F@4 G@4 H ~@6 I J@3 K L@2 D M F@4 G@4 H ~@6 N O@3 P Q@2 R S T@16 U@4 ~
>`.pickRestart({
  A: "[c5@2 a#4@2 g#4 g4@2 f4@16 ~ f4@6 a#4@4 g#4@4 g4@2 f4@8]/3", B: "d#4@5 c4 d#4@2",
  C: "[c5@2 a#4@2 g#4 g4@2 f4@17 f5@6 a#5@2]/2", D: "g#5@2 g5 f5@13", E: "d#5@9 ~ a#5@2 g#5@2 a#5@2",
  F: "[c6@29 a#5 g#5 a#5]/4", G: "[c6@15 a#5]/4", H: "f5", I: "~@15 [g5,g#5,a#5]",
  J: "[c6@2 a#5@2 g#5 g5@2 f5@17 f5@6 a#5@4 g#5@4 g5@2 f5@8]/3", K: "d#5@5 c5 d#5 c5",
  L: "[c6@2 a#5@2 g#5 g5@2 f5@17 f5@6 a#5@2]/2", M: "d#5@5 a#5 g#5 a#5", N: "~@14 g5 [g#5,a#5]",
  O: "[c6@2 a#5@2 g#5 g5@2 f5@16 ~ f5@6 a#5@4 g#5@4 g5@2 f5@8]/3", P: "d#5@5 c6 d#6 c6",
  Q: "[c7@2 a#6@2 g#6 g6@2 f6@17 f6@6 a#6@2]/2", R: "g#6@2 g6 f6@13", S: "d#6@5 c6 d#6 f6", T: "[f6@29 c6 d#6 f6]/4",
  U: "f6/4",
})).s("gm_string_ensemble_1").gain(0.2).pan(0.8)

// other · harmonica
const harmonica = note(`<
  ~@20 A@2 B@2 C D@2 E C F G H I J K L M N O P Q@2 R S T U V W X Y@2 Z AA AB@2 AC AD AE AF AG AH AI AJ AK AL AM AN AO AP
  AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE ~
>`.pickRestart({
  A: "[~@10 d#5@11 ~ c5 ~ c5@2 g4 ~ f4@3 ~]/2", B: "[f4@9 d4 f4 ~ f4 ~ f4@6 ~@2 g#4@5 ~ g#4@2 g4 ~]/2", C: "f4@3 ~",
  D: "[~@6 a#4 ~ a#4@2 a4 f4@13 ~@8]/2", E: "~@9 [f4,a#4] ~@2 a#4@2 g#4@2", F: "~@6 c5 ~ c5@3 ~ a#4@2 a4@2",
  G: "f4@11 ~@5", H: "~@7 f4 g#4 ~ a#4 ~ a#4 ~ a#4@2", I: "d#4@13 d#5@3", J: "d#5@3 ~", K: "~@13 g#4 a#4 g#4",
  L: "a#4 ~ a#4@14", M: "~@10 d#5@5 ~", N: "d#5@11 ~@5", O: "~@9 f4 g#4 ~ a#4@2 g#4 ~", P: "a#4@13 ~@3",
  Q: "[~@14 d#5@7 ~ c5 ~ c5@2 g4 ~ g4@2 f4 ~]/2", R: "g4@4 f4 ~@4 d4 [e4,f4] ~ g4 ~ f4 ~",
  S: "g#4@2 g4 f4 ~@5 f4 a#4 ~ a#4 ~ a#4 ~", T: "d#5 ~ d#5@7 ~ c5@3 c5@2 ~", U: "g4@2 f4 ~ f4@4 ~ d4 f4 ~ g4@2 f4 ~",
  V: "~@2 g4@2 a#4 ~ g4 ~ f4@3 ~@5", W: "~@2 a#4@5 ~@3 a#4 ~ a#4 ~ g#4 ~", X: "a#4@2 ~ a#4@13",
  Y: "[~@6 [a#4,c5] ~ a#4@2 [g#4,a4] ~ f4@2 d4 f4@11 ~@6]/2", Z: "~@9 c4 d#4 ~ f4@2 g#4@2", AA: "f4@13 ~@3, f#4 ~@15",
  AB: "[~@9 a#4@2 ~ a#4@2 a4 f4@13 ~@4]/2", AC: "~@7 f4 g#4 ~ a#4 f4 c5@2 a#4@2, ~@12 a#4 ~@3", AD: "d#4@13 c4 d#4 c4",
  AE: "d#4 ~ d#4@13 ~", AF: "~@2 d#5@9 ~@3 d#5 ~", AG: "d#5@2 c5!2 ~@6 a#4 ~ a#4@2 g#4@2", AH: "f4@13 ~ g4 g#4",
  AI: "a#4 ~ a#4@12 ~@2", AJ: "~@7 c5 d#5 ~ f5 ~ f5 ~ f5 ~", AK: "d#5@9 ~@7", AL: "~@5 d#5@3",
  AM: "~@2 c5 ~ c5@2 a4 ~ g4 ~ g4 f4 ~ d4 f4 ~", AN: "f4 ~ f4@7 ~@4 d4 f4 ~",
  AO: "g4 ~ g4 ~ f4@4 ~ f4 g#4 [a4,a#4] b4 c5@3", AP: "~ [b4,c5] d#5 ~ d#5 ~ d#5@5 ~ c5 ~ a#4 ~",
  AQ: "g4@3 ~ e4 ~@4 f4 g#4 ~ a#4 ~ a#4 ~", AR: "f4@5 ~@8 f5 g#5 ~", AS: "a#5 ~ a#5@11 ~ g#5 ~",
  AT: "a#5@2 a#5@10 ~ f5 g#5 ~", AU: "g#5 ~ g#5 ~ g#5@2 f5 d#5 ~ d#5@2 c5 a#4 ~ g#4 ~",
  AV: "f4@4 ~ f5 [g#5,a5] a#5 b5 c6@3 ~ c6 d#6 c6", AW: "d#6 ~ d#6@7 ~ a#5 ~ c6 a#5 g5 ~",
  AX: "g#5 ~ g#5 ~ g#5@2 g5 f5 ~ f5 ~ f5 g5 ~ g5 f5", AY: "g5@2 f5 ~ g5@2 f5 g5 ~ f5 g5@2 f5 g5 ~ f5",
  AZ: "g5 ~ f5 ~ f5@2 g5!2 ~ f5 g5 ~ f5 g5 ~ f5", BA: "g5 ~ g5 ~ g5@2 f5 g5 ~ f5 ~ g5 ~ f5 g5 f5",
  BB: "~@2 a#5@7 ~ c6@4 c6 ~", BC: "g5 ~ g5 ~ f5@2 d5 f5 ~@5 d5 f5 ~", BD: "g#5 ~ g#5 ~ g5@2 f5!2 ~ f5 ~@3 d5 f5 ~",
  BE: "g5@3 ~ g5@2 f5!2 ~ f5 ~ f5 g#5 ~ g5 ~",
})).s("gm_harmonica").gain(0.15).pan(0.2)

// drums · kick
const kick = s("bd").struct("<A@15 B C@8 A@15 B C@8 A@15 B C@20 ~>".pickRestart({
  A: "x ~@6 x ~@2 x ~@5", B: "x ~@6 x ~@8", C: "x!2",
})).gain(0.21)

// drums · snare
const snare = s("sd").struct(`<
  A@15 B A@3 C A@3 B A@15 B A@3 C A@3 B A@15 B A@3 C A@3 B A@3 C A@3 B A@3 C ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x!2 ~@5", C: "~@2 x ~@2 x!2 ~",
})).gain(0.21)

// drums · clap
const clap = s("cp").struct("<[~@3 x]!16 [~ x ~ x]!8 [~@3 x]!16 [~ x ~ x]!8 [~@3 x]!16 [~ x ~ x]!20 ~>").gain(0.19)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@7 A ~@3 A ~@3 B ~@3 C ~@3 A ~@7 A ~@3 A ~@3 B ~@3 C ~@3 A ~@7 A ~@3 A ~@3 B ~@3 C ~@3 A ~@3 C ~@3 A ~@3 C ~
>`.pickRestart({
  A: "~@7 x", B: "~@15 x", C: "~@13 x!2 ~",
})).gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@7 A ~@3 B ~@3 C ~@7 C ~@7 A ~@3 B ~@3 C ~@7 C ~@7 A ~@3 B ~@3 C ~@7 C ~@7 C ~@5
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~ x ~@2", C: "~@12 x!3 ~",
})).gain(0.23)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4
// … 25 more lines

More by Bill Withers