Strudelify

Herz an Herz

Blumchen

KeyF majorTempo173 bpm
0:00/0:00
// Herz an Herz — Blumchen
// 173 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 118 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(173/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 · lead 8 bass lead · "BASS&LEAD"
const bass = note(`<
  ~@24 A@7 ~ A@4 ~ A@7 B ~@8 C A D@2 C E A@2 F G H I J K L M J K L M J K L ~ J K L M J K L N ~@8 O P Q R S T P@2 C A D U
  V W X Y S Z AA@2 ~@5
>`.pickRestart({
  A: "f1 ~ f2 ~ f1 ~ f2 ~ f1 ~ f2 ~ f1 ~ f2 ~", B: "g1 ~ g2 ~ g1 ~ g2 ~ a1 ~ a2 ~ a1 ~ a2 ~",
  C: "bb1 ~ bb2 ~ bb1 ~ bb2 ~ bb1 ~ bb2 ~ bb1 ~ bb2 ~", D: "d1 ~ d2 ~ d1 ~ d2 ~ d1 ~ d2 ~ d1 ~ d2 ~",
  E: "g1 ~ g2 ~ g1 ~ g2 ~ c2 ~ c3 ~ c2 ~ c3 ~", F: "~@2 [f3,f4] ~@3 [f3,f4] ~@3 [f3,f4] ~@3 [f3,f4] ~",
  G: "~@2 [f3,f4] ~@3 [f3,f4] ~@3 [f3,f4] ~ [eb3,eb4] ~ [f3,f4] ~", // F Eb F
  H: "[f3,f4] ~ [ab2,ab3] ~@3 [ab2,ab3] ~@3 [ab2,ab3] ~@3 [ab2,ab3] ~", // F Ab
  I: "[ab2,ab3] ~ [bb2,bb3] ~@3 [bb2,bb3] ~@3 [bb2,bb3] ~@3 [bb2,bb3] ~", // Ab Bb
  J: "f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~", // F
  K: "f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~, ~@12 eb4 ~@3", // F
  L: "[f3,f4] ~ [ab2,ab3] ~ ab1@2 [ab2,ab3] ~ ab1@2 [ab2,ab3] ~ ab1@2 [ab2,ab3] ~, ab1 ~@7", // F Ab
  M: "bb1@2 [bb2,bb3] ~ bb1@2 [bb2,bb3] ~ bb1@2 [bb2,bb3] ~ bb1@2 [bb2,bb3] ~, ab3 ~@15", // Bb
  N: "bb2!3 ~ bb2!3 ~ bb2!3 ~ bb2!3 ~", O: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~",
  P: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~", Q: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~",
  R: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~", S: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~",
  T: "g2 ~ g2 ~ g2 ~ g2 ~ c2 ~ c2 ~ c2 ~ c2 ~", U: "a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~",
  V: "g1 ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~", W: "c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~",
  X: "d2 ~ d3 ~ d2 ~ d3 ~ d2 ~ d3 ~ d2 ~ d3 ~", Y: "g1 ~@3 g1 ~@2 g1 a1 ~ a1 ~ a1 ~ a1!2",
  Z: "f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~", AA: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~",
})).s("gm_lead_8_bass_lead").gain(0.15).pan(0.1)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A@6 B@3 C@6 D E@3 ~@18 F@7 G@8 C@6 D H I ~@16 J@2 K L M ~ N O@8 P Q R S@2 T D U@3 V@6 C@6 W@4
>`.pickRestart({
  A: "[~@15 [g2,d4,g4,bb4]@8 [a2,c4,a4]@8 [bb2,bb3,d4]@16 ~@16 [d2,d3]@16 [a2,a3,c4,e4]@16 [g2,g3,bb3,d4], ~@23 f4@56 ~@17, ~@47 [a3,c4]@32 ~@17, ~@47 f2@18 ~@31]/6", // Gm Am Bb D Am Gm Am
  B: "[~@7 [a2,a3,c4,e4]@4 [bb2,bb3,d4,f4]@4 [c3,c4,e4,g4]@16 g4@8 gb4@8 [g2,d4,g4,bb4], ~@31 [d3,a3,d4]@16 ~]/3", // Am Bb C Gm D5
  C: "[~@7 [a2,c4,f4,a4]@8 [bb2,bb3,d4]@16 [f2,f3,a3,c4]@16 ~ f4@15 ~ [d3,gb3,gb4]@15 ~ [bb2,d4]@16, ~@15 f4 ~@31 a3@32 [f3,bb3]@15 ~@2, ~@47 [d2,d3,f3]@16 d4@16 ~@17]/6", // F Bb F D Bb Bb5 Dm
  D: "[g2,g3,bb3,d4] [c3,g3,c4,e4]", E: "[f2@15 ~ f5@32, [c4,f4,a4]]/3", F: "[f6 e6 d6 c6 bb3@3, [c4,f4]]/7",
  G: "[[g3,d4,bb4]@8 [a3,f4,c5]@7 [bb2,bb3,d4,f4]@16 ~@16 [d2,d3]@16 [a2,a3,c4,e4]@16 [g2,g3,bb3,d4]@8 [a2,a3,c4,e4]@4 [bb2,bb3,d4,f4]@4 [c3,c4,e4,g4]@16 g4@8 gb4@8 [g2,d4,g4,bb4], ~@31 [a3,c4]@32 ~@48 [d3,a3,d4]@16 ~, ~@31 f2@18 ~@79]/8", // Gm F Bb D Am Gm Am Bb …
  H: "[f2,c4,f4,a4]", I: "f5 ~@15", J: "[c5,f5]/2", K: "[bb4,eb5]", L: "[c5,f5]", M: "[c5,f5] ~@15", N: "[ab4,eb5]",
  O: "[[c5,f5]@15 [bb2,bb3,d4]@16 ~@16 [d2,d3]@16 [a2,a3,c4,e4]@16 [g2,g3,bb3,d4]@8 [a2,a3,c4,e4]@4 [bb2,bb3,d4,f4]@4 [c3,c4,e4,g4]@16 g4@8 gb4@8 [g2,d4,g4,bb4], ~@15 f4@48 ~@65, ~@31 [a3,c4]@32 ~@48 [d3,a3,d4]@16 ~, ~@31 f2@18 ~@79]/8", // F5 Bb D Am Gm Am Bb C …
  P: "~@7 [a2,c4,f4,a4]@8 ~", Q: "[bb2,bb3,d4,f4]", R: "[f2,f3,a3,c4]", S: "[[d3,f3,f4] [a2,c4,e4], a3]/2",
  T: "[bb2,f3,bb3,d4]", U: "[[c4,f4,a4,f5]@31 [bb2,bb3,d4]@16 [f2,a3,c4], f2@15 ~@16 f4 ~@16]/3",
  V: "[~@15 [d2,d3]@16 [a2,a3,c4,e4]@16 [g2,g3,bb3,d4]@8 [a2,a3,c4,e4]@4 [bb2,bb3,d4,f4]@4 [c3,c4,e4,g4]@16 g4@8 gb4@8 [g2,d4,g4,bb4], ~@79 [d3,a3,d4]@16 ~]/6", // D Am Gm Am Bb C Gm D5
  W: "[[g2,g3,bb3,d4]@8 [c3,g3,c4,e4]@7 ~ [c4,f4,a4,f5]@44 ~@4, ~@15 c6@45 ~@4, ~@16 f2@15 ~@33]/4", // Gm C F
})).s("gm_string_ensemble_1").gain(0.13).pan(0.6)

// other · vibraphone
const vibraphone = note(`<
  ~@2 A B C D E F G H I J K L I M N ~@28 A B C D E F G H I J O L I M N ~@25 A B C D E F G H I J K P I M N ~@2 B C D E F
  G ~ I J K Q I M ~@3
