Strudelify

Phantom of the Opera

Andrew Lloyd Webber

KeyF majorTempo120 bpm
0:00/0:00
// Phantom of the Opera — Andrew Lloyd Webber
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 7 "Orchestra" named as a string part, played on string ensemble 1 (its brass section patch is not one)
// note: duplicate parts dropped: ch 3 "Strings" string ensemble 1 (copy of ch 1 "Main" church organ); ch 12 "Orchestra" orchestra hit (copy of ch 7 "Orchestra" string ensemble 1); ch 9 "Orchestra" cello (copy of ch 8 "Orchestra" pizzicato strings)
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// chords · church organ · "Main"
const church_organ = note(`<
  A@2 B ~ A@2 B C D@2 E@2 F G H@3 I@3 J@2 K L M@2 A@2 N O P@2 Q R S@2 T U@2 V W X Y@2 Z AA AB@2 AC@2 AD AE AF@2 AG@2
  AH@2 AI@2 AJ AK AL AM AN@2 AO AP AQ AR AS AT AU@2 AV AW AX@2 AY AZ BA BB BC@2 BD BE BF BG BH BB BI@2 BJ BK BL@2 BM BN
  BO@2 BP BQ BR@2 BS BT BU@2 BV BW BX@2 BV BW BX@2 BY BZ CA@2 CB@2 CC@2 CB@2 CD@2
>`.pickRestart({
  A: "[[f4,a4,d5]@12 [f4,a4,d5] [e4,ab4,db5] [eb4,g4,c5] [eb4,gb4,b4]]/2", B: "[d4,f4,bb4]",
  C: "[c4,eb4,ab4] [d4,f4,bb4] ~@2 [d4,f4,bb4] [eb4,gb4,b4] [e4,g4,c5] [e4,ab4,db5]", // Ab Bb B C Dbm
  D: "[[f4,a4]@5 f4 d5 a4, d5@3 f4, ~@5 a4@2 ~]/2", // F
  E: "[c5@3 bb4 d4@4 ~@4 c5@3 g4, [d4,g4]@4 [g4,bb4]@6 g4@5 ~, ~@2 e4!2]/2", F: "[f4,a4]@6 ~ [g3,c4], d4@7 ~",
  G: "[a3,d4] f4 d5 a4, ~ a4@2 ~, ~ f4", // D5
  H: "[c5@3 bb4 ~@2 d4@2 ~@4 c5@3 ~ [d4,f4,a4]@8, [d4,g4]@4 [g4,bb4]@6 g4@5 g4@7 ~@2, ~@2 e4!2 ~@2]/3", // Dm G5 Gm
  I: "[~@8 d5@3 ~ f5@3 ~ [bb4,d5,a5]@5 ~ g5 ~ [bb4,d5]@8 ~@4 g5@4 c6@6 g5@2, ~ a4@4 ~ g5@3 ~@3, ~@4 [c5,e5]!2]/3", // Bbmaj7 Bb C
  J: "[[d5,f5,a5]@6 ~ [d5,f5,a5]]/2", K: "[d5,f5,a5,d6]", L: "~ c6 bb5 a5 g5 f5 e5 d5",
  M: "[[e4,g4,db5]@10 [db4,e4,g4,bb4]@2 bb4@3 a4, ~@3 [db4,e4,g4]]/2", N: "[d4,f4,bb4]@11 ~@5",
  O: "[c4,eb4,ab4] ~ [d4,f4,bb4]@6 db5 ~ c5 ~ b4 ~ bb4 ~", P: "[[bb3,d4,g4]@19 ~ [bb4,d5]@4 g5@4 d5@4, ~@3 bb4]/2",
  Q: "f5@3 eb5 [g4,c5,eb5]@4, [g4,c5] ~", R: "~@4 f5@3 c5, a4@2 a4 ~, ~@2 c5@5 ~",
  S: "[[g4,bb4,d5]@5 [bb4,d5] g5 d5, ~@3 bb4]/2", T: "[g4,c5]@2 ~ eb5 [g4,c5,eb5]@4, f5@3 ~@5",
  U: "[a4@2 c5@2 f5@3 ~ [g4,bb4,d5]@8, ~@4 a4@2 ~ c5@3 ~@6]/2", V: "~@2 g4 bb4, ~ d4@3",
  W: "[eb4,g4]@2 ~ c5 [eb4,g4,c5]@4, d5@3 ~@5", X: "~@4 [a4,f5]@3 c5, [f4,a4]@3 ~@5, ~@2 c5@3 ~@3",
  Y: "[[g4,bb4,d5]@6 ~ [g4,bb4,d5]]/2", Z: "[g4,bb4,d5,g5]", AA: "~ f5 eb5 d5 c5 bb4 a4 g4",
  AB: "[[eb4,gb4]@10 eb4@2 ~@3 d4, a3@3 [a3,c4,eb4]]/2", // Ebm Adim
  AC: "[[bb4,d5,g5]@12 [bb4,d5,g5] [a4,db5,gb5] [ab4,c5,f5] [ab4,b4,e5]]/2", AD: "[g4,bb4,eb5]",
  AE: "~ a4 [a4,c5] ~, [gb4,d5]", AF: "[[g4,b4,e5]@5 [g4,b4] [g4,e5] b4]/2",
  AG: "[d5@3 c5 [e4,a4,c5]@6 a4@2 [d4,a4]@2 ~ a4, [e4,a4]@4 ~@8 d5@3 ~]/2", // Am D5 A5
  AH: "[[e4,g4,b4]@5 [e4,g4,b4] e5 b4, ~@3 [e4,g4]]/2", // Em
  AI: "[d5@3 c5 a4@6 a4@2 [a4,d5]@3 a4, [e4,a4] e4@2 d4, ~@2 c5 ~@5]/2", AJ: "[e4,g4,b4]", AK: "~ b3 e4 g4",
  AL: "b4@3 a4 [c4,e4,a4]@4, [c4,e4] ~", AM: "d4@2 a4@2 d5@3 a4, gb4!2", AN: "[[e4,g4,b4]@6 ~ [e4,g4,b4]]/2",
  AO: "[g4,b4,e5]", AP: "~ d5 c5 b4 a4 g4 gb4 e4, e4@7 ~", AQ: "[gb3,a3,eb4]",
  AR: "~@2 [eb3,gb3,c4]@2 c4@3 b3, ~ [eb3,gb3]", AS: "[g3,b3,e4]@3 [g3,b3,gb4]",
  AT: "[g3,b3,gb4]@3 [g3,b3,e4] [g3,b3,e4]@3 [g3,b3,e4]", AU: "[[g3,c4,e4]@2 [c4,e4,g4,b4]@5 [g4,b4,e5]]/2",
  AV: "[g4,b4,e5]@3 [g4,b4,gb5]", AW: "[g4,b4,gb5]@3 [g4,b4,e5] [g4,b4,e5]@3 [g4,b4,e5]",
  AX: "[[g4,c5,e5]@8 [c5,e5,g5,b5]@19 ~@5]/2", // C Cmaj7
  AY: "[ab4,c5,f5]@2 ~@2 bb4 ~ f4@2 ab4 ~ bb4 ~ ab4 ~ [eb4,g4,bb4,eb5]@2, ~ f4@2 ~@5", // Fm Eb
  AZ: "[f4,ab4,c5,f5]@3 ~ [f4,ab4,c5]@4 f5@4 c5@4, ~ [f4,ab4]", BA: "[f4,ab4,eb5]@4 ~@2 db5 ~ [f4,ab4,db5]@8",
  BB: "[eb4,g4]@2 bb4@2 eb5@3 bb4, ~@2 g4 ~", BC: "[[f4,ab4,c5]@5 [f4,ab4,c5] [f4,ab4,f5] c5]/2",
  BD: "[f4,ab4]@2 ~ db5 [f4,ab4,db5]@4, eb5@3 ~@5", BE: "[f4,ab4]@2 bb4@2 eb5@3 bb4, ~@2 g4 ~", BF: "[f4,ab4,c5]",
  BG: "~ c4 f4 ab4", BH: "[db4,f4,c5]@2 ~ bb4 [db4,f4,bb4]@4", BI: "[[f4,ab4,c5]@6 ~ [f4,ab4,c5]]/2",
  BJ: "[f4,ab4,c5,f5]", BK: "~ eb5 db5 c5 bb4 ab4 g4 f4", BL: "[[g3,bb3,e4]@10 db4@2 db4@3 c4, ~@3 [e3,g3]]/2",
  BM: "[ab3,c4,f4]@3 [ab3,c4,g4]", BN: "[ab3,c4,g4]@3 [ab3,c4,f4] [ab3,c4,f4]@3 [ab3,c4,f4]",
  BO: "[[ab3,db4,f4]@2 [db4,f4,ab4,c5]@5 f4]/2", BP: "[ab3,c4,f4]@8 ~@4 [ab3,c4,g4]@3 ~",
  BQ: "[ab3,c4,g4]@4 ~@2 [ab3,c4,f4] ~ [ab3,c4,f4]@4 ~@2 [ab3,c4,f4] ~", // Abmaj7 Fm
  BR: "[[ab3,db4,f4]@5 ~@3 [db4,f4,ab4,c5]@19 ~@5]/2", BS: "[c5,f5,ab5]@12 g5 ab5 ~ g5",
  BT: "f5@3 g5 f5@3 eb5, [ab4,c5]!2", BU: "[[ab4,db5,f5]@2 [db5,f5,ab5]@5 ~]/2", BV: "bb5@8 ~@4 a5 bb5 ~ a5, [d5,g5]",
  BW: "g5@3 a5 g5@3 f5, [bb4,d5]!2", BX: "[[bb4,eb5,g5]@2 [eb5,g5,bb5]@5 ~]/2", BY: "c6@12 b5 c6 ~ b5, [e5,a5]",
  BZ: "a5@3 b5 a5@3 g5, [c5,e5]!2", CA: "[[c5,f5,a5]@2 [f5,a5,c6]@5 ~]/2", CB: "[[e5,a5,c6]@7 ~]/2",
  CC: "[[f5,a5,c6]@7 ~]/2", CD: "[[e5,a5,c6,e6]@3 ~]/2",
})).s("gm_church_organ").gain(0.6)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A B C D A B C E A@2 F G H A F G A@2 C G H A@3 C@2 A B C I J K G L J K G L J K M L N K@2 N G O F P M A Q@2 R S T@2 R S
  T@2 U V Q W Q@2 U@2 X Y G Z X Y AA AB AC AD AE AF AG@2 AE AF AG AH AI AJ AK@4 AI@2 L@2 AL AM L AN AL AM AO AN AP AQ AR
  P AS AT AR P AS AU AV AW AO AX AV AW AO AX AV AW AY@2
