Strudelify

Jealous Guy

Roxy Music

KeyG majorTempo68 bpm
0:00/0:00
// Jealous Guy — Roxy Music
// 68 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 21, 4/4 at bar 22) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@12 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF B AG AH@2 AI AJ AK I J K L M N O P Q R S T
  U V W@3 ~
>`.pickRestart({
  A: "~ g2", B: "f2 c2", C: "~@2 d2 ~ d2 ~ e2 ~ g2@8", D: "f2 a#2", E: "~@4 a2@4 g2@7 ~", F: "f#2@7 ~ e2@7 ~",
  G: "d3@7 ~ c2@7 ~", H: "g1@7 ~@3 c2 ~ d2 ~ f#2 ~", I: "g2@8 e2@7 ~", J: "d2@7 ~ d2 ~ d2@4 ~ a1",
  K: "d2@8 ~@2 d2 ~ d2@2 d#2 ~", L: "e2@7 ~ g2@3 ~ b2@3 ~", M: "e3@5 ~ e3 [g2,b2] e2@5 ~ e2 ~",
  N: "d2@7 a1 d2 ~ d2@3 ~ d2 ~", O: "e2@7 ~ e2@4 d2@3 ~", P: "c2@5 ~ c2@2 c2 ~ c2@2 c2@2 d2 ~", Q: "g2 f2",
  R: "c2@8 d2 ~ d2@3 e2 g2 e2", S: "g2@7 ~ f2@5 ~ f2@2", T: "a#1@11 ~ a1@4", U: "g1@7 ~ f#1@6 ~@2", V: "e1@8 d2@7 ~",
  W: "c2@4 ~ c2 a1 ~ g1@6 ~@2", X: "c2 ~ c2 ~ d2 ~ f#2 ~ g2@8", Y: "e2@7 ~ d2@7 ~", Z: "d2 ~ d2@4 ~ a1 d2@8",
  AA: "~@2 d2 ~ d2@2 d#2 ~ e2@7 ~", AB: "g2@3 ~ b2@3 ~ e3@5 ~ e3 [g2,b2]", AC: "e2@5 ~ e2 ~ d2@7 a1",
  AD: "d2 ~ d2@3 ~ d2 ~ e2@7 ~", AE: "e2@4 d2@3 ~ c2@5 ~ c2@2", AF: "c2 ~ c2@2 c2@2 d2 ~ g2@8",
  AG: "d2 ~ d2@3 e2 g2 e2 g2@7 ~", AH: "[f2@5 ~ f2@2 a#1@11 ~ a1@4 g1@7 ~]/2", AI: "f#1@3 ~ e1@4",
  AJ: "d2@7 ~ c2@4 ~ c2 a1 ~", AK: "g1@6 ~@2 c2 ~ c2 ~ d2 ~ f#2 ~",
})).s("gm_acoustic_bass").gain(0.59)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A B C D@2 E@2 F G H I J@2 K L M@2 N@2 O@2 P Q R S T U V W X Y Z AA@2 AB@2 AC@2 AD@3 AE@3 AF AG AH AI AJ@2 AK AL AM AN
  R S AO U AP W X Y Z AQ AR AS@2 AT ~
>`.pickRestart({
  A: "~@8 g4 b4 g4 b4 [d4,g4] b4 g4 b4, ~@8 g3@5 ~@3, ~@4 d5 ~ d5 ~", // G5
  B: "[g4,e5] b4 g4 b4 [g4,e5] [g4,f#5] g5 ~ [d4,d5,f#5]@2 f#4 ~ [d4,d5,f#5]@2 ~@2, e3@3 ~ d3@3 ~, e4@3 ~ e4@2 ~@10", // C Gmaj7 D
  C: "[e4,a4] ~ a4 f#4 ~ e5@2 ~ d5 ~ d5@2 d4@2 [a4,d5,f#5] [b3,c4,g5], d3@7 ~ d3@7 ~, d4 d5 ~@2 [d4,a4,f#5]@2 ~@2, ~ f#4@2 ~ a4@2 ~ f#4@8 ~", // A5 D Cmaj7 D
  D: "[[d4,f#5,a5]@2 ~ [d5,f#5,b5] ~ [a4,d5,f#5,a5] ~@2 g5@2 e5@2 e4@2 ~@2 a4 b4 ~ b3 f#5 ~ b4 g4 d4 b4 ~@3 b4 g4 f#3, [c#4,a4,d5] ~ a4@2 d4@2 d#4@2 [e4,b4]@5 ~@2 b3@2 ~ g4@3 e5@2 ~ d5@2 ~@2 d5@2 ~@2, ~@7 g4@6 ~ g4@2 e3@6 b3@2 g3@7 ~, ~@16 e5@2 ~@2 e4@3 ~@4 d4@3 ~@2]/2", // D Bm D Dmaj7 E5
  E: "[e4 b4 ~@3 b4@2 e4 [d5,f#5]@3 ~ [d5,f#5]@2 a4@2 [d5,f#5]@2 a4 [a3,b3] [c#4,a4,d5,f#5] [b4,d5,g5]@2 ~ [a4,d5,f#5]@5 ~ [a4,d5,f#5] [b4,d5,g5], e3@7 ~@25, e5@2 ~ e4@2 ~@3 d4@11 ~ d4@3 ~ d4@3 ~@5, ~@4 e5@2 ~@2 a4 ~@23]/2", // D Asus2 Dmaj7 G D G
  F: "[d4,d5,f#5]@3 ~ b5 ~ a5@2 [b4,e5,g5]@2 ~@2 [b3,g4,b4,e5]@2 ~@2, a4 ~@3 d4@3 ~ e3@6 ~@2, ~@5 d5@2 ~@9", // D Em
  G: "a4 ~ g4@3 ~ [g4,b4,e5] [g4,c5,e5] [c#5,e5]@2 ~@2 [c#5,e5]@3 ~, [e3,e5]@3 ~ e3@2 ~@2, ~ b4@4 ~@11, ~@2 e4 ~@5 g4 ~@3 g4 ~@3", // Em C C#m E
  H: "[e3,c#5,e5]@2 [e4,g4] ~ [c#5,e5]@2 [e3,g4] ~ [a4,d5,f#5]@2 ~@2 [a4,d5,f#5] ~@3, g4 ~@3 g4 ~@3 d3@7 ~, ~@6 a3 ~", // C#m Em C#m Em D
  I: "[f#4,a4,d5]@3 ~ f#4 g4 f#4 g4 [b4,e5]@2 ~@2 [b4,e5]@2 ~@2, d3@3 ~ e3@2 ~@2, ~@4 [a4,d5]@3 ~ g4 ~@3 g4 ~@3", // D E5 D5
  J: "[[b4,e5]@3 ~ g4 ~ b4 g4 [c4,c5,e5]@3 ~ [c4,g4,e5] ~ g4 [g4,c5,e5,g5] [g4,c5,e5]@3 [g5,c6,e6,g6] c4 ~ d3@2 [g3,g4,b4,d5]@4 [g4,b4,d5]@2 g3@2, e3@5 e5@2 ~ g4 ~@3 c5@2 ~@2 g5@2 ~@2 [g5,c6,e6,g6]@4 ~@8, g4 ~@3 [e4,f#5]@2 ~@2 c3@14 ~@10, ~@16 c4 ~@15]/2", // E5 C G C Esus2
  K: "[f3,f4,a4,d5]@4 [f4,a4,d5]@2 f3@2 [e4,g4,d5]@3 ~ [e4,g4,d5] ~ c3 ~, ~@2 c3 ~", // Dm Em7
  L: "[g4,c5,e5,g5] ~ c5 g4 ~@2 c4 g4 [g3,g4,b4,d5]@4 [g4,b4,d5]@2 g3@2, c3@5 [e5,g5]@2 ~@9, c4@2 [e5,g5]@2 c5@3 ~@9", // C G Em
  M: "[[f3,a4,d5]@4 [f4,a4,d5]@2 f3 ~ [a#3,a#4,d5]@2 ~@4 a#4 ~@3 a#4 ~@3 a#4 ~ [g4,d5,g5]@3 ~ [b4,g5] a5 [b4,b5]@2, f4@2 ~@6 a#2@15 ~@9, ~@8 f4 ~@3 [a#3,c5,f5]@2 ~@2 [a#3,c5,f5]@2 ~@2 [a#3,c5,f5]@3 ~ [g3,b4] ~@5 g5 ~, ~@13 d5@2 ~@2 d5@2 ~@2 d5@2 ~@5 d5@3 ~]/2", // Dm A# G5 Em B A#sus2 G
  N: "[[f#3,d5,g5]@4 [b4,d5,g5] a5 [b4,g5] ~ [e3,g5,e6]@4 ~ g5 ~@2 [e5,g5]@2 ~@2 [e5,g5] [d5,f5]@2 ~ g4 e5 g4 ~ [e4,g4] g4 ~ c4, f#4@2 ~@2 f#4@2 b5@2 [e4,e5,b5]@3 ~ [e5,b5]@2 b4@4 ~@6 c3@7 ~, ~@12 [c4,d5,g5] ~ [c4,c5] ~]/2", // Gmaj7 G Em Dm Em E5 Csus2 C
  O: "[[d4,g4]@3 ~ g4 ~@3 a4 b4 g4 ~ d5 ~ b4 d5 [d4,g4,g5,b5]@3 ~ [d5,g5]@2 ~@2 a4 b4 g4 ~ [e4,b4,e5]@3 ~, g3@9 ~@7, b4@4 ~@6 g5@2 [d4,g4]@3 ~ [b4,d5] ~@3 [g4,b4] ~@3 [e4,e5]@3 ~@5, ~@11 b4@2 a5@2 ~@17]/2", // G5 G G5 E5 G5 Bm G E
  P: "[d4,d5,f#5]@3 ~ [d5,f#5]@5 ~@3 d4 ~ d4 a4, d3, ~@4 [d4,f#4]@3 ~@3 d5@2 ~ e5@2 ~, ~@11 f#4@2 ~@3", // D
  Q: "a4@2 d5@2 a4@2 f#5 [a3,b3,g5] [c4,c#4] ~@3 b5 ~ [d5,f#5,a5] ~, d4@3 ~ d4@3 ~, f#5@4 ~@4 [f#5,a5]@2 d5@3 ~@3, ~@9 a4@2 f#5@3 ~@2", // Em C#maj7 D F#m
  R: "[e4,e5,g5]@3 ~ [b4,e5] ~ a4 b4 [e4,g4]@2 b4 e5 [g4,e5] g4 [c5,e5] [e4,g4], e3, g4 ~@5 e5@3 ~@3 [e4,b4]@2 ~@2", // Em E5 Em C Em E5
  S: "[e4,c#5,e5]@3 ~ [e4,c#5,e5]@3 ~ [e4,c#5]@3 ~ [e4,c#5]@3 ~, e3@7 ~, g4 ~@3 g4 ~@3 e5@6 ~@2, ~@8 g4 ~@3 g4 ~@3", // C#m
  T: "[a4,d5,f#5]@3 ~ [d5,f#5]@3 [a3,b3] [c4,c#4,a4,d5,f#5] [b4,d5,g5]@2 [a3,b3,c4] [c#4,b4,d5,g5] [a4,d5,f#5]@2 ~, d4@7 ~ d4@3 ~ d4@4, ~@4 a4 ~@11", // D Asus2 D7 G Am G D
  U: "[e4,b4,e5,g5]@3 ~ [e4,b4,e5,g5]@3 ~ a4 b4 g4@2 [e4,b4,e5,g5]@2 g4 ~, e3@15 ~, g4 ~@3 g4 ~@3 [e4,e5,g5]@3 ~@5", // Em
  V: "[c4,c5,e5]@3 ~ [c4,g4,c5,e5] ~@2 [c5,e5,g5] [c5,e5,g5]@2 ~ [g5,c6,e6,g6] [g5,c6,e6,g6]@3 ~, c3@7 ~, g4 ~@7 c4 ~@3 c4 ~@3", // C
  W: "[g3,g4,b4,d5]@4 [g4,b4,d5]@2 g3 ~ [f3,f4,a4,d5]@4 [f4,a4,d5]@2 f3 ~", // G Dm
  X: "[c4,e4,g4,d5]@3 ~ [c4,g4]@2 c3 ~ [c3,e4,g4] ~ e5 g4 c5 ~@2 g4, c3@4 [e4,d5]@4 ~@2 g5@2 ~ [e5,g5]@3, ~@7 c4", // C C5 C E7 Em
  Y: "[g4,b4,d5]@3 ~ [g4,b4,d5]@2 g3@2 [f3,f4,a4,d5]@4 [f4,d5]@2 f3@2, g3@4 ~@8 a4 ~@3", // G Dm
  Z: "[a#3,f4,a#4,d5,f5]@3 ~ [a#3,f4,a#4,d5,f5]@2 ~@2 [a#4,d5,a#5] f5 [a#4,d5,a#5] ~ [d5,a#5] ~ d5 ~, a#2 ~@2 a#4, ~@13 g5@2 ~", // A# Gm
  AA: "[[g4,b4,d5,g5]@3 ~@2 a5 b5 d4 [f#4,d5,g5]@2 ~@2 d5 a5 [f#3,b5] e5 [e4,e5]@3 ~@2 g5 ~@2 [e5,g5]@2 ~@2 [e5,g5] [d5,f5]@2 ~, g3@3 ~ f#3@2 ~@2 [e3,b5,e6]@3 ~@5, ~@4 [g4,b4,d5,g5]@3 ~ b4 ~@3 [f#4,b4,g5]@2 ~ g5@4 ~ [e4,e5]@2 b4@4 ~@6]/2", // G Gmaj7 B5 E Em Dm E5 G …
  AB: "[g4 e5 g4 ~ [e4,g4] g4 ~ c4 [d4,g4]@3 ~ g4 ~@3 a4 b4 g4 ~ d5 ~@2 d5 [g3,d4,g4,d5,g5,b5]@3 ~ [d5,g5]@2 ~@2, c3@7 ~ b4@4 ~@6 g5@2 [d4,g4]@2 b4@2 b4 ~@3 [g4,b4] ~@3, [c4,d5,g5] ~ [c4,c5] ~ g3@8 ~@4, ~@19 b4@2 a5@2 ~@9]/2", // Em G5 G G5 G Csus2 C
  AC: "[a4 b4 g4 ~ [e4,b4,e5]@3 ~ [d4,d5,f#5]@3 ~ [d5,f#5]@5 ~@3 d4 ~ d4 a4 a4@2 d5@2 a4@2 f#5 [a3,b3,g5], [e4,e5]@3 ~@5 d3@16 ~@8, ~@12 d4@2 ~@5 f#4@2 ~@3 d4@6 ~@2, ~@12 f#4 ~@5 d5@2 ~ e5@2 ~ f#5@4 ~@4]/2", // E5 D Em E
  AD: "[[c4,c#4] ~@3 b5 ~ [d5,f#5,a5] ~ [e4,e5,g5]@3 ~ [b4,e5] ~ a4 b4 [e4,g4]@2 b4 e5 [g4,e5] g4 [c5,e5] [e4,g4] [e4,c#5,e5]@3 ~ [e4,c#5,e5]@3 ~ [e4,c#5]@3 ~ [e4,c#5]@3 ~ [a4,d5,f#5]@3 ~ [d5,f#5]@3 [a3,b3], d4@3 ~ e3@8 e3@7 ~@5, [f#5,a5]@2 d5@3 ~@3 g4 ~@11 [e4,b4]@2 ~@2 g4 ~@3 g4 ~@3 g4 ~@3 g4 ~@3 d4@7 ~, ~ a4@2 f#5@3 ~@8 e5@3 ~@15 e5@6 ~@6 a4 ~@3]/3", // C#maj7 D Em E5 Em C Em C#m …
  AE: "[[c4,c#4,a4,d5,f#5] [b4,d5,g5]@2 [a3,b3,c4] [c#4,b4,d5,g5] [a4,d5,f#5]@2 ~ [e4,b4,e5,g5]@3 ~ [e4,b4,e5,g5]@3 ~ a4 b4 g4@2 [e4,b4,e5,g5]@2 g4 ~ [c4,c5,e5]@3 ~ [c4,g4,c5,e5] ~@2 [c5,e5,g5] [c5,e5,g5]@2 ~ [g5,c6,e6,g6] [g5,c6,e6,g6]@3 ~ [g3,g4,b4,d5]@4 [g4,b4,d5]@2 g3 ~, d4@3 ~ d4@4 e3@15 ~ c3@14 ~@10, ~@8 g4 ~@3 g4 ~@3 [e4,e5,g5]@3 ~@5 g4 ~@7 c4 ~@3 c4 ~@11]/3", // D7 G Am G D Em C G …
  AF: "[f3,f4,a4,d5]@4 [f4,a4,d5]@2 f3 ~ [c4,e4,g4,d5]@3 ~ [c4,g4]@2 c3 ~, ~@2 c3 [e4,d5]", // Dm C C5 E7
  AG: "[c3,e4,g4] ~ e5 g4 c5 ~@2 g4 [g4,b4,d5]@3 ~ [g4,b4,d5]@2 g3@2, ~@2 g5@2 ~ [e5,g5]@3 ~@8, ~@3 c4 g3@2 ~@2", // C G Em
  AH: "[f3,f4,a4,d5]@4 [f4,d5]@2 f3@2 [a#3,f4,a#4,d5,f5]@3 ~ [a#3,f4,a#4,d5,f5]@2 ~@2, ~@4 a4 ~@3 a#2@4 ~@4", // Dm A#
  AI: "[a#4,d5,a#5] f5 [a#4,d5,a#5] ~ [d5,a#5] ~ d5 ~ [g4,b4,d5,g5]@3 ~@2 a5 b5 d4, ~@2 a#4@2 g3@3 ~, ~@5 g5@2 ~@5 [g4,b4,d5,g5]@3 ~", // A# Gm G
  AJ: "[[f#4,d5,g5]@2 ~@2 d5 a5 [f#3,b5] ~ [e3,g5,e6]@4 ~ g5 ~@2 [e5,g5]@2 ~@2 [e5,g5] [d5,f5]@2 ~ g4 e5 g4 ~ [e4,g4] g4 ~ c4, f#3@2 ~@5 b4@2 ~@3 [c4,d5,g5] ~ [c4,c5] ~, b4 ~@3 [f#4,b4,g5]@2 ~@2 [e4,e5,b5]@3 ~ [e4,e5,b5]@3 ~@9 c3@7 ~]/2", // Gmaj7 B5 Em Dm Em Csus2 C Gmaj7 …
  AK: "[g4,b4,g5]@3 ~ [g4,d5]@2 ~@2 g4@2 [b4,g5] d5 g5 d5 a5 [g4,d5], g3, ~ g5 ~@2, ~@4 b4 ~@7 g4@2 ~@2", // G G5 Em G5
  AL: "[g3,d4,g4,d5,g5,b5]@3 ~ [d5,g5]@2 ~@2 a4 b4 g4 ~ [e4,b4,e5]@3 ~, b4 ~@3 [g4,b4] ~@3 [e4,e5]@3 ~@5", // G G5 E5 G E
  AM: "[d4,d5,f#5]@3 ~ [d5,f#5]@5 ~@3 d4 ~ d4 a4, d3, ~@4 d4@2 ~@5 f#4@2 ~@3, ~@4 f#4 ~@5 d5@2 ~ e5@2 ~", // D
  AN: "a4@2 d5@2 a4@2 f#5 g5 ~@4 d4@2 [d5,f#5,a5] ~, d4@6 ~@2 [d4,f#5,a5]@2 d5@2 b5 ~@3, f#5@4 ~@5 a4@2 f#5@3 ~@2", // D
  AO: "[a4,d5,f#5]@3 ~ [d5,f#5]@3 ~ [a4,d5,f#5] [b4,d5,g5]@2 ~ [b4,d5,g5] [a4,d5,f#5]@2 ~, d4@7 ~ d4@3 ~ d4@3 ~, ~@4 a4 ~@11", // D G D
  AP: "[c4,c5,e5]@3 ~ [c4,g4,c5,e5] ~@2 [c5,e5,g5] [c5,e5,g5]@3 [g5,c6,e6,g6] [g5,c6,e6,g6]@3 ~, c3@7 ~, g4 ~@7 c4 ~@3 c4 ~@3", // C
  AQ: "[g4,b4,d5,g5]@3 ~@2 a5 b5 d4 [f#4,d5,g5]@2 ~@2 d5 a5 [f#3,b5] ~, g3@3 ~ f#3@2 ~@2, ~@4 [g4,b4,d5,g5]@3 ~ b4 ~@3 [f#4,b4,g5]@2 ~@2", // G Gmaj7 B5 G Gmaj7
  AR: "[e3,g5,e6]@4 ~ g5 ~@2 [e5,g5]@2 ~@2 [e5,g5] [d5,f5]@2 ~, [e4,e5,b5]@3 ~ [e4,e5,b5]@2 b4@4 ~@6", // Em Dm E5
  AS: "g4 e5 g4 ~ [e4,g4] g4 ~ c4 [g4,b4,g5]@3 ~ [g4,d5]@2 ~@2, c3@7 ~@5 g5@4, [c4,d5,g5] ~ [c4,c5] ~ g3@4, ~@12 b4 ~@3", // Em G G5 Csus2 C
  AT: "g4 e5 g4 ~ [e4,g4] g4 ~ c4 [g3,g4,b4,g5]@8, c3@7 ~@9, [c4,d5,g5] ~ [c4,c5] ~@5", // Em G Csus2 C
})).s("gm_piano").gain(0.42).pan(0.7)

