Strudelify
Purple Haze cover art

Miami Pop Festival

Purple Haze

Jimi Hendrix

KeyG majorTempo112 bpm
0:00/0:00
// Purple Haze — Jimi Hendrix
// 112 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 77 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(112/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.

// chords · distortion guitar · "Distortion Guitar1"
const distortion_guitar = note(`<
  A B C D C E F G H I J K L M N O P Q J R S T U V W X Y Z AA AB T AC AD AE AF AG AH AI AJ@2 AK AL AM C D C AN AO AP AQ
  AR AS AT AU AV AW AX AY T U AZ@3 BA BB@2 BC BD@2 BE BF BD@2 BG BD@3
>`.pickRestart({
  A: "a#2@5 ~@3 a#3@5 ~@3 a#2@5 ~@3 a#3@5 ~@3", B: "a#2@5 ~@3 a#3@5 ~@3 a#2@5 ~@3 [a#3,d#4]@5 ~@3", C: "b3 d4 g4 g3@5",
  D: "g3@2 d3@2 e2@2 d3 e3@9", E: "g3@4 d3@4 e2@4 [d4,a4]@3 [e4,b4]@13 d3@2 e3@2", F: "g3@4 a3@4 a3@5 ~ g3@18",
  G: "g3 a2 e2 g2@4 a2", H: "d3 e3 g3@2 a3@2 g4 [a4,e5]@5 g3@2 d3@2",
  I: "b3@4 d4@4 d4@4 e4@9 [d3,g3,b3]@2 ~ d3@8, ~@3 b3 ~@4", // G
  J: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@3 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@4", // E7
  K: "g2@2 [g2,g3]@2 g2@2 g2@2 ~@2 [a3,c#4,e4]!2 f#4 e4 [a2,a3,c#4]@2, ~@2 [g3,b3,d4]@2 a2@2 [a2,a3,c#4] ~", // G A G A
  L: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,e4,g4]@3 [e3,g#3,d4,e4,g4]!3 [e3,g#3,d4,e4,g4]@2 d3@2", // E7
  M: "g2@2 g2@2 g2@2 g2@2 ~@2 [a3,c#4,e4]!2 f#4 e4 [a2,a3,c#4]@2, ~@2 [g3,d4,g4]@2 a2@2 [a2,a3,c#4] ~", // A G5 A
  N: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@3 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 d3@2", // E7
  O: "g2@2 g2@2 [g3,b3,d4]@2 g2@2 [a2,a3,c#4,e4]@2 [a3,c#4,e4]!2 [e4,f#4] e4 [a2,a3,c#4,e4]@2, ~@5 a2 [a2,a3,c#4] ~", // G A Esus2 A
  P: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@3 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]!2 ~@2", // E7
  Q: "g2@2 g2@2 g2@2 g2@2 [a2,a3,c#4,e4]@2 [a3,c#4,e4] [a3,c#4,f#4] f#4 e4 [a2,a3,c#4,e4]@2, ~@2 [g3,d4,g4]@2 ~ a2 [a2,a3,c#4] ~", // A F#m A G5 A
  R: "[g2,g3,b3]@2 [g2,g3,b3]@2 [g2,g3,b3,d4]@2 g2@2 [a2,a3,c#4,e4]@2 [a3,c#4,e4] [a3,c#4,f#4] f#4 e4 [a2,a3,c#4,e4]@2, ~@5 a2 [a2,a3,c#4] ~", // G A F#m A
  S: "e2 d5 ~@6", T: "~@4 [f#3,f#4] [e3,e4] [d3,d4]@2", U: "b3 d4 g4@2 b3 d4 g4@2",
  V: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 ~ [e3,g#3,d4,g4]!4 ~ [b3,e4]@2", // E7 E5
  W: "g2@2 g2@2 [g2,g3,d4]@2 g2@2 [a2,a3,c#4]@2 [a3,c#4,e4] a2 [g3,b3]@3 ~, ~ b3 ~@2", // G5 A G
  X: "e2@4 [e3,g#3,d4,g4]@4 a2 b2 d3 e3 d3 b2 a#2 a2", // E7
  Y: "g2@4 g2@4 [g3,b3,d4]@4 g2@4 a2@4 [a3,c#4,e4]@2 [a3,c#4,f#4]@2 [a3,c#4,f#4]@2 [a3,c#4,e4]@2 [a3,c#4,e4] ~ [a3,c#4,e4] ~, ~@5 a2 a2@2", // G A F#m A
  Z: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 a2 b2 d3 e3 d3 b2 a#2 a2", // E7
  AA: "g2@2 g2@2 g2@2 g2@2 [a2,a3,c#4,e4]@2 [a3,c#4,e4]!2 f#4 e4 [a2,a3,c#4,e4]@2, ~@2 [g3,b3,d4]@2 ~ a2 [a2,a3,c#4] ~", // A G A
  AB: "e2 ~@3", AC: "b3@2 d4@2 g4@4 b3@2 d4@2 g4@3 b3", AD: "c#4 e4 b4@2 c#4 e4 b4@2",
  AE: "e4@2 g4@2 g5@4 e4@2 g4@2 g5@3 e5", AF: "b4@3 d5 a#4@3 d5 [b4,d5]@2 [b4,d5]@2 [e3,b4,d5]@2 ~@2",
  AG: "b4@4 b4@2 c#5@2 c#5@2 b4@2 b4@2 a4@10 a4 b4 ~ a4 g#4@4",
  AH: "a4@8 ~ d3@7 [d5,f#5]@4 e4@4 g4@2 a4@2 g4@2 e4@2, ~ b4 ~@2", AI: "g4@6 g4 f#4 f#4@2 e4@2 d4@4",
  AJ: "[~@4 d4@2 e4@2 d4@2 c#4@2 d4@8 b3@2 c#4@2 e4@4 f#4@8 f#4 e4 ~ d4 d4@2 e4@2 e4@4 f#4@4 d4@12]/2",
  AK: "f#4@2 d4@2 f#4@2 d4@2 f#4@4 d4@4 ~@5 e5 b4 g4 d4@4 e4@4",
  AL: "f#4@2 g4@2 ~@4 f#5@7 e5 f#5@2 e5@2 d5@4 e5@4 c#5 d5 ~ c#5",
  AM: "c#5@4 c#5@4 b4 c#5 ~ b4 a4@4 b4@4 d5@4 a4@2 b4@6", AN: "g3@2 d3@2 e2@2 d3 e3@7 e2@2",
  AO: "e3@4 g3@2 a3@2 a#3@4 b3@15 g3 e3@4, ~@3 d#4 ~@4", AP: "g3 a3 ~ a3 b3@4 a3@2 g3@2 g2@17 g3@2 ~",
  AQ: "b3 d4 g4 g3@5, ~@3 b3 ~@4", AR: "g3@4 d3@4 e2@4 d3@2 e3@10 e2@4 [a2,e3,g3] ~@3",
  AS: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 ~ [d4,g4]!5 [b3,e4]@2", // E7 G5 E5
  AT: "g2@2 [g2,g3,b3,d4]!2 [g2,g3,b3,d4]@2 [g2,g3,b3,d4]@2 [a2,c#4,e4]@2 e4@2 [c#4,f#4] f#4 e4@2", // G A F#5
  AU: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@3 [e3,g#3,d4,g4]!3 [e3,g#3,d4,g4]@2 e2@2", // E7
  AV: "g2@2 [g2,g3,b3,d4]@2 [g2,g3,b3,d4]@2 [g2,g3,b3,d4]@2 [a2,c#4,e4]@2 [c#4,e4] [c#4,f#4] f#4 e4 c#4 b3, ~@6 c#4 ~", // G A C#m F#5
  AW: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4] [e3,g#3,d4,g4]@2 g3@2 e3@2", // E7
  AX: "[g2,g3,b3,d4]@2 [g2,g3,b3,d4]@2 [g2,d3,g3]@4 [a2,a3,c#4,e4]@2 g4 f#4@3 e4@2, ~@5 [a3,c#4]@2 ~", AY: "e2 e5 ~@14",
  AZ: "[~@8 b3@2 d4@2 g4@6 ~@6 c#4@2 e4@2 g4@6 ~@4 b4 c#5 d5@2 c#5@2 c#5 b4 a4@2]/3",
  BA: "g4@4 e5@4 e5@4 [e5,e6]@2 [e5,e6]!2", // E
  BB: "[[e5,e6]@6 [e5,e6]@2 [e5,e6]@2 [e5,e6] [e5,e6]@2 [e5,e6] [e5,e6]@2 [e5,e6]@4 [e5,e6]!2 ~ [e5,e6] [e5,e6]@3 [e5,e6]@3 [d5,d6]@6 [e5,e6]@4 [e5,e6]@3 [e5,e6]@2 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 ~ [e5,e6]@3 [e5,e6]@3]/2", // E D E
  BC: "[e5,e6]@3 [e5,e6]@2 [e5,e6]@3 [e5,e6]@3 [e5,e6]@2 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 ~ [e5,e6]@3 [e5,e6]@3", // E
  BD: "[e5,e6]@3 [e5,e6]@3 [e5,e6]@3 ~ [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 ~ [e5,e6]@3 [e5,e6]@3", // E
  BE: "[e5,e6]@3 [e5,e6]@2 [e5,e6] ~ [e5,e6] e5@8 g5@8 f5@8", // E
  BF: "[d5,d6]@4 [e5,e6]@3 [f5,f6] ~@2 [e5,e6] [d5,d6]!3 ~ [d5,d6] [e5,e6]@3 [f5,f6]@2 [e5,e6]@3 [d5,d6]@3 [e5,e6]@2 [e5,e6]@2 ~", // D E F E D E F E …
  BG: "d5@2 f5@6 ~@3 [e5,e6]@2 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 [e5,e6]@3 ~ [e5,e6]@3 [e5,e6]@3", // E
})).s("gm_distortion_guitar").gain(0.5).pan(0.4)

// chords · distortion guitar · "Distortion Guitar2"
const distortion_guitar_2 = note("<~@3 A ~ A ~ A ~@36 A ~ A ~ A ~@11 B C D E ~ F G H I@3 J@2 K L@2 ~>".pickRestart({
  A: "~@3 g3", B: "[e2,a2,e3,a3]@3 [a3,b3,e4] [e3,a3,b3,e4]!2 [a2,e3,a3] [b2,b3]",
  C: "e2@2 [b2,b3,e4]!2 [e2,b2,b3]!2 [b2,b3,e4]@2", // E5
  D: "e2@4 [e3,g#3,d4,g4]@2 [e3,g#3,d4,g4]@2 ~@2 [e2,e3,b3]@2 [e2,e3,b3]@2 b3 c#4", // E7 E5
  E: "~ g3 d3 [d3,g3] [d3,d4]!2 [c#3,c#4]!2", F: "e4@2 ~@2 d4@2 ~ e4@3 e4@2 d4@2 ~@5 d4@3 e4 ~@7 e4@2",
  G: "~ d4@2 ~@5 d4 ~@2 d4@2 ~ e4@2 ~ d4@2 ~@7 d4@2 e4 e4@2 ~, ~@10 e4@3 ~@3 e4@2 ~@14",
  H: "d4@3 d4@2 ~@4 e4@2 d4@2 ~@4 d4@3 ~ d4@2 e4 ~@6 d4@2, ~@20 e4@2 ~@7 e4@3",
  I: "[e4@4 ~@2 d4 ~@3 e4@2 e4@4 d4@2 d4@6 d4@2 ~@2 e4@3 ~@8 e4@2 ~ e4@2 d4@7 ~@3 e4 ~@10 d4@2 ~@5 d4@2 ~ d4@3 e4@2 ~ d4@2 ~@9 e4 e4@2 ~, ~@4 e4@5 ~@22 d4@3 ~@2 d4@6 ~@9 d4@5 ~@34 d4@5 ~, ~@32 e4@7 ~@23 e4@5 ~@7 e4@4 ~@2 e4@4 ~@12]/3",
  J: "[d4@3 d4@5 ~ e4@2 d4@5 ~ d4@3 ~@3 e4 ~@8 e4@3 ~@3 d4@3 ~ e4@2 e4@4 d4@2 d4@3 ~@3 d4@2 ~@2 e4@2 ~ d4, ~@20 e4@3 ~@6 e4@3 ~@4 e4@5 ~@23, ~@21 d4@7 ~@2 d4@5 ~@29]/2",
  K: "d4@3 d4@3 ~@3 e4@2 d4@3 ~@3 d4@2 ~@4 e4@3 ~@4 d4@2, ~@20 e4@2 ~@7 e4@3, ~@21 d4@5 ~@6",
  L: "[e4@3 ~ e4@2 d4@4 e4@2 e4@4 d4@2 d4@2 ~@4 d4@4 e4@3 d4@5 ~@28]/2",
})).s("gm_distortion_guitar").gain(0.32).pan(0.7)

// bass · slap bass 2 · "Slap Bass"
const bass = note(`<
  A@2 B@5 C@3 D E F G H I J K L K M N O P Q R S P T M N U V W X Y Z AA AB AC AD AE AF A AG@6 AH L AI AJ AK L AK M N U AL
  AM AN AO AF AP AF AQ AR AS AF AO AF AO AF AO AF
>`.pickRestart({
  A: "e2 ~ e3 ~ e2 ~ e3 ~", B: "e2 e3 e2 e3", C: "e2@7 ~ e2@7 ~ e2@7 ~ e2@7 ~", D: "e2@7 ~ e2@4 e2@4 e2@4 e2@4 e2@7 ~",
  E: "g1@2 g1@2 d2@2 g1@2 a1@2 a1@2 c#2!2 d2!2", F: "e2@4 e2@4 e2@7 ~ e2@4 e2@4 e2@7 ~",
  G: "g1@2 g1@2 d2@2 g1@2 a1@2 a1@2 c#2!2 d2@2", H: "e2!5 e1 e2@2", I: "g1@2 g1@2 g1@4 a1!2 a1@2 c#2@2 d2@2",
  J: "e2@2 e2@2 e2 e1 e2@2", K: "g1!2 d2 g1 a1!2 c#2 d2", L: "e2!8", M: "e2 ~@3", N: "~@4 f#2 e2 d2@2",
  O: "b1 d2 g2@2 b1 d2 g2@2", P: "e2!6 e2@2", Q: "g1@2 g1@2 g1@4 a1@2 a1@2 c#2!2 d2!2", R: "e2@2 e2@2 e2@4 e2!6 e2@2",
  S: "g1@2 g1@2 g1@2 g1@2 a1!2 a1@2 c#2@2 d2@2", T: "g1!2 g1@2 a1!2 c#2 d2", U: "b2 d3 g3@2 b2 d3 g3@2",
  V: "a1!2 a2@2 a1!2 a2@2", W: "b1!2 b1@2 b1!2 b1@2", X: "d2!2 d2@2 d2!2 d#2!2", Y: "e1@2 e2@2 e2 e1 f#2 e2",
  Z: "f#2@2 f#2@2 d2!2 d#2!2", AA: "e2@4 e2@4 e1@2 e1@2 e2@2 e2 f#2", AB: "f#2@2 f#2!2 d2!3 d#2",
  AC: "e2@4 e2 ~ e2 ~ e2@2 e1@2 e2@2 e1@2", AD: "f#2!4 d2!4", AE: "e1@2 e2@2 e1 e2!3", AF: "f#2!4 d2!3 d#2",
  AG: "e2 ~ e2@2 e2 ~ e2@2", AH: "e2@4 e2@4 e2@4 a1 b1 d2@2", AI: "g1!4 ~ a1 c#2 d2", AJ: "e2!2 e2@2 e2!4",
  AK: "g1!4 a1!2 c#2 d2", AL: "a1!2 a1@2 a1!2 [a1,a2]@2", AM: "[b1,b2]!2 [b1,b2]@2 [b1,b2]!2 [b1,b2]@2",
  AN: "d2@2 d2@2 d2!2 d#2!2", AO: "e1!2 e2@2 e2 e1 e2!2", AP: "e2@2 e1@2 e2@2 e1@2 e2@2 e1@2 e2@3 e2",
  AQ: "e2@4 e2@2 e1@2 e2@2 e1@2 e2@3 e2", AR: "f#2!2 f#2@2 d2!3 d#2", AS: "e1!2 e2@2 e2 e1 e2 e1",
})).s("gm_slap_bass_2").gain(0.4).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A B@6 C D E D E D F D G H I J K L D G D F D E J K ~ H M H D G H N H O H P H B Q B@4 J H R H I H I J S T D U D H G
  D@2 H V H V H V H V H V
>`.pickRestart({
  A: "~@5 x ~ x", B: "x ~@4 x ~ x", C: "~@5 x ~@2", D: "x ~@3 x!2 ~@2", E: "x!2 ~ x!2 ~ x!2", F: "x!2 ~@2 x!4",
  G: "x!2 ~ x!5", H: "x ~@3 x!2 ~ x", I: "x!7 ~", J: "x", K: "~@4 x!3 ~", L: "~ x!2 ~@5", M: "x!2 ~@2 x!2 ~ x",
  N: "x!2 ~ x!2 ~ x ~", O: "x!3 ~ x ~ x ~", P: "x!4", Q: "x ~@2 x ~ x ~ x", R: "x!8", S: "~@5 x!2 ~", T: "~@7 x",
  U: "x!2 ~ x!3 ~@2", V: "x ~@2 x ~@4 x ~@7 x ~@2 x ~@4 x ~@7",
})).gain(0.45)

// drums · rim
const rim = s("rim").struct("<~@46 [~ x ~@2] ~@11 [~ x ~@2] ~@18>").gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A@7 B C D E F E G E H E I ~ J K E F E G E L ~ J M N@2 O N P N Q O R S T O@2 U@3 A@2 V E W E X E Y ~ Z AA N@2 E O
  AB E@2 N AC N AD N AC O AD O AC
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x ~ x!2", C: "~@4 x ~@2 x ~ x ~@2 x ~ x!2", D: "~@4 x ~@2 x!8 ~",
  E: "~@4 x ~@2 x ~ x ~@2 x ~@2 x", F: "~@4 x ~@2 x!5 ~ x ~@2", G: "~@4 x ~@2 x!6 ~@3", H: "~@4 x ~ x!2 ~ x!2 ~@5",
  I: "x ~ x ~@3 x ~ x ~ x ~ x ~ x ~ x ~@3 x ~@2 x ~ x ~ x!2 ~@3", J: "~@4 x!4 ~@7 x", K: "x ~@5 x!4 ~@6",
  L: "~@4 x ~ x!2 ~ x!5 ~@2", M: "x ~@6 x!3 ~@6", N: "~@4 x ~@2 x ~@4 x ~@2 x", O: "~@4 x ~@2 x ~@4 x ~@3",
  P: "~@4 x ~@2 x ~@8", Q: "~@8 x ~@8 x ~ x!3 ~ x!3 ~ x ~@4", R: "x!2 ~ x!3 ~@3 x ~ x ~@3 x ~ x ~ x!3 ~ x!3 ~ x!2 ~@3",
  S: "~@4 x ~@2 x ~ x ~@2 x ~@3", T: "~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x!3 ~ x ~ x ~ x!2 ~@3", U: "~ x!3",
  V: "x ~@3 x ~@3 x ~@3 x!3 ~", W: "x!2 ~ x ~ x!5 ~@6", X: "x ~ x ~@3 x ~ x ~@7 x ~@3 x ~@2 x ~ x ~ x!3 ~ x",
  Y: "x ~ x ~@3 x ~@3 x ~ x ~ x ~ x ~@3 x ~@2 x ~ x ~ x ~@4", Z: "~@12 x!2 ~ x!2 ~@13 x ~",
  AA: "x ~@11 x!2 ~ x!2 ~ x ~ x ~@11", AB: "~@4 x ~@2 x ~ x ~ x ~@4",
  AC: "x!2 ~@2 x!2 ~ x ~ x ~ x!3 ~ x!3 ~ x!3 ~ x!3 ~ x ~@4",
  AD: "~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~ x ~@2",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@17 A ~@4 B ~ A ~@6 B ~@4 B ~@3 C ~ C ~@9 B ~@10 D A ~@5 E ~@3 E ~@2>".pickRestart({
  A: "~@7 x", B: "~@12 x!3 ~", C: "~@29 x ~ x", D: "~@3 x", E: "x ~ x!2",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@2 A@7 B ~@13 C ~@19 D ~@6 E ~@26>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x", D: "~ x ~@2", E: "~ x!2 ~",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@9 A ~@11 B ~@8 B ~ C A D E F G H G ~ I ~ J K@6 L C ~@6 A ~ M C N O P Q@2 R ~ R ~ Q ~ R ~ R ~
>`.pickRestart({
  A: "~@3 x", B: "~@5 x!2 ~", C: "x", D: "x!8", E: "~@2 x ~ x!3 ~", F: "x!3 ~@5", G: "x ~ x ~ x ~ x!2", H: "x!2 ~@2",
  I: "x!3 ~", J: "~@2 x!2", K: "x!4", L: "x ~@4 x ~@2", M: "~ x!3", N: "~@6 x!2", O: "x!3 ~ x ~ x ~", P: "x!4 ~@4",
  Q: "x ~ x!6", R: "~@2 x!6",
})).gain(0.45)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@13 A ~ B ~ C ~ D ~@2 E ~@3 B ~ C ~@2 E ~@4 F ~ C ~ G ~ H ~@11 D ~ I ~@2 E ~@4 J ~@3 E ~ K ~ E ~ K ~ E
>`.pickRestart({
  A: "~@6 x!2", B: "~@13 x!2 ~", C: "~ x", D: "~@4 x ~@12 x ~@6 x ~@7", E: "~ x ~@2", F: "~@8 x!2 ~@6",
  G: "~@7 x!2 ~@23", H: "x ~@3 x!2 ~@2 x ~@23", I: "~@8 x ~@8 x ~@14", J: "~@4 x!3 ~", K: "~@8 x ~@19 x ~@2 x",
})).gain(0.45)

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

// drums · ride bell
const ride_bell = s("rd").struct("<~@32 [~@2 x ~ x ~ x!2] [x!5 ~@3] ~@27 [~ x!3] [x!5 ~@3] ~@14>").gain(0.45)

// drums · cowbell
const cowbell = s("cb").struct("<~@43 A ~ A ~ A ~ A ~@27>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.45)

// drums · claves
const claves = s("clave:2").struct("<~@44 A ~ B ~ B ~ A ~@26>".pickRestart({
  A: "~@3 x ~@4", B: "~ x ~@2",
})).gain(2.19)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@44 A ~ A ~ A ~ A ~@26>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.65)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct("<~@43 A ~ A ~ A ~ A ~@27>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.65)

stack(
  distortion_guitar, distortion_guitar_2, bass, kick, rim, snare, low_tom, hihat, open_hat, mid_tom, high_tom, crash,
  ride_bell, cowbell, claves, woodblocks, woodblocks_2
)

More by Jimi Hendrix