Strudelify
That's the Way cover art

That's the Way

Katrina and the Waves

KeyD majorTempo128 bpm
0:00/0:00
// That's the Way — Katrina and the Waves
// 128 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 114 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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, A@4 for four bars: edit a riff to change every repeat.

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  A B C D@2 E F E G H C B I B C H I J@8 K@2 L@5 M N O N M N O N M B C B I B C B P Q@2 R S T@3 M N O N M N O N M U V U V
  U V U V N O N M N O N W@7 X@2 N O N M N O N M N O N M N O Y M N O N M N O N Z@2
>`.pickRestart({
  A: "~@18 g3 ~@2 f4 [g4,a4] [b4,c5], ~@9 [a3,b3] d4 ~, ~@19 c4@2 e4@2 ~", B: "[d5,f#5,a5]@9 ~ [d5,g5,b5]@13 ~",
  C: "[d5,g5,b5]@9 ~ [e5,a5,c#6]@14", D: "[[f#5,a5]@9 ~ [g5,b5]@13 ~ [g5,b5]@9 ~ [d5,f#5,a5]@14, d5@11 ~@5]/2",
  E: "[d6,f#6,a6]@9 ~ [d6,g6,b6]@13 ~", F: "[e6,g6,b6]@9 ~ [e6,f#6,a6,c#7]@14",
  G: "[d6,g6,b6]@2 [d6,g6,b6]@2 [d6,g6,b6]@6 [d6,f#6,a6]@13 ~", H: "[f#5,a5]@10 [g5,b5]@13 ~, d5@23 ~",
  I: "[d5,g5,b5]@9 ~ [d5,f#5,a5]@14", // G D
  J: "[[f#4,a4,d5]@24 e5@12 ~@12 [a4,f#5]@24 ~@6 e5@6 [b4,g5]@5 [a4,f#5]@7, ~@48 [g4,b4]@49 ~@47 [g4,b4]@23 ~@25, ~@72 d5@119 ~]/8", // D Em D G
  K: "[[d5,f#5], a4@15 ~]/2", L: "[[g4,e5] g5 [a4,f#5]@2 [b4,e5,g5], b4@49 ~@71, ~@24 d5@95 ~]/5",
  M: "[b4,d5,g5]@9 ~ [a4,d5,f#5]@13 ~", N: "[a4,d5,f#5]@9 ~ [b4,d5,g5]@13 ~", O: "[b4,d5,g5]@9 ~ [c#5,e5,a5]@14",
  P: "[d5,g5,b5]@9 ~ [f#5,a5]@13 ~, ~@10 d5@11 ~@3", Q: "[[f#4,d5], a4@23 ~]/2", R: "[g4,b4,e5]", S: "[b4,d5,g5]",
  T: "[[a4,f#5]@2 [b4,e5,g5], d5@71 ~]/3", U: "[a4,d5,f#5] ~@2", V: "[b4,d5,g5]@9 ~ [a4,d5,f#5]@9 ~@5",
  W: "[[b4,d5,g5]@9 ~ [a4,d5,f#5]@5 ~ [a4,d5,f#5] ~ [a#4,c#5,f#5]@3 ~ [b4,d5,f#5]@43 ~ [a#4,c#5,f#5]@3 ~ [b4,d5,f#5]@43 ~ [a#4,c#5,f#5]@3 ~ [b4,d5,f#5]@48 ~@2]/7", // G D F# Bm F# Bm F# Bm
  X: "[[c#5,e5]@47 ~, a4@15 ~]/2", Y: "[a4,f#5]@9 ~ [b4,g5]@14, d5@23 ~",
  Z: "[[b4,d5,g5]@9 ~ [a4,d5,f#5,a5]@27 ~@11]/2", // G D
})).s("gm_rock_organ").gain(0.33).pan(0.4)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@5 A B@2 C D E F G F E F H A B I J B K I L B A I M B@2 I L F E F L F E F L F E F N F O F G B P I J B@2 I L F E F L F
  E F L Q R Q R Q S T U F E F V F E F W@2 X@4 Y Z AA F E F G ~@3 AB F E F L F E F L F E F L F E F AC@2
>`.pickRestart({
  A: "d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@3 ~ d2 ~ d2@3 ~ d2 ~", B: "d2@3 ~ d2 ~ d2@3 ~ d2 ~ d2@3 ~ d2 ~ d2@2 ~@2 d2 ~",
  C: "d2@3 ~ d2 ~ d2@2 ~@2 d2 ~ d2@3 ~ a2@2 b2@2 a2@2 f#2 ~",
  D: "d2@2 ~@2 d2 ~ d2@2 ~@2 d2@2 g1@2 ~@2 g1 ~ g1@3 ~ g1 ~", E: "g1@3 ~ g1 ~ g1@3 ~ g1 ~ a1@3 ~ a1 ~ a1@3 ~ a1@2",
  F: "d2@3 ~ d2 ~ d2@3 ~ d2@2 g1@3 ~ g1 ~ g1@3 ~ g1 ~", G: "g1@3 ~ g1 ~ g1@2 ~@2 g1 ~ d2@3 ~ d2 ~ d2@2 ~@2 d2 ~",
  H: "g1@3 ~ g1 ~ g1@3 ~ g1 ~ d2@2 ~@2 d2 ~ d2@3 ~ d2@2", I: "e1@3 ~ e1 ~ e1@3 ~ e1 ~ e1@2 ~@2 e1@2 f#1@3 ~ e1@2",
  J: "g1@2 ~@2 g1 ~ g1@3 ~ g1 ~ g1@3 ~ g1 ~ g1@3 ~ a1 ~", K: "d2@3 ~ d2@2 d2@3 ~ d2 ~ d2@3 ~ d2 ~ d2@3 ~ d2@2",
  L: "g1@3 ~ g1 ~ g1@3 ~ g1@2 d2@3 ~ d2 ~ d2@3 ~ a1@2", M: "g1@3 ~ g1 ~ g1@3 ~ g1 ~ g1@3 ~ g1 ~ g1@4 a1@2",
  N: "g1@3 ~ g1 ~ g1@3 ~ g1@2 d2@2 ~@2 d2 ~ d2@3 ~ d2 ~", O: "g1@3 ~ g1 ~ g1@3 ~ g1@2 a1@2 ~@2 a1 ~ a1@2 ~@2 a1@2",
  P: "d2@2 ~@2 d2 ~ d2@3 ~ d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2@2", Q: "d2 ~@3", R: "g1@2 a1 b1@2 d2@6 ~",
  S: "g1@2 a1 b1@2 a1@6 ~", T: "d2@3 ~@5", U: "g1@3 ~ a1@2 b1@4 d2@9 ~@5",
  V: "g1@3 ~ g1 ~ g1@3 ~ g1@2 d2@3 ~ d2@2 d2@4 a2@2",
  W: "[g1@3 ~ g1 ~ g1@3 ~ g1@2 d2@3 ~ a1@2 a#1@4 b1@6 b1 ~ b1@3 ~ b1@2 b1@3 ~ b1 ~ b1@3 ~ b1 ~]/2",
  X: "[b1@3 ~ b1 ~ b1@3 ~ b1 ~ b1@2 ~@2 b1@2 a#1@3 ~ b1@5 ~ b1 ~ b1@3 ~ b1@2 b1@3 ~ b1 ~ b1@3 ~ b1 ~]/2",
  Y: "b1@3 ~ b1 ~ b1@3 ~ b1 ~ b1@4 f#1@2 a1@4 b1@2", Z: "a1@3 ~ a1 ~ a1@3 ~ a1 ~ a1@3 ~ a1 ~ a1@3 ~ a1 ~",
  AA: "a1@5 ~ a1@6 a1@5 ~ a1@5 ~", AB: "g1@3 ~ g1@2 g1@3 ~ g1@2 d2@3 ~ d2 ~ d2@2 b1@2 a1@2", AC: "[g1@5 d2@13 ~@6]/2",
})).s("gm_fretless_bass").gain(0.49)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@5 A B@2 C D E F G D E F G ~@8 H I J K L H K M D E F G D E F G D E F G D E F G H I J K H@2 K M D E F G D E F G ~@8 D
  E F G D E F N ~@8 D E F G D E F G D E F G D E F G D E F G D E F O ~
