Strudelify

Heartbreaker

Grand Funk Railroad

KeyB minorTempo140 bpm
0:00/0:00
// Heartbreaker — Grand Funk Railroad
// 140 bpm, 3/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (3/4 at bar 1, 4/4 at bar 248, 9/8 at bar 296, 4/4 at bar 298, ...) are rendered on a constant 3/4 grid of one bar per cycle
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 4 "Guitar" Elec Gtr 2 -> overdriven guitar
// note: ch 5 "Guitar (dbl track)" named as a guitar, played on electric guitar clean (its harpsichord patch is not one)
// note: duplicate parts dropped: ch 3 "Vocal (dbl track)" synth choir (copy of ch 2 "Vocal" bandoneon); ch 4 "Guitar" overdriven guitar (copy of ch 5 "Guitar (dbl track)" electric guitar clean)
// note: Full arrangement: all 314 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/3)

// 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 · electric guitar clean · "Guitar (dbl track)"
const electric_guitar_clean = note(`<
  ~@2 A@2 B@2 C D C D E F E F G H G H I@2 J@2 K L K L M N M N O P O P I@2 Q@2 R S R S T U T U V W V W I@2 Q@2 C D C D E
  F E F G H G H I@2 Q@2 C D C D E F E F G H G H I@2 J@2 K L K L M N M N O P O P I@2 Q@2 C D C D E F E F G H G H I@2 Q@2
  C D C D E F E F G H G H I@2 J@2 K L K L M N M N O P O P I@2 Q@2 C D C D E F E F G H G H I@2 J@2 X@4 Y@4 Z@4 AA@4 AB@2
  AC AD C D C D E F E F G H G H I@2 Q@2 C D C D E F E F G H G H I@2 J@2 AE@4 AF@4 AG@4 I@4 Q@3 AH AI AJ AK@2 AL@4 AM AN
  ~@38 AO@2 AP AQ AR@2 AS AT AU@2 AV AW AX AY@3 AZ@2 BA BB BC@3 BD BE@4
>`.pickRestart({
  A: "[~@27 b3@5, c#3 c#3, ~@5 e3@16 e3@11, ~@11 b3@16 ~@5]/2",
  B: "[~@27 e3@5, c#3, ~@5 e3@21 ~@6, ~@11 a#3@10 a#3@11, ~ c#4]/2",
  C: "b2@4 [b2,f#3,b3,d4] ~@4 [b2,f#3,b3,d4] ~ [b2,f#3,b3,d4]@4 [b2,f#3,b3,d4]", // Bm
  D: "d4 e4@4 [b2,f#3,b3,d4]@5 ~ [b2,f#3,b3]@5, [b2,f#3,b3]@5 ~@11", // Bm B5
  E: "a2@4 [a2,e3,a3,c#4] ~@4 [a2,e3,a3,c#4] ~ [a2,e3,a3,c#4]@4 [a2,e3,a3,c#4]", // A
  F: "c#4 d4@4 [a2,e3,a3,c#4]@5 ~ [a2,e3,a3]@5, [a2,e3,a3]@5 ~@11", // A A5
  G: "g2@4 [g2,d3,g3,b3] ~@4 [g2,d3,g3,b3] ~ [g2,d3,g3,b3]@4 [g2,d3,g3,b3]", // G
  H: "b3 c4@4 [g2,d3,f3,b3]@5 ~ [g2,d3,g3]@5, [g2,d3,f3]@5 ~@11", // G7 G5 G7
  I: "[f#2,c#3,e3,b3]@5 [f#2,c#3,e3,b3]@5 ~ [f#2,c#3,e3,b3]@5", J: "[f#2,c#3,e3,a#3]/2", K: "[b2,f#3,b3]",
  L: "[d4,f#4,b4] ~@15", M: "[a2,e3,a3]", N: "[c#4,e4,a4] ~@15", O: "[g2,d3,g3]", P: "[b3,d4,g4] ~@15",
  Q: "[f#2,c#3,e3,a#3]@5 [f#2,c#3,e3,a#3]@5 ~ [f#2,c#3,e3,a#3]@5", R: "~@11 b3@5, b2, ~@5 f#3@11",
  S: "d4@2 e4@2 ~@7 f#3@5, ~@2 d4 ~@5, ~@5 b3@11", T: "~@11 a3@5, a2, ~@5 e3@11",
  U: "c#4@2 d4@2 ~@7 e3@5, ~@2 c#4 ~@5, ~@5 a3@11", V: "~@11 g3@5, g2, ~@5 d3@11",
  W: "b3@2 c4@2 ~@7 d3@5, ~@2 b3 ~@5, ~@5 g3@11",
  X: "[~@61 d4@3, b4!2 b4!2 b4!2 b4!2, ~@3 f#4@8 f#4@8 f#4@8 f#4@8 f#4@8 f#4@8 f#4@8 f#4@5, ~@5 d4@8 d4@8 d4@8 d4@8 d4@8 d4@8 d4@8 ~@3]/4",
  Y: "[~@61 c#4@3, a4!2 a4!2 a4!2 a4!2, ~@3 e4@8 e4@8 e4@8 e4@8 e4@8 e4@8 e4@8 e4@5, ~@5 c#4@8 c#4@8 c#4@8 c#4@8 c#4@8 c#4@8 c#4@8 ~@3]/4",
  Z: "[~@61 b3@3, g4!2 g4!2 g4!2 g4!2, ~@3 d4@8 d4@8 d4@8 d4@8 d4@8 d4@8 d4@8 d4@5, ~@5 b3@8 b3@8 b3@8 b3@8 b3@8 b3@8 b3@8 ~@3]/4",
  AA: "[~@61 b3@3, f#4!2 f#4!2 f#4!2 f#4!2, ~@3 c#4@8 c#4@8 c#4@8 c#4@8 c#4@8 c#4@8 c#4@8 c#4@5, ~@5 b3@8 b3@8 b3@8 b3@8 b3@8 b3@8 b3@8 ~@3]/4",
  AB: "[~@29 a#3@3, f#4!2 f#4!2, ~@3 c#4@8 c#4@8 c#4@8 c#4@5, ~@5 a#3@8 a#3@8 a#3@8 ~@3]/2", AC: "[a#3,c#4,f#4]",
  AD: "[f#2,c#3,e3]@5 [f#2,c#3,e3]@5 ~ [f#2,c#3,e3]@5", // F#7
  AE: "[b2,f#3,b3,d4]@3 [b2,f#3,b3,d4]@2 [b2,f#3,b3,d4]@3 [b2,f#3,b3,d4]@3 [b2,f#3,b3,d4]@2 [b2,f#3,b3,d4]@3", // Bm
  AF: "[a2,e3,a3,c#4]@3 [a2,e3,a3,c#4]@2 [a2,e3,a3,c#4]@3 [a2,e3,a3,c#4]@3 [a2,e3,a3,c#4]@2 [a2,e3,a3,c#4]@3", // A
  AG: "[g2,d3,g3,b3]@3 [g2,d3,g3,b3]@2 [g2,d3,g3,b3]@3 [g2,d3,g3,b3]@3 [g2,d3,g3,b3]@2 [g2,d3,g3,b3]@3", // G
  AH: "[f#2,c#3,e3,a#3]", AI: "b3@2 c#4@2 ~ c#4@2 d4@2 e4@2 ~ e4@2 f#4@2, ~@4 d4@2 ~@5 d4@2 ~@3",
  AJ: "e4@2 f#4@2 ~ f#4@11, ~@2 g4 ~@5", AK: "[a#4@11 b4@21]/2",
  AL: "[b2,f#3,b3,d4,f#4,b4]!2 ~ [b2,f#3,b3,d4,f#4,b4]!3 ~ [b2,f#3,b3,d4,f#4,b4]!3 ~ [b2,f#3,b3,d4,f#4,b4]!3 ~ [b2,f#3,b3,d4,f#4,b4]", // Bm
  AM: "[b2,f#3,b3,d4,f#4,b4]!3 ~ [b2,f#3,b3,d4,f#4,b4]!5 ~ [b2,f#3,b3,d4,f#4,b4]!5 ~", // Bm
  AN: "[b2,f#3,b3,d4,f#4,b4]!5 ~ [b2,f#3,b3,d4,f#4,b4]!5 ~ [b2,f#3,b3,d4,f#4,b4] ~@3", // Bm
  AO: "[~@6 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 ~ [f#3,b3,d4,f#4]@2]/2", // Bm
  AP: "~@2 [e3,b3,e4,g4]@2 ~ [e3,b3,e4,g4]@2 [e3,b3,e4,g4]@5 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2", // Em Bm
  AQ: "~@3 [f#3,b3,d4,f#4]@2 ~ [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~", // Bm
  AR: "[~@2 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [e3,b3,e4,g4]@2 [e3,b3,e4,g4]@2 ~ [e3,b3,e4,g4]@5 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@2]/2", // Bm Em Bm
  AS: "~ [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 ~ [f#3,b3,d4,f#4]@2 ~@3", // Bm
  AT: "[e3,b3,e4,g4]@2 [e3,b3,e4,g4]@2 [e3,b3,e4,g4]@5 [f#3,b3,d4,f#4]@2 ~ [f#3,b3,d4,f#4]@2 ~@2", // Em Bm
  AU: "[[f#3,b3,d4,f#4]@2 ~ [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]@2 ~@3 [e3,b3,e4,g4]@2 [e3,b3,e4,g4]@2 ~ [e3,b3,e4,g4]@5]/2", // Bm Em
  AV: "[b2,f#3,b3,d4,f#4,b4]@3 ~@6 [c#3,g#3,c#4,e4,g#4,c#5]@3 ~@4", // Bm C#m
  AW: "~@2 [d3,a3,d4,f4,a4,d5]@3 ~@7 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]", // Dm Em
  AX: "[e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2", // Em
  AY: "[[e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5]]/3", // Em
  AZ: "[[e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@2 [e3,b3,e4,g4,b4,e5] [e3,b3,e4,g4,b4,e5]@19 ~@7]/2", // Em
  BA: "~@5 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]", // Bm
  BB: "[b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2", // Bm
  BC: "[[b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]]/3", // Bm
  BD: "[b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2", // Bm
  BE: "[[b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4] [b2,f#3,b3,d4,f#4,b4]@2 [b2,f#3,b3,d4,f#4,b4]@50 ~@5]/4", // Bm
})).s("gm_electric_guitar_clean").gain(0.48)

