Strudelify

Road to Hell

Chris Rea

KeyA minorTempo134 bpm
0:00/0:00
// Road to Hell — Chris Rea
// 134 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 137 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(134/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 · "bass"
const bass = note(`<
  ~@10 A B C D E F G H B@2 C D I F G H B@2 C D E F G H B H C D I F G H J K L M N O P Q R H S T U V W H X B C Y Z AA AB
  AC AD B C D AE F AF H AG@2 AH AI AJ AK AL AM AN H AO AP AE AQ AR H AS H C D AE F AT AU AV F AF H B H C D E F G H B H C
  D I F G H B@2 C D E AU G H B@2 C D I F G H AS AW ~
>`.pickRestart({
  A: "~@8 a1@5 ~ a1 ~", B: "a1@4 e1@2 g1@2 a1@5 ~ a1 ~", C: "a1@3 ~ a1@2 c2@2 d2@5 ~ d2 ~",
  D: "d2@4 a1@2 c2@2 d2@4 ~@2 d2 ~", E: "d2@4 e1@2 f1@2 f1@4 ~@2 f1 ~", F: "f1@5 ~ f1 ~ e1@4 ~@2 e1@2",
  G: "e1 ~ e1 ~ e1@2 g1@2 a1@5 ~ a1 ~", H: "a1@3 ~ e1@2 g1@2 a1@5 ~ a1 ~", I: "d2@2 a1@2 e1@2 f1@2 f1@4 ~@2 f1 ~",
  J: "a1@4 b1@4 c2@4 ~@2 c2 ~", K: "c2@2 c2@3 ~ g1 ~ c2@5 ~ c2 ~", L: "c2@2 e1@2 f1@2 g1@2 g1@5 ~ g1 ~",
  M: "g1@3 ~ d1@4 g1@5 ~ g1 ~", N: "g1@2 d1@2 g1@2 f#1@2 f1@5 ~ f1 ~", O: "f1@5 ~ c1@2 f1@5 ~ f1 ~",
  P: "f1@5 ~ f1@2 e1@5 ~ e1 ~", Q: "e1@2 d2@2 e2@2 e1@2 e1@5 ~ e1 ~", R: "e1@4 g#1@2 e1@2 a1@5 ~ a1@2",
  S: "a1@4 c2@2 a1@2 d2@5 ~ d2 ~", T: "d2@4 a1@2 c2@2 d2@5 ~ d2 ~", U: "d2@2 a1@2 f1@3 ~ f1@4 ~@2 f1 ~",
  V: "f1@4 a1@2 f1@2 e1@5 ~ e1 ~", W: "e1@3 ~ e1 ~ e1@2 a1@4 ~@2 a1 ~", X: "a1@4 e1@2 g1@2 a1@4 ~@2 a1 ~",
  Y: "d2@3 ~ a1@2 c2@2 d2@5 ~ d2 ~", Z: "d2@4 a1@2 d2@2 g1@5 ~ g1 ~", AA: "g1@5 ~ d2@2 g1@4 ~@2 g1 ~",
  AB: "g1@2 a1@2 d2@2 d2@2 c2@5 ~ c2 ~", AC: "c2@5 ~ c2 ~ b1@5 ~ b1 ~", AD: "e1@4 g1@2 g#1@2 a1@5 ~ a1 ~",
  AE: "d2@2 a1@2 f1@4 f1@4 ~@2 f1 ~", AF: "e1@3 ~ e1@2 g1@2 a1@5 ~ a1 ~",
  AG: "[a1@4 b1@4 c2@3 ~ c2 ~ c2@4 g1@2 a1@2 g1@2 c2@2 g1@2 e1@4]/2", AH: "~@2 e1@2 f1@2 a1@2 g1@5 ~ g1 ~",
  AI: "g1@3 ~ g1@2 d1@2 g1@5 ~ g1 ~", AJ: "g1@2 d1@2 g1@2 f#1@2 f1@4 ~@2 f1 ~", AK: "f1@4 d2@2 c2@2 f1@5 ~ f1 ~",
  AL: "f1@3 ~ f1@2 g1@2 e1@5 ~ e1 ~", AM: "e1@3 b1 e2@3 b1", AN: "e2@2 b1@2 e2@2 b1@2 a1@4 ~@2 a1 ~",
  AO: "a1@4 c2@2 a1@2 d2@4 ~@2 d2 ~", AP: "d2@4 a1@2 c2@2 d2@5 ~ d2@2", AQ: "f1@4 g1@2 f1@2 e1@4 ~@2 e1 ~",
  AR: "e1@4 e1@2 g1@2 a1@4 ~@2 a1 ~", AS: "a1@2 c2@2 a1@2 g1@2 a1@5 ~ a1 ~", AT: "e1@3 ~ e1@2 g1@2 f1@4 ~@2 f1 ~",
  AU: "f1@5 ~ f1 ~ e1@4 ~@2 e1 ~", AV: "e1@2 b1@2 e1@2 f1@2 f1@4 ~@2 f1 ~", AW: "a1@4 e1@2 g1@2 a1@5 ~@3",
})).s("gm_electric_bass_finger").gain(0.64)

