Strudelify
Crazy Train cover art

1980 · The Ozzman Cometh

Crazy Train

Ozzy Osbourne

KeyA majorTempo67 bpm
0:00/0:00
// Crazy Train — Ozzy Osbourne
// 67 bpm, 4/8, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 fretless bass (copy of ch 2 electric bass pick); ch 6 overdriven guitar (copy of ch 5 distortion guitar)
// note: Full arrangement: all 169 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(67/2)

// 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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass pick
const bass = note(`<
  A B A C A B A D E F G H G I J K L M N@4 O P Q R Q S@3 T U V W X Y@3 Z AA AB AC AD AE AF AG AH@2 AI@2 AJ AK@4 AL AM AN
  AO AP AQ@4 AR AS AT AU AT AV@3 AW AX AW AY AZ BA@2 BB@3 BC BD BE BF BG BH BI BJ BK BL BM@5 BN BO BP BQ BR BS@3 BN BT
  BU BV BW BX BY BZ CA CB CC CD@2 AK@4 AL AM AN AO AP AQ@4 AR AS AT AU AT AV@3 AW AX AW AY AZ BA@2 BB@3 BC BD BE BF BG
  BH BI BJ BK BL CE BL CF@2 CG CH CI CJ CK CL
>`.pickRestart({
  A: "f#1!2 ~@6", B: "a1!2 ~@2 e1!2 ~@2", C: "d2!2 ~@2 c#2!2 ~@2", D: "d2@3 d2@3 ~@7 c#2@3 c#2@3 ~@5",
  E: "~ f#1@3 f#1@3 ~@17", F: "~ a1@3 a1@3 ~@6 e1@3 e1@3 ~@5", G: "~@2 f#1@3 f#1@3 ~@16",
  H: "~@2 d2@3 d2@3 ~@6 c#2@3 c#2@3 ~@4", I: "~ a1!2 ~@2 e1!2 ~", J: "~ f#1!2 ~@5",
  K: "~@3 d2@3 d2@3 ~@7 e2@3 e2@3 ~@2", L: "~@4 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@2",
  M: "~ a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@2",
  N: "[~ e2@3 a1@3 a2@3 ~ a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 ~ a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3]/4",
  O: "a1 e2 a1 a2 a1 a2 a1 a2", P: "a1 a2 a1 a2 a1 g#2 a1 f#2", Q: "~ a1@3 e2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@2",
  R: "~ a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@2",
  S: "[~@2 a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 ~ a1@3 g#2@3 a1@3]/3",
  T: "f#2 a1 e2 a1 a2 a1 a2 a1", U: "a2 a1 a2 a1 a2 a1 g#2 a1", V: "f#2@3 a1@3 e2@3 ~ a1@3 a2@3 a1@3 a2@3 a1@2",
  W: "~ a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@2", X: "~ f#2@3 a1@3 e2@3 a1@3 a2@3 a1@3 a2@3 a1@2",
  Y: "[~ a2@3 ~ a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 [f#1,f#2]@6 [f#1,f#2]@6 [e1,e2]@6 [e1,e2]@6 [d1,d2]@12 ~]/3", // F# E D
  Z: "~@2 [f#1,f#2]!2", AA: "[e1,e2]!2 [d1,d2]@2", AB: "~@12 [a1,a2]@6 ~ [a1,a2]@5",
  AC: "~ [a1,a2]@6 [a1,a2]@6 [e1,e2]@6 [e1,e2]@5", AD: "~ [e1,e2]@6 [e1,e2]@6 [f#1,f#2]@6 [f#1,f#2]@5",
  AE: "~ [f#1,f#2]@6 [f#1,f#2]@6 ~ [f#1,f#2]@6 [f#1,f#2]@4", AF: "~ [f#1,f#2]@3 [f#1,f#2]@3 [a1,a2]@3 [a1,a2]@2",
  AG: "~ [a1,a2]@3 [a1,a2]@3 [e1,e2]@3 [e1,e2]@2", // A E
  AH: "[~@2 [e1,e2]@6 ~ [e1,e2]@6 f#2@6 f#2@6 f#2@3 ~@3 e2@3 d2@3 d2@3 d2@3 d2@3, ~@5 f#2 ~@2]/2", // E
  AI: "[e2@3 e2@3 e2@3 e2@3 e2@3 f#2@6 f#2@6 ~ f#2@3 ~@3 e2@3 d2@3 d2@3 d2@3 d2@2, ~@31 f#2@6 ~@11]/2",
  AJ: "~ e2@3 e2@3 e2@3 e2@3 e2@3 a1@3 a2@3 a1@2",
  AK: "[~ a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 ~ a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 ~ a1@3 a2@3]/4",
  AL: "a1 a2 a1 a2 a1 a2 a1 a2", AM: "a1 g#2 a1 f#2 a1 e2 a1 a2", AN: "a1@3 a2@3 a1@3 a2@3 ~ a1@3 a2@3 a1@3 a2@2",
  AO: "~ a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 a1@3 a2@2", AP: "~ a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@2",
  AQ: "[~ a1@3 g#2@3 ~ a1@3 f#2@3 a1@3 e2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 a1@3 a2@3 ~ a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3]/4",
  AR: "a2 a1 g#2 a1 f#2 a1 e2 a1", AS: "a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 ~ a1@2",
  AT: "~ a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 a1@2", AU: "~ a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@2",
  AV: "[~@2 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 a2@3 a1@3 g#2@3 a1@3 f#2@3 a1@3 e2@3 [f#1,f#2]@6 [f#1,f#2]@6 ~ [e1,e2]@6 [e1,e2]@6]/3", // F# E
  AW: "[d1,d2] ~", AX: "[f#1,f#2]!2 [e1,e2]!2", AY: "~ [a1,a2]@6 [a1,a2]@6 [a1,a2]@6 [a1,a2]@5",
  AZ: "~ [e1,e2]@6 [e1,e2]@6 [e1,e2]@6 [e1,e2]@5", BA: "~ [f#1,f#2]@3 [f#1,f#2]@3 [f#1,f#2]@3 [f#1,f#2]@2",
  BB: "[~@2 [a1,a2]@6 [a1,a2]@6 [a1,a2]@6 ~ [a1,a2]@6 [e1,e2]@6 [e1,e2]@6 [e1,e2]@6 [e1,e2]@6 f#2@6 f#2@6 f#2@3 ~@3 e2@3, ~@11 f#2]/3", // A E
  BC: "d2@3 d2@3 d2@3 d2@3 e2@3 ~ e2@3 e2@3 e2@2", BD: "~ e2@3 f#2@6 f#2@6 f#2@3 ~@3 e2@2, ~@19 f#2@5",
  BE: "~ d2@3 d2@3 d2@3 d2@3 e2@3 e2@3 e2@3 e2@2", BF: "~ e2@3 f#1@3 f#1@3 ~@14", BG: "~@5 a1@3 a1@3 ~@6 e1@3 e1@3 ~",
  BH: "~@5 f#1@3 f#1@3 ~@13", BI: "~@2 d2!2 ~@2 e2!2", BJ: "~@2 f#1!2 ~@4", BK: "~@2 a1!2 ~@2 e1!2",
  BL: "~@7 f#1@3 f#1@3 ~@11",
  BM: "[~@7 d2@12 e2@12 f#1@3 f#1@3 f#1@3 f#1@3 ~ f#1@3 f#1@3 e1@3 e1@3 d1@3 d1@3 d1@3 d1@3 d1@3 d1@3 c#1@3 c#1@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 f#1@3 f#1@3 ~ f#1@3 f#1@3 f#1@3]/5", // B
  BN: "f#1!8", BO: "f#1 e1!2 d1!5", BP: "d1@3 c#1@3 c#1@3 ~ [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@2",
  BQ: "~ [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 f#1@3 f#1@3 f#1@3 f#1@3 f#1@2", // B
  BR: "~ f#1@3 f#1@3 f#1@3 f#1@3 f#1@3 f#1@3 f#1@3 f#1@2",
  BS: "[~ f#1@3 ~ e1@3 e1@3 d1@3 d1@3 d1@3 d1@3 d1@3 d1@3 c#1@3 c#1@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 f#1@3 f#1@3 f#1@3 f#1@3 ~]/3", // B
  BT: "f#1!2 e1!2 d1!4", BU: "d1@3 d1@3 c#1@3 c#1@3 [b0,b1]@3 [b0,b1]@3 ~ [b0,b1]@3 [b0,b1]@2",
  BV: "~ [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [b0,b1]@3 [c#1,c#2]@3 [c#1,c#2]@3 [c#1,c#2]@3 [c#1,c#2]@2", // B C#
  BW: "~ [c#1,c#2]@3 [c#1,c#2]@3 [c#1,c#2]@3 [c#1,c#2]@3 f#1@3 f#1@3 ~@5", BX: "~@14 a1@3 a1@3 ~@4",
  BY: "~@2 e1@3 e1@3 ~@6 f#1@3 f#1@3 ~@4", BZ: "~@14 d2@3 d2@3 ~@4", CA: "~@2 c#2@3 c#2@3 ~@7 f#1@3 f#1@3 ~@3",
  CB: "~@5 a1!2 ~", CC: "~ e1!2 ~@2 f#1!2 ~", CD: "[~@16 d2@12 e2@12 a1@3 a2@3 a1@2]/2",
  CE: "~@7 d2@3 d2@3 ~@6 e2@3 e2@2", CF: "[~@8 a1@3 a1@3 ~@6 e1@3 e1@3 ~@6 f#1@3 f#1@3 ~@10]/2",
  CG: "~@8 d2@3 d2@3 ~@7 e2@3", CH: "e2 ~@2 f#1!2 ~@3", CI: "~@3 a1!2 ~@2 e1", CJ: "e1@3 ~@7 f#1@3 f#1@3 ~@8",
  CK: "~@10 d2@3 d2@3 ~@6 e2@2", CL: "~ e2@3 ~@20",
})).s("gm_electric_bass_pick").gain(0.8)