>`.pickRestart({
  A: "d2!8", B: "d2!5 db2 c2 b1", C: "bb1!8", D: "ab1 bb1!7", E: "ab1 bb1!4 b1 c2 db2", F: "g2!8", G: "c2!8",
  H: "d2!7 c2", I: "ab1 bb1!3 db2 c2 b1 bb1", J: "g2!6 d3@2", K: "g2!6 d2!2", L: "f2!8", M: "eb2!8", N: "g2!7 d2",
  O: "gb2!8", P: "g2!5 gb2 f2 e2", Q: "e2!2 ~ e2 e2@2 ~ e2", R: "a2!2 ~ a2 a2@2 ~ a2", S: "gb2!2 ~ gb2 gb2@2 ~ gb2",
  T: "b2!2 ~ b2 b2@2 ~ b2", U: "c2!2 ~ c2 c2@2 ~ c2", V: "d2!2 ~ d2 d2@2 ~ d2", W: "e2!2 ~ e2 e2@2 b1!2", X: "e2!8",
  Y: "e2!5 eb2 d2 db2", Z: "c2!5 db2 d2 eb2", AA: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  AB: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ db2 ~ d2 ~ e2 ~", AC: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ eb2 ~",
  AD: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~", AE: "db2@3 db2 db2@3 db2", AF: "eb2@3 eb2 eb2@3 eb2",
  AG: "f2@3 f2 f2@3 f2", AH: "f2@3 f2!3 eb2 c2", AI: "db2 db2@2 db2 db2@3 db2", AJ: "eb2 eb2@2 eb2 eb2@3 eb2",
  AK: "f2 f2@2 f2 f2@3 f2", AL: "db2!8", AM: "db2!5 d2 eb2 e2", AN: "f2!5 e2 eb2 d2", AO: "f2!3 eb2 f2!4",
  AP: "db2!3 b1 db2!4", AQ: "db2!5 eb2 f2 gb2", AR: "g2!3 f2 g2!4", AS: "eb2!3 db2 eb2!4", AT: "eb2!5 e2 f2 gb2",
  AU: "eb2!5 f2 g2 ab2", AV: "a2!3 g2 a2!4", AW: "a2!5 ab2 g2 gb2", AX: "f2!5 gb2 g2 ab2", AY: "[a2@3 ~]/2",
})).s("gm_acoustic_bass").gain(0.65)

// other · epiano2 · "Phantom"
const epiano2 = note(`<
  ~@31 A B@2 C@2 B@2 D E F@2 G@2 H@2 I@2 J@2 ~@9 K L M N@2 O@2 P@2 Q R S ~@8 T U@2 V@2 W@2 ~ X Y@2 Z@2 AA@2 AB@2 AC ~@9
  AD@2 ~@2 AE@2 ~@2 AE@2 ~@2 AF@2 ~@8
