Strudelify

A Thousand Years

Toto

KeyB♭ majorTempo92 bpm
0:00/0:00
// A Thousand Years — Toto
// 92 bpm, 4/4, key A# 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 115 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(92/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 · electric bass pick
const bass = note(`<
  ~ A B C D E F G H A B C D I A B C D E F J K@2 L M N O P@2 Q A B C D I A B C D E F J R@2 L M N S P@2 Q M T U V@4 W@4
  X@8 Y@6 Z@8 AA@8 AB AC AD AE AF@8 AG@4 AH@7
>`.pickRestart({
  A: "g1@23 ~@3 bb1@4 g1@2", B: "f1@23 ~@3 g1@3 ~ bb1@2", C: "eb1@21 ~@5 g1@3 ~ eb1@2", D: "c1@19 ~ eb1@12",
  E: "f1@23 ~@3 f1@3 ~ a1@2", F: "bb1@23 ~@3 bb1@4 bb1@2", G: "ab1@23 ~@3 c2@4 a1@2", H: "g1@13 ~@3",
  I: "f1@23 ~@3 d1@3 ~ f1@2", J: "ab1@23 ~@3 c2@4 ab1@2", K: "[g1@29 ~@3 c1@12 eb1@19 ~, ~@29 g1@7 ~@28]/2",
  L: "f1@6 ~ c1 f1@2 eb1@4 d1@2", M: "c1@12 eb1@19 ~", N: "f1@12 ~@2 c1@2 f1@9 ~ f1@4 f1@2",
  O: "~@12 ab1@19 ~, f1@15 ~", P: "[bb1@13 ~ f1@2 bb1@4 bb1@8 ~@4 c1@12 eb1@19 ~, ~@28 c2@9 ~@27]/2",
  Q: "f1@11 ~@2 c1@2 f1", R: "[g1@16 g1@12 ~@4 c1@12 eb1@19 ~, ~@28 g1@7 ~@29]/2", S: "f1@12 ab1@19 ~",
  T: "f1@12 ~@2 c1@2 ~@3 eb1@8 d1@5, ~@8 f1@3 ~@5", U: "c1@11 eb1@19 ~@2",
  V: "[f1@12 ~ c1@2 f1@9 ~ f1@4 f1@2 f1@12 ab1@19 ~ bb1@13 ~ f1@2 bb1@4 ~@12 c1@12 eb1@19 ~@2, ~@83 bb1@14 ~@31, ~@91 c2@9 ~@28]/4",
  W: "[f1@22 ~@3 c1@4 f1@2 g1@23 ~@3 bb1@4 g1@2 f1@23 ~@3 g1@3 ~ bb1@2 eb1@21 ~@5 g1@3 ~ eb1@2 c1]/4",
  X: "[~@19 eb1@12 f1@23 ~@3 d1@3 ~ f1@2 ~@26 eb1@4 ab1@2 ab1@23 ~@9 ab1@23 ~@3 eb1@4 ab1@2 ab1@23 ~@3 eb1@4 ab1@2 g1@23 ~@3 bb1@4 g1@2 f1@23 ~@3 g1@3 ~ bb1@2 eb1, ~@63 ab1@30 ~@163]/8",
  Y: "[~@25 g1@3 ~ eb1@2 c1@19 ~ eb1@12 f1@23 ~@3 f1@3 ~ a1@2 g1@23 ~@3 bb1@4 g1@2 f1@23 ~@3 g1@3 ~ bb1@2 eb1@21 ~@5 g1@3 ~ eb1@2 c1]/6",
  Z: "[~@19 eb1@12 f1@23 ~@3 f1@3 ~ a1@2 bb1@23 ~@3 bb1@4 bb1@2 ab1@23 ~@3 c2@4 ab1@2 g1@16 g1@13 ~@3 c1@12 eb1@19 ~ f1@12 ~@2 c1@2 f1@4 eb1@8 d1@4 c1@12 eb1@19 ~ f1, ~@156 g1@7 ~@93]/8",
  AA: "[~@13 c1@2 f1@9 ~ f1@4 f1@2 ~@12 ab1@19 ~ bb1@12 ~@2 f1@2 bb1@4 bb1@8 ~@4 c1@12 eb1@19 ~ f1@23 ~@3 c1@4 f1@2 c1@12 eb1@19 ~ f1@12 ~@2 c1@2 f1@4 eb1@8 d1@4 c1@12 eb1@19 ~ f1, ~@31 f1@17 ~@43 c2@9 ~@156]/8",
  AB: "~@13 c1@2 f1@9 ~ f1@3 f1@3 ~", AC: "f1@8 ~@2 ab1@16 ~@5 bb1", AD: "~@13 f1@2 bb1@4 bb1@8 c2@4 c1",
  AE: "~@11 eb1@19 ~ f1",
  AF: "[~@25 c1@4 f1@2 ~@26 eb1@4 ab1@2 ab1@32 ~@26 eb1@4 ab1@2 ~@26 eb1@4 ab1@2 ~@26 eb1@4 ab1@2 ab1@32 ~@26 eb1@4 ab1@2 ab1, ~@31 ab1@30 ~@34 ab1@30 ~@2 ab1@30 ~@2 ab1@30 ~@34 ab1@30 ~@3]/8",
  AG: "[~@25 eb1@4 ab1@2 ~@26 eb1@4 ab1@2 ab1@32 ~@26 eb1@4 ab1 ab1@2, ~@31 ab1@30 ~@34 ab1@30 ~@3]/4",
  AH: "[~@25 eb1@4 ab1@2 ~@26 eb1@4 ab1@2 ab1@23 ~@35 eb1@4 ab1@2 ~@26 eb1@4 ab1@57 ~@10, ~@31 ab1@30 ~@34 ab1@30 ~@2 ab1@30 ~@67]/7",
})).s("gm_electric_bass_pick").gain(0.22)