>`.pickRestart({
  A: "d3@3 ~ d3@2 [d3,a3]@3 ~ d3@2 [d3,a3]@4 d3@2 [d3,a3]@4 d3@2", // D5
  B: "[d3@3 ~ d3@2 [d3,a3]@4 d3@2 d3@4 a3@2 a3@2 ~@4 d3@3 ~ [d3,a3]@2 [d3,a3]@4 [d3,a3]@2 [d3,a3]@4 d3@2 [d3,a3]@4 [d3,a3]@2, ~@4 d3!2 ~@6, ~@11 a3@2 ~@11]/2", // D5
  C: "[d3,a3]@4 [d3,a3]@2 [d3,a3]@4 d3@2 [d3,a3]@4 d3@2 [d3,a3]@3 ~ [d3,a3]@2", // D5
  D: "f#4@4 f#4@2 ~@4 g4@2 g4@4 [d4,g4]@2 [b3,d4,g4]@3 ~@3, [a3,d4]@3 ~@2 b3@4 ~@3, ~@5 d4@3 ~@4", // G5 G D5
  E: "[d4,g4]@4 [d4,g4]@2 ~@4 a4@2 a4@4 [e4,a4]@2 [e4,a4]@3 ~@3, b3@6 ~@4 c#4@11 ~@3, ~@5 e4@3 ~@4", // G5 A5
  F: "[a3,d4,f#4]@2 [a3,d4,f#4] ~@2 g4 g4@2 [d4,g4]!2 ~@2, ~@10 b3@11 ~@3, ~@5 d4@3 ~@4", // D G5
  G: "[b3,d4,g4]@4 [d4,g4] ~@5 [d4,f#4]@6 [d4,f#4]@2 [a3,d4,f#4]@4 [d4,f#4]@2, ~@5 a3@4 ~@3", // G G5 D
  H: "~@2 [a3,d4] ~@3 a3@4 [a3,d4]@6 [a3,d4] ~@7, ~@6 d4 ~@17", // D5
  I: "~@2 [a3,d4] ~@3 d4 e4@3 [a3,d4]@6 [a3,d4]@2 ~@6, ~@3 a3@2 ~@7", // D5
  J: "~@2 [b3,d4] ~@3 [b3,d4] e4@3 [b3,d4]@6 [b3,d4] ~@7", // Bm
  K: "~@2 [b3,d4] ~@3 d4 e4@3 [b3,d4]@6 [b3,d4] ~@7, ~@3 b3@2 ~@7", // Bm
  L: "~@2 [a3,c#4] ~@3 a3@4 [a3,d4]@6 [a3,d4] ~@7, ~@6 d4 ~@17", M: "[b3,d4]@4 [b3,d4] ~@5 [f#3,a3,d4]@12 ~@2",
  N: "[b3,d4,g4]@4 [d4,g4] ~@5 [d4,f#4]@6 [d4,f#4]@2 [a#3,c#4,f#4]@4 [d4,f#4]@2, ~@5 a3@4 ~@3", // G G5 D F# D
  O: "[b3,d4,g4]@4 [d4,g4] ~@5 [a3,d4,f#4]@13 ~", // G G5 D
})).s("gm_electric_guitar_clean").gain(0.28).pan(0.7)

// chords · electric guitar clean · "CLEAN GTR" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@5 A B ~ C D E F G D E F G ~@8 H ~ I ~ H@2 ~@2 D E F G D E F G D E F G D E F G H ~ I ~ H@2 ~@2 D E F G D E F G ~@8 D
  E F G D E F J ~@8 D E F G D E F G D E F G D E F G D E F G D E F G ~
>`.pickRestart({
  A: "a3@3 ~ a3@2 ~@4 a3@2 ~@4 a3@2 ~@4 a3@2", B: "a3@3 ~@9 a3@4 ~@4 a3@2 ~@2", C: "~@8 a3 ~@3", D: "~@10 g3@11 ~@3",
  E: "~@10 a3@11 ~@3", F: "~@6 g3 g3@3 ~@2", G: "~@10 f#3@13 ~", H: "~@7 e4@3 ~@14", I: "~@5 g3@3 ~@4",
  J: "~@10 f#3@7 ~@7",
})).s("gm_electric_guitar_clean").gain(0.08).pan(0.7)