>`.pickRestart({
  A: "~ d4 g4 d4", B: "[f4@3 eb4 eb4@6 c4@2 f4@3 c4]/2", C: "[d4@5 d4 g4 d4]/2", D: "d4", E: "~ d3 g3 bb3",
  F: "[d4@3 c4 c4@6 c4@2 f4@3 c4]/2", G: "[d4@6 ~ d4]/2", H: "[g4@9 f4 eb4 d4 c4 bb3 a3 g3]/2",
  I: "[gb3@10 eb3@2 eb3@3 d3]/2", J: "[d3@3 ~]/2", K: "~@2 a4@2 d5@3 a4", L: "b4", M: "~ b3 e4 g4",
  N: "[b4@3 a4 a4@6 a4@2 d5@3 a4]/2", O: "[b4@6 ~ b4]/2", P: "[e5@9 d5 c5 b4 a4 g4 gb4 e4]/2", Q: "eb4",
  R: "~@2 c4@2 c4@3 b3", S: "b3", T: "~ c4 f4 c4", U: "[eb4@3 db4 db4@6 bb3@2 eb4@3 bb3]/2", V: "[c4@5 c4 f4 c4]/2",
  W: "[eb4@3 db4 db4@6 ~@6]/2", X: "~ c4 f4 ab4", Y: "[c5@3 bb4 bb4@6 bb4@2 eb5@3 bb4]/2", Z: "[c5@6 ~ c5]/2",
  AA: "[f5@9 eb5 db5 c5 bb4 ab4 g4 f4]/2", AB: "[e4@10 db4@2 db4@3 c4]/2", AC: "c4", AD: "[~@2 ab5@5 ~]/2",
  AE: "[~@2 bb5@5 ~]/2", AF: "[~@2 c6@5 ~]/2",
})).s("gm_epiano2").gain(0.69).pan(0.3)

// other · string ensemble 1 · "Orchestra"
const string_ensemble_1 = note(`<
  ~@5 A B C D ~@18 E F G ~@19 E F ~@27 H I ~@16 J@2 K L J M K L N M O P Q R S T Q R S U V W N X V W N X V W Y@2
