Strudelify

Phantom of the Opera

Broadway

KeyC majorTempo125 bpm
0:00/0:00
// Phantom of the Opera — Broadway
// 125 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 11 "Synthetic Brass 2" synth brass 2 (copy of ch 1 "Organ (Rock)" rock organ); ch 2 "Organ (Rock)" rock organ (copy of ch 12 "Electric Guitar (Clean)" electric guitar clean); ch 13 "Synthetic Brass 2" synth brass 2 (copy of ch 3 "Organ (Rock)" church organ); ch 4 "Organ (Rock)" church organ (copy of ch 14 "Electric Guitar (Clean)" electric guitar clean)
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(125/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · "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.

// other · church organ · "Organ (Rock)"
const church_organ = note(`<
  A@2 B ~ A@2 C D E@2 ~ F G H I J@2 B ~ K L M@2 N@2 O@2 P@2 Q R S@2 T U V W X@2 Y ~ Z AA AB@2 AC@2 AD@2 AE@2 AF AG AH@2
  AI AJ AK AL AM@2 AN ~ AO AP AQ@2 AR@2 AS AT AU AV AW@2 AX AY AZ@2 ~ BA BB BC BD@2 BB BC BE ~ BF BC BG@2 BH@2 BI@2 BJ
  BK BL@2 BJ BK BL@2 BM BN BO@2 BP BQ BR@2 BP BQ BR@2 BS BT BU@2 BV@2 BW@2 BX@3
>`.pickRestart({
  A: "[f4@12 f4 e4 d#4!2]/2", B: "d4", C: "d4 d4@3", D: "c4 d4 ~@2 d4 d#4 e4!2", E: "[f4@5 ~@3]/2", F: "d4!2",
  G: "e4 ~", H: "d4@7 g3", I: "a3 ~@3", J: "[d4 d4@2 ~]/2", K: "a#3!2", L: "c4 ~", M: "[d4@6 ~ d4]/2",
  N: "[f4@9 ~@7]/2", O: "[e3@5 e3 e3@2]/2", P: "[f3@12 a3 g#3 g3 f#3]/2", Q: "f3", R: "d#3 f3@3 ~@4", S: "[d3@5 ~@3]/2",
  T: "g4!2", U: "a4 ~", V: "g4@7 c4", W: "d4 ~@3", X: "[g4 g4@2 ~]/2", Y: "g4", Z: "d#4!2", AA: "f4 ~",
  AB: "[g4@6 ~ g4]/2", AC: "[a#4@9 ~@7]/2", AD: "[a3@5 a3 a3@2]/2", AE: "[a#3@12 d4 c#4 c4 b3]/2", AF: "a#3",
  AG: "~ a3@3", AH: "[b3@5 g3 g3@2]/2", AI: "e4!2", AJ: "f#4 ~", AK: "e4@7 a3", AL: "b3 ~@3", AM: "[e4 e4@2 ~]/2",
  AN: "e4", AO: "c4!2", AP: "d4 ~", AQ: "[e4@6 ~ e4]/2", AR: "[g4@9 ~@7]/2", AS: "f#3", AT: "~ d#3 d#3@2",
  AU: "b3@3 b3", AV: "b3@3 b3 b3@3 b3", AW: "[c4@2 e4@5 g4]/2", AX: "g4@3 g4", AY: "g4@3 g4 g4@3 g4", AZ: "[g4 g5@3]/2",
  BA: "c5 g#4 g#4@2", BB: "f4!2", BC: "d#4 ~", BD: "[f4@5 f4 f4@2]/2", BE: "f4", BF: "c#4!2", BG: "[f4@6 ~ f4]/2",
  BH: "[g#4@9 ~@7]/2", BI: "[g3@3 e3]/2", BJ: "c4@3 c4", BK: "c4@3 c4 c4@3 c4", BL: "[c#4@2 g#4@5 ~]/2", BM: "c5",
  BN: "g#4!2", BO: "[g#4@2 d#5@5 ~]/2", BP: "d5", BQ: "a#4!2", BR: "[a#4@2 f5@5 ~]/2", BS: "e5", BT: "c5!2",
  BU: "[c5@2 f5@5 ~]/2", BV: "[e5@7 ~]/2", BW: "[f5@7 ~]/2", BX: "[~@2 a5@3 ~, e5 ~]/3",
})).s("gm_church_organ").gain(0.36)

// other · lead 5 charang · "Lead5 (Charang)"
const lead_5_charang = note(`<
  ~@62 A B@2 C@2 D@2 E F G H I@2 ~@2 J@2 ~ K L@2 M@2 L@2 N O P@2 Q@2 R@2 S@2 T ~ U@2 T ~ U@2 ~@21 V@2
>`.pickRestart({
  A: "~ b3 e4 g4", B: "[b4@3 a4 a4@6 a4@2 d5@3 a4]/2", C: "[b4@6 ~ b4]/2", D: "[e5@9 d5 c5 b4 a4 g4 f#4 e4]/2",
  E: "d#4", F: "~@2 c4@2 c4@3 b3", G: "b3", H: "f#4@3 e4 e4@3 e4", I: "[e4@2 g4@5 ~]/2", J: "[~ c5@3]/2",
  K: "~ c5 f5 c5", L: "[d#5@3 c#5 c#5@6 a#4@2 d#5@3 a#4]/2", M: "[c5@5 c5 f5 c5]/2", N: "c5", O: "~ c4 f4 g#4",
  P: "[c5@3 a#4 a#4@6 a#4@2 d#5@3 a#4]/2", Q: "[c5@6 ~ c5]/2", R: "[f5@9 d#5 c#5 c5 a#4 g#4 g4 f4]/2",
  S: "[e4@10 c#4@2 c#4@3 c#4]/2", T: "c4", U: "[~@2 c#4@5 ~]/2", V: "[c6@3 ~]/2",
})).s("gm_lead_5_charang").gain(0.2)

// bass · acoustic bass · "Accoustic Bass"
const bass = note(`<
  A B C D A B C E A@3 F G A@2 F G A@2 C G H A@3 C@2 A B C I J K L M F@2 L M F@2 N M O F@3 N@2 F P N A Q@2 R S Q@2 T S
  Q@2 U S V W Q@2 U@2 X Y G Z X Y G AA M@2 AB AC AD@2 AE AF AG AH AE AF AG@4 AE@2 M@2 AI AJ M AK AI AJ AL AK AM AN AO P
  AP AQ AO P AP AQ AR AS AL AT AR AS AL AT AR AU AV
>`.pickRestart({
  A: "d2!8", B: "d2!5 c#2 c2 b1", C: "a#1!8", D: "g#1 a#1!7", E: "g#1 a#1!4 b1 c2 c#2", F: "g2!8", G: "c2!8",
  H: "d2!7 c2", I: "g#1 a#1!3 c#2 c2 b1 a#1", J: "g2!6 d3@2", K: "g2!6 d2!2", L: "c3!8", M: "f2!8", N: "d#2!8",
  O: "g2!7 f2", P: "g2!5 f#2 f2 e2", Q: "e2!2 ~ e2 e2@2 ~ e2", R: "a2!2 ~ a2 a2@2 ~ a2", S: "d2!2 ~ d2 d2@2 ~ d2",
  T: "a2!8", U: "c2!2 ~ c2 c2@2 ~ c2", V: "e2!2 ~ e2 e2@2 ~ d2", W: "e2!2 ~ e2 e2@2 b1!2", X: "e2!8",
  Y: "e2!5 d#2 d2 c#2", Z: "c2!5 c#2 d2 d#2", AA: "c2!5 c#2 d2 e2", AB: "c#2@3 c#2 c#2@3 c#2",
  AC: "d#2@3 d#2 d#2@3 d#2", AD: "f2@3 f2 f2@3 f2", AE: "c#2 c#2@2 c#2 c#2@3 c#2", AF: "d#2 d#2@2 d#2 d#2@3 d#2",
  AG: "f2 f2@2 f2 f2@3 f2", AH: "f2@3 f2!3 d#2 c2", AI: "c#2!8", AJ: "c#2!5 d2 d#2 e2", AK: "f2!5 e2 d#2 d2",
  AL: "f2!3 d#2 f2!4", AM: "c#2!3 b1 c#2!4", AN: "c#2!5 d#2 f2 f#2", AO: "g2!3 f2 g2!4", AP: "d#2!3 c#2 d#2!4",
  AQ: "d#2!5 e2 f2 f#2", AR: "a2!3 g2 a2!4", AS: "a2!5 g#2 g2 f#2", AT: "f2!5 f#2 g2 g#2",
  AU: "a2@2 a2@2 a2@2 a2@2 a2@2 a2@2 a2 ~ a2@2", AV: "a2 ~@7",
})).s("gm_acoustic_bass").gain(0.4)

// other · electric guitar clean · "Electric Guitar (Clean)"
const electric_guitar_clean = note(`<
  A@2 B ~ A@2 B C D@2 E F G H I J@2 B K L M N@2 O@2 P@2 Q@2 R S T@2 U V W X Y@2 Z AA F AB AC@2 AD@2 AE@2 AF@2 AG AH AI@2
  AB AJ AK AL AM@2 AN AO M AP AQ@2 AR@2 AS AT AU AV AW@3 AX AY@2 AZ BA BB F BC@2 BB F BD BE BF F BG@2 BH@2 BI@2 BJ BK
  BL@2 BJ BK BL@2 BM U BN@2 BO BP BQ@2 BO BP BQ@2 BR BS BT@2 BU@4 BV@3
>`.pickRestart({
  A: "[a4@12 a4 g#4 g4 f#4]/2", B: "f4", C: "d#4 f4 ~@2 f4 f#4 g4 g#4", D: "[a4@5 ~@3]/2", E: "~ f4 f4@2", F: "g4!2",
  G: "g4 ~ e4@2", H: "f4@7 c4", I: "d4 f4 f4@2", J: "[g4 g4@2 e4]/2", K: "~ a3@3", L: "d4!2", M: "e4!2",
  N: "[f4@6 ~ f4]/2", O: "[a4@9 ~@7]/2", P: "[g3@5 g3 g3@2]/2", Q: "[a3@12 d4 c#4 c4 b3]/2", R: "a#3",
  S: "g#3 a#3@3 c#4 c4 b3 a#3", T: "[g3@5 a3 a3@2]/2", U: "c5!2", V: "c5 ~ a4@2", W: "a#4@7 f4", X: "g4 a#4 a#4@2",
  Y: "[c5 c5@2 a4]/2", Z: "a#4", AA: "~ d4@3", AB: "a4!2", AC: "[a#4@6 ~ a#4]/2", AD: "[d5@9 ~@7]/2",
  AE: "[c4@5 c4 c4@2]/2", AF: "[d4@12 g4 f#4 f4 e4]/2", AG: "d#4", AH: "f#3", AI: "[e4@5 b3@3]/2", AJ: "a4 ~ f#4@2",
  AK: "g4@7 d4", AL: "e4 g4 g4@2", AM: "[a4 a4@2 f#4]/2", AN: "g4", AO: "~ b3@3", AP: "f#4!2", AQ: "[g4@6 ~ g4]/2",
  AR: "[b4@9 ~@7]/2", AS: "a3", AT: "~ f#3 f#3@2", AU: "g3@3 g3", AV: "g3@3 g3 g3@3 g3", AW: "[g3@2 c4@5 e4@4 b4]/3",
  AX: "b4@3 b4 b4@3 b4", AY: "[b4 e5@3]/2", AZ: "f5@2 f4 ~ a#4 ~ f4 ~ g#4 ~ a#4 ~ g#4 ~ d#5@2", BA: "f5 c5 f5 c5",
  BB: "g#4!2", BC: "[g#4@5 g#4 g#4@2]/2", BD: "g#4", BE: "~ c4@3", BF: "f4!2", BG: "[g#4@6 ~ g#4]/2",
  BH: "[c5@9 ~@7]/2", BI: "[a#3@3 g3]/2", BJ: "f4@3 g4", BK: "g4@3 f4 f4@3 f4", BL: "[f4@2 c5@5 ~]/2", BM: "f5",
  BN: "[c#5@2 f5@5 ~]/2", BO: "g5", BP: "d5!2", BQ: "[d#5@2 g5@5 ~]/2", BR: "a5", BS: "e5!2", BT: "[f5@2 a5@5 ~]/2",
  BU: "[a5@7 ~]/2", BV: "[~@2 e5@3 ~, a5 ~]/3",
})).s("gm_electric_guitar_clean").gain(0.4)

// other · electric guitar clean · "Electric Guitar (Clean)"
const electric_guitar_clean_2 = note(`<
  A@2 B ~ A@2 B C D@2 ~@13 E@2 ~ F G@2 H I J@2 ~@12 K@2 ~ L M@2 N ~ O@2 ~@7 P Q@2 R@2 S@2 T U V W X@2 V W Y@2 Z AA ~@6
  AB ~@5 AC@2 ~@2 AD AE AF@2 AD AE AF@2 ~@14 AG@2 AH@4 AI@3
>`.pickRestart({
  A: "[d3@12 d3 c#3 c3 b2]/2", B: "a#2", C: "g#2 a#2 ~@2 a#2 b2 c3 c#3", D: "[d3@5 ~@3]/2", E: "[d4@9 ~@7]/2",
  F: "~ d3", G: "[d4@12 f3 e3 d#3 c#3]/2", H: "d3", I: "c3 d3@3 ~@4", J: "[a#2@5 ~@3]/2", K: "[g4@9 ~@7]/2", L: "~ g3",
  M: "[g4@12 a#3 a3 g#3 f#3]/2", N: "g3", O: "[g3@5 g3 g3@2]/2", P: "~ b3 e4 g4", Q: "[b4@3 a4 a4@6 a4@2 d5@3 a4]/2",
  R: "[b4@6 ~ b4]/2", S: "[e5@9 d5 c5 b4 a4 g4 f#4 e4]/2", T: "d#4", U: "~@3 e5", V: "e5@3 f#5", W: "f#5@3 e5 e5@3 e5",
  X: "[e5@2 b5@5 e5]/2", Y: "[e5 b5@3]/2", Z: "g#4 ~@6 g4", AA: "g#4 f4 f4@2", AB: "c5@2 ~ c5", AC: "[f4@9 ~@7]/2",
  AD: "g#3@3 g#3", AE: "g#3@3 g#3 g#3@3 g#3", AF: "[g#3@2 f4@5 ~]/2", AG: "[~@2 c6@5 ~]/2", AH: "[c6@7 ~]/2",
  AI: "[~@2 e6@3 ~, c6 ~]/3",
})).s("gm_electric_guitar_clean").gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@29 [~@3 x] ~@98>").gain(0.25)

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

// drums · low tom
const low_tom = s("lt").struct("<A B C D C A C@6 E C@16 F C@2 G H@2 I J ~@18 C E C@30 ~@41>".pickRestart({
  A: "~ x", B: "x", C: "x!2", D: "x!8", E: "x ~@3 x ~@3 x ~@2 x ~@4", F: "x ~ x!2", G: "x ~@2 x ~@4 x ~@7",
  H: "~ x ~ x", I: "~@4 x!2 ~@6 x ~@3", J: "~@4 x!2 ~@10",
})).gain(0.25)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@14 A B@2 C B@3 D E F B F G B@2 ~@29 A B@2 C B@3 D E F B F H B@2 A@2 B@2 H A ~@21 H ~@27
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x!2 ~@6 x ~@3", D: "~@4 x!2 ~@2 x ~@3 x!2 ~@2", E: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x ~",
  F: "~@3 x!2 ~ x ~@5 x ~@3", G: "~@3 x!2 ~@7 x ~@3", H: "~ x ~@2",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@33 A B A@20 ~@18 C@2 ~@2 D C ~@30 A@8 ~@11>".pickRestart({
  A: "x!2", B: "x ~@3 x ~@3 x ~@2 x ~@4", C: "~ x ~@2", D: "~@3 x",
})).gain(0.25)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@36 A B@2 C B@3 D E F B F G B@2 G@2 H I ~@15 A ~@9 D A ~@2 B@2 ~ E ~ F B F J B K B@5 L M B@2 N O B@2 N O B@2 N O B@2
  N P@10 ~
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x!2 ~@6 x ~@3", D: "~@4 x!2 ~@2 x ~@3 x!2 ~@2", E: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x ~",
  F: "~@3 x!2 ~ x ~@5 x ~@3", G: "~@3 x!2 ~@7 x ~@3", H: "x ~ x ~@3 x ~ x!8", I: "x!4 ~@4 x ~@7",
  J: "~@4 x ~@6 x!2 ~@3", K: "~@3 x!2 ~@3 x ~@3 x ~@3", L: "~@11 x!2 ~ x ~", M: "x ~@2 x", N: "~@4 x ~@6 x!2 ~ x ~",
  O: "x!2 ~ x", P: "x!2",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ B@2 C ~ B ~@3 B ~@21 B ~@17 D E@11 ~@4 F ~@6 G ~@4 B H F I@2 ~@2 I ~@6 J ~@6 F ~@16 K I@2 L F@3 G F M N