// chords · synth strings 2
const synth_strings_2 = note("<~@72 A@6 ~@18 B@8 C@4 D@6 ~>".pickRestart({
  A: "[~@23 [a3,c4]@38 ~ [g3,c4,d4,g4]@33 ~ bb3@31 ~ bb3@31 ~ [g3,c4,f4,g4,c5,f5]@31 ~, ~@23 g3@9 ~@63 d4@64 f3@31 ~@2, ~@95 [g3,g4]@32 [eb4,g4,bb4]@33 ~@32]/6", // Am Gsus4 Csus4 G Eb
  B: "[~@31 bb3 c4@95 eb4 ~@31 c4@95 eb4@2, ~@31 f4@225, ~@32 d4 ~@126 d4@63 ~@34]/8",
  C: "[~@31 c4@95 eb4@2, ~@15 d4@32 ~@17]/4", D: "[~@30 c4@96 eb4@32 [c4,d4]@33 ~, ~@30 d4@65 ~@97]/6",
})).s("gm_synth_strings_2").gain(0.48)

// chords · rock organ
const rock_organ = note(`<
  ~@6 A@2 B C D@8 E F@2 G H@2 I@2 J K L M N@6 O@4 P@2 Q R@2 S@4 T@2 U@2 V@4 W@2 X@5 Y@4 ~ Z@3 ~@43
>`.pickRestart({
  A: "[~@32 [f4,bb4]@31 ~, g4@15 ~@17, ~ d5@3]/2", B: "~ a4@31, [d5,g5]@31 ~", C: "[g4,bb4]",
  D: "[~@32 g5@32 ~@22 bb4@8 ~@98 g5@32 eb5@14 ~@7 bb4@9 c5@2, bb4@31 ~ g4@77 ~ a4@33 ~@113, ~ d5@63 eb5@14 d5@16 ~@37 bb4@62 ~@31 c5@19 ~@13, ~@65 c5@19 ~@10 c5@42 ~@25 d5@65 ~@12 d5@16 ~@2, ~@131 g4@33 ~@28 g4@64]/8",
  E: "a4@7 a4@9, [c5,f5]@31 ~", F: "[eb5@15 d5@13 c5@4 c5 [bb4,d5]@31, f5]/2", G: "~ g5@31, [a4,d5], ~ f5 ~@30",
  H: "[~@31 [bb4,c5]@33, g5@22 ~ f5@41, eb5@11 d5@20 ~@33, ~ bb4@30 ~@33]/2", // Bbsus2
  I: "[~@47 a4@16 ~, eb5@15 d5@16 ~ c5@30 ~@2, ~ bb4@46 ~@17, ~ g5@27 f5@35 ~]/2", J: "~ ab5@11 g5@20, [c5,eb5]",
  K: "[d5,f5,bb5]@7 [bb4,d5,f5]@9", L: "eb5@14 d5@17 ~, [g4,bb4]@15 ~", M: "[bb4,c5,f5]",
  N: "[~@64 g5@32 eb5@14 ~@7 bb4@9 ~@37 g4@29, g4@62 ~@2 g4@77 a4@33 ~@18, ~@32 [bb4,d5]@63 ~ c5@19 ~@11 c5@42 ~@24, ~@55 d5@8 ~@33]/6", // Bb
  O: "[~@32 g5@32 eb5@14 ~@7 bb4@9 c5@2 a4@13 a4@18 ~, d5@65 ~@13 d5@16 ~@34, bb4@62 ~@2 c5@19 ~@13 [c5,f5]@31 ~, ~@32 g4@77 ~@19]/4", // F5
  P: "[eb5@15 d5@12 c5@4 ~ c5 [bb4,d5]@31, f5]/2", Q: "[a4,d5,g5], f5 ~@31",
  R: "[eb5@11 ~@20 c5@33, bb4@31 ~@33, g5@23 f5@41, ~@11 d5@20 ~@33]/2",
  S: "[eb5@14 ~@33 a4@16 ~ ab5@11 g5@20 ~ [d5,f5,bb5]@13 [bb4,d5,f5]@19, bb4@109 ~@19, g5@27 f5@35 ~@66, ~@7 d5@8 ~ c5@15 ~ [c5,eb5]@16 ~@16]/4", // Bb Cm
  T: "[eb5@14 d5@17 ~ c5@32, [g4,bb4]@31 [bb4,f5]@33]/2", // Gm Bb5
  U: "[eb5@11 ~@20 [bb4,c5]@33, bb4@31 ~@33, g5@23 f5@41, ~@11 d5@20 ~@33]/2", // Bbsus2
  V: "[eb5@14 ~@32 a4@16 ~@2 ab5@11 g5@21 [d5,f5,bb5]@13 [bb4,d5,f5]@19, bb4@109 ~@19, g5@27 f5@35 ~@66, ~@7 d5@8 ~ c5@15 ~ [c5,eb5]@16 ~@16]/4", // Bb Cm
  W: "[eb5@14 d5@17 [bb4,c5,f5]@33, [g4,bb4] ~]/2", // Bbsus2 Gm
  X: "[g4@22 ~@74 eb5@14 ~@7 bb4@8 ~@16 a4@17 ~@2, bb4@62 ~ g5@33 ~@14 d5@16 ~@34, ~@32 d5@63 ~ c5@19 ~@10 c5@35, ~@64 g4@77 ~@19]/5",
  Y: "[[ab4,c5,f5]@15 [ab4,c5,f5]@17, d5 ~@63]/4", // Fm
  Z: "[~@19 a5@5 ~ bb5@5 ~@5 f4@2 ~@9 bb5@17 ~@2 g5 ~@18 f5@10 bb4@2, ~@30 c6@16 ~@17 a5@6 g5@15 ~@12, ~@77 bb4@15 ~@4]/3",
})).s("gm_rock_organ").gain(0.2)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@58 A B@4 C@2 D@5 E@5 ~@23 F@2 ~@15>".pickRestart({
  A: "~@25 c4@2 ~@2 d4@3, ~@23 d4@4 f4@5",
  B: "[g4@5 ~@18 c4@4 ~ c4 ~ c4@15 ~@14 bb3@5 ~@6 g3@17 bb3@2 ~ c4@2 ~ d4@2 ~@30 a2@2 ~, ~@5 g4@100 ~@23, ~@64 d4@7 ~@24 c4@5 ~ a3@5 a3@5 f3@5 ~ d3@5 bb2@5 ~, ~@67 bb3@10 ~@21 bb3@5 bb3@5 ~ g3@5 eb3@5 c3@5 ~@4]/4",
  C: "[c3@17 ~@9 bb3@2 ~@3 d4@6 f4@2 d4@2 ~@2 d4@17 ~@4, ~@23 f3@7 f4@3 ~@31, ~@25 a3@3 c4@4 ~@32]/2",
  D: "[~@41 bb5@5 ~ f5@4 f4@4 c4@4 c4@13 ~@7 db4 ~@8 eb4@3 ~@4 f4@2 bb4@2 c5@2 ~@5 d4@2 ~ c4@2 f4@2 ~ d4@2 ~ c4@2 ~@2 c4@5 ~@3 c4@5 ~@26, ~@27 c4@10 ~@90 d4@5 ~@28, ~@31 d4@31 ~@18 d4@12 d4@5 ~@4 a4@8 ~@51]/5",
  E: "[~@13 g4@2 bb4@3 g4@6 ~@3 d5@2 ~@3 g5@6 ~@4 eb5@4 d5@4 ~ c5@5 bb4@5 ~@14 bb4 ~ g4@2 d4@2 ~ c4@2 ~@76, ~@7 d4@2 f4@3 ~@17 eb5@3 ~@29 c5@79 ~@20, ~@8 eb4@2 d4@5 ~@15 f5@8 f5@103 ~@19, ~@38 a4 ~@41]/5",
  F: "[~@27 eb5@2 d5@2 c5@27 ~@6]/2",
})).s("gm_acoustic_guitar_steel").gain(0.31)