// other · recorder
const recorder = note(`<
  ~@9 A B@2 ~ A C@2 ~@20 D ~@3 E A B@2 ~ A F@2 ~@7 G H ~@3 I ~@3 I ~@27 I ~@3 I A B@2 ~ A J@2 ~ K@2 L M K N O P@2
>`.pickRestart({
  A: "a3@3 b3@2 a3 d4@3 e4@2 d4", B: "[f#4@5 e4@3 d4 b3@2 d4@4 b3@2 a3@3 ~@4]/2",
  C: "[[f#4,a4,d5]@5 [e4,a4,c#5]@3 [d4,f#4] [b3,e4]@2 [d4,f#4,a4]@4 [b3,e4,a4]@2 [a3,d4,g4]@3 ~@4, ~@8 a4@3 ~@13]/2", // D A D E5 D Esus4 Dsus4
  D: "g4@10 f#4@13 ~", E: "g4@10 f#4@9 ~@5",
  F: "[[f#4,a4,d5]@5 [e4,a4,c#5]@3 [d4,f#4] [b3,a4]@2 [d4,f#4,a4]@4 [b3,e4,a4]@2 [a3,d4,g4]@3 ~@4, ~@16 a4 ~ e4@3 ~@27]/2", // D A D B7 D Esus4 Dsus4
  G: "~@6 b4@4 b4 ~ b4@4 a4 ~ b4@5 ~", H: "b4@10 a4@11 ~@3", I: "g4@10 f#4@11 ~@3",
  J: "[[f#4,a4,d5]@5 [e4,a4,c#5]@3 [d4,f#4] [b3,e4,a4]@2 [d4,f#4,a4]@4 [b3,e4,a4]@2 [a3,d4,g4]@3 ~@4, ~@16 a4 ~@31]/2", // D A D Esus4 D Esus4 Dsus4
  K: "a3@3 b3@2 a3 d4@3 b3@3", L: "a3@3 b3@2 a3 e4@3 d4@3",
  M: "a3@3 b3@2 a3 [f#4,a4,d5]@3 [e4,b4]@2 [d4,f#4,a4], ~@6 g4 ~", N: "a3@6 b3@4 a3@2 d4@6 b3@5 ~",
  O: "a3@6 b3@4 a3@2 e4@6 d4@5 ~", P: "[[b3,d4,g4]@5 [a3,d4,f#4]@13 ~@6]/2",
})).s("gm_recorder").gain(0.35)