>`.pickRestart({
  A: "~@4 d5 db5 c5 b4", B: "bb4@5 ~@11", C: "~@8 bb4 ~ b4 ~ c5 ~ db5 ~", D: "d5@5 ~@11", E: "~@8 d5 ~ db5 ~ c5 ~ b4 ~",
  F: "bb4@5 ~@3", G: "ab4 ~ bb4@3 ~@11", H: "~@14 eb4 ~", I: "f4@3 ~@13", J: "f4!8", K: "db4!8", L: "db4!5 d4 eb4 e4",
  M: "f4!5 e4 eb4 d4", N: "f4!3 eb4 f4!4", O: "db4!3 b3 db4!4", P: "db4!5 eb4 f4 gb4", Q: "g4!3 f4 g4!4",
  R: "g4!5 gb4 f4 e4", S: "eb4!3 db4 eb4!4", T: "eb4!5 e4 f4 gb4", U: "eb4!5 f4 g4 ab4", V: "a4!3 g4 a4!4",
  W: "a4!5 ab4 g4 gb4", X: "f4!5 gb4 g4 ab4", Y: "[a4@3 ~]/2",
})).s("gm_string_ensemble_1").gain(0.62)

// bass · pizzicato strings · "Orchestra"
const bass_2 = note(`<
  ~@5 A B C D ~@18 A B E ~@19 A B ~@27 F G ~@16 H@2 I J H K I J L K M N O P Q R O P Q S T U L V T U L V T U W ~