// chords · acoustic guitar steel · soft notes
const acoustic_guitar_steel_2 = note(`<
  ~@64
  [d5@7 ~@9]
  ~@13
  [~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3]
  [~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~@8]
  ~@35
>`).s("gm_acoustic_guitar_steel").gain(0.05)

// other · fretless bass
const fretless_bass = note("<~@33 A ~@71 B C D E F G H ~@3>".pickRestart({
  A: "~@24 bb3@5 ~@3", B: "f5@2 ~@5 c5@2 ~@2 f5@2 ~@5 c5@2 ~@2 f5@2 ~@6 c5@2",
  C: "~@6 f5@2 ~@3 c5@2 ~@3 f5 ~@5 c5 ~@4 f5@2 ~@3", D: "~@2 c5 ~@3 f5@2 ~@4 c5 ~@3 f5@2 ~@5 c5@2 ~@2 f5@2 ~@3",
  E: "~@2 c5 ~@5 f5@2 ~@3 c5 ~@3 f5 ~@6 c5 ~@3 f5@2 ~@2", F: "~@5 c5 ~@3 f5 ~@5 c5 ~@3 f5@2 ~@4 c5 ~@3 f5@2 ~",
  G: "~@5 c5 ~@3 f5@2 ~@5 c5 ~@2 f5 ~@5 c5 ~@3 f5 ~@2", H: "~@3 c5 ~@3 f5@3 ~@7 f5@2 ~@13",
})).s("gm_lead_8_bass_lead").gain(0.2)