>`.pickRestart({
  A: "f6 ~ d6@2 bb5@2 d6@2 f6@2 d6@2 bb5@2 d6@2", B: "f6@2 c6@2 a5 ~ c6@2 f6@2 c6@2 g6@2 c6 ~",
  C: "a6 ~ f6@2 c7 ~ f6@2 a6 ~ c6@2 g6 ~ c6@2", D: "e6 a5 c6 a5 e6 a5 c6 a5",
  E: "d6@2 g5@2 bb5@2 g5@2 c6@2 g5@2 d6@2 g5 ~", F: "g6 e6 c6 e6 g6 e6 c6 e6",
  G: "a6@2 g6@2 d6@2 g6@2 a6@2 gb6@2 d6@2 gb6 ~", H: "bb6 g6 d6 f6 a6 f6 c6 f6", I: "f6 d6 bb5 d6 f6 d6 bb5 d6",
  J: "f6 c6 a5 c6 f6 c6 a5 c6", K: "a6@2 f6@2 d6@2 f6@2 a6@2 f6 ~ d6@2 f6@2",
  L: "a6@2 gb6@2 d6@2 gb6 ~ a6@2 gb6 ~ d6@2 gb6 ~", M: "g6@2 d6@2 bb5@2 d6@2 g6@2 e6@2 c6@2 e6 ~", N: "f6@7 ~@9",
  O: "a6 f6 d6 f6 a6 f6 d6 f6", P: "a6@2 e6@2 c6@2 e6 ~ a6@2 e6 ~ c6@2 e6 ~",
  Q: "a6@2 gb6@2 d6@2 gb6 ~ a6@2 gb6@2 d6@2 gb6 ~",
})).s("gm_vibraphone").gain(0.16).pan(0.6)

// other · muted trumpet · "MT TRUMPET"
const muted_trumpet = note(`<
  ~@18 A B@2 C D@2 A B@2 C B@2 C E A@6 F G H A I J K L M N O P Q R S T U V@2 W X Y ~@33 Z AA R AB AC AD AE ~@9 T U V@2 W
  X ~@3