// chords · recorder
const recorder_2 = note(`<
  ~@33 A B C ~ A B C ~@17 A B C ~ D B E ~@2 F@2 ~@2 F@2 ~@10 G@2 H@2 ~@3 A B E ~ D B E ~@18
>`.pickRestart({
  A: "~@18 [a3,d4,f#4]@3 ~ [b3,d4,f#4,a4]@2", B: "~@16 [f#3,f#4]@3 ~ [e3,e4]@4", C: "d4 ~@3, d3 ~@5",
  D: "~@9 [a3,d4,f#4]@2 [b3,d4,f#4,a4]", E: "[d3,d4] ~@3", F: "[~@8 [d5,f#5,a5] [e5,g5,b5]@2 [f#5,a5,d6]@3 ~@10]/2",
  G: "[~@6 [f#4,a4]@4 ~@2 [f#4,a4]@3 ~ [e4,g#4]@4 ~@2 [d4,f#4]@8 ~@18]/2", // F#m E D
  H: "[~@12 [f#4,a4]@4 ~@2 [f#4,a4]@3 ~ [e4,g#4]@5 ~ [d4,f#4]@7 ~@13]/2", // F#m E D
})).s("gm_recorder").gain(0.35)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@8 A@2 ~@10 B C D@2 E ~@3 B C ~@17 F G ~@16 H I H J H K L M ~@2 N@2 O P Q R@8 S ~@25
>`.pickRestart({
  A: "[~@2 d4 [d3,d4]@2 [d3,d4] [a3,d4]@2 d4 d4@2 ~ a3@8 ~@4, d3@3 a3@3 d3@5 [d3,d4]@9 ~@4, ~@2 a3 ~@3]/2", // D D5 D
  B: "[a4,d5]@2 [a#4,b4,d#5,e5]@2 [b4,e5]@2 ~ [a#4,d#5]@2 [a4,d5]@3 [e4,a4]@2 f#4@2 ~@3 a#4 [e4,a4]@2 a4 ~, ~@6 [b4,e5]@2 ~@6 f4 ~ b4@2 b4@2 ~@4, ~@17 f#4@2 ~ f4 ~@3", // D5 Emaj7 E5 D#5 D5 A5 E5
  C: "[d3,a3,d4]@13 ~@11", D: "[~@16 [f#4,b4]@2 [f4,a#4] e4@3 [e4,f4,a4,a#4] [f#4,b4]@21 ~@2 a4 ~, ~@6 a4 ~@9]/2",
  E: "f#4@4 e4@2 b3@4 d4@11 ~@3", F: "[a3,d4]@4 [d4,f#4] ~@5 [g4,d5]@6 [g4,d5]@4 ~@4, f#4 ~@7",
  G: "g4@2 f#4 g4 ~ d4 d4@6, ~@2 d4@3 ~@7, ~ f#4@2", H: "[d3,a3,d4] ~@2", I: "f#2@3 ~ a2@2 b2@3 ~ d3@10 ~@4",
  J: "g2@3 ~ a2@2 b2@3 ~ d3@8 ~@6", K: "g2@4 a2 ~ b2@3 ~ a2@11 ~@3", L: "[d3,a3,d4]@7 ~@17",
  M: "g2@3 ~ a2@2 b2@3 ~ d3@12 ~@2", N: "[~@22 f5@4 d5@2 b4 ~ e5@3 ~ d5@9 ~@5]/2", O: "g5@3 ~@3 g5@3 ~ g5@9 ~@3 d5@2",
  P: "f#5@3 ~ d5 ~ a5@3 ~ a5@8 ~@6", Q: "g5@3 ~@3 g5@3 ~ g5@6 ~@6 f5@2",
  R: "[~@2 d5@2 b4@2 e5@3 ~ d5@4 ~@2 a2@2 a#2@3 ~@19 d4@4 ~@4 [a3,d4]@16 a2@2 a#2@4 ~@18 d4@4 ~@4 d4@4 [a3,d4]@12 a2@2 a#2@3 ~ b2@18 d4@3 ~@21 a2@2 b2@3 ~@7 [e3,a3]@20, ~@22 b2@41 ~@7 b2@41 ~@33 d4@18 ~@30, ~@44 a3@6 ~@18 a3@12 ~@3 a2@13]/8", // D5 A5
  S: "[e3,a3,c#4]@3 ~@7 [a2,e3,a3,c#4]@14", // A
})).s("gm_overdriven_guitar").gain(0.32).pan(0.3)

// chords · overdriven guitar · "OVERDRIVE" · soft notes
const overdriven_guitar_soft = note("<~@8 A ~@11 B ~ C ~@5 B ~@18 D ~@29 E ~@3 F ~@3 G@2 ~ H ~@25>".pickRestart({
  A: "a3@2 a3 ~@9", B: "~@14 b4 ~@9", C: "~@22 f#4 ~", D: "~@4 d4 ~", E: "~@20 e4 ~@3", F: "~@2 a3",
  G: "[~@2 b2@3 ~]/2", H: "~@5 f4@2 ~@5",
})).s("gm_overdriven_guitar").gain(0.16).pan(0.3)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note("<~@77 A B C@2 ~@33>".pickRestart({
  A: "a4@3 ~@3 a4@4 b4@10 ~@4", B: "b4@3 ~@3 c#5@3 ~ c#5@8 ~@6",
  C: "[a4@3 ~@3 a4@3 ~ b4@11 ~ b4@4 a4@2 f#4 ~ b4@2 ~@2 a4@12 ~@2]/2",
})).s("gm_overdriven_guitar").gain(0.32).pan(0.6)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_3 = note("<~@73 A B C@2 A B C@2 ~@33>".pickRestart({
  A: "e4@3 ~@3 e4@4 d4@12 b3@2", B: "d4@6 e4@2 ~@2 e4@6 d4@2 b3@3 ~ a3@2",
  C: "[e4@2 ~@4 e4@3 d4@9 ~@4 f4@4 ~@2 b3 ~ e4@2 ~@2 d4@10 ~@4, ~@27 d4@2 ~@19]/2",
})).s("gm_overdriven_guitar").gain(0.49)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A B@3 C B@3 D B@3 E B@7 D B@7 F B@3 D B@3 C B@3 D B@3 G B@7 E B@3 D B@3 C B H B H I H J I B@3 K B@11 L B@3 M B@3 N
  B@3 D B O B P B O B M B O B ~@2
>`.pickRestart({
  A: "~@2 x", B: "~ x ~ x", C: "~@3 x ~@4 x!4", D: "~@3 x ~@3 x ~ x ~@2", E: "~@3 x ~@2 x!6", F: "~@3 x ~@3 x!5",
  G: "~@3 x ~@2 x ~ x!4", H: "~@3 x ~@4 x ~@3", I: "~@3 x ~@4 x!2 ~@2", J: "~@11 x", K: "~@3 x ~@3 x ~ x ~ x",
  L: "x!12", M: "~@3 x ~@5 x!3", N: "~ x ~ x ~@3 x!5", O: "~@3 x ~@5 x ~ x", P: "~ x ~ x ~@3 x ~ x ~ x",
})).gain(0.38)