// other · fretless bass · soft notes
const fretless_bass_soft = note("<~@33 A@2 ~@76 B C D ~>".pickRestart({
  A: "[~@28 a3@15 ~@21]/2", B: "~@13 c5@2 ~@8 c5 ~@3 f5@2 ~@3", C: "~@2 c5 ~@3 f5@2 ~@4 c5 ~@3 f5@2 ~@5 c5 ~@3 f5 ~@4",
  D: "~@3 c5@2 ~@2 f5 ~@24",
})).s("gm_lead_8_bass_lead").gain(0.05)

// other · distortion guitar · "Electric Guitar Solo!"
const distortion_guitar = note("<~@73 A@3 B C@2 ~@36>".pickRestart({
  A: "[~@15 g5@5 ~ g5@4 ~ g5@2 f5 ~ g5@14 ~@2 g5@6 a5@4 bb5@5 c6@29 ~ bb5@2 a5@3]/3", B: "g5@11 f5@16 eb5@2 db5 d5@2",
  C: "[~@20 a4@2 ~@2 eb4@2 ~@2 bb3@2 ~ f3@3 ~@30, c5@13 ~@19, ~@19 bb4@3 g4@3 ~@2 c4@3 a3@3 ~@31, ~@23 f4@3 d4@3 ~@35]/2",
})).s("gm_distortion_guitar").gain(0.11)

// other · distortion guitar · "Electric Guitar Solo!" · soft notes
const distortion_guitar_soft = note("<~@64 A@8 ~@43>".pickRestart({
  A: "[~@23 c4!8 c4@225]/8",
})).s("gm_distortion_guitar").gain(0.02)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A B@2 C@7 B C@8 B C@15 D@7 E F G D E G E G D E F@3 G ~@3 H F@13 I J@2 F J@7 K J@2 K L ~@18
>`.pickRestart({
  A: "~@3 x", B: "~ x ~@24 x ~@3 x ~", C: "x ~@12 x ~ x", D: "x ~@24 x ~@3 x ~@2", E: "x ~@24 x ~@3 x ~ x",
  F: "~@25 x ~@3 x ~ x", G: "~@25 x ~@3 x ~@2", H: "~@31 x", I: "~@24 x ~@4 x ~ x", J: "~@24 x ~@3 x ~@2 x",
  K: "~@12 x ~ x!2", L: "~@6 x!2",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct("<~@9 A@12 B A@20 B C A C A C@3 D C@5 E C@7 ~@4 C@15 F C F C F@7 G F@2 ~@18>".pickRestart({
  A: "~ x", B: "~@8 x ~@2 x ~@4", C: "~@15 x ~@16", D: "~@15 x ~@5 x ~@10", E: "~@15 x ~@11 x ~@4", F: "~@7 x ~@8",
  G: "~@7 x ~@5 x ~@2",
})).gain(0.41)

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

// drums · open hat
const open_hat = s("oh").struct("<~@46 [~@25 x ~@4 x ~] ~@30 [~ x] ~@6 [~@25 x ~@3 x ~@2] ~@30>").gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@88 [~@28 x ~@2 x] ~@26>").gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@21 A ~@20 A ~@7 B ~@29 C ~@7 D ~@26>".pickRestart({
  A: "~@12 x!4", B: "~@23 x ~ x ~ x ~ x ~@2", C: "~@13 x ~ x ~@5 x ~ x ~@8", D: "~@7 x!2 ~@2 x!2 ~@3",
})).gain(0.41)

// drums · crash
const crash = s("cr").struct(`<
  ~@22 A ~@20 A ~ A ~ A ~@2 B A ~@2 C ~ C ~@23 C ~ C ~ C ~@3 C ~@3 C ~ C ~@20