>`.pickRestart({
  A: "f3@2 ~@4 f3@2 ~@4 f3 ~@3", B: "f3@2 ~@4 f3 ~@5 f3 ~@3", C: "f3@2 ~@4 f3 ~@5 f3@2 ~@2", D: "[f3@31 ~]/2", E: "f3",
  F: "e3@2 ~@4 e3@2 ~@4 e3 ~@3", G: "d3@2 ~@4 d3@2 ~@4 d3 ~@3", H: "c3@2 ~@4 c3@2 ~@4 c3 ~@3",
  I: "g3@2 ~@4 g3@2 ~@4 g3 ~@3", J: "bb3@2 ~@4 bb3@2 ~@4 bb3 ~@3", K: "bb3@2 ~@4 bb3@2 ~@4 a3 ~@3",
  L: "~@2 f4@2 ~@2 f4@2 ~@2 f4@2 ~@2 f4 ~", M: "~@2 c5@2 ~@2 c5@2 ~@2 c5@2 ~@2 c5 ~",
  N: "~@2 c5@2 ~@2 a4@2 ~@2 a4@2 ~@2 a4 ~", O: "~@2 c5@2 ~@2 a4@2 ~@2 g4@2 ~@2 f4 ~",
  P: "~@2 g4@2 ~@2 g4@2 ~@2 f4 ~@3 g4 ~", Q: "~ g4 ~ g4 ~ g4 ~ f4", R: "~ a4 ~ a4 ~ a4 ~ a4",
  S: "~ bb4 ~ bb4 ~ a4 ~ a4", T: "~@2 f4@2 ~@2 f4@2 ~@2 f4 ~@5", U: "~@2 c5@2 ~@2 c5@2 ~@2 c5 ~@5",
  V: "~@2 a4@2 ~@2 a4@2 ~@2 a4 ~@5", W: "~@2 f4@2 ~@2 f4@2 ~@2 g4 ~@3 a4 ~", X: "~@2 c5 ~@3 a4 ~@3 g4 ~@3 f4 ~",
  Y: "~@2 f4 ~@3 f4 ~@3 f4 ~@3 f4 ~", Z: "~@2 f4 ~@3 f4@2 ~@2 f4@2 ~@2 f4 ~", AA: "~@2 c5 ~@3 c5@2 ~@2 c5@2 ~@2 d5 ~",
  AB: "~ c5 ~ a4 ~ g4 ~ f4", AC: "~ d4 ~ f4 ~ f4 ~ g4", AD: "~ a4 ~ a4 ~ g4 ~ g4", AE: "~ f4 ~ f4 ~ f4 ~ f4",
})).s("gm_muted_trumpet").gain(0.19).pan(0.6)

// chords · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead = note(`<
  ~@18 A@4 ~@2 A@7 ~ B@4 ~ C D E F C G H I ~@40 J K L M N O P Q J K L M R O S Q ~@9 T U V W X ~@3