// chords · piano · "A.PIANO 2" · soft notes
const piano_soft = note(`<
  A B C ~ D E F G H I J K ~@4 L M N O P Q ~ R S T U V ~ W ~ X Y ~ Z AA AB AC AD AE AF AE ~ AG ~ AH AI ~ AJ N AK P Q ~ R
  S T U V ~ W ~ X Y ~ AL@2 AM ~
>`.pickRestart({
  A: "~@4 d4 ~@3", B: "~@7 b3 ~@3 a4 ~@4", C: "~@4 d4 ~ d4 ~@8 a3", D: "~@10 g4 ~@5", E: "~@2 g4 ~@3 g4 ~@3 a4@3 ~@3",
  F: "~@6 d4 ~", G: "~@10 e4 ~@3 e4 ~", H: "~@4 b3 ~@5 [e4,g4] ~@3 [e4,g4] ~", I: "~@10 d4 ~@3 d4@2",
  J: "~@2 d4 ~ a3@2 d4 ~@3 g4 ~@3 e4@2, ~@14 g4 ~", K: "~@2 g4 ~@7 g4 ~@5",
  L: "~@9 g3 b4 ~ g4 ~@3, ~@9 d4@6 ~, ~@10 g3@5 ~", M: "~@2 b4 ~ g4@3 f#3 ~@8", N: "~@14 e4 ~",
  O: "~@5 a4 b4 g4 d4@3 ~@5, ~@2 d4 ~@5", P: "~@6 b4 ~@5 g4 ~ g4 ~", Q: "~@8 [d4,f#4]@3 ~ a4 ~@2 f#4",
  R: "~@2 g4 ~ e4@3 ~@9, ~@4 g4 ~@11", S: "~@2 g4 ~@3 g4 ~@3 g4!2 ~@2 g4 ~", T: "~@6 a4 ~@9", U: "~@2 g4 ~@3 g4 ~@9",
  V: "~@10 c4 ~@5", W: "~@12 c4 ~@3", X: "~@6 a#2 ~@9", Y: "~@10 b4 ~@5", Z: "~@6 e4 ~@6 a4 b4 g4, ~@6 d4 ~",
  AA: "d4@3 ~@11 b4 ~", AB: "~@4 g4 ~ g4 ~@9", AC: "[d4,f#4]@3 ~ a4 ~@2 f#4 ~@8", AD: "~@10 g4 ~ e4@3 ~, ~@12 g4 ~@3",
  AE: "~@10 g4 ~@3 g4 ~", AF: "~@2 g4!2 ~@2 g4 ~@7 a4 ~", AG: "~@2 c4 ~@13", AH: "~@4 c4 ~@11", AI: "~@14 a#2 ~",
  AJ: "~@2 b4 ~@13", AK: "~@7 b4!2 ~@7", AL: "~@6 e4 ~@8 b4", AM: "~@6 e4 ~@9",
})).s("gm_piano").gain(0.24).pan(0.7)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A@5 B@8 C@2 D@6 E@2 F@2 G H@2 I@2 J@2 K@4 L M N O@6 P@6 Q R@2 S@2 T Q U V@4 W@2 X@3 ~
>`.pickRestart({
  A: "[~ d5 e5 [a4,d5,f#5]@4 [b4,e5,g5]@2 [g4,b4,d5], ~ [g4,b4]@2 ~@7]/5", // D Em G
  B: "[e5 [a4,d5,f#5]@4 b4@2 c#5@2 [a4,d5,f#5]@2 b4@2 c5@2 [g4,b4], ~@5 [e5,g5]@4 ~@2 [g4,e5]@4 ~]/8", // D G Em C
  C: "[[f4,a4] [e4,g4]@2 [g4,b4], c5@3 ~]/2", // F Em G
  D: "[[a4,c5] [a#4,d5]@2 d4@2 ~@2 c5 d4@2 d5 e5, f4 g4@3, ~@3 b4@4 ~ b4@4, ~@5 e4@3 ~@4]/6", E: "[a4,d5,f#5]/2",
  F: "[b4 c#5, [e5,g5]]/2", G: "[a4,d5,f#5]", H: "[b4 c5, [g4,e5]]/2", I: "[[g4,b4] [f4,a4] [e4,g4]@2, ~ c5@3]/2",
  J: "[[g4,b4] [a4,c5] [a#4,d5]@2, ~ f4@3]/2", K: "[d4@4 ~@4 c5@2 [d4,b4]@4 ~ [d5,d6], g4@7 ~, b4 ~, ~@2 e4@3 ~@3]/4",
  L: "[e5,e6] [g5,g6] [b4,b5]@2", M: "[a4,a5]@2 ~ [a4,a5]", N: "[b4,b5] [d5,d6] [f#4,f#5]@2",
  O: "[[e4,e5]@24 [f#4,f#5]@16 [e4,e5]@28 ~ e5 g5 e6 g5@8 f5@7 ~ [e5,g5]@8, ~@9 [b5,d6]@2 ~]/6", // E F# E Em Bm
  P: "[~@4 [c6,e6]@4 g5@7 ~@9 [a#5,d6]@16 g5@8 f#5@8 [g5,e6]@15 ~ [e4,c5]@8 [d4,b4]@16, ~@8 [b5,d6]@16 ~@16 b5@31 ~ g4@24, ~@2 f5@3 d6@2 ~@5]/6", // C A# C G Bm
  Q: "[g4,b4]", R: "[a4@4 [a4,a5]@4 [b4,b5]@7 ~ [a4,a5]@14 ~@2, f#4@31 ~, ~@8 [a#4,a#5] ~@7 [a#4,a#5] ~@15]/2",
  S: "[f#4@4 e4@4 f#5@6 f#5 f5 [c#5,e5]@16, g4, b4@7 ~ b4@24]/2", T: "[f#4,d5]",
  U: "~@2 g4 c5 e5 ~ c5 e5 g5 c5 e5 g5 c6 ~ g5 c6, ~ e4@2 ~@2 g4@2 ~@6 e5@2 ~",
  V: "[[g5,b5]@2 [f5,a5]@2 [e5,g5]@3 [f#5,a5] [g5,b5]@2 a5@2 a#5@4, d6, ~@5 f5@3]/4", W: "[g5 f#5 e5 d5, b5, d5 g5]/2",
  X: "[c5,e5] [b4,d5], g5", // C Bm
})).s("gm_string_ensemble_2").gain(0.15).pan(0.3)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~@20 A B C D E C F G H I J K L M N@2 O@8 P@2 Q@2 R@2 S A B C D E C F G H I J K L M T@3 ~
>`.pickRestart({
  A: "g3@4 [g3,b3]@4 [e3,b3]@4 [e3,b3]@3 ~, [g2,d4,g4]@8 [e2,e4,g4]@7 ~", B: "[d3,d4,f#4] [d3,d4,f#4,a4]@3, d2",
  C: "[d2,d3,a3,d4,f#4]@15 ~", D: "[e3,g4]@14 ~ c5, [e2,b3,e4], ~@7 [e3,g4,b4]", E: "[e2,e3,e4,g4,c#5]@7 ~",
  F: "[e2,e3,b3,e4,g4]@15 ~", G: "[c2,c3,g3,c4,e4,g4]", H: "[g3,d4,g4,b4]@8 [f3,c4,f4,a4]@7 ~",
  I: "[c4,e4,g4], c3@3 ~@5", J: "[g3,d4,g4,b4] [f3,f4,a4,c5]", K: "[a#3,d4,f4,a#4]@15 ~",
  L: "[g3,d4,g4,b4] [f#3,d4,f#4,b4]", M: "e3 d3, [b3,e4,g4,b4]",
  N: "[[c3,c4,e4,g4]@2 [g2,b3,d4,g4]@4 g3 [g3,b3], ~@3 [g2,d4,g4]]/2", // C G G5
  O: "[[e3,b3]@4 [e3,b3]@3 ~ [d3,d4,f#4]@4 [d3,d4,f#4,a4]@12 [d2,d3,a3,d4,f#4]@15 ~ [e3,g4]@14 ~ c5 [e2,e3,e4,g4,c#5]@14 ~@2 [d2,d3,a3,d4,f#4]@15 ~ [e2,e3,b3,e4,g4]@15 ~ [c2,c3,g3,c4,e4,g4]@16 [g3,d4,g4,b4]@8, [e2,e4,g4]@7 ~ d2@16 ~@16 [e2,b3,e4]@16 ~@72, ~@27 [e3,g4,b4] ~@36]/8", // E5 D Em C#dim D Em C G …
  P: "[[f3,c4,f4,a4]@7 ~ [c4,e4,g4]@16 [g3,d4,g4,b4]@8, ~@4 c3@3 ~@9]/2", // F C G
  Q: "[[f3,f4,a4,c5]@8 [a#3,d4,f4,a#4]@15 ~ [g3,d4,g4,b4]@8]/2", // F A# G
  R: "[[f#3,d4,f#4,b4] e3 d3 [c3,c4,e4,g4], ~ [b3,e4,g4,b4]@2 ~]/2", S: "[g2,b3,d4,g4]",
  T: "[c3,c4,e4,g4] [g2,b3,d4,g4]", // C G
})).s("gm_epiano1").gain(0.42).pan(0.3)