>`.pickRestart({
  A: "x", B: "~@15 x", C: "~@31 x",
})).gain(0.41)

// drums · ride
const ride = s("rd").struct(`<
  A B@2 C D E F C@2 G H@8 G H@8 G H@15 I J K L M K@2 L N M L N M L M K L N@3 M O P@3 N@13 Q R S T S U V@4 W X V X@2 Y
  Z@15 AA ~@2
>`.pickRestart({
  A: "~@28 x!4", B: "~ x ~@23 x ~@2 x ~ x ~", C: "~ x ~@22 x ~@3 x ~ x ~", D: "~ x ~@18 x!4 ~ x!7",
  E: "x!2 ~@22 x ~@3 x ~ x ~", F: "x ~@11 x ~ x!2", G: "~ x ~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~",
  H: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", I: "x ~@2 x ~ x ~ x ~@4 x!2 ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~@2",
  J: "x ~@2 x ~ x ~ x ~@3 x ~ x ~@2 x ~@2 x ~ x ~ x ~@3 x ~ x ~@2",
  K: "x ~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~@2",
  L: "x ~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x",
  M: "~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~@2",
  N: "~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x", O: "x ~@22 x ~@3 x ~ x ~ x", P: "~@23 x ~@3 x ~ x ~ x",
  Q: "~@3 x!2 ~@2 x ~@3 x!2 ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2 x",
  R: "~@2 x ~ x ~@2 x ~@2 x ~@2 x ~ x ~@3 x!2 ~@2 x ~@3 x!2 ~@2 x",
  S: "~@2 x ~ x ~ x ~@4 x!2 ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~@2 x",
  T: "~@2 x ~ x ~ x ~@3 x ~@2 x ~ x ~@2 x ~ x ~ x!2 ~@2 x ~@2 x ~ x",
  U: "~@2 x ~ x ~ x ~@3 x ~@2 x!2 ~@4 x!2 ~ x ~@3 x ~ x ~@2 x",
  V: "~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~@2 x",
  W: "~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x!2", X: "~ x!3 ~ x!3 ~ x!3 ~ x!3",
  Y: "~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x!6", Z: "~@11 x ~ x!3", AA: "~@11 x ~ x!2 ~",
})).gain(0.41)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~ A@4 B@2 A@3 B@8 A B@3 C@5 D C@2 B@13 E F G H G I G J@2 G J@2 K J K J ~@5 L M@16 N O P Q R S T U V T V@2 T V@3 W X Y
  X Y X Y W Z W@6 ~@3
>`.pickRestart({
  A: "~ x ~@30", B: "x", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", D: "~ x ~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~",
  E: "x ~@3 x!2 ~ x ~@4 x!2 ~ x ~@4 x!2 ~ x ~@3 x ~ x ~@2",
  F: "x ~@2 x ~ x ~ x ~@3 x ~ x ~@2 x ~@2 x ~ x ~ x ~@4 x!2 ~@2",
  G: "x ~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~@2",
  H: "x ~@2 x ~ x ~ x ~@3 x ~ x ~@2 x ~@2 x ~ x ~ x ~@3 x ~ x ~ x",
  I: "x ~@2 x ~ x ~ x ~@3 x ~@2 x!2 ~@3 x ~ x ~ x ~@3 x ~ x ~@2",
  J: "x ~@2 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x",
// … 17 more lines

More by Toto