Strudelify

The Phantom of the Opera: The Music of the Night

Broadway

KeyD♭ majorTempo100 bpm
0:00/0:00
// The Phantom of the Opera: The Music of the Night — Broadway
// 100 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 8, 4/4 at bar 8, 2/4 at bar 16, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 64 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · string ensemble 1
const string_ensemble_1 = note(`<
  A B A C D E F G H I J K L M@2 N O P Q R S T U V W X A B A C D@2 Y Z AA AB AC AD AE@2 AF AG AH@2 AI AJ AK AL AM@2 N AN
  AO AP AO AP AQ@2 Y AR AS AT AU@2
>`.pickRestart({
  A: "f4@3 ~ ab3@3 ~ eb4@3 ~ ab3@3 ~, db4@3 ~ c4@3 ~",
  B: "~@2 eb4@2 f4@2 gb4@2 ~@4 ab4@3 ~, [ab3,db4]@3 ~ [c4,eb4]@3 ~", // Db5 Cm
  C: "~@2 eb4@2 f4@2 gb4@2 ~@4 ab4@3 ~, [bb3,db4]@3 ~ [c4,eb4]@3 ~", // Bbm Cm
  D: "~@2 db5@2 db5@2 db5@2 eb5@3 ~ db5@2 c5@2, [gb4,bb4]@3 ~ [f4,ab4]@3 ~", // Gb Fm
  E: "~@2 db5@2 db5@2 db5@2 eb5@3 ~ db5@3 ~, [gb4,bb4]@3 ~ [f4,ab4]@3 ~", // Gb Fm
  F: "~ db5!3 [gb4,b4,eb5] db5 bb4 f4, [gb4,bb4]@3 ~@5", G: "[db4,ab4]@3 ~ [gb3,bb3,eb4]@3 ~",
  H: "[ab3,c4,f4]@6 ~@2 f4@3 ~ ab3@3 ~, ~@4 db4@3 ~", I: "eb4@3 ~ ab3@3 ~@3 eb4@2 f4@2 gb4@2, c4@3 ~ [ab3,db4]@3 ~",
  J: "~@4 ab4@3 ~ f4@3 ~ ab3@3 ~, [c4,eb4]@3 ~ db4@3 ~", K: "eb4@3 ~ ab3@3 ~@3 eb4@2 f4@2 gb4@2, c4@3 ~ [bb3,db4]@3 ~",
  L: "~@4 ab4@3 ~@3 db5@2 db5@2 db5@2, [c4,eb4]@3 ~ [gb4,bb4]@3 ~", // Cm Gb
  M: "eb5@3 ~ db5@2 c5@2 ~@2 db5@2 db5@2 db5@2, [f4,ab4]@3 ~ [gb4,bb4]@3 ~", // Fm Gb
  N: "[gb4,b4,eb5] db5 [db4,bb4] f4 db4@3 f4, ~@8 ab4@3 ~@5", // B Gb
  O: "f4 eb4!2 f4 [c4,eb4,gb4] ab4 [ab3,c4,f4] [gb3,c4,eb4], [gb3,bb3]@3 ~@5", // Cdim Fm Cdim Gb
  P: "[f3,ab3,db4]@3 ~ [f3,ab3,db4]@3 ~ [ab3,db4,f4]@3 ~ [db4,f4]@2 ab4@2", // Db
  Q: "eb5@3 ~ db5@2 b4@2 bb4@2 ab4@2 gb4@2 ab4@2, [gb4,b4]@3 ~ [b3,eb4]@3 ~", // B5 B
  R: "ab4@3 ~ gb4@3 ~ [ab3,b3,e4]@3 ~ [e4,ab4]@2 b4@2, [b3,e4]@3 ~@5", // E E5
  S: "e5@3 ~ eb5@2 ~ db5 db5@2 b4@2 b4@2 bb4@2, [a4,db5]@3 ~ [e4,a4]@3 ~", // A A5
  T: "[eb4,g4]@5 ~ [db4,g4,bb4,eb5] eb5, bb4@3 ~@5", // Eb Eb7
  U: "eb5@3 ~ db5@2 c5@2 bb4@2 ab4@2 bb4@2 ab4@2, [ab4,c5]@3 ~ [c4,eb4,gb4]@3 ~", // Ab Cdim
  V: "[ab4,db5,f5,ab5]@6 ~@2 [db4,f4,ab4]@3 ~ c5@2 c5@2", // Db
  W: "c5@3 ~ c5@2 c5@2 c5@2 bb4@2 c5@2 db5@2, [f4,ab4]@3 ~ [e4,g4]@3 ~", X: "[f4,a4,c5]@13 ~@3",
  Y: "~ db5!3 [gb4,b4,eb5] db5 [db4,bb4] f4, [gb4,bb4]@3 ~@5", Z: "db4@3 f4!2 eb4!2 f4, ab4@3 ~@5 [gb3,bb3]@6 ~@2",
  AA: "[c4,eb4,gb4]@2 ab4@2 [ab3,c4,f4]@2 [gb3,c4,eb4]@2 f4@3 ~ ab3@3 ~, ~@4 db4@3 ~", // Cdim Fm Cdim
  AB: "db4 eb4 f4 ab4 f4 ab4 db5 eb5 eb5@3 ~ db5@2 b4@2, ~@4 [eb4,gb4,b4]@3 ~", // B
  AC: "[b3,eb4,gb4,bb4]@2 ab4@2 [b3,eb4,gb4]@2 ab4@2 ab4@3 ~ gb4@3 ~, ~@4 [ab3,b3,e4]@3 ~", // Bmaj7 B E
  AD: "[ab3,b3,e4]@3 ~ [e4,ab4]@2 b4@2 e5@3 ~ eb5@2 ~ db5, ~@4 [e4,a4,db5]@3 ~", // E A
  AE: "[db5@2 b4@2 b4@2 bb4@2 [eb4,g4,bb4]@10 ~@2 [db4,g4,bb4,eb5]@2 eb5@2 eb5@3 ~ db5@2 c5@2, [db4,e4,a4]@3 ~@9 [eb4,ab4,c5]@3 ~]/2", // Eb Eb7 A Ab
  AF: "[c4,eb4,gb4,bb4] ab4 [c4,eb4,gb4,bb4] [c4,eb4,gb4,ab4] [ab4,db5,f5,ab5]@3 ~", // Cm7b5 Ab7 Db
  AG: "~@4 c5@2 c5@2 c5@3 ~ c5@3 ~, ~@4 [f4,ab4]@3 ~", // Fm
  AH: "[c5@2 bb4@2 c5@2 db5@2 [f4,a4,c5]@13 ~@3 f5@3 ~ ab4@3 ~, [e4,g4]@3 ~@9 db5@3 ~]/2", // F Em
  AI: "eb5@3 ~ ab4@3 ~ [f4,db5]@2 eb5@2 [ab4,f5]@2 gb5@2, c5@3 ~@5", // Db
  AJ: "eb5@3 ~ ab5@3 ~ f5@3 ~ ab4@3 ~, c5@3 ~ db5@3 ~",
  AK: "eb5@3 ~ ab4@3 ~ [bb4,db5]@2 eb5@2 [db5,f5]@2 gb5@2, c5@3 ~@5", // Bbm Db
  AL: "eb5@3 ~ ab5@3 ~ [gb4,bb4]@2 [gb4,bb4,db5]@2 [gb4,bb4,db5]@2 [gb4,bb4,db5]@2, c5@3 ~@5", // Gb
  AM: "[f4,ab4,eb5]@3 ~ [f4,ab4,db5]@2 c5@2 [gb4,bb4]@2 [gb4,bb4,db5]@2 [gb4,bb4,db5]@2 [gb4,bb4,db5]@2", // Fm7 Db Gb
  AN: "f4 eb4!2 f4 [c4,eb4,gb4] ab4 [ab3,c4,f4] [gb3,c4,eb4], [bb3,db4]@3 ~@5", // Cdim Fm Cdim Bbm
  AO: "[f4,f5]@3 ~ ab4@3 ~ [eb4,eb5]@3 ~ ab4@3 ~", // F Eb
  AP: "[db4,db5]@2 [eb4,eb5]@2 [f4,f5]@2 [gb4,gb5]@2 [eb4,eb5]@3 ~ [ab4,ab5]@3 ~", // Db Eb F Gb Eb Ab
  AQ: "[bb4,bb5]@2 [db5,db6]@2 [db5,db6]@2 [db5,db6]@2 [eb5,eb6]@3 ~ [db5,db6]@2 [c5,c6]@2", // Bb Db Eb Db C
  AR: "[db4,ab4]@3 ~ f4 eb4!2 f4, ~@4 [gb3,bb3]@3 ~", AS: "gb4 ab4 f4 eb4 [db5,gb5,bb5,db6]@3 ~, [ab3,c4]@3 ~@5",
  AT: "[eb5,gb5,bb5,eb6]@3 ~ [f5,a5,f6]@3 ~", AU: "[[g5,e6,g6]@6 ~@2 [ab5,f6,ab6]@13 ~@11]/2",
})).s("gm_string_ensemble_1").gain(0.37)

