Strudelify

Theme from Will & Grace

Jonathan Wolff

KeyA majorTempo216 bpm
0:00/0:00
// Theme from Will & Grace — Jonathan Wolff
// 216 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5285172; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 28 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(216/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 · piano
const piano = note("<A B C@2 D E F@2 G H I J K L M N@2 O P@2 Q R S@2 T U@2 V>".pickRestart({
  A: "~@2 [e3,e4]!2 [f#3,f#4]!2 [a3,a4]!2", // E F# A
  B: "~ a2 ~@2 a2 a3 ~ [a3,b3,e4], [a3,c#4,e4]@3 a5@4 ~, ~ a1 ~ a2, ~@3 a4@2 ~@3", // Asus2 A
  C: "[~@2 a3 c#3 ~ c#3 ~@3 d2 ~@2 d3 d2 ~ [a3,b3,e4], c#2@2 ~@5 c#2@2 ~@5 d2@2, ~ e4@3 [a4,a5]@2 a3@2 [b3,e4]@3 [a4,a5]@2 ~@3, ~@8 a3@2 a3@2 ~ a3@2 ~]/2", // Asus2 A E5 A
  D: "e2@2 [e3,e5,g5,a5]@2 [e5,g5,a5]@2 [e5,g5,a5] ~ d5 [d#5,e5,g5,a5] [d5,g5,a5]@2 [c5,g5,a5]@2 [c#5,g5,a5]@2, ~@3 e3 ~ e2@3", // A7 Dsus4 Am7 A7
  E: "~@2 [a4,a5] ~ a2 a3 ~ [a3,b3,e4], [a4,c#5,e5,a5]@2 ~ a5@4 ~, ~ a1@3 ~@2 a2@2, ~@3 a4@2 ~@3", // A Asus2 A
  F: "[~@2 a3 c#3 ~ c#3 ~@3 d2 ~@2 d3 d2 ~ [a3,b3,e4], c#2@2 ~@5 c#2@2 ~@2 [a4,a5]@2 ~ d2@2, ~ e4@3 [a4,a5]@2 a3@2 [a4,b4,e5,a5]@2 a3@2 ~ a3@2 ~]/2", // Asus2 A Asus2
  G: "e2 [e3,a4,a5] [b4,b5] [e3,c5,c6] [c#5,c#6] [e2,e5,b5,e6] [f#5,c#6,f#6] [a5,e6,a6], ~@3 e2", // A5 B C C# E5 F#5 A5
  H: "~ b1 a3 ~ b2 b1 ~ [b4,e5], [a4,b4,d5,f#5,a5]@3 [a4,a5]@2 a3@2 ~, ~@3 b2", // E5 Bm7 A
  I: "~ [b4,e5] ~ c#3 ~ c#3 ~ c#2, c#2@3 ~@5, ~ [e4,a4]!2 a3", // E5 A5
  J: "c#2 d2 ~@2 d3 [d2,a3] ~ [a3,c#4,e4], [b3,e4]@3 [a4,a5]@2 ~@3, ~ a3 ~ d3", // D5 A E5 A
  K: "c#2@2 [c#3,e5,a5]@2 ~@2 [c#3,e5,a5]@2 [c5,e5] [c5,c#5] [c#3,a4]@2 [c#2,f#4]@2 [c#3,e4]@2, ~@4 c#2 ~@3", // A C C#maj7 F#m F#5 C#m
  L: "~@2 [a4,a5] b1 b2 b1 ~ [a4,b4,e5,a5], [a4,b4,d5,f#5,a5]@2 ~ a5@4 ~, ~ b1@2 a4@2 b4@2 ~, ~@3 b2", // A Asus2 Bm7
  M: "~ e5 ~ c#3 [c#3,a4,a5] [c#2,b4,b5] [c#3,e5,c#6]@2, c#2@3 ~@5, ~ [e4,a4] ~@2", // F#m C#7 C#m A5
  N: "[[d2,d3,d5,e5,a5,d6]@2 [d2,d3,d5,e5,a5,d6]@2 [d2,d3,d5,e5,a5,d6]@2 [d2,d3,d5,e5,a5,d6]@4 [d2,d3,d5,e5,a5,d6]@2 [d2,d3,d5,e5,a5,d6]@2 [e2,e3,d5,e5,b5,e6]@4 [e2,e3,d5,e5,b5,e6]@2 e1 [f1,g1] [a1,b1] [c2,d2] [e2,f2] [g2,a2] [b2,c3] [d3,e3] [f3,g3] [a3,b3] [c4,d4] [e4,f4]]/2", // Dsus2 E7 Fsus2 Asus2 Csus2 Fmaj7 Gsus2 Cmaj7 …
  O: "g4 ~@7 a2@2 a3@2 ~@2 [a3,b3,e4]@2, [a3,c#4,e4,a4]@3 [a4,a5]@4 ~, ~ a1@3 ~@2 a2@2", // Asus2 A
  P: "[~@2 a3 c#3 ~ c#3 ~@3 d2 ~@2 d3 d2 a3 [a3,b3,e4], c#2@2 ~@5 c#2@2 ~@5 d2@2, ~ e4@3 [a4,a5]@2 a3@2 [b3,e4]@3 [a4,a5]@2 ~@3, ~@4 a3!2 ~@2]/2", // Asus2 A E5 A
  Q: "e2@2 [e3,e5,g5,a5]@2 [e5,g5,a5]@2 [g5,a5] ~ d5 [d#5,e5,g5,a5] [e2,d5,g5,a5]@2 [c5,g5,a5]@2 c#5@2, ~@3 e3 ~@2 e2@2", // A7 Gsus2 A7 Em7 Am7
  R: "~@2 [a4,a5] ~ a2 a3 ~ [a3,b3,e4], [a4,c#5,e5,a5]@2 ~ [a4,a5]@4 ~, ~ a1@3 ~@2 a2@2", // A Asus2 A
  S: "[~@2 a3 c#3 ~ c#3 ~@3 d2 ~@2 d3 [d2,a3] ~ [a3,b3,e4], c#2@2 ~@5 c#2@2 ~@2 [a4,a5]@2 ~@3, ~ e4@3 [a4,a5]@2 a3@2 [a4,b4,e5,a5]@2 a3@2 ~@2 d3@2]/2", // D5 Asus2 A Asus2
  T: "e2 [e2,e3,e4,e5] [e4,e5] [e2,e3,e4,e5] [e4,e5] [e2,e3,e4,e5]!3", // E
  U: "[[a1,a2,a4,a5] [a1,a2,b4,b5] [a1,a2,c5,c6] [c#5,c#6]@2 [c#2,c#3,e5,e6] [f#5,f#6] d3 d2 [d3,a5,c6,a6] [e3,a5,c6,a6] [e2,a5,c6,a6] [e3,b5] [e2,a5] [e3,f#5] [e2,e5], ~@3 [c#2,c#3] ~@3 [a5,a6]@2 ~@7]/2", // A Asus2 Am C# C#m F# D7 Am …
  V: "c5 [a4,c#5,e5,a5]@14 ~, [a1,a2]@15 ~", // A
})).s("gm_piano").gain(0.25)

stack(piano)