Strudelify

Nocturne

Billy Joel

KeyG majorTempo126 bpm
0:00/0:00
// Nocturne — Billy Joel
// 126 bpm, 3/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: duplicate parts dropped: ch 5 french horn (copy of ch 4 piano)
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(126/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano
const piano = note(`<
  ~@2 A B C@2 D E F G A B C@2 D E H@2 I J K@2 L M N ~ O P Q@2 R S T U V@2 W X Y@2 Z AA AB ~ W X Y@2 Z AA AC@2 AD AE AF@2
  AG AH AI ~@10 AJ@2 AK@2 AL@2 AM@2 AN@8 AO@8 ~ AP AQ AR@5 AS@2 AT AU@5 AV@4
>`.pickRestart({
  A: "[c5,c6]", B: "[b4,b5]", C: "[g4,g5]/2", D: "[a4,a5]", E: "[g4,g5]", F: "[e4,e5]", G: "e4", H: "[e4,e5]/2",
  I: "~@5 a4@11", J: "[c4,e4]@5 c5@11", K: "[[d4,f4]@5 d5@27]/2", L: "a4@11 b4@5", M: "c5@11 d5@5", N: "b4",
  O: "~@5 a5@11", P: "[c5,e5]@5 c6@11", Q: "[[d5,f5]@5 d6@27]/2", R: "a5@11 b5@5", S: "c6@11 d6@4 ~", T: "b5",
  U: "[b5,d6]@3 [g5,b5]@3 [b4,g5]@2", V: "[~@2 [b4,c5,e5]@27 ~@3]/2", W: "~@2 [c5,e5,a5,c6]@11 ~@3",
  X: "~@2 [b4,d5,g5,b5]@11 ~@3", Y: "[~@2 [g4,b4,e5,g5]@27 ~@3]/2", Z: "~@2 [a4,c5,f5,a5]@11 ~@3",
  AA: "~@2 [g4,b4,d5,g5]@11 ~@3", AB: "~@2 [e4,g4,c5,e5]@11 ~@3", AC: "[~@2 [e4,g4,c5,e5]@27 ~@3]/2",
  AD: "~@7 a4@7 ~@2", AE: "~@2 [c4,e4]@4 ~ c5@7 ~@2", AF: "[~@2 [d4,f4]@4 ~ d5@21 ~@4]/2", AG: "~@2 a4@7 ~@4 b4@3",
  AH: "~@2 c5@7 ~@4 d5@3", AI: "~@2 b4@11 ~@3", AJ: "[~@5 d4@5 ~@6]/2", AK: "[~@8 [d4,g4]@11 ~@6 [f#4,b4,d5]@7]/2",
  AL: "[~@4 c5@4 ~@2 [e4,g#4,b4]@8 ~@3 g#4@2 ~ b4@2 ~ [g#4,e5]@4 ~]/2", // E C#m
  AM: "[~ [e4,b4]@4 ~@2 [g#4,e5]@4 ~@2 [b4,c5,e5]@19]/2", // E5 C#m Cmaj7
  AN: "[~@13 [c5,e5,a5,c6]@11 ~@5 [b4,d5,g5,b5]@11 ~@5 [g4,b4,e5,g5]@27 ~@5 [a4,c5,f5,a5]@11 ~@5 [g4,b4,d5,g5]@11 ~@5 [e4,g4,c5,e5]@11 ~@8]/8", // Am G Em F G C
  AO: "[~@13 [c5,e5,a5,c6]@11 ~@5 [b4,d5,g5,b5]@11 ~@5 [g4,b4,e5,g5]@27 ~@5 [a4,c5,f5,a5]@11 ~@5 [g4,b4,d5,g5]@11 ~@5 [e4,g4,c5,e5]@19]/8", // Am G Em F G C
  AP: "~@3 a4@7 ~@3 [c4,e4]@3", AQ: "~@3 c5@7 ~@3 [d4,f4]@3",
  AR: "[~@3 d5@21 ~@5 a4@7 ~@4 b4@4 ~ c5@7 ~@4 d5@4 ~ b4@11 ~@8]/5", AS: "[~@15 [c5,f5]@8 ~@4 a4@4 ~]/2",
  AT: "~ [e5,a5]@8 ~@4 c5@3", AU: "[~@3 [f5,a#5]@31 ~@7 [a3,c4,e4,a4]@9 ~@5 b4@4 ~@2 [d4,f#4,a4,c5]@9 ~@5 d5@4 ~]/5",
  AV: "[~ [d4,g4,b4]@54 ~@9]/4", // G
})).s("gm_piano").gain(0.26)

// other · piano
const piano_2 = note(`<
  ~@9 A ~@7 B C D E ~ F G ~ H I J K ~ L M ~@11 N ~@7 O P@4 Q@3 R@2 S@2 T U@2 V@2 W X Y Z@3 ~@10 AA AB ~@7 AC AD AE AF ~
  AG AH AI AJ@2 AK AL@3 ~@6
>`.pickRestart({
  A: "e4@3 c4@2 g3@3 e3@3 ~@5", B: "~@11 c5@5", C: "a4@3 g4@2 a4@3 c4@3 f4@2 a4@3", D: "c5@3 b4@2 c5@3 c4@3 e4@2 a4@3",
  E: "d5@3 c5@2 d5@3 c5@3 a#4@2 f4@3", F: "~@5 [c4,e4]@8 c4@3", G: "c5@3 d4@2 f#4@3 a4@5 d4@3",
  H: "b4@3 g4@2 d5@3 b4@3 g5@2 d5@3", I: "a5@3 g5@2 a5@3 c5@3 f5@2 a5@3", J: "c6@3 b5@2 c6@3 c5@3 e5@2 a5@3",
  K: "d6@3 c6@2 d6@3 c6@3 a#5@2 f5@3", L: "~@5 [c5,e5]@8 c5@3", M: "c6@3 d5@2 f#5@3 a5@5 d5@2 ~",
  N: "~@2 e4@3 c4@2 g3@3 e3@3 ~@3", O: "~@13 c5@3",
  P: "[~@2 a4@2 ~ g4@2 a4@2 ~ c4@2 ~ f4@2 a4@2 ~ c5@2 ~ b4@2 c5@2 ~ c4@2 ~ e4@2 a4@2 ~ d5@2 ~ c5@2 d5@2 ~ c5@2 ~ a#4@2 f4@2 ~@15]/4",
  Q: "[~@7 [c4,e4]@5 ~@3 c4@2 ~ c5@2 ~ d4@2 f#4@2 ~ a4@4 ~ d4@2 ~@15]/3", // C
  R: "[~@2 [b4,d5]@4 ~@2 [g4,b4]@4 ~@2 [d4,g4]@4 ~@2 [e4,g#4,b4,e5]@5 ~@2 e4@2 ~ g#4@2]/2", // Bm G G5 E
  S: "[b4@2 ~ [d4,f#4,a4,d5]@5 ~@2 d4@2 ~ f#4@2 a4@2 ~ [d4,b4]@3 ~@2 [c4,a4]@3 ~@2 [b3,g4]@3 ~]/2", // D G F Em
  T: "~ [c#4,a4]@5 ~@2 c#4@2 ~ e4@2 a4@2 ~", // F#m
  U: "[[d4,b4]@5 ~@2 [c4,a4]@2 ~ [b3,g4]@3 ~@2 [c#4,a4]@5 ~@2 c#4@2 ~ e4@2 a4@2 ~ [d#4,a4]@2]/2", // G F Em F#m D#dim
  V: "[~@3 [e4,g4]@3 ~@2 [d#4,f#4]@3 ~@2 [e4,g4]@10 ~@5 [g4,b4,e5,g5]@4]/2", // Em D#m Em
  W: "~@4 g4@2 b4@2 ~ e5@2 [f#4,a4,d5,f#5]@5", X: "~@3 d4@2 f#4@2 ~ a4@2 [b4,d5]@5 ~",
  Y: "~@2 [a4,c5]@2 [g4,b4]@3 ~@2 [e4,a4,c#5]@5 ~@2", // Am G A
  Z: "[~ e4@2 a4@2 ~ c#5@2 b4@4 ~@2 a4@4 ~ g4@4 ~@2 d4@4 ~ d4@7 ~@11]/3", AA: "~@13 e4@3", AB: "c4@3 g3@2 e3@3 ~@8",
  AC: "~@8 c5@4 ~ a4@2 ~", AD: "g4@2 ~ a4@2 c4@2 ~ f4@2 ~ a4@2 c5@2 ~", AE: "b4@2 ~ c5@2 c4@2 ~ e4@2 ~ a4@2 d5@2 ~",
  AF: "c5@2 ~ d5@2 c5@2 ~ a#4@2 ~ f4@2 ~@3", AG: "~@3 [c4,e4]@5 ~@3 c4@2 c5@2 ~", AH: "d4@2 ~ f#4@2 a4@4 ~@2 d4@2 ~@3",
  AI: "~@13 [b4,d5]@3", AJ: "[~@3 [g4,b4]@4 ~@2 [d4,g4]@4 ~@2 a5@2 ~ g5@2 ~ a5@8 ~@3]/2", AK: "~ c6@2 ~ b5@2 ~ c6@8 ~",
  AL: "[~@3 d6@2 ~ c6@2 ~@2 d6@25 ~@13]/3",
})).s("gm_piano").gain(0.26)

// other · piano
const piano_3 = note(`<
  ~@2 A B C@2 D B E F A B C@2 D B G@2 D A H@2 A I J@2 K L M@2 L N O@3 ~ P@8 Q@8 R@7 S@4 T U@8 V@4 ~ W@8 X@8 Y@7 Z@2 ~@11
>`.pickRestart({
  A: "a2", B: "g2", C: "e2/2", D: "f2", E: "c2", F: "b1", G: "c2/2", H: "[a#2,f3,a#3]/2", I: "d3", J: "g2/2",
  K: "f3@11 ~@5", L: "a3", M: "[a#3,f4,a#4]/2", N: "d4", O: "[g3@17 ~@7]/3",
  P: "[~ a2@8 g2@8 e2@16 f2@8 g2@8 c2@8 b1@7]/8", Q: "[~ a2@8 g2@8 e2@16 f2@8 g2@8 c2@15]/8",
  R: "[~ f2@8 a2@8 [a#2,f3,a#3]@16 a2@8 d3@8 g2@7]/7", S: "[~@2 g2@18 e2@15 f#2@15 g2@14]/4", T: "~ a2@15",
  U: "[g2@15 a2@15 b2@15 e2@15 e2@15 f#2@15 g2@15 a2@15 g2@8]/8", V: "[~@3 g2@5 ~ b2@17 e2@36 ~@2]/4",
  W: "[~@13 a2@16 g2@16 e2@32 f2@16 g2@16 c2@16 b1@3]/8", X: "[~@13 a2@16 g2@16 e2@32 f2@16 g2@16 c2@19]/8",
  Y: "[~@13 f2@16 a2@16 [a#2,f3,a#3]@32 a2@16 d3@16 g2@3]/7", Z: "[~@13 g2@18 ~]/2",
})).s("gm_piano").gain(0.26)

stack(piano, piano_2, piano_3)

More by Billy Joel