// other · electric guitar muted · "m guitar"
const electric_guitar_muted = note(`<
  ~@2 A B C B C B C B D E F G H I J E@3 F G H I J E@3 F G H I J E@3 F G H I J E K L M N O P Q R S E F G H I J E@3 F G T
  N U V W E F G X Q S E K L M N O P Q R S E F G H I J E@3 F G H I Y I Y I J E@3 F G X Q S E@3 F G X Q S E@3 F G X Q S
  E@3 F G X Q S E@2 Z ~
>`.pickRestart({
  A: "~@8 [a2,e3] ~ a2 ~ a2 ~ [a2,e3] ~", B: "a2 ~ a2 ~ [a2,e3] ~ a2 ~ a2 ~ [a2,e3] ~ a2 ~ a2 ~",
  C: "[a2,e3] ~ a2 ~ [a2,e3] ~ a2 ~ [a2,e3] ~ a2 ~ a2 ~ [a2,e3] ~", // A5
  D: "[a2,e3] ~ a2 ~ [a2,e3] ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~", E: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  F: "a2 ~ a2 ~ a2 ~ a2 ~ d3 ~ d3 ~ d3 ~ d3 ~", G: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~",
  H: "d3 ~ d3 ~ d3 ~ d3 ~ f3 ~ f3 ~ f3 ~ f3 ~", I: "f3 ~ f3 ~ f3 ~ f3 ~ e3 ~ e3 ~ e3 ~ e3 ~",
  J: "e3 ~ e3 ~ e3 ~ e3 ~ a2 ~ a2 ~ a2 ~ a2 ~", K: "a2 ~ a2 ~ b2 ~ b2 ~ c3 ~ c3 ~ c3 ~ c3 ~",
  L: "c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~", M: "c3 ~ c3 ~ c3 ~ c3 ~ g2 ~ g2 ~ g2 ~ g2 ~",
  N: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", O: "g2 ~ g2 ~ g2 ~ g2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  P: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~", Q: "f2 ~ f2 ~ f2 ~ f2 ~ e2 ~ e2 ~ e2 ~ e2 ~",
  R: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~", S: "e2 ~ e2 ~ e2 ~ e2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  T: "d3 ~ d3 ~ d3 ~ d3 ~ g2 ~ g2 ~ g2 ~ g2 ~", U: "g2 ~ g2 ~ g2 ~ g2 ~ c3 ~ c3 ~ c3 ~ c3 ~",
  V: "c3 ~ c3 ~ c3 ~ c3 ~ b2 ~ b2 ~ b2 ~ b2 ~", W: "b2 ~ b2 ~ b2 ~ b2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  X: "d3 ~ d3 ~ d3 ~ d3 ~ f2 ~ f2 ~ f2 ~ f2 ~", Y: "e3 ~ e3 ~ e3 ~ e3 ~ f3 ~ f3 ~ f3 ~ f3 ~",
  Z: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~@5",
})).s("gm_electric_guitar_muted").gain(0.56).pan(0.6)