// drums · low tom
const low_tom = s("lt").struct("<~@66 A ~ A ~ A ~@9 B ~@33>".pickRestart({
  A: "~@11 x", B: "~@2 x",
})).gain(0.49)

// drums · hihat
const hihat = s("hh").struct("<~@17 A B@6 C B@7 C ~@16 A B@6 C ~@8 A D A E A E B ~@21 A B@2 F ~@17>".pickRestart({
  A: "~ x!3", B: "x!4", C: "x!3 ~", D: "x!2 ~@2", E: "~ x ~@2", F: "x",
})).gain(0.44)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@61 B ~ B ~ B ~ C ~@7 D ~@31 E ~>".pickRestart({
  A: "~@3 x", B: "~@5 x", C: "~@11 x", D: "~@7 x ~@4", E: "~ x ~@2",
})).gain(0.38)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@5 A B ~@2 C ~@6 C ~@17 B ~@46 B ~ B D B E ~ B ~@25>".pickRestart({
  A: "x!2 ~@2", B: "~ x", C: "~ x ~@2", D: "x", E: "x ~@5 x ~@4 x",
})).gain(0.22)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@61 B ~ B ~ B ~ C ~@7 D ~@31 E ~>".pickRestart({
  A: "~@10 x!2", B: "~@3 x", C: "~@5 x", D: "~ x", E: "~ x ~@4",
})).gain(0.49)

// drums · crash
const crash = s("cr").struct(`<
  ~@7 A ~ A ~@3 A ~@2 B A ~@3 A ~@3 A ~@3 A ~@2 A@2 ~@2 C A ~@3 A ~@3 A ~@3 A ~@11 A ~@2 D A E A E A F ~ D A ~ A B A ~ A
  G ~ H ~ I ~@2 A J A ~@2 K A ~@2 J A ~ A C A ~@2 J K C L J K L J E ~
>`.pickRestart({
// … 33 more lines

More by Katrina and the Waves