Strudelify

Love and Hate

Chastain

KeyE majorTempo68 bpm
0:00/0:00
// Love and Hate — Chastain
// 68 bpm, 4/4, key E 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: duplicate parts dropped: ch 8 "JAZZ GTR" electric guitar jazz (copy of ch 9 "STEEL GTR" acoustic guitar steel)
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): DISTORTION.
setcpm(68/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 finger · "FINGERDBAS"
const bass = note(`<
  ~ A B A C@5 D@4 E F G H I J K L I M N M O P Q@2 R L S N R L S N T U V I M N M O P W@2 X Y Z AA AB AC AD AE AF@2 AG AH
  M N AI AJ AI N AI AK AL@4 ~
>`.pickRestart({
  A: "e1@8 b1 ~ b1@5 ~", B: "a1@8 e1@7 ~", C: "[a1@5 ~ a1@2 b1 ~ b1@14 e1@15 ~ c#2@16 a1@15 ~ e1@8]/5",
  D: "[~ e1@2 c#2@2 a1@2 e1]/4", E: "b1@7 ~ e1@7 ~", F: "e1@8 a1@5 ~ a1 ~", G: "a1@8 c#2@7 ~",
  H: "c#2 ~ c#2@6 a1@5 ~ a1 ~", I: "b1@8 e1@5 ~ e1 ~", J: "e1@7 ~ a1@7 ~", K: "a1@3 ~ a1@3 ~ c#2@7 ~",
  L: "c#2@7 ~ a1@5 ~ a1 ~", M: "b1@7 ~ a1@5 ~ a1 ~", N: "b1@7 ~ e1@5 ~ e1 ~", O: "b1@7 ~ c#2@8", P: "b1 a1",
  Q: "[f#1@8 e1@16 e1@5 ~ e1 ~]/2", R: "e1@7 ~ c#2@5 ~ c#2 ~", S: "a1@7 ~ e1@5 ~ e1 ~", T: "e1@5 ~ e1 ~ a1@5 ~ a1 ~",
  U: "a1@5 ~ a1 ~ c#2@7 ~", V: "c#2 ~ c#2@5 ~ a1@4 a2@4", W: "[f#1@8 e1@16 a1@4 a2@3 a1]/2", X: "a2 ~ a1@2 a2@3 ~ a1@8",
  Y: "e2 ~ e2@4 b1@2 e1@6 b1 c#2", Z: "e2 ~ e2@6 e1@5 ~ b1 c#2", AA: "e2 ~ e2@3 b1 e2 b1 a1@3 ~ a1@4",
  AB: "a2 e2 f#2 a2@4 ~ a1@3 ~ a1@4", AC: "e2 ~ e2@3 ~ b1@2 e1@6 ~ e1", AD: "e1 ~ e1@3 ~ e1@2 b1@4 b1@4",
  AE: "b2@2 b1 b2@2 b1 b2 ~ e1@5 ~ e1 ~", AF: "[e1@5 ~ e1 ~ a1@4 a2@2 a1 a2@2 a1 a2@2 a1 a2@2 ~ c#2@5 ~ c#2 ~]/2",
  AG: "c#2@3 ~ c#2@3 ~ a1 ~@5 b1 ~", AH: "~@8 e1@5 ~ e1 ~", AI: "b1@8 a1@5 ~ a1 ~",
  AJ: "b1@2 ~ b1 b2 b1 ~@2 e1@5 ~ e1 ~", AK: "b1@2 ~ b1 b2 b1 ~@2 c#2@8", AL: "[b1@4 a1@8 e1@13 ~@7]/4",
})).s("gm_electric_bass_finger").gain(0.4)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~ A B A C@2 ~@15 D E F E G ~@10 H@4 I E F E G ~@10 J@4 D E F E F E F E G ~@5
>`.pickRestart({
  A: "e2 b2", B: "a2@8 e2@7 ~", C: "[a2 b2@2 ~]/2", D: "~ e2", E: "b2 a2", F: "b2 e2", G: "b2 ~",
  H: "[~ e2@2 a2@2 c#3@2 a2]/4", I: "b2@7 ~ e2@8", J: "[~ e2@2 a2@2 c#3@2 ~]/4",
})).s("gm_distortion_guitar").gain(0.35)

// other · distortion guitar · "DISTORTION"
const distortion_guitar_2 = note("<~@4 A@2 ~@67>".pickRestart({
  A: "[~ b2@2 ~]/2",
})).s("gm_distortion_guitar").gain(0.32)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@17 A B@3 C ~@14 A B@3 C ~@14 A B@2 D ~@14>".pickRestart({
  A: "~@8 e3!2 [b3,e4]!2 e4!2 [b3,e4]!2", B: "e3!2 [b3,e4]!2 e4!2 [b3,e4]!2 e3!2 [b3,e4]!2 e4!2 [b3,e4]!2",
  C: "e3!2 [b3,e4]!2 e4!2 ~@10", D: "e3!2 [b3,e4]!2 e4!2 [b3,e4]!2 a2 ~@5 b2 ~",
})).s("gm_overdriven_guitar").gain(0.21)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note("<~@47 A@3 B C D E F G@2 ~@16>".pickRestart({
  A: "[~@11 a2 e3 a3 b3@10 ~@3 c#4 e4!2 ~ e4@7 ~@6 [g#4,b4]@4]/3", B: "g#4@8 ~ g#4!2 a4 g#4@2 f#4 e4",
  C: "~ f#4@2 e4 f#4@3 e4@4 ~@2 a3 ~ b3, ~@6 [c#4,a4] [d4,b4]", // F#m G
  D: "[e4,c#5] [c#4,a4] [d4,b4] [e4,c#5]@6 ~@2 e4 b4 e4 b4 ~", E: "b4@2 ~ [g#4,b4]", F: "e4@2 g#4@5 ~@7 f#4@2",
  G: "[b4 f#4 ~ b4 f#4 b4 ~ f#4 g#4@5 ~ e4@9 ~@9]/2",
})).s("gm_acoustic_guitar_steel").gain(0.26)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_2 = note(`<
  ~@5 A@7 B@2 C D E F C D E G ~@3 H I J@8 B@2 C D E G ~@3 H I K@2 L M N O L M P Q C D R ~@8 H S T@2 ~@2
>`.pickRestart({
  A: "[~@12 [e4,f#4]@11 ~@5 [e4,f#4]@11 ~@3 a3@2 [b3,e4]@2 b3@4 a3@5 ~@3 b3@2 [e4,f#4]@11 ~@5 [e4,f#4]@11 ~@5 [e4,f#4]@11 ~@3 a3@2 [b3,e4]@2 b3@2, ~@10 b3@13 ~@3 b3@13 ~@35 b3@13 ~@3 b3@13 ~@9]/7", // Esus2 E5 Esus2 E5
  B: "[~@2 a3@5 ~@3 b3@2 [e4,f#4]@6 b3@2 e4@2 d#4@2 e3@4 [b3,e4] ~ [b3,e4] e3]/2", // Esus2 E5
  C: "[b3,e4] e3 [b3,e4] e3 [b3,e4] ~ [b3,e4]@2 e3@4 [a3,e4] ~ [a3,e4] e3", // E5 A5
  D: "[a3,e4] e3 [a3,e4] e3 [a3,e4] ~ [a3,e4]@2 c#3@4 [g#3,c#4] ~ [g#3,c#4] c#3", // A5 C#5
  E: "[g#3,c#4] c#3 [g#3,c#4] c#3 [g#3,c#4] ~ [g#3,c#4]@2 e3@4 [a3,e4] ~ [a3,e4] e3", // C#5 A5
  F: "[b3,e4] e3 [b3,e4] e3 [b3,e4] ~ [b3,e4] ~ e3@4 [b3,e4] ~ [b3,e4] e3", // E5
  G: "[b3,e4] e3 [b3,e4] e3 [b3,e4] ~ [b3,e4] ~@9", H: "~@4 c#3 e3 b3 e3", I: "b2 e3 b3 e3 a2 e3 b3 e3",
  J: "[f#2@2 c#3@2 b3@2 ~@2 b3@12 ~@8 [e4,f#4]@11 ~@5 [e4,f#4]@11 ~@3 a3@2 [b3,e4]@2 b3@4 a3@5 ~@3 b3@2 [e4,f#4]@11 ~@5 [e4,f#4]@11 ~@5 [e4,f#4]@11 ~@3 a3@2 [b3,e4]@2 b3@2, ~@7 [b2,e3]@12 ~@7 b3@13 ~@3 b3@13 ~@35 b3@13 ~@3 b3@13 ~@9]/8", // Esus2 E5 Esus2 E5
  K: "[f#2@2 c#3@2 b3@2 ~@2 b3@12 ~@4 a3@4 [c#4,e4] a3 [c#4,e4] a3, ~@7 [b2,e3]@12 ~@13]/2", // C#m E5
  L: "[c#4,e4] a3 [c#4,e4] [c#4,e4]@2 a3 [c#4,e4] a3 a3@2 ~ a3 [c#4,e4] a3 [c#4,e4] a3", // C#m
  M: "[c#4,e4] a3 [c#4,e4] [c#4,e4]@2 a3 [c#4,e4] a3 e3@2 ~ e3 [b3,e4] e3 [b3,e4] e3", // C#m E5
  N: "[b3,e4] e3 [b3,e4] [b3,e4]@2 e3 [b3,e4] e3 e3@2 ~ e3 [b3,e4] e3 [b3,e4] e3", // E5
  O: "[b3,e4] e3 [b3,e4] [b3,e4]@2 e3 [b3,e4] e3 a3@2 ~ a3 [c#4,e4] a3 [c#4,e4] a3", // E5 C#m
  P: "[b3,e4] e3 [b3,e4] [b3,e4]@2 e3 [b3,e4] e3 b2@2 ~ b2 [b3,f#4] b2 [b3,f#4] b2", // E5 B5
  Q: "[b3,f#4] b2 [b3,f#4]!2 ~ b2 [b3,f#4] b2 e3@4 [b3,e4] ~ [b3,e4] e3", // B5 E5
  R: "[g#3,c#4] c#3 [g#3,c#4] c#3 [g#3,c#4] ~ [g#3,c#4]@2 ~@8", S: "b2@2 e3@2 b3@2 e3 a2 [a2,b3]@7 ~, ~@7 e3@8 ~",
  T: "[~@5 e4@7 ~@4, ~ b2@2 ~, ~@9 [e3,g#3]@15 ~@8]/2", // E
})).s("gm_acoustic_guitar_steel").gain(0.25).pan(0.4)

// chords · piano · "A.PIANO 1"
const piano = note("<~ A@5 B@4 C@6 D@4 E@8 F G H@8 I E@8 J@2 K@4 L@5 M@7 N@5 ~@3>".pickRestart({
  A: "[~@28 [b3,e4]@8 ~@3 e3, [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 b3@5 e3@2 e3@2 e3@2 e3@2 e3@6 e3 e4 e3@10 e3@2 ~, ~ e3@2 e3@6 e3 e4@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 b3@6 ~@8 [b3,e4]@2 [b3,e4]@2, ~@5 b2@2 b2@14 b2 e4 b2@5 b2@12, ~@3 e4 [a3,e4] a3@7 [a3,e4] a3@7]/5", // E5 A5
  B: "[~@31 e3, [b3,e4] b3@8 e4 [b3,e4]!2 [b3,e4]!4, ~ e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~, ~ e4 [c#4,e4]!2 [c#4,e4] c#4@8 ~@3, ~@5 e4 [a3,e4]!2 [a3,e4] a3@7]/4", // E5 C#m A5
  C: "[~@24 b2 ~@22 e3, [b3,e4]@2 b3@16 e4@2 [b3,e4]@2 e4@3 b2@15 [a3,e4]@2 a3@6, ~ e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3 b3 e3 d#4@10 e4 e3 [a3,e4] e3 [a3,e4] e3@2 e3 e4@2 [c#4,e4]@2 [c#4,e4]@2, ~@2 e4@2 [c#4,e4]@2 [c#4,e4]@2 [c#4,e4]@2 c#4@14 b3@2 e3 d#3@16 e3@2 e3@2 ~, ~@10 e4@2 [a3,e4]@2 [a3,e4]@2 [a3,e4]@2 a3@10 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 b3@14]/6", // E5 A5 C#m A5 E5
  D: "[~@31 e3, [c#4,e4]@2 c#4@10 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 b3@14, ~ e3@2 e3@2 e3@2 e3@3 b3 b2@15 e4@2 [c#4,e4]@2 [c#4,e4]@2, ~@2 e4@2 [a3,e4]@2 a3@12 e4 e3 [a3,e4] e3 [a3,e4] e3 [a3,e4] e3@2 e3@2 e3@2 ~, ~@6 e4@2 [b3,d#4] b2 d#4@16 a3@6]/4", // C#m E5 C#m A5 B
  E: "[~@43 b2@16 ~@5, [c#4,e4]@2 c#4@15 b2@2 b2@6 b2@2 b2@6 b2 e4 b2@5 [b3,e4] b2 [b3,e4]@16 ~@6, ~ e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@14 e3@2 e3@16 ~@17, ~@2 e4@2 [a3,e4]@2 a3@15 a2@2 a2@13 [a3,e4] a2 a3@16 ~@10, ~@6 e4@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 b3@4 e4 a2@16 ~@9]/8", // C#m E5 A5 E5
  F: "~@7 e3, ~@2 [b3,e4]!2, ~@5 e3@2 ~", // E5
  G: "~@3 e4 ~@3 e3, [b3,e4] b3@3, ~@2 e3@3 f#4@11, ~@2 e4 e3@2 e3@2 ~, ~@2 [c#4,e4]!2", // E5 C#m
  H: "[~@35 e4 ~@12 b2 ~@14 e3, [c#4,e4]@2 c#4@8 e4 e3 [b3,e4] e3 e4@4 b3 b2@15 e4 e3 [a3,e4] e3 [a3,e4] e3 [a3,e4] e3 e4 e3 [b3,e4] e3 e4@2 b3 b2@9 e4 e3 [a3,e4] e3 [a3,e4]@2, ~@2 e3@3 f#4@23 b3@2 e3@10 [b3,e4]@2 e3@2 [b3,e4]@2 e3@2 [b3,e4]@2 e3@2 e4@2 e3@2 [c#4,e4]@2 e3@2 [c#4,e4]@2 e3@2 [c#4,e4]@2 e3@3 f#4@23 b3@2 e3@2 d#4@32, ~@2 e4 e3 [a3,e4] e3 [a3,e4] e3 [a3,e4] e3 a3@16 b3@16 a3@10 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 b3@6, ~@3 g#4@13 [b3,d#4] b2 d#4@16 c#4@2 c#4@14 e3 d#3@13]/8", // C#m E5 A5 E5 A5 E5 C#m A5 …
  I: "~@7 e3, [a3,e4] a3@3, ~ e3@2 e3@2 e3@2 ~, ~ e4 [c#4,e4]!2", // A5 C#m
  J: "[~@15 e3, ~@2 [a3,e4]!2 [a3,e4]!4, ~@5 e3@2 e3@2 e3@2 e3@2 e3@2 ~]/2", // A5
  K: "[~@31 e3, [a3,e4]@2 a3@15 e3 e4 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~, ~@2 e3@4 e3@3 a4@31 [a3,e4]@4 [a3,e4]@4 [a3,e4]@4 [a3,e4]@4 [a3,e4]@4 [a3,e4]@4, ~@2 e4@2 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 [b3,e4] e3 [b3,e4]@2 b3@14, ~@4 g#4 g#4@7 g#4@16 ~@4]/4", // A5 E5
  L: "[~@39 e3, [a3,e4]@2 a3@10 [b3,f#4] b2 [b3,f#4] b2 [b3,f#4] b2 f#4@15 e3 e4@2 [c#4,e4]@2 [c#4,e4]@2, ~ e3@2 e3@2 e3@2 e3@2 e3 b3 e3@9 [b3,e4] e3@2 e3@2 e3 e4 e3 [a3,e4] e3 [a3,e4] e3 [a3,e4]@2 a3@6, ~ e4 [b3,e4,g#4] g#4@8 [b3,e4] [b3,e4] b3@7, ~@6 [b3,e4]@2 [b3,e4]@2 e4@8 b3 b2@16 e3@2 e3@2 ~]/5", // A5 B5 C#m E5 A5 E E5
  M: "[~@7 b3@5 ~@43 a2, [c#4,e4]@2 c#4@14 [b3,e4] b2 [b3,e4] b2@6 b2@2 b2@6 b2 e4 b2@5 [b3,e4] b2 [b3,e4] b2@5 [b3,e4] b2 [b3,e4] b2@5, ~ e3@2 e3@9 [b3,e4] e3 [b3,e4] e3@14 e3@2 e3@13 [b3,e4] e3 [b3,e4] e3@9, ~@2 e4@2 a3@16 [b3,e4] a2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 b3@4 e4 a2@13 [b3,e4] a2@2 ~, ~@4 e4@3 f#4@16 a2@13 [a3,e4] a2 a3@16 [b3,e4]@2]/7", // C#m E5 A5 E5
  N: "[~@19 b2@16 ~@5, [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 b3@4 e4 a2@16 ~@9, ~ b2@2 b2@6 b2@2 b2@5 [b3,e4] b2 [b3,e4]@16 ~@6, ~@5 e3@2 e3@16 ~@17, ~@10 e4@2 [a3,e4] a2 a3@16 ~@10]/5", // E5 A5
})).s("gm_piano").gain(0.22).pan(0.3)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~ A B@4 ~@2 C@3 ~@2 D@4 E@4 F G H I J@3 K@2 L@4 M@6 N@2 O@2 P@4 Q@3 R@3 S@5 T@3 U@4 V W@6
>`.pickRestart({
  A: "g#4 f#4",
  B: "[e4@8 ~@6 g#5 a5 ~@8 f#4@8 e4@8 ~ e6 b5 a5 g#5 e5 f#5 a4 g#4 b4@7 ~@8, ~ g#4@2 ~@2 f#4@2 ~, ~@16 b5@25 ~@23]/4",
  C: "[~@6 b5@3 e6 b5 e5 b4@8 ~@4]/3", D: "[~ e4@2 a3@2 c#4@2 e4]/4",
  E: "[f#4@8 e4@16 ~@14 g#5 a5 b5@12 ~@8 e5@4, ~@3 a3@2 c#4@2 e4, ~@13 e6@2 ~]/4",
  F: "f#5 b5 a5 f#5 a5 a4 b4 a4 [e4,g#4]@8, f#4 ~", G: "f#4 e4", H: "f#4 g#4", I: "f#4@2 e4 d#4 c#4@4",
  J: "[d#4@6 ~@6 f#5@2 g#5 a5 b5@8 a3@8 f#3@8 ~@6 [g#5,b5]@2, ~ b3@2 e6@3, ~@5 b3]/3", // G#m
  K: "[[f#5,a5] [c#4,e5,g#5] [b3,b4,e5]@2 b4 [a3,a4] [g#3,g#4] [e3,e4] b3@24, b3 ~ b3@2 ~@12]/2", // F#m C#m E5 A G# E
  L: "[~@4 g#3@4 a3 e3@14 ~ b3@16 ~@12 e5@2 b5@2 e6@8, ~@5 b3@3]/4",
  M: "[~ d#6 b5 ~ a3 ~ g#5 ~@9 f#5@4 e4@8 a3@8 c#4@8 e4@4, ~@4 g#3@4 ~@2 e3@14 b3@15 ~@57, ~@3 f#5@3 ~ e5@9 ~@32]/6",
  N: "[f#4@4 [e3,e4]@4 [f#3,f#4]@2 [e3,e4] [d#3,d#4] [c#3,c#4]@4, ~ b5@3]/2", // E F# E D# C#
  O: "[~ e6 b5 a5 g#5 e5 f#5 a4 [e3,e4]@8 [f#3,f#4]@4 [e3,e4]@2 g#5 a5 [c#3,c#4,b5]@8, [d#3,d#4]@4 b4@7 ~@5, ~@8 g#4 ~@13 [d#3,d#4]@2 ~@8]/2", // E F# E C#7 D#
  P: "[~ e6 b5 a5 g#5 e5 f#5 ~ c#5@8 d#5@6 b4@2 a3@8 f#3@8 ~@10 e4 ~ f#4 e4 b3!2 g#3@7 ~, [d#3,d#4] b3@2 c#5@2 e5@2 ~, ~@40 b3@11 b3@3 ~@10, ~@49 [g#4,b4]@6 ~@9]/4", // D# G#m
  Q: "[a3@8 b3@7 c#4@8 ~ e4@7 f#4@8 ~ g#4@8]/3", R: "[b4@7 ~ c#5@7 ~ e5@8 c#5@8 a5@7 ~ [e4,g#5]@8, ~ a3@4 ~]/3",
  S: "[b3@4 e4@4 e6@8 f#6@7 ~ g#6@10 b5@2 g#5@2 e5@2 b4@7 ~@5 b3@3 [c#5,d#5] e5@6 d#5@2 c#5@7 [c#5,e5] [a3,a5,b5] ~@5 [b3,b4,f#5,b5] ~, b5@2 f#4@4 e3@4 a3@3 ~ c#4@4 ~@2, ~@48 a4@7 ~@25]/5", // C#sus2 C#m Asus2 B5
  T: "[~@8 e4@7 ~ f#4@4 e4@2 d#4@2 c#4@8 ~ e6 b5 a5 g#5 e5 f#5 a4 [e4,g#5]@8, ~@8 b5@24 f#4@8 g#4 ~@7]/3", // E
  U: "[f#4@4 e4@2 ~ g#5 c#4@8 f#4@7 ~ e4@8 d#4@8 c#4@8 ~@2 b4@2 e5@2 f#5@2 [e4,g#5]@8, f#5@6 d#4@2 b5@15 ~@17 e6@10 ~@14, ~@8 a5 ~@15 g#5@16 ~@8 d#4@8 ~@8]/4", // E
  V: "f#5@2 g#5 f#5 [c#4,e5]@4, d#4 ~", // C#m
  W: "[[d#4,f#5]@8 [b4,b5]@12 [c#5,c#6]@3 [e5,e6]@13 ~@20 [g#5,g#6]@29 ~@11, ~@8 [e3,b3]@32 [b2,e3,f#3,b3]@49 ~@7, ~@12 [f#5,f#6]@7 ~@13]/6", // D#m B C# E G# E5 Bsus4 F#
})).s("gm_string_ensemble_2").gain(0.22)