// chords · distortion guitar · "Guiter3"
const distortion_guitar = note("<~@247 A@8 B@7 C@5 D@7 E@5 F@8 ~@18 G H I J K@5>".pickRestart({
  A: "[~@13 [b2,f#3]@38 [a2,e3]@39 [g2,d3]@38]/8", B: "[~ [f#2,c#3]@38 [b2,f#3]@39 [a2,e3]@34]/7",
  C: "[~@4 [g2,d3]@39 [f#2,c#3]@37]/5", D: "[~ [b2,f#3]@39 [a2,e3]@38 [g2,d3]@34]/7",
  E: "[~@5 [f#2,c#3]@38 [b2,f#3]@37]/5", F: "[~@2 [a2,e3]@38 [g2,d3]@39 [f#2,c#3]@39 ~@10]/8", G: "~@7 b3",
  H: "~ c#4@3 ~ d4@3 c#4@3 d4@3 e4@2", I: "~ d4@3 c#4@3 d4@3 c#4@3 b3@3", J: "~ a3@3 f#3@3 e3@3 d3@3 c#3@3",
  K: "[b2@15 ~]/5",
})).s("gm_distortion_guitar").gain(0.64).pan(0.4)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~@6 A@3 B C@3 D E@4 F@2 G@2 A H A I C I C J E J E ~ K@4 L M N O P Q R S T U T@2 K@3 V A@2 W X C@2 Y Z E@2 T AA K@2 AB
  V A@2 W X C@2 Y Z E@2 T AA K@3 F A H A I C I C J E J E ~ K@3 V A@2 W X C@2 Y Z E@2 T AA K@2 AB V A@2 W X C@2 Y Z E@2 T
  AA K@3 F A H A I C I C J E J E ~ K@3 V A@2 W X C@2 Y Z E@2 T AA K@3 F AC@2 AD@2 AE@2 AF@2 AG@2 AH@2 K@8 A@2 W X C@2 Y
  Z E@2 T AA K@2 AB V A@2 W X C@2 Y Z E@2 T AA K@4 AI@4 AJ@4 AK@4 K@7 F ~@4 AL@2 AM@2 AN AO@2 AP@3 AQ AR AS AT@2 AU AV
  AW@2 AX@5 AY@3 AZ@2 BA@3 BB BC@3 BD@4 BE BF@2 BG BH@2 BI BJ BK@2 BL BM BN@2 BO BP BQ BR@3 BS@2 BT BU BV@3 BW BX@4