// other · lead 1 square
const lead_1_square = note(`<
  ~@20 A B@2 ~ C@2 D@2 E F@2 ~ G H@3 I J@2 K@3 L@2 M@4 ~@6 N@2 O@2 P Q R@2 S@2 T U V W X Y Z@3 AA@2 AB@3 AC@3 AD ~@3
  AE@3 ~ AF AG AH@3 ~@27 AI@2 AJ ~ P AK AL@2 AM@2 AN@2 AO AP AQ ~ AR@3 AA@2 AS@3 AT@4 ~@20
>`.pickRestart({
  A: "~@5 e4@3 c#4@4 ~@12", B: "[~@15 c#4@2 b3@3 a3@3 g#3@3 a3@4 ~@2 c#4@7 ~@9, ~@31 b3@2 ~@15]/2",
  C: "[~@6 a4@2 ~ a4@2 ~ a4@2 ~@3 f#4@4 e4@12 ~@7 f#4@6 e4@2, ~@8 e4 ~@15]/2",
  D: "[~ e4@2 ~ d4@6 e4@3 d4@3 c#4@3 a3@10 ~@19]/2", E: "~@8 e4@3 c#4@5 ~@8",
  F: "[~@17 c#4@3 b3@3 a3@3 g#3@3 a3@5 ~@2 c#4@5 ~@7, ~@35 b3@2 ~@11]/2", G: "~@6 a4@2 ~@2 a4@2 ~ a4 ~ a4@3 e4@2 f#4@4",
  H: "[e4@9 ~@6 e4@3 ~ e4@3 f#4@3 e4@2 ~ [e4,f4]@3 d4@6 e4@3 d4@3 c#4@3 a3@8 ~@18]/3", I: "~@11 f#4@3 e4@3 f#4@7",
  J: "[~@2 g#4@5 ~@2 a4@14 f#4@11 ~ f#4@3 e4@3 f#4@7, ~@4 g#4 ~@19]/2",
  K: "[~@3 g#4@4 ~ g#4@2 ~ a4@22 e4@3 [a4,c#5]@3 a4@5 ~@2 [a4,c#5]@4 ~@2 c#5@3 ~@4 g#4@7 ~ [g#4,b4]@3 [g#4,b4]@2, ~@39 c#5@3 ~@9 a4@7 b4@9 ~@5, ~@29 f#4 ~@6]/3", // A G#m
  L: "[~ [g#4,b4]@3 g#4@5 ~@2 g#4@2 f#4@18 ~@17, ~@4 b4@3 ~@2 f#4@2 ~@37, ~@5 a4@12 ~@7]/2", // G#m
  M: "[~@11 e4@3 [a4,c#5]@3 [a4,c#5]@4 ~@2 [a4,c#5]@4 ~@2 a4@6 ~ g#4@7 ~ [g#4,b4]@3 [g#4,b4]@3 [g#4,b4]@3 g#4@5 ~@2 g#4@3 f#4@17 ~@16, ~@29 c#5@3 ~@3 b4@9 ~@9 b4@3 ~@4 a4@24 ~@12, ~@35 f#4@2 ~@22 f#4@2 ~@35]/4", // A G#m
  N: "[~@15 a4@2 ~ a4@2 ~ a4@2 a4@3 ~ f#4@6 e4@9 ~@6, ~@13 e4 ~@10]/2",
  O: "[~@2 e4@3 f#4@4 e4@2 ~ e4@3 d4@6 e4@6 ~@21]/2", P: "~@16 a4@2 ~ a4@2 ~ a4@2",
  Q: "~ a4@3 ~ f#4@5 e4@12 ~@2, ~@2 e4 ~@9", R: "[~@4 e4@3 f#4@3 e4@2 ~ e4@2 ~ d4@6 ~ e4@2 ~ d4@3 c#4@3 a3@9 ~@7]/2",
  S: "[~@17 a4@2 ~ a4@2 ~ a4@2 ~ a4@3 e4@2 f#4@4 e4@12 ~]/2", T: "~@6 e4@3 f#4@3 e4@2 ~ e4@3 d4@6", U: "e4 ~@5",
  V: "~@9 a4 ~ a4", W: "~ a4@2 ~ a4@3 e4@2 f#4@4 e4@11", X: "~@7 e4@3 f#4@3 e4@2 ~ e4@3 d4@5",
  Y: "~ e4@2 ~ d4@3 c#4@3 ~ a3@10 ~@3", Z: "[~@23 f#4@3 e4@3 f#4@8 ~@2 g#4@4 ~ g#4@2 a4@14 f#4@12]/3",
  AA: "[f#4@3 e4@3 f#4@9 g#4@5 ~ g#4@2 a4@23 e4@2]/2",
  AB: "[~ c#5@3 [a4,c#5]@4 ~@2 a4@5 ~ a4@6 ~ g#4@7 ~ [g#4,b4]@3 [g#4,b4]@3 [g#4,b4]@3 g#4@6 ~ g#4@2 f#4@23, a4@3 ~@7 c#5@3 ~@3 c#5@3 ~@3 b4@9 ~@9 b4@3 ~@3 a4@24 ~@2, ~@11 f#4 ~@11 f#4 ~@12]/3", // A G#m
  AC: "[~@23 e4@3 [a4,c#5]@3 [a4,c#5]@4 ~@2 a4@5 ~@2 a4@5 ~ [g#4,b4]@8 ~ b4@2 ~ b4@2 ~ b4@3 g#4@5 f#4, ~@35 c#5@3 ~@3 c#5@3 ~@3 f#4@2 ~@7 g#4@2 ~ g#4@2 ~ g#4@3 ~ b4@3 ~@3]/3", // A G#m
  AD: "g#4@3 f#4@17 ~@4, a4", AE: "[~@10 f#4@6 e4@6 d4@6 c#4@6 ~ b3@6 a3@6 b3@3 a3@3 c#4@6 e4@3 c#4@9 ~]/3",
  AF: "~@12 f#4@5 ~ f#4@5 ~", AG: "f#4 a4 g#4 f#4",
  AH: "[g#4@5 ~@2 a4@8 g#4@3 f#4@11 ~ f#4@13 g#4@10 ~@2 a4@17, ~@3 g#4 ~@23 g#4 ~@8]/3",
  AI: "[~@18 a4@3 a4@2 a4@3 ~ f#4@5 e4@13 ~@3, ~@27 e4 ~@20]/2", AJ: "~@2 e4@4 f#4@2 e4@2 ~@2 e4@3 d4@6 e4@3",
  AK: "~ a4@2 ~@2 f#4@4 e4@12 ~@3, ~@2 e4 ~@9", AL: "[~@4 e4@3 f#4@3 e4@2 ~ e4@3 d4@7 e4@3 d4@3 c#4@3 a3@9 ~@7]/2",
  AM: "[~@20 e4@3 c#4@7 ~@18]/2", AN: "[~@5 c#4@3 e4@2 ~@2 e4@2 ~ e4@2 ~ c#4@5 b3@2 a3@6 ~@17]/2",
  AO: "~@19 a4@2 ~ a4@2", AP: "~ a4@2 ~ a4@2 ~ a4@6 ~ e4@7 ~@3, ~@13 f#4@2 ~@9", AQ: "~@7 e4@3 f#4@3 a4@3 f#4 ~@2 a4@5",
  AR: "[~@23 f#4@3 e4@3 f#4@9 g#4@5 ~ g#4@2 a4@14 f#4@12]/3",
  AS: "[~ c#5@3 a4@5 ~ a4@5 ~ a4@6 ~ g#4@7 ~ [g#4,b4]@3 [g#4,b4]@3 [g#4,b4]@3 g#4@5 ~ f#4 g#4@2 f#4@23, a4@3 ~ c#5@3 ~@3 c#5@3 ~@3 c#5@3 ~@3 b4@9 ~@9 b4@3 ~@3 a4@24 ~@2, ~@11 f#4 ~@24]/3", // G#m
  AT: "[~@23 e4@3 [a4,c#5]@3 [a4,c#5]@4 ~@2 a4@5 ~@2 a4@5 ~ [g#4,b4]@8 ~ b4@2 ~ b4@2 ~ b4@2 ~ b4@3 ~@3 g#4@3 f#4@20 ~, ~@35 c#5@3 ~@3 c#5@3 ~@3 f#4@2 ~@7 g#4@2 ~ g#4@2 ~ g#4@2 ~ g#4@6 f#4@2 ~@23, ~@3 a4]/4", // A G#m
})).s("gm_lead_1_square").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A B C D C E F G H I@2 J K L@3 M@3 N@3 O@2 G@3 P Q R S@3 T@3 U V W@3 X Y I K@3 L@3 M@2 N@3 O@3 G@3 P@2 Z S@3 T@2 AA
  AB V W@3 I@2 AC AD@2 AE AF@2 B AG AH AI@2 AJ AK O G@2 AL AM AN AO AP AQ@2 AR AS ~@6 AT Y I K@2 AU L@3 M@2 N@3 O@3 G@3
  P@2 Z S@3 T@2 AV AW V W@3 I@2 AD@3 AE AF@2 B@3 D@3 E@2 AX AY AZ