// other · electric guitar clean · "el guit1"
const electric_guitar_clean = note(`<
  ~@4 A@6 B C D@2 E@8 F@5 ~@2 G@2 ~ H I@6 J@5 K@3 L M@2 N ~@2 O@2 ~@2 P Q ~@11 R S T@2 ~@13 U@2 ~ V@3 W@2 ~ X Y@2 Z@2 ~
  AA@3 AB@2 AC@2 AD AE AF@2 AG@4 AH@4 AI@2 AJ@5 AK@3 AL AM AN AO AP ~
>`.pickRestart({
  A: "[~@10 [e3,a3] ~@5 [e3,a3]@8 ~@2 [e3,a3] ~@7 [e3,a3] ~@7 [e3,a3] ~@5 [e3,a3]@9 ~ [e3,a3] ~@5 [e3,a3] ~ [e3,a3] ~@7 [e3,a3] ~@5 [e3,a3]@6 ~@2 e3@2 g3@6, ~@6 a2@30 ~@2 a2@29 ~@3 a2@15 ~@11]/6", // A5
  B: "e3@4 d3@2 c3 ~@9", C: "~@5 c4!2 a3", D: "[c4@2 a3@2 c4@2 d4@13 ~@13]/2",
  E: "[~@8 c4@10 b4@4 a4@2 g#4@2 e4@2 b3@11 ~@15 a4@2 b4@3 ~ b4@12 ~@2 e4@13 ~ e4@3 ~ e4 ~ e4@10 d4@16 c4@6 e4@2, ~@40 a2@15 ~@73, ~@43 e3@12 ~@73, ~@46 a3@5 e4@5 ~@16 b4@14 ~@42, ~@6 c4 ~@9]/8",
  F: "[~@2 c4@2 d4@2 a3@2 c4@16 b3@14 ~@2 c4@15 ~ g3@4 e3@2 a2@8 ~@10]/5", G: "[~@8 f4@15 ~@9, ~@7 [a3,d4]@17 ~@8]/2",
  H: "~@8 a2@4 [e3,a3] ~@3", // A5
  I: "[[e3,a3] ~ [e3,a3]@2 ~@2 d3 e3 g3@6 e3@6 d3@2 c3@2 [a2,e3,a3]@31 ~ [d3,a3]@12 ~@20 e4@8, ~@56 d4@31 ~@9]/6", // A5 D5
  J: "[~@3 e4@2 e4@3 d4@15 ~ c4@2 g3@2 a3@23 ~@5 e4@6 g4@13 ~ e4@2 g4@2]/5",
  K: "[f4@4 e4@4 d4@29 ~@5 [f3,a3,c4] ~@5]/3", L: "[f3,a3,c4]", M: "[~@4 e4@4 d4@14 ~@4 [e3,b3,d4] ~@5]/2",
  N: "[e3,b3,d4]@7 ~@9", O: "[~@8 d5@15 ~@9, ~@3 f4@8 ~@5, ~@7 a4@16 ~@9]/2", P: "~@10 [e3,a3,c4] ~@5",
  Q: "[e3,a3,c4] ~ [e3,a3,c4] ~@13", R: "~@7 a3", S: "c4@2 ~ e4@2 a4@2 ~ b4@2 ~ b4@5", T: "[e4@7 ~ e4@23 ~]/2",
  U: "[~@2 [c4,f4,a4] ~@3 [b3,e4,g#4]@16 ~@10]/2", V: "[~@2 a4 ~ b4 ~@3 a4@15 ~@3 b4 ~@3 e4@8 ~@10]/3",
  W: "[~@6 d4 c4 d4@4 c4@2 d4@8 ~@10]/2", X: "~@11 c5@2 c5@2 ~", Y: "[c5@2 ~ c5@2 c5 ~@2 c5@4 b4@10 ~@5 c5@2 ~ c5@2]/2",
  Z: "[c5@2 ~ c5@2 ~ c5@2 c5@4 b4@9 ~@11]/2", AA: "[~@2 e5@3 e5@3 e5@28 e5@4 d5@8]/3", AB: "[d5@21 ~@9 a4 c5]/2",
  AC: "[c5@3 ~ c5@2 a4 ~ d5@4 d5@11 ~@5 g5@2 e5@2]/2", AD: "c5@3 ~ c5@2 ~@10", AE: "~@3 g5",
  AF: "[e5@2 c5 ~@3 g5@6 e5@2 c5@9 ~@7 c5@2]/2",
  AG: "[a4@2 c5@2 c5@16 ~@4 c5@6 c5@4 c5@4 c5@2 c5@2 b4@12 ~@2 e4@3 g4@2 g3@3]/4",
  AH: "[b3@2 ~ d4@2 c4@2 ~ a3@10 e3@2 g3@2 a3@2 a3@6 e3@4 g3@4 e3@2 a3@4 g3@2 a3@8 ~@4 a4@4 g4@2]/4",
  AI: "[e4@2 d4 c4 d4@2 c4@2 d4@2 e4@2 d4@2 c4@7 ~@9 a4@2]/2",
  AJ: "[c5@3 d5@3 e5@2 d5@6 c5@4 d5 ~@9 a5@7 ~ a5@4 a5@4 a5 ~ a5@4 a5 ~ a5@2 a5@2 a5@6 a5@5 ~ a5@4 a5@4 g5@2 e5@2]/5",
  AK: "[e5@2 d5 c5 d5@2 c5@2 ~@4 f5@14 ~@2 c5 ~ c5@4 a4!2 c5@2 a4 ~ g5@8]/3", AL: "e5@4 c5@2 e5 c5",
  AM: "g5@2 e5@2 c5@2 a4 ~@5 e5@2 c5@2", AN: "c5 a4@2 c5@2 c5@2 c5", AO: "~@2 c5@4 c5@2 c5@4 c5@3 ~",
  AP: "c5@3 ~ c5@3 ~ c5@2 c5@4 ~@2",
})).s("gm_electric_guitar_clean").gain(0.64).pan(0.2)