// drums · kick
const kick = s("bd").struct(`<
  A B C B D E@8 F B@2 E G B@2 E H E D E I B E@9 F B@2 E D E D E I B J K E D E@3 D L M E@3 N E D E H E D E I B ~@4
>`.pickRestart({
  A: "~@11 x!3 ~@2", B: "x!2", C: "x ~@5 x ~ x ~@2 x ~@2 x ~", D: "x ~@2 x ~@2 x ~ x ~@5 x ~", E: "x ~@3 x ~@2 x",
  F: "x ~ x!2 ~ x ~@2 x ~@7", G: "x ~@2 x ~@2 x ~ x ~@7", H: "x ~@2 x ~@4 x ~@5 x ~", I: "x ~@2 x ~@4 x ~@7",
  J: "x ~@2 x!2 ~@3", K: "~@4 x ~@2 x", L: "x ~@7 x ~@2 x ~@3 x", M: "~ x ~ x ~@4 x ~@5 x ~",
  N: "~@3 x!3 ~@2 x ~@5 x ~",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@5 A B@7 C ~@11 A@11 ~@8 A@2 ~@21 A ~@5>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<A B@3 C ~@8 B@12 D ~@3 C@7 B@4 E B@3 C ~@2 A B@6 F G B@2 C B@8 C ~@5>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2", D: "~@4 x ~ x!2 ~@8", E: "~@4 x ~ x!2 ~@4 x ~@3", F: "~@4 x ~@2 x ~@4 x ~@3",
  G: "x ~@3 x!4 ~@4 x ~@3",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<A ~@20 B ~@22 C ~@10 B ~@3 D ~@3 C ~@3 C ~@5>".pickRestart({
  A: "~@11 x!3 ~@2", B: "~@7 x ~@8", C: "~@6 x!2 ~@8", D: "~@3 x!3 ~@10",
})).gain(0.4)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@13 [~@2 x!4 ~@10] ~@22 [~@2 x!4 ~@10] ~@36>").gain(0.2)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@5 A@3 B C A@4 D@7 E ~@3 F A@5 B C A@4 D@3 E ~@3 F A G F D@6 H D@3 E ~@8 I J ~@4
>`.pickRestart({
  A: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", B: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x!2", C: "x ~ x!3 ~ x!3 ~ x ~ x ~ x ~", D: "x!8",
  E: "x!4 ~@4", F: "~@4 x!4", G: "x ~ x ~ x ~ x!2 ~@8", H: "x!4 ~ x!3", I: "~@8 x ~ x ~ x ~ x!2",
  J: "x ~ x ~ x ~ x!3 ~@7",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 [~@3 x ~@4] ~@33 [~@5 x!2 ~@9] ~@17>").gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~ A@3 B ~@8 C ~@3 C ~ C@2 D C@3 A ~@10 C ~ C@2 B C@3 A ~@2 C ~@3 C ~ C@2 B ~ C E C@4 B C@3 A C ~@4
>`.pickRestart({
  A: "x", B: "x!2", C: "~ x", D: "x!3 ~", E: "~@4 x ~@2 x",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~ A@3 B ~@16 C A@3 D ~@14 C A@3 D ~ E ~@12 C A@7 D ~@5>".pickRestart({
  A: "x!8", B: "x!5 ~ x ~", C: "~@4 x!4", D: "x!5 ~@3", E: "~ x",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@4 A B@8 C ~@11 A B@10 C ~@7 A B D ~@20 A C ~@4>".pickRestart({
  A: "~@12 x!4", B: "x ~@11 x!4", C: "x", D: "x!2",
})).gain(0.25)

// drums · shaker
const shaker = s("sh").struct("<~@13 A B C@2 B@2 C@2 D ~@14 A B C@2 D ~@6 E F@7 G B C H ~@14>".pickRestart({
  A: "~@8 x ~@3 x ~ x!2", B: "x!3 ~ x ~ x ~ x ~@3 x ~ x!2", C: "x!5 ~ x ~ x ~@3 x ~ x!2", D: "x!3 ~ x ~ x ~@9",
  E: "~@8 x ~@2 x!5", F: "x!4 ~ x!4 ~@2 x!5", G: "x!4 ~ x!4 ~@3 x ~ x!2", H: "x!5 ~ x ~@9",
})).gain(0.2)

stack(
  bass, distortion_guitar, distortion_guitar_2, overdriven_guitar, acoustic_guitar_steel, acoustic_guitar_steel_2,
  piano, string_ensemble_2, kick, rim, snare, low_tom, low_tom_soft, hihat, mid_tom, crash, ride, tambourine, shaker
)