>`.pickRestart({
  A: "~ x ~@2 x ~@2 x ~@5 x ~@5 x ~@4", B: "~ x ~@5 x ~@5 x ~@5 x ~@4", C: "~@2 x ~@2 x ~@2 x ~@5 x ~@5 x ~@3",
  D: "~ x ~@2 x ~@2 x ~@2 x ~", E: "~ x ~ x ~ x ~ x", F: "~ x!3 ~ x ~ x", G: "~@5 x ~@5 x", H: "~@2 x",
  I: "~ x ~@2 x ~", J: "~@5 x ~@11 x ~@5 x", K: "~@5 x ~@11 x ~@6", L: "~ x ~ x", M: "~@7 x ~@11 x ~@4",
  N: "~@2 x ~@2 x", O: "~@3 x ~@3 x", P: "~@11 x ~@11 x", Q: "~@11 x ~@2 x ~@8 x", R: "~@11 x ~@12", S: "x!2",
  T: "~ x ~@11 x ~@10", U: "~@2 x ~@2 x ~@8 x ~@9", V: "~ x ~@5 x ~@4", W: "~ x ~@3 x ~@2", X: "~@2 x ~@8 x",
  Y: "~@5 x ~@6", Z: "~ x ~@4 x ~@5", AA: "~@5 x ~@5 x ~@2 x ~@2 x ~@6", AB: "~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x",
  AC: "~ x ~@2 x ~@6 x ~@5 x ~@5 x", AD: "~@5 x ~@5 x ~@5 x ~@5 x", AE: "~ x!3", AF: "x!4", AG: "~ x ~@5 x ~@5 x ~@10",
  AH: "~ x ~@5 x ~@2 x ~@5 x ~@3 x ~@2 x", AI: "~@8 x ~@2 x ~@5 x ~@2 x ~@2 x", AJ: "~@5 x ~@2 x ~@2 x ~@6 x ~@2 x ~@2",
  AK: "~ x!3 ~@3 x", AL: "~@10 x ~@2 x ~@5 x ~@2 x ~", AM: "~ x ~@9 x ~@2 x ~@5 x ~@2 x",
  AN: "~@2 x ~@8 x ~@2 x ~@5 x ~@2 x", AO: "~@2 x ~@8 x ~@2 x ~@5 x ~@3", AP: "x!2 ~@2 x!2 ~ x", AQ: "x!2 ~ x!3 ~ x",
  AR: "~ x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~", AS: "~ x ~@2 x ~@5 x ~@13", AT: "~@11 x", AU: "~@5 x ~@5 x ~@6 x ~@5",
  AV: "~ x!7", AW: "x ~ x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x", AX: "~@3 x ~@6 x ~@5 x ~@5 x ~",
  AY: "~@2 x ~@2 x ~@2 x ~@2 x", AZ: "~ x ~@4",
})).gain(0.66)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A ~ B ~ B ~ C D E F G H I J K L M N@2 O P O Q@2 R S@2 T U T V@3 W@3 X Y Z@3 AA AB F G@2 AC K@3 AD N@2 O AE Q@3 AF
  S@2 T AG V@3 W@3 AH AI AJ Z@3 F@2 AK ~@3 AL ~@2 AM N AN@2 O AO Q@2 S@2 AP@3 AQ V@2 W AR ~@6 AS AB F AT G AC K@3 AD N@2
  O AE Q@3 AF S@2 T AG V@3 W@3 AU AV AJ Z@3 F@2 ~@17
>`.pickRestart({
  A: "~ x ~@2 x ~@19", B: "~@2 x ~@2 x ~@18", C: "~ x!2 ~@5", D: "~@3 x ~@5 x ~@6 x ~@5 x ~", E: "~@2 x ~@2 x ~@5 x",
  F: "~@5 x ~@5 x", G: "~@11 x ~@11 x", H: "~@11 x ~@10 x!2", I: "~ x!2 ~ x ~@6 x ~@11 x", J: "~ x", K: "x!2",
  L: "x ~@11 x ~@10 x", M: "~ x!2 ~ x!2 ~@7 x ~@10", N: "~ x ~@11 x ~@10", O: "~ x ~@5 x ~@4",
  P: "x ~ x!2 ~ x ~ x ~@6 x ~@9", Q: "~ x ~@3 x ~@2", R: "~@2 x!2 ~ x!2 ~ x ~@7 x ~@7", S: "~ x ~@2 x ~",
  T: "~@5 x ~@11 x ~@6", U: "~@5 x!2 ~ x!2 ~@7 x ~@6", V: "~ x ~ x", W: "~@7 x ~@11 x ~@4",
  X: "~@2 x ~@5 x ~@2 x ~@8 x ~@3", Y: "~@2 x ~@2 x", Z: "~@3 x ~@3 x", AA: "~@5 x ~@2 x ~@2 x",
  AB: "~@2 x ~@2 x ~@2 x ~@2 x", AC: "~@10 x!2 ~ x!2 ~ x ~@7", AD: "~ x ~@9 x ~ x!2 ~ x!2 ~@6",
  AE: "~@2 x ~@10 x!2 ~ x!2 ~ x ~@4", AF: "~@4 x ~@9 x ~ x!2 ~ x!2 ~@3", AG: "~@5 x ~@11 x ~ x!2 ~ x ~",
  AH: "~ x ~@2 x ~@2 x ~@2 x ~", AI: "~ x ~@2 x ~@2 x!2 ~ x ~", AJ: "~@8 x ~@12 x ~@2", AK: "~@4 x ~@2 x ~@16",
  AL: "~@2 x!2 ~@4", AM: "~@7 x ~@5 x ~@5 x ~@4", AN: "~@2 x ~@2 x ~@8 x ~@9", AO: "x ~@4 x ~@2",
  AP: "~@5 x ~@2 x ~@8 x ~@6", AQ: "~@2 x!2 ~@2 x ~", AR: "~@7 x ~@16", AS: "~@8 x ~@2 x", AT: "~@11 x ~@2 x!2 ~@7 x",
  AU: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x", AV: "~@2 x ~@3 x ~ x!2 ~ x ~ x!2 ~ x ~@2 x!2 ~ x ~",
})).gain(0.66)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@15 A B ~@32 C D ~@34 E F@2 G@3 H I J ~@22 C D ~@27 K ~@6 E F@2 G@3 H@3 L@2 M N@2 O P Q
>`.pickRestart({
  A: "~@8 x!2 ~@2 x ~@3 x!2 ~@2 x ~ x!2", B: "~ x!2 ~@21", C: "~@10 x!2", D: "~ x ~@2 x!2 ~@2 x ~ x!2 ~ x ~ x ~@8",
  E: "~@7 x ~@6 x ~@5 x ~@3", F: "~ x ~@2 x ~@2 x ~@2 x ~", G: "~ x ~ x ~ x ~ x", H: "~@2 x ~@2 x ~@2 x ~@2 x",
  I: "~@4 x ~@7 x!2 ~@2 x ~@2 x ~ x ~@2", J: "x!2 ~ x!2 ~ x ~@17", K: "~@2 x!2 ~ x ~@5 x ~ x ~@2 x!2 ~ x ~@4",
  L: "~@5 x ~@5 x ~@5 x ~@5 x", M: "~@5 x ~@5 x ~@6 x ~@5", N: "x!4", O: "x ~@5 x ~@6 x ~@5 x ~@4",
  P: "~ x ~@5 x ~@5 x ~@5 x ~@4", Q: "~ x ~@5 x ~@16",
})).gain(0.66)

// drums · hihat
const hihat = s("hh").struct(`<
  A@7 B ~@7 C D E F G H I J K L M N O P Q R S T U V W X Y Z@3 AA@2 AB AC@2 AD Z@2 AE AF AG AH AI AJ AK AL AM AN AO AP AQ
  AR AS AT AU AV AW AX AY AZ AD Z@2 AA@3 AC@2 AD Z@3 AA@2 BA BB@2 BC BD@2 BE@2 BF ~@15 BG BH@3 C@3 BI AF AG AH AI AJ AK
  AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ AD Z@2 AA@3 AC@2 AD Z@3 AA@2 BA BB@2 BC BD@2 BE@3 BJ@3 BK@3 BL BM