// chords · rock organ · "organ"
const rock_organ = note("<~@6 A@5 ~@63 B@6 C@2 D@8 E@5 F@6 ~@36>".pickRestart({
  A: "[~@8 a6@48 g6@6 e6@4 c6@5 ~@9]/5", B: "[~@2 [e5,c6]@8 b5@3 c6 b5@4 [c5,f5,a5]@6, ~ g5@8 ~@3, ~@40 d5@31 ~@25]/6",
  C: "[~ [b4,e5,g#5]@3]/2", D: "[~ [c5,e5]@4 [d5,f5]@4 c5@2 [b4,g#5]@2 [c5,a5]@3, ~ a5@10 ~@5, ~@9 e5@7]/8",
  E: "[~ [c5,e5]@4 [d5,f5]@4 [c5,e5], ~ a5@9]/5", // C Dm C
  F: "[~ [b4,d5,g#5]@2 [c5,e5,a5]@2 [b4,d5,g#5]@2 [c5,e5,a5]@2 [b4,d5,g#5]@2 ~]/6", // G#dim Am G#dim Am G#dim
})).s("gm_rock_organ").gain(0.2).pan(0.8)

// chords · overdriven guitar · "d guitar"
const overdriven_guitar = note(`<
  ~@6 A@5 ~@6 B@2 ~@5 C D@2 ~@31 E@3 F@5 G@3 H@2 I@2 J@2 ~@7 K@5 L M@7 N@6 O P Q@2 R@2 S T U@2 Q@2 R@2 S T U@2 Q@2 R@2 S
  T U@2 Q@2 R@2 S T U@2 V ~
>`.pickRestart({
  A: "[~@3 [g2,d3,g3] [a2,e3,a3]@32 ~@4]/5", B: "[~@4 [e3,a3] ~ [d3,g3] [e3,a3]@5 ~@4]/2", C: "~@10 [e3,a3] ~@5",
  D: "[[e3,a3] ~@7 [e3,a3] ~@3 [d3,g3]@2 [e3,a3]@9 ~@9]/2", // A5 G5 A5
  E: "[~@2 [e5,g5]@3 [e5,g5]@3 [e5,g5]@15 ~ [e5,g5]@2 [e5,g5]@4 [c5,e5]@8 ~@8 a4@2]/3", // Em C
  F: "[c5 a4 c5@8 a4 ~ [b4,d5]@15 ~@2 g5@5 g5@2 g5@3 g5, ~@7 e5@2 ~]/5", // Bm
  G: "[~@4 d5@4 g5@2 e5@2 d5@2 c5@10 g5@2 e5@2 d5@2 c5@9 ~@7 a4@2, g5@7 ~@41]/3",
  H: "[c5@2 a4@2 c5@16 a4@2 c5@2 c5@2 ~ c5@2 c5@2 ~]/2", I: "[c5@8 b4@2 ~ b4@13 e4@8]/2", J: "[f4@2 e4@4 a4@15 ~@11]/2",
  K: "[~@12 [e3,a3]@7 ~ [d3,g3]@2 ~@2 [e3,a3]@2 ~@2 [d3,g3] ~ [e3,a3]@4 g3@2 e3@2 ~@6 [a3,d4]@8 [g3,c4] ~@3 [a3,d4] ~@3 [g3,c4]@2 [a3,d4]@8 ~@2 [f3,c4]@5 ~ [f3,c4] ~]/5", // A5 G5 A5 G5 A5 D5 C5 D5 …
  L: "~@2 [f3,c4] ~@5 [e3,b3]@5 ~ [e3,b3] ~", // F5 E5
  M: "[~@2 [e3,b3] ~@7 [a2,e3,a3] ~@3 [a2,e3,a3]@6 [g2,d3,g3] ~@3 [g2,d3,g3]@2 [a2,e3,a3] ~@3 [a2,e3,a3]@6 [g2,d3,g3] ~@7 [e3,a3]@7 ~ [d3,g3]@2 ~@2 [e3,a3]@2 ~@2 [d3,g3] ~ [e3,a3]@4 g3@2 e3@2 ~@6 [a3,d4]@8 [g3,c4] ~@3 [a3,d4] ~@3 [g3,c4]@2 [a3,d4]@8 ~@6 [f3,c4] ~@3]/7", // E5 A5 G5 A5 G5 A5 G5 A5 …
  N: "[~@2 [f3,c4] ~@5 [e3,b3]@15 ~ [f3,c4]@16 [e3,b3]@16 [f3,c4]@16 [e3,b3]@16 ~@4 [a2,e3] ~@3]/6", // F5 E5 F5 E5 F5 E5 A5
  O: "~@2 [a2,e3] ~@5 g2@2 a2@4 g2@2", P: "a2@4 g2@2 a2@2 ~@4 [e3,a3] ~@3",
  Q: "[~@2 [e3,a3] ~@5 [e3,a3] ~@3 [d3,g3]@2 [e3,a3]@8 ~@6 [a3,d4] ~@3]/2", // A5 G5 A5 D5
  R: "[~@2 [a3,d4] ~@5 [a3,d4] ~@3 [g3,c4]@2 [a3,d4]@9 ~@5 [f3,c4] ~@3]/2", // D5 C5 D5 F5
  S: "~@2 [f3,c4] ~@3 [f3,c4] ~@5 [e3,b3] ~@3", T: "~@2 [e3,b3] ~@3 [e3,b3] ~@5 [e3,a3] ~@3",
  U: "[~@2 [e3,a3] ~@5 [e3,a3] ~@3 [d3,g3]@2 [e3,a3]@9 ~@5 [e3,a3] ~@3]/2", V: "~@2 [e3,a3] ~@5 [e3,a3] ~@7",
})).s("gm_overdriven_guitar").gain(0.48).pan(0.3)