// chords · rock organ
const rock_organ = note(`<
  A@3 B C@2 D E@2 F@2 G H I@2 J K L M N O P Q R S T F@3 U V@2 W X@2 Y@6 Z AA@2 AB@3 AC AD@2 AE AF AG@3 AH AI@2 AJ AK AL
  AM AN@2
>`.pickRestart({
  A: "[db2,ab2]@13 ~@3", B: "gb2@3 ~ ab2@3 ~, db2@13 ~@3", C: "[gb2,db3]@3 ~ [db2,db3]@3 ~", D: "[gb2,db3]@3 ~@5",
  E: "[[ab2,f3]@6 ~@2 ab2@13 ~@3 [db2,ab2]@6 ~@2]/2", F: "[db2,ab2]@3 ~ [db2,ab2]@3 ~", G: "[db2,ab2]@3 ~ gb2@3 ~",
  H: "ab2@3 ~ gb2@3 ~", I: "db2@3 ~ gb2@3 ~", J: "b2@3 ~ [gb2,db3]@3 ~ [ab2,f3]@6 ~@2", K: "ab2@13 ~@3",
  L: "[db2,db3]@13 ~@3", M: "~@4 gb3@3 ~", N: "[e2,e3]@13 ~@3", O: "[a2,a3]@13 ~@3", P: "~ eb3 g3 ab3 bb3@3 ~",
  Q: "[ab2,ab3]@13 ~@3", R: "~ ab3 db4 f4 ~@4, [db2,db3]@5 ~@3", S: "[f2,f3]@3 ~ [c3,g3]@3 ~", T: "[f2,f3]@13 ~@3",
  U: "gb2@3 ~ ab2@3 ~", V: "gb2@3 ~ db2@3 ~", W: "gb2@6 ~@2 b2@3 ~ [gb2,db3]@3 ~",
  X: "[[ab2,f3]@6 ~@2 ab2@13 ~@3 [db2,db3]@6 ~@2]/2", // Db
  Y: "[[db2,db3]@6 ~@2 [b1,b2]@10 ~@2 [b1,b2]@3 ~ [e2,e3]@10 ~@2 [b1,b2]@3 ~ [a1,a2]@10 ~@2 [a1,a2]@3 ~ bb3@2 gb3@2 gb3@2 eb3@2 eb3@2 bb2@2 [eb2,eb3]@3 ~ [ab1,ab2]@10 ~@2 [ab1,ab2]@2 [ab1,ab2]@2 [db2,db3,f3]@6 ~@2, ~@28 eb2@5 ~@15, ~@28 eb3@3 ~@17]/6", // Db B E B A Eb Ab Db
  Z: "~@4 [f2,f3]@3 ~", AA: "[[c3,g3]@6 ~@2 [f2,f3]@13 ~@5 ab3@2 db4@2 ab3@2, ~@12 db3@3 ~]/2",
  AB: "~ c4 eb4 c4 ~ ab3 db4 ab3, db3@3 ~ db3@3 ~", AC: "~ c4 eb4 c4 [gb2,gb3]@3 ~, db3@3 ~@5",
  AD: "[db3,ab3]@3 ~ [gb2,gb3]@3 ~", AE: "[b2,gb3]@3 ~ [gb2,gb3]@3 ~ [ab2,f3]@6 ~@2", AF: "[ab2,gb3]@3 ~ [ab1,ab2]@3 ~",
  AG: "~ [db3,f3,ab3]!3 ~ [c3,eb3,ab3]!3, db2@3 ~ db2@3 ~", // Db Ab
  AH: "~ [db3,gb3,bb3]!3 ~ [c3,eb3,gb3,ab3]!3, gb2@3 ~ ab2@3 ~", // Gb Ab7
  AI: "~ [db3,gb3,bb3]!3 ~ [db3,f3,ab3]!3, gb2@3 ~ db2@3 ~", AJ: "[gb2,gb3]@6 ~@2 [b2,gb3]@3 ~ [gb2,gb3]@3 ~",
  AK: "[ab2,f3]@3 ~ ab2@3 ~", AL: "ab2@3 ~ [gb2,gb3]@3 ~", AM: "[eb2,eb3]@3 ~ [d2,d3]@3 ~",
  AN: "[[c2,c3]@6 ~@2 [db2,db3]@13 ~@11]/2", // C Db
})).s("gm_rock_organ").gain(0.44)

stack(string_ensemble_1, rock_organ)

More by Broadway