>`.pickRestart({
  A: "b1", B: "e2@5 d2@5 ~ b1@5", C: "a1", D: "d2@5 c#2@5 ~ a1@5", E: "g1", F: "f#1", G: "f#1/2", H: "~@15 f#1",
  I: "~@15 e1", J: "~@15 g1", K: "f#1@5 f#1@5 ~ f#1@5", L: "b1@15 f#1", M: "f#2@5 e2@5 ~ d2@5", N: "b1@5 f#1@5 ~ b1@5",
  O: "b2@5 f#2@5 ~ b2@5", P: "a1@5 a1@5 ~ a1@5", Q: "c#2@5 d2@5 ~ e2@5", R: "a1@5 e1@5 ~ a1@5",
  S: "a1@4 a3 ~@4 a3 ~ a3@5", T: "g1@15 g1", U: "f#2@2 g2@2 ~ f#2@2 g2@2 g2@2 ~ g2@2 g2@2, ~@4 g2@2 ~@5 f#2@2 ~@3",
  V: "f#2@3 f#1@2 f#2@3 f#1@3 f#2@2 f#1@3", W: "b1@15 b1", X: "b2@5 f#2@5 ~ b1@5", Y: "a1@15 a1",
  Z: "g2@2 a2@2 ~ g2@2 a2@2 a2@2 ~ a2@2 a2@2, ~@4 a2@2 ~@5 g2@2 ~@3", AA: "g2@5 d2@5 ~ g1@5", AB: "f#2@5 f#2@5 ~ f#2@5",
  AC: "b1/2", AD: "b2/2", AE: "a1/2", AF: "a2/2", AG: "g1/2", AH: "g2/2", AI: "b1@3 b1@2 b1@3 b1@3 b1@2 b1@3",
  AJ: "a1@3 a1@2 a1@3 a1@3 a1@2 a1@3", AK: "g1@3 g1@2 g1@3 g1@3 g1@2 g1@3", AL: "b1!2 ~ b1!3 ~ b1!3 ~ b1!3 ~ b1",
  AM: "b2!2 ~ b2!3 ~ b2!3 ~ b2!3 ~ b2", AN: "b2!3 ~ b2!5 ~ b2!5 ~", AO: "[b2!5 ~ b2!5 ~ b2 b1@7 b1@2 ~ b1@7 b1@2]/2",
  AP: "[~@3 b1@2 ~@2 b1@2 ~ b1@2 f#1@2 ~ b1@4 a1@7 ~ a1@2 a1@7 a1@2 ~@3 a1@2 ~@3 a1@2]/3", AQ: "a1@2 ~ e1@2 a1@5 g1@6",
  AR: "~ g1@2 ~ g1@7 g1@2 ~@3", AS: "g1@2 ~@2 g1@2 ~ g1@2 g1@2 ~ g1@2 g1@2",
  AT: "[~ f#1@2 f#1@2 f#1@2 ~ f#1@2 f#1@2 ~ f#1@2 f#1@2 f#1@2 ~@3 f#2@2 ~@3 f#2@2 f#2@2 ~]/2",
  AU: "e2@2 d2@2 ~ f#1@2 b1@7 b1@2", AV: "~ b1@7 b1@2 ~@3 b1@2 ~",
  AW: "[~@2 b1@2 b1@2 f#1@2 ~ b1@5 a1@7 a1@2 a1@7 a1@2]/2",
  AX: "[~@3 a1@2 ~@3 a1@2 ~ a1@2 e1@2 a1@5 g1@7 g1@2 ~ g1@7 g1@2 ~@3 g1@2 ~@3 g1@2 g1@2 g1@2 ~ g1@2 g1@2 ~ f#1@2 f#1@2 f#1@2 ~ f#1@2 f#1@2 ~ f#1@2 f#1@2 ~ f#1@2 ~@2]/5",
  AY: "[f#2@2 ~@3 f#2@2 ~ f#2@2 e2@2 d2@2 ~ f#1@2 b1@7 b1@2 ~ b1@7 b1@2 ~@3 b1@2 ~@3 b1@2 b1@2]/3",
  AZ: "[~ f#1@2 b1@5 a1@7 a1@2 a1@7 ~ a1@2 ~@2 a1@2 ~]/2",
  BA: "[~@2 a1@2 ~ a1@2 e1@2 a1@5 g1@7 ~ g1@2 g1@7 g1@2 ~@3 g1@2 ~@3 g1@2 g1@2 ~ g1@2]/3",
  BB: "g1@2 g1@2 ~ f#1@2 f#1@2 ~ f#1@2 f#1@2 f#1@2",
  BC: "[~ f#1@2 f#1@2 ~ f#1@2 ~@3 f#2@2 ~@2 f#2@2 ~ f#2@2 e2@2 ~ d2@2 f#1@2 b1@7 ~ b1@2 b1@7 b1@2 ~@2]/3",
  BD: "[~ b1@2 ~@3 b1@2 b1@2 ~ f#1@2 b1@5 a1@7 a1@2 ~ a1@7 a1@2 ~@3 a1@2 ~@2 a1@2 ~ a1@2 e1@2 ~ a1@4 g1@7 ~]/4",
  BE: "g1@2 g1@7 g1@2 ~@3 g1@2",
  BF: "[~@3 g1@2 g1@2 ~ g1@2 g1@2 ~ g1@2 f#1@2 f#1@2 ~ f#1@2 f#1@2 ~ f#1@2 f#1@2 f#1@2 ~]/2",
  BG: "f#1@2 ~@3 f#2@2 ~@2 f#2@2 ~ f#2@2 e2@2",
  BH: "[~ d2@2 f#1@2 ~ b1@2 b1@2 ~@3 b1@2 b1@2 ~@3 b1@2 b1@2 ~@3 b1@2 ~ b1@2]/2", BI: "~@2 e2@2 ~ e2@2 e2@5 b1@2 b1@2",
  BJ: "~@3 b1@2 ~ b1@2 ~@3 b1@2 b1@2 ~", BK: "[~@2 b1@2 b1@2 ~@3 e2@2 e2@2 ~ e2@5 b1@2 b1@2 ~@3 b1@2 b1@2 ~@2]/2",
  BL: "~ b1@2 b1@2 ~@3 b1@2 ~ b1@2 ~@3", BM: "e2@2 e2@2 e2@5 b1@2 ~ b1@2 ~@2",
  BN: "[b1@2 ~ b1@2 ~@3 b1@2 b1@2 ~@3 b1@2 b1@2 ~@3 e2@2 e2@2 ~ e2@5]/2", BO: "b1@3 ~@6 c#2@3 ~@4",
  BP: "~@2 d2@3 ~@7 e2 e2@2 e2", BQ: "e2@2 e2 e2@2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2",
  BR: "[e2 e2@2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2 e2 e2@2 e2@2 e2]/3",
  BS: "[e2@2 e2 e2@2 e2 e2@22 ~@4]/2", BT: "~@5 b1@2 b1@2 b1 b1@2 b1 b1@2 b1",
  BU: "b1@2 b1 b1@2 b1@2 b1 b1@2 b1 b1@2 b1 b1@2",
  BV: "[b1 b1@2 b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1@2 b1]/3",
  BW: "b1@2 b1 b1@2 b1 b1@2 b1 b1@2 b1@2 b1 b1@2", BX: "[b1 b1@2 b1 b1@2 b1 b1@2 b1@50 ~@5]/4",
})).s("gm_electric_bass_pick").gain(0.64)

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

// drums · rim
const rim = s("rim").struct("<[~@5 x ~@10] [x ~@10 x ~@4] ~@312>").gain(0.53).pan(0.4)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A B ~@7 C ~@4 D@3 ~@24 C ~@36 D@3 ~@45 D@3 ~@16 E ~@3 E ~@3 F ~@4 D@3 ~@17 D@2 B G ~@71 H ~@18 I ~@9 J K L M N O P
  Q R S ~@18
>`.pickRestart({
  A: "~@5 x ~@2 x ~@2 x ~ x ~@2", B: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", C: "~@11 x!2 ~@3", D: "x ~@4 x ~@5 x ~@4",
  E: "~@11 x!2 ~ x ~", F: "~@11 x ~@4", G: "x ~@2 x ~ x ~@2 x ~@2 x ~@4", H: "~@2 x!2 ~ x!2 ~@9", I: "~@7 x!4 ~@5",
  J: "~ x!4 ~ x ~ x ~@4 x ~ x", K: "~@4 x ~ x ~@4 x ~@2 x ~", L: "~@6 x!2", M: "~@3 x ~@2 x ~@4 x ~ x ~@2",
  N: "~ x!2 ~@5", O: "~@3 x ~ x ~@4 x ~ x ~@3", P: "~ x ~ x ~@4 x ~@2 x ~@4", Q: "~@9 x ~@2 x ~@3",
  R: "x ~@2 x ~@4 x ~ x ~@4 x", S: "~ x ~@14",
})).gain(0.53).pan(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@22 A B C B C B C B C B C B ~@52 A B C B C B C B C B C B ~@36 C B C B C B C B C B C B ~@168
>`.pickRestart({
  A: "~@5 x ~@10", B: "x ~@4 x ~@5 x ~@4", C: "x ~@4 x ~@10",
})).gain(0.53).pan(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@13 A ~@31 A ~@103 B ~@3 B ~@3 C ~@98 D E ~@18 F ~@8 G H ~@27>".pickRestart({
  A: "~@5 x ~ x ~@8", B: "~@5 x ~ x ~ x ~@6", C: "~@5 x!2 ~@9", D: "~@13 x ~ x", E: "x!2 ~@14", F: "~@2 x!4 ~@10",
  G: "~@12 x!3 ~", H: "x",
})).gain(0.53).pan(0.4)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@22 A ~ A ~ A ~ A ~ A ~ A ~ B@4 ~@12 B@4 ~@32 A ~ A ~ A ~ A ~ A ~ A ~ B@4 ~@32 A ~ A ~ A ~ A ~ A ~ A ~ B@3 ~@98 C D E
  F G E H G I J K L M G N M O N M ~ P Q F P R F S T U A E F G E H G I V W ~@28
>`.pickRestart({
  A: "~@11 x ~@4", B: "x ~@4 x ~@5 x ~@4", C: "~@13 x ~@2", D: "~@2 x ~@4 x ~@3 x ~@4", E: "x ~@4 x ~@4 x ~@4 x",
  F: "~@3 x ~@4 x ~@4 x ~@2", G: "~@2 x ~@4 x ~@4 x ~@3", H: "~@4 x ~@3 x ~@4 x ~@2", I: "~ x ~@3 x ~@4 x ~@4 x",
  J: "~ x ~@2", K: "~@7 x ~@4 x ~@3", L: "~ x ~@4 x ~@3 x ~@4 x", M: "~@4 x ~@4 x ~@4 x ~", N: "~ x ~@4 x ~@4 x ~@3 x",
  O: "~@3 x ~@3 x ~@4 x ~@3", P: "~ x ~@4 x ~@4 x ~@4", Q: "x ~@3 x ~@4 x ~@4 x ~", R: "x ~@4 x ~@3 x ~@4 x ~",
  S: "~@2 x ~@3 x ~@4 x ~@4", T: "x ~@4 x ~@4 x ~@3 x ~", U: "~@3 x ~@4 x ~@7", V: "~@4 x ~@4 x ~@3 x ~@2",
  W: "~ x ~@6",
// … 15 more lines

More by Grand Funk Railroad