// other · whistle
const whistle = note("<~@35 A B@2 C@6 ~@25>".pickRestart({
  A: "~@12 d7@2 e7 g7", B: "[~ e7@3 d7 ~ e7 ~ b6@15 ~@5 a6@2 b6 d7]/2",
  C: "[~ b6@3 a6@2 b6 ~ f#6@11 ~@9 e6@2 f#6 g6@3 a6 b6@2 ~ d7 d7@11 ~ d7 ~@8 e6@2 f#6 g6@3 a6 b6@3 e7 ~ e7@13 ~@11]/6",
})).s("gm_whistle").gain(0.35).pan(0.8)

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

// drums · snare
const snare = s("sd").struct("<~@20 A@7 B A@14 C D A@14 E A F A G A@4 H ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@2 x!2 ~@7", C: "~@4 x ~@7 x ~@2 x", D: "x ~@2 x", E: "~@4 x ~ x!4 ~ x ~@4",
  F: "~@2 x ~@2 x!3", G: "~ x ~@2", H: "~@4 x!3 ~@9",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@27 A ~@15 B ~@14 C ~ D ~ E ~@6>".pickRestart({
  A: "~@9 x!2 ~@2 x!3", B: "~ x!2 ~@2 x!3 ~@8", C: "~@12 x!4", D: "~@3 x", E: "~@13 x ~ x",
})).gain(0.54)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@20 A B A B A B A B A B A B A B A@3 C A C A C A C A C A C A C A@2 B A B A B A B A B A B A B A@2 D ~
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~ x!3 ~ x ~", D: "x!3 ~",
})).gain(0.48)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct(`<
  ~@20 A B A B A B A B A B A B A B A@3 C A C A C A C A C A C A C A@2 B A B A B A B A B A B A B A@2 D ~
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~ x ~@3 x ~ x", D: "~ x ~ x ~@4",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A ~@15 B ~@16 C ~ D ~@6>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@3 x!2 ~@11", C: "~@11 x ~@3 x", D: "~@10 x!3 ~@3",
})).gain(0.54)

// drums · crash
const crash = s("cr").struct("<~@28 A ~@14 B ~@5 B ~ A ~@7 A ~ A ~ A ~ B ~ B ~>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.54)

stack(
  bass, piano, piano_soft, string_ensemble_2, epiano1, whistle, kick, snare, low_tom, pedal_hat, pedal_hat_soft,
  mid_tom, crash
)

More by Roxy Music