>`.pickRestart({
  A: "~@10 gb3@2 ~@2 gb3 ~", B: "f4@2 ~@4 f4@2 ~@2 gb3@2 f4@2 gb3 ~", C: "f4 ~@2 f4 ~@2 f4 ~", D: "e4 ~@2 e4 ~@2 e4 ~",
  E: "d4 ~@2 d4 ~@2 d4 ~", F: "c4 ~@2 c4 ~@2 c4 ~", G: "g4 ~@2 g4 ~@2 g4 ~", H: "bb4 ~@2 bb4 ~@2 bb4 ~",
  I: "bb4 ~@2 bb4 ~@2 a4 ~", J: "[bb3,f4]!16", K: "[a3,c4]!16", L: "[f3,a3]!16", M: "[a3,e4]!16",
  N: "[g3,d4]!8 [a3,e4]!4 [bb3,f4]!4", O: "[c4,g4]!16", P: "[d4,g4]!8 [d4,gb4]!8", Q: "[d4,bb4]!8 [c4,a4]!8",
  R: "[bb3,d4]!16", S: "[c4,f4]!16", T: "c6 ~@3 c6 ~@3 c6@2 ~@2 c6 ~@3", U: "a5 ~@3 a5 ~@3 a5@2 ~@2 a5 ~@3",
  V: "c6 ~@3 a5 ~@3 g5 ~@3 f5 ~@3", W: "d5 ~@3 f5 ~@3 f5 ~@3 g5 ~@3", X: "a5 ~@3 a5 ~@3 a5 ~@3 a5 ~@3",
})).s("gm_lead_8_bass_lead").gain(0.13).pan(0.6)

// other · pad halo · "HALO PAD"
const pad_halo = note("<~@60 A B ~@2 A B ~@2 A C@7 B C@3 D C@3 B ~@33>".pickRestart({
  A: "~@8 f4@3 ~ a4@2 ~@2", B: "a4 ~@7", C: "a4@2 ~@6 f4@3 ~ a4@2 ~@2", D: "a4@2 ~@10 f4@3 ~",
})).s("gm_pad_halo").gain(0.22).pan(0.6)

// other · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead_2 = note(`<
  ~@8 A B C D E F G H I J K@4 ~@2 L@7 ~ L@4 ~ L@7 M N O P Q R S T U ~@8 V W X Y Z AA AB AC Z AA AB AC Z AA AB AD Z AA AB
  AC Z AA AB ~@9 AE AF AG AH AI AJ AF@2 ~@8 AI AK AL@2 ~@5