>`.pickRestart({
  A: "~@4 x!2 ~@2", B: "x", C: "~ x", D: "~ x ~@6 x ~@7", E: "x!2", F: "~ x ~@2", G: "~@3 x",
  H: "x ~@3 x!2 ~@2 x ~@3 x!2 ~@2", I: "~ x ~ x", J: "~ x ~@14", K: "x!2 ~ x", L: "~@4 x ~@6 x!2 ~ x ~", M: "x!16",
  N: "x!7 ~ x ~@7",
})).gain(0.25)

// drums · ride
const ride = s("rd").struct("<~@79 A ~ B ~@2 C@2 ~ D ~ E C E F C G C@5 H I J ~@18 B@3 J B K L>".pickRestart({
  A: "~@7 x", B: "~@3 x", C: "~ x ~ x", D: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x ~", E: "~@3 x!2 ~ x ~@5 x ~@3",
  F: "~@4 x ~@6 x!2 ~@3", G: "~@3 x!2 ~@3 x ~@3 x ~@3", H: "~@11 x!2 ~ x ~", I: "x ~@2 x", J: "~ x ~@2", K: "~@9 x!7",
  L: "x!2 ~@14",
})).gain(0.25)

// drums · tambourine
const tambourine = s("tb").struct("<~@81 [~ x ~@2] [~ x ~ x]!2 ~@2 [~ x ~ x] ~@41>").gain(0.25)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@12 A B@20 ~ B@10 C B@6 ~@2 D ~@2 E ~@6 B@4 ~ B@6 E B@4 ~@2 F B@11 ~ B@26 G B@6 ~
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@2 x ~@2 x ~@5", D: "x", E: "~ x ~@2", F: "x ~@8 x ~@6", G: "~@4 x ~@6 x ~@4",
})).gain(0.3)

// drums · congas
const congas = s("conga:33").struct("<~@79 [~@7 x] ~@48>").gain(0.79)

stack(
  church_organ, lead_5_charang, bass, electric_guitar_clean, electric_guitar_clean_2, rim, snare, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash, ride, tambourine, cowbell, congas
)

More by Broadway