>`.pickRestart({
  A: "~@4 d3 db3 c3 b2", B: "bb2 ~@7", C: "~@4 bb2 b2 c3 db3", D: "d3 ~@7", E: "ab2 bb2 ~@6", F: "~@7 eb2", G: "f2 ~@7",
  H: "f2!8", I: "db2!8", J: "db2!5 d2 eb2 e2", K: "f2!5 e2 eb2 d2", L: "f2!3 eb2 f2!4", M: "db2!3 b1 db2!4",
  N: "db2!5 eb2 f2 gb2", O: "g2!3 f2 g2!4", P: "g2!5 gb2 f2 e2", Q: "eb2!3 db2 eb2!4", R: "eb2!5 e2 f2 gb2",
  S: "eb2!5 f2 g2 ab2", T: "a2!3 g2 a2!4", U: "a2!5 ab2 g2 gb2", V: "f2!5 gb2 g2 ab2", W: "a2 ~@7",
})).s("gm_pizzicato_strings").gain(0.62)

// other · timpani
const timpani = note(`<
  ~@3 A ~@3 B ~@4 C D ~@2 E F ~@9 G H ~ I J ~@2 I J ~@2 I J ~@2 I J ~@2 I J ~ K L M N ~@3 O P Q R O P C S E T E T U ~ V
  ~ W X ~@2 Y Z AA AB AC ~ AD AE AF AG AD AE AF L AD AH AD AH AF AI AD AH AF AI AD AH AF AI AD AH AF AI AJ J AK L AJ J
  AK L AL AM AD AH AL AM AD AH AL AM AN ~