// chords · piano · "ac piano"
const piano = note(`<
  ~@10 A@4 B@8 C@5 ~@31 D@3 E@6 F@2 G H@8 I@5 ~@19 J F@2 K@6 F@2 K@6 F@2 K@6 F@2 K@6 L ~
>`.pickRestart({
  A: "[~@12 [a4,c5]@6 [b4,d5]@5 ~ [c5,e5]@6 [b4,d5]@4 [a4,c5]@5 ~@5 [d5,f5]@6 [e5,g5]@6 [f5,a5]@6 [e5,g5]@2]/4", // Am Bm C Bm Am Dm Em F …
  B: "[~@2 [d5,f5]@5 ~ [f4,a4,c5]@15 ~ [e4,g#4,b4]@15 ~ [e4,a4,c5]@31 ~@5 [a4,c5]@6 [b4,d5]@5 ~ [c5,e5]@6 [b4,d5]@4 [a4,c5]@5 ~@5 [d5,f5]@6 [e5,g5]@6 [f5,a5]@6 [e5,g5]@2]/8", // Dm F E Am Bm C Bm Am …
  C: "[~@2 [d5,f5]@5 ~ [f4,a4,c5]@15 ~ [e4,g#4,b4]@15 ~ [e4,a4,c5]@31 ~@9]/5", // Dm F E Am
  D: "[~@12 [a3,c4]@6 [b3,d4]@5 ~ [c4,e4]@6 [b3,d4]@4 [a3,c4]@5 ~@5 [d4,f4]@4]/3", // Am Bm C Bm Am Dm
  E: "[~@2 [e4,g4]@5 ~ [f4,a4]@5 ~ [e4,g4]@4 [d4,f4]@5 ~@5 [g3,b3]@6 [a3,c4]@5 ~ [b3,d4]@5 ~ [c4,e4]@4 [d4,f4]@5 ~ [c4,e4]@12 c4@2 e4@2 d4@2 ~@2 d4@2 ~@6 b3@3 ~@5 [a3,c4]@4, ~@74 b3@9 ~@13, ~@26 g4@3 ~@3, ~@80 d4@7 ~@9]/6", // Em F Em Dm G Am Bm C …
  F: "[~@2 [b3,d4]@5 ~ [c4,e4]@5 ~ [b3,d4]@4 [a3,c4]@5 ~@5 [d4,f4]@4]/2", G: "~@2 [e4,g4]@5 ~ [f4,a4]@5 ~ [e4,g4]@2",
  H: "[~@2 [d4,f4]@5 ~ [f3,a3,c4]@15 ~ [e3,g#3,b3]@15 ~ [e3,a3,c4]@26 ~@6 [g3,c4,e4]@30 ~@2 [g3,b3,d4]@15 ~ [g3,b3,d4]@3 ~ [g3,c4,e4] ~ [g3,d4,f4]@2]/8", // Dm F E Am C G C G7
  I: "[~@2 [g3,b3,d4]@5 ~ [f3,a3,c4]@16 c4@2 ~@4 c4@9 ~ [e3,g#3,b3]@30 ~@10, ~@13 f3@6 ~@21, ~@28 a3@11 ~@41]/5", // G F E
  J: "~@3 [a3,c4]", // Am
  K: "[~@2 [e4,g4]@5 ~ [f4,a4]@5 ~ [e4,g4]@4 [d4,f4]@5 ~ [f3,a3,c4]@15 ~ [e3,g#3,b3]@15 ~ [e3,a3,c4]@26 ~@10 [a3,c4]@4]/6", // Em F Em Dm F E Am
  L: "~@2 [b3,d4]@5 ~ [c4,e4]@5 ~@3", // Bm C
})).s("gm_piano").gain(0.64).pan(0.6)