>`.pickRestart({
  A: "[d4,g4]!3 g4 d4!2 [d4,g4] g4 [d4,gb4]!3 gb4 d4!2 [d4,gb4] gb4", // G5 D
  B: "[d4,bb4]!3 bb4 d4!2 [d4,bb4] bb4 [c4,a4]!3 a4 c4!2 [c4,a4] a4", // Gm F
  C: "bb3 f4 bb4 d5 f5 d5 bb4 f4 bb3 f4 bb4 d5 f5 d5 bb4 f4", D: "a3 f4 a4 c5 f5 c5 a4 f4 a3 f4 a4 c5 f5 c5 a4 f4",
  E: "d4 a4 d5 f5 d6 d5 a4 f4 d4 a4 c5 f5 d6 f5 c5 a4", F: "d4 a4 d5 a4 gb4 d4 a4 d5 a4 gb4 a4 d4 gb4 d4 a3 d4",
  G: "bb3 d4 f4 bb4 d5 f4 d4 f4 bb3 f4 bb4 f4 d5 f4 bb3 d4", H: "~ bb3 c4 d4 g4 bb4 d5 f5 g5 d5 c5 bb4 g4 d4 g4 d4",
  I: "f3 c4 f4 c5 f5 c5 f4 c4 f3 c4 f4 c5 f5 c5 f4 c4", J: "f3 c4 f4 c5 f5 c5 f4 c4 ~@8", K: "~@10 gb3@2 ~@2 gb3 ~",
  L: "f1 ~ f2 ~ f1 ~ f2 ~ f1 ~ f2 ~ f1 ~ f2 ~", M: "g1 ~ g2 ~ g1 ~ g2 ~ a1 ~ a2 ~ a1 ~ a2 ~", N: "[bb3,f4]!16",
  O: "[a3,c4]!16", P: "[f3,a3]!16", Q: "[a3,e4]!16", R: "[g3,d4]!8 [a3,e4]!4 [bb3,f4]!4", S: "[c4,g4]!16",
  T: "[d4,g4]!8 [d4,gb4]!8", U: "[d4,bb4]!8 [c4,a4]!8", V: "~@2 [f3,f4] ~@3 [f3,f4] ~@3 [f3,f4] ~@3 [f3,f4] ~",
  W: "~@2 [f3,f4] ~@3 [f3,f4] ~@3 [f3,f4] ~ [eb3,eb4] ~ [f3,f4] ~", // F Eb F
  X: "[f3,f4] ~ [ab2,ab3] ~@3 [ab2,ab3] ~@3 [ab2,ab3] ~@3 [ab2,ab3] ~", // F Ab
  Y: "[ab2,ab3] ~ [bb2,bb3] ~@3 [bb2,bb3] ~@3 [bb2,bb3] ~@3 [bb2,bb3] ~", // Ab Bb
  Z: "f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~", // F
  AA: "f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~ f1@2 [f2,f4] ~, ~@12 eb4 ~@3", // F
  AB: "[f3,f4] ~ [ab2,ab3] ~ ab1@2 [ab2,ab3] ~ ab1@2 [ab2,ab3] ~ ab1@2 [ab2,ab3] ~, ab1 ~@7", // F Ab
  AC: "bb1@2 [bb2,bb3] ~ bb1@2 [bb2,bb3] ~ bb1@2 [bb2,bb3] ~ bb1@2 [bb2,bb3] ~, ab3 ~@15", AD: "~@5 a3!11",
  AE: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~", AF: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  AG: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", AH: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  AI: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~", AJ: "g2 ~ g2 ~ g2 ~ g2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  AK: "f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~", AL: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~",
})).s("gm_lead_8_bass_lead").gain(0.1).pan(0.9)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@18 A@4 B@2 A@12 B A@8 ~@8 A@3 C A D A ~@16 E A@8 ~@16 A@3 F D G H I A@3 C ~@5
>`.pickRestart({
  A: "f3!10 ~@6", B: "f3!16", C: "gb3!10 ~@6", D: "g3!10 ~@6", E: "a3!16", F: "a3!10 ~@6", G: "c3!10 ~@6",
  H: "d3!10 ~@6", I: "g3!8 ~@8",
})).s("gm_lead_2_sawtooth").gain(0.13).pan(0.6)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A B ~@21 C ~@4 D E@7 F ~@6 G H E@8 ~@6 I@2 E@7 J E@7 ~@7 A B ~@6 I@2 E@7 K ~@9
>`.pickRestart({
  A: "~@2 x ~ x ~ x!3 ~@3 x ~ x ~", B: "x!2 ~ x!2 ~@2 x!9", C: "~@2 x ~ x!4 ~@2 x ~ x!4", D: "~@8 x!8", E: "~ x ~ x",
  F: "~ x ~@2", G: "~@6 x!2 ~@8", H: "x ~@3 x ~@2 x!2 ~ x ~ x ~@3", I: "x!16", J: "~@12 x!4",
  K: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x!2",
})).gain(0.25)

// drums · clap
const clap = s("cp").struct("<~@77 [~ x ~ x]!7 ~@17 [~ x ~ x]!7 ~@10>").gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<~@9 [~@13 x!3] ~@82 [~@13 x!3] ~@25>").gain(0.32)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@8 A B ~@14 C@7 D C@4 E C@7 F D ~@5 G H C@7 I D J D ~ C@3 K C@3 K C@3 ~ C@3 K C@3 L D ~@5 A B ~ J D C E J D M C@3 K
  C@3 ~@10
>`.pickRestart({
  A: "~@6 x!2 ~@8", B: "~@11 x!2 ~@3", C: "x!4", D: "x", E: "x!2 ~@2", F: "x ~@3 x ~@3 x ~ x!3 ~ x ~",
  G: "x!3 ~ x ~ x!2", H: "~@13 x!3", I: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x!2", J: "~@5 x!3", K: "x ~@3 x ~@3 x ~@3 x ~@2 x",
  L: "x!3 ~ x!3 ~ x!3 ~ x!3 ~", M: "x!2",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@32 A@4 ~ A@8 ~@4 A@12 ~@4 A@11 ~ A@8 ~@16 A@14 ~@3>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.25)

// drums · high tom
const high_tom = s("ht").struct("<~@8 A B ~@21 C ~@4 D ~@14 E F ~@14 G H ~@22 A B ~@7 I ~@7 J ~@9>".pickRestart({
  A: "~ x!2 ~ x ~ x!2", B: "x!2 ~ x!2 ~@2 x!4 ~@5", C: "~@2 x ~ x ~@2 x ~@2 x ~ x ~@2 x", D: "~@8 x!8",
  E: "~@6 x!2 ~@8", F: "x ~@3 x ~@2 x!2 ~ x ~ x ~@3", G: "x!16", H: "~ x!3 ~ x!3 ~ x!3 ~ x!3", I: "~ x!7 ~ x!7",
  J: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x!2",
})).gain(0.32)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@31 [~@5 x!2 ~@6 x!2 ~] ~@36 [x!4] ~@31 [x!2] ~@17>").gain(0.19)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A B A C A ~ A@2 ~ A ~ A C ~@2 A ~@18 A ~@15 A ~@8 D A ~@3 E F A ~@7 A ~@15 A D A F G D A E A ~@7 A ~@8
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~ x", D: "~@5 x!3", E: "x!2", F: "x!4", G: "x!2 ~@2",
})).gain(0.22)

// drums · shaker
const shaker = s("sh").struct("<~@32 A@4 ~ A@8 ~@4 A@12 ~@4 A@10 B ~ A@8 ~@16 A@8 B C B C B C ~@3>".pickRestart({
// … 12 more lines

More by Blumchen