>`.pickRestart({
  A: "ab2@2 bb2@3 ~@11", B: "ab2 bb2@6 ~", C: "~@7 c2", D: "d3 ~@7", E: "~@7 e2", F: "e2@3 ~@13", G: "~@4 d3 db3 c3 b2",
  H: "bb2", I: "~@3 d3", J: "g2 ~@7", K: "~@4 g2 gb2 f2 e2", L: "eb2 ~@7", M: "~@6 d2!2", N: "e2!2 ~ e2 e2@2 ~ e2",
  O: "~@7 b2", P: "b2!2 ~@6", Q: "~@7 a2", R: "gb2!2 ~@6", S: "d2!2 ~@6", T: "e2!2 ~@6", U: "c2!2 ~ c2 c2@2 ~ c2",
  V: "e2", W: "~@6 c2!2", X: "c2 ~@7", Y: "~@12 c2 ~ c2 ~", Z: "c2 ~@15", AA: "~@12 f2 ~ eb2 ~", AB: "f2 ~@13 eb2 ~",
  AC: "f2@3 ~@13", AD: "~@6 f2!2", AE: "f2 ~@3", AF: "~@6 db2!2", AG: "eb2 ~@3", AH: "f2 ~@7", AI: "db2 ~@7",
  AJ: "~@6 g2!2", AK: "~@6 eb2!2", AL: "~@6 a2!2", AM: "a2 ~@7", AN: "a2",
})).s("gm_timpani").gain(0.8)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A B@3 C B@4 D B E B@2 F G B F B@3 F H I J E B H E B@2 F B@3 K L E B@4 M N J I B@2 F O P D@2 J Q D@2 K R Q D@3 B S
  Q T Q D F U B@2 F V W B D B X E D@2 J Y Q B D@5 Y E Z AA AB P Z@2 AA P Z@2 AC P Z@2 AD P Z AE AF P Z@2 AE P AG AH AG P
  AI AJ ~
>`.pickRestart({
  A: "~@8 x!6 ~@2", B: "~ x ~ x", C: "~@4 x ~@3 x!2 ~ x!3 ~@2", D: "~@4 x ~@7 x!2 ~@2", E: "x!2 ~ x",
  F: "~@4 x ~@6 x!3 ~@2", G: "x ~@3 x ~@6 x!3 ~@2", H: "~@4 x ~@3 x!2 ~ x!3 ~ x", I: "x!2 ~@2 x ~@7 x ~@3",
  J: "~@4 x ~@6 x!5", K: "~@4 x ~@6 x!3 ~ x", L: "x ~@3 x ~@6 x!5", M: "~@4 x ~@3 x!2 ~ x!2 ~ x!2",
  N: "x ~@3 x ~@3 x ~@2 x!3 ~@2", O: "~@8 x!2 ~ x!2 ~ x!2", P: "x ~@3 x!2 ~@6 x!2 ~@2", Q: "x ~@3 x ~@7 x!2 ~@2",
  R: "~@3 x!3 ~ x!3 ~ x!3 ~@2", S: "x ~@3 x ~@3 x ~@3 x!4", T: "~@4 x ~@3 x!2 ~ x!4 ~", U: "x!2 ~ x!3 ~@6 x!2 ~@2",
  V: "x!2 ~ x!7 ~ x!3 ~ x", W: "x ~@3 x ~@4 x ~@2 x!2 ~@2", X: "~@4 x ~@6 x!4 ~", Y: "~@4 x ~@2 x!3 ~ x!5",
  Z: "~@4 x!2 ~@6 x!2 ~@2", AA: "~@4 x!2 ~@2 x!2 ~ x!5", AB: "x ~@2 x!3 ~@5 x!3 ~ x", AC: "~@4 x!2 ~@2 x!8",
  AD: "~@3 x!3 ~@2 x!8", AE: "~@4 x!2 ~ x!3 ~ x!5", AF: "x ~@3 x!2 ~@2 x!6 ~ x", AG: "x ~@3 x!2 ~@2 x!8",
  AH: "x ~@3 x!2 ~@5 x!3 ~@2", AI: "x ~@2 x!3 ~ x!9", AJ: "x!3 ~@13",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@3 A ~ B ~@10 A ~ C ~ C ~ A ~ C D ~ C ~@2 C ~ C ~@3 C ~ A ~@3 C ~@4 D ~@4 E F ~@3 G ~@4 C ~@10 C ~@4 H ~@3 C ~@3 G C
  ~@7 C ~@3 I ~@3 B ~@7 J ~@3 B ~@3 B ~@3 B ~@4
>`.pickRestart({
  A: "~@15 x", B: "~@3 x", C: "~@7 x", D: "~@6 x!2", E: "~@9 x!2 ~@5", F: "~ x!2 ~@13", G: "~@13 x ~@2",
  H: "~ x!3 ~ x ~@2 x ~@3 x!2 ~@2", I: "~ x ~@2", J: "~@2 x ~@2 x ~@2",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@3 A ~ B ~@10 C ~ C ~ C ~@4 D ~@10 C ~ A ~@8 D ~@4 E F ~@2 G ~@12 A ~@3 H ~@3 I J ~@3 G ~@3 A D ~@7 D ~@3 H ~@3 A ~@7
  H ~@3 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@7 x", B: "~@5 x ~@2", C: "~@3 x", D: "~@13 x ~@2", E: "~ x ~@7 x ~@6", F: "~ x ~@14", G: "~@15 x", H: "~ x",
  I: "~@13 x ~ x", J: "~@4 x!2 ~ x ~ x ~ x ~@2 x ~",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@7 A@2 ~@3 A ~@3 A ~@15 A@8 ~@20 B ~ A@11 C A@4 ~@10 A@38 ~@2>".pickRestart({
  A: "~@5 x ~@2", B: "~@15 x", C: "~@5 x!2 ~",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@3 A ~ B ~@6 C ~@3 D ~@7 C ~@2 C ~@2 C ~ C ~@5 C ~@3 C ~@9 E F ~@2 G ~@16 H ~@3 D I ~@7 J C ~@7 C ~@3 C ~@3 J ~@7 K
  ~@3 J ~@3 J ~@3 J ~@4
>`.pickRestart({
  A: "~@13 x ~@2", B: "~ x", C: "~@3 x", D: "~@7 x", E: "x ~@3 x!2 ~@2", F: "x!2 ~@6", G: "~@6 x!2", H: "~@5 x ~@2",
  I: "~@9 x!3 ~ x ~ x", J: "~@15 x", K: "~@3 x ~@2 x ~",
})).gain(0.64)

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

// drums · ride
// … 14 more lines

More by Andrew Lloyd Webber