>`.pickRestart({
  A: "~ x ~ x", B: "~@7 x ~@11 x ~@4", C: "~@3 x ~@3 x", D: "~@5 x ~ x!2 ~ x ~@2 x!2 ~@4 x!2 ~@3",
  E: "~ x ~ x ~@2 x!2 ~ x!2 ~@2 x ~ x ~@3 x ~ x ~@2", F: "~ x ~ x ~@2 x!2 ~ x ~ x ~@2 x!2 ~@4 x!2 ~@2",
  G: "~@2 x!2 ~@2 x ~ x!2 ~ x ~@2 x!2 ~@4 x ~ x ~", H: "~@7 x!2 ~ x!2 ~@2 x ~ x ~@3 x ~ x ~",
  I: "~@2 x ~ x ~@2 x ~ x!2 ~ x ~@2 x!2 ~@4 x!2 ~", J: "~@3 x!2 ~@2 x ~ x!2 ~ x ~@2 x ~ x ~@3 x ~ x",
  K: "~@3 x ~ x ~@2 x!2 ~ x!2 ~@2 x ~ x ~@3 x ~ x", L: "~@8 x ~ x!2 ~ x ~@2 x!2 ~@4 x!2",
  M: "~@4 x!2 ~@2 x ~ x ~ x!2 ~@2 x ~ x ~@3 x ~", N: "x ~@3 x ~ x ~@2 x!2 ~ x!2 ~@2 x ~ x ~@4 x",
  O: "x ~@4 x!2 ~@2 x ~ x!2 ~ x ~@2 x!2 ~@4 x", P: "~@10 x!2 ~ x!2 ~@2 x ~ x ~@3 x",
  Q: "~ x ~@3 x ~ x ~@2 x!2 ~ x ~ x ~@2 x!2 ~@4", R: "x!2 ~@4 x!2 ~@2 x ~ x!2 ~ x ~@2 x!2 ~@4",
  S: "x ~ x ~@3 x ~ x ~@2 x!2 ~ x!2 ~@2 x ~ x ~@3", T: "x ~ x ~@5 x ~@2 x ~ x!2 ~ x ~@2 x!2 ~@3",
  U: "~ x!2 ~@4 x!2 ~@2 x ~ x!2 ~ x ~@2 x ~ x ~@2", V: "~ x ~ x ~@3 x ~ x ~@2 x!2 ~ x!2 ~@2 x ~ x ~@2",
  W: "~ x ~ x ~@4 x!2 ~@2 x ~ x!2 ~ x ~@2 x!2 ~@2", X: "~@2 x!2 ~@7 x ~@2 x ~@2 x ~@2 x ~@2 x",
  Y: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@3 x ~@2", Z: "x!8", AA: "~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~",
  AB: "~ x ~@2 x ~@2 x ~@2 x ~@3 x ~@2 x ~@2 x ~@2 x", AC: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x",
  AD: "~@2 x ~@2 x ~@2 x ~@3 x ~@2 x ~@2 x ~@2 x ~@2", AE: "x ~@3 x ~@2 x ~@2 x ~@2 x ~@8 x ~",
  AF: "~@10 x ~@7 x!2 ~ x!2 ~", AG: "~ x ~ x ~@3 x ~ x ~@3 x ~ x ~@2 x!2 ~ x ~ x",
  AH: "~@2 x!2 ~@4 x!2 ~@4 x!2 ~@2 x ~ x!2 ~ x", AI: "~@2 x!2 ~@4 x ~ x ~@3 x ~ x ~@2 x!2 ~ x!2",
  AJ: "~@2 x ~ x ~@3 x ~ x ~@8 x ~ x!2 ~", AK: "x ~@2 x!2 ~@4 x!2 ~@4 x!2 ~@2 x ~ x!2 ~",
  AL: "x ~@2 x ~ x ~@3 x ~ x ~@3 x ~ x ~@2 x!2 ~ x", AM: "x ~@2 x ~ x ~@3 x ~ x ~@4 x!2 ~@2 x ~ x!2",
  AN: "~ x ~@2 x!2 ~@4 x!2 ~@8 x ~ x ~", AO: "x!2 ~@2 x ~ x ~@3 x ~ x ~@3 x ~ x ~@2 x!2 ~",
  AP: "x!2 ~@2 x ~ x ~@4 x!2 ~@4 x!2 ~@2 x ~ x", AQ: "x ~ x ~@2 x!2 ~@4 x!2 ~@4 x ~ x ~@2 x!2",
  AR: "~ x!2 ~@2 x ~ x ~@3 x ~@10 x!2", AS: "~ x ~ x ~@2 x!2 ~@4 x!2 ~@4 x!2 ~@2 x ~",
  AT: "x!2 ~ x ~@2 x!2 ~@4 x ~ x ~@3 x ~ x ~@2 x", AU: "x ~ x!2 ~@2 x ~ x ~@3 x ~ x ~@3 x ~ x ~@2 x",
  AV: "~ x!2 ~ x ~@2 x!2 ~@4 x!2 ~@5 x ~@2 x", AW: "~ x!2 ~ x ~@2 x ~ x ~@3 x ~ x ~@3 x ~ x ~@2",
  AX: "x!2 ~ x!2 ~@2 x ~ x ~@3 x ~ x ~@4 x!2 ~@2", AY: "x ~ x!2 ~ x ~@2 x!2 ~@4 x!2 ~@4 x!2 ~@2",
  AZ: "x ~ x ~ x!2 ~@2 x ~ x ~@3 x ~ x ~@6 x", BA: "~ x ~@9 x ~@11 x", BB: "~@11 x ~@11 x", BC: "~ x", BD: "x!2",
  BE: "~ x ~@11 x ~@10", BF: "~ x ~@22", BG: "~@19 x ~@4", BH: "~@2 x ~@2 x", BI: "~@2 x ~@2 x ~@5 x",
  BJ: "~ x ~@5 x ~@4", BK: "~ x ~@3 x ~@2", BL: "~ x ~@2 x ~", BM: "~ x ~@4",
})).gain(0.66)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A B A B A B A C D E F G F H I J ~@33 K ~@35 L M N O P Q R S ~@16 T U G U H V H K ~@35 L M N O P Q R W X Y Z AA AB AC
  AD AE AF
>`.pickRestart({
  A: "x!2 ~@6", B: "x!2 ~@2 x!2 ~@2", C: "x ~@2 x ~@9 x ~@2 x ~@7", D: "~ x ~@2 x ~@19", E: "~ x ~@2 x ~@8 x ~@2 x ~@7",
  F: "~@2 x ~@2 x ~@18", G: "~@2 x ~@2 x ~@8 x ~@2 x ~@6", H: "~ x!2 ~@2 x!2 ~", I: "~ x!2 ~@5", J: "~@3 x ~ x ~@18",
  K: "~@16 x!2 ~@6", L: "~@4 x ~ x!2 ~@3 x!2 ~@4 x!2 ~@4 x", M: "x ~@4 x!2 ~ x ~@2 x!2 ~@4 x!2 ~ x ~@2 x",
  N: "~ x ~@3 x ~ x!2 ~@2 x ~ x ~@3 x ~ x ~@3 x", O: "~ x ~@4 x!2 ~ x ~@2 x!2 ~@4 x!2 ~ x ~@2",
  P: "x!2 ~@4 x!2 ~ x ~@2 x!2 ~@4 x ~ x ~@3", Q: "x ~ x ~@3 x ~ x!2 ~@2 x ~ x ~@3 x ~ x!2 ~@2",
  R: "~ x!2 ~@4 x!2 ~ x ~@2 x!2 ~@4 x!2 ~@3", S: "~ x!2 ~@4 x!2 ~@15", T: "~@13 x ~@2 x ~@7", U: "~@14 x ~@2 x ~@6",
// … 28 more lines

More by Ozzy Osbourne