// chords · synth strings 1 · "pad"
const synth_strings_1 = note("<~@10 A@32 B@6 C@2 D@8 E@8 A@8 B@6 C@2 D@8 F@8 G@4 A@32 H@3>".pickRestart({
  A: "[~ [e3,c4]@4 d4@4 [c4,e4]@2 [g#3,b3,d4]@2 [a3,c4]@3, ~ a3@10 ~@5, ~@5 f3@6 e3@5]/8", // C G#dim Am
  B: "[~ [g3,b3,d4] [c4,e4]@8 [b3,d4]@8 [f3,a3,c4]@6, ~ g3@8 ~@3]/6", C: "[~ [e3,g#3,b3,d4]@3]/2",
  D: "[~ [e3,c4]@4 d4@4 [c4,e4]@2 [g#3,b3,d4]@2 [a3,c4]@3, ~ a3@10 e3@5, ~@40 f3@49 ~@39]/8", // C G#dim Am
  E: "[~ [e3,c4]@4 f3@4 b3@4 [c4,e4]@2 [b3,d4], ~ a3@8 g3@7, ~@5 d4@8 ~@3]/8", // C Bm
  F: "[~ [e3,c4]@4 d4@4 [c4,e4]@2 [e3,g#3,b3,d4]@2 [f3,a3,c4,e4]@2 [e3,g#3,b3,d4], ~ a3@10 ~@5, ~@5 f3@6 ~@5]/8", // C E7 Fmaj7 E7
  G: "[~ [f3,a3,c4,e4]@2 [g#3,b3,d4]@2 [a3,c4]@3, ~@3 e3@5]/4", H: "[~ [e3,a3,c4]@4 ~]/3",
})).s("gm_synth_strings_1").gain(0.4)

// other · electric guitar jazz · "el guit2"
const electric_guitar_jazz = note("<~@45 A@4 B@3 C@3 ~@19 D@4 ~ E@2 F@3 C@3 ~@50>".pickRestart({
  A: "[~@4 g4@3 ~ a4@2 b4@4 b4@10 [a4,c5]@11 ~ [a4,c5]@19 ~@3 f5 ~@3 e5 ~]/4", // Am
  B: "[~@2 d5 ~@3 e5@13 ~ e5 d5 b4@2 b4@15 ~@3 b4@2 c5@4]/3", C: "[b4@4 a4@3 ~ d4@11 ~ d4@18 ~@10]/3",
  D: "[~@3 c5@2 d5@2 ~ e5@4 e5@8 g4@4 g5@6 f5@4 e5@6 d5@18 ~@6]/4", E: "[~@4 c5@19 ~@9]/2",
  F: "[~@8 e5 ~@3 d#5 ~ d5@8 ~@2 b4@15 ~@3 b4@2 c5@4]/3",
})).s("gm_electric_guitar_jazz").gain(0.56).pan(0.3)

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

// drums · rim
const rim = s("rim").struct("<[x!4] ~@136>").gain(0.4)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@26 [x!2 ~@6] ~@31 [~@2 x!2 ~@4] ~@78>").gain(0.72)

// drums · open hat
const open_hat = s("oh").struct("<~@6 A ~@53 A ~ A ~@5 A ~ A ~@11 A ~@6 B C ~@5 D ~ A B E ~@36>".pickRestart({
  A: "~ x ~@2", B: "~@7 x", C: "x!4 ~@4", D: "~@2 x!2 ~@4", E: "x!3 ~@5",
})).gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@57 [~@7 x] [x!2 ~@6] ~@78>").gain(0.72)

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

// … 10 more lines

More by Chris Rea