Strudelify

piece by piece

Kelly Clarkson

KeyD♭ majorTempo105 bpm
0:00/0:00
// piece by piece — Kelly Clarkson
// 105 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 33, 4/4 at bar 34) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5952803; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(105/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@6 B@7 C@7 D@4 E@4 F@5 G@2 H I J@2 K L M@2 N O P@2 N Q R S T@2 U V W X Y Z AA AB AC AD AE AF AG AH AI@2 AJ AK AL@2 AM
  AN AO AP AQ AR AS AT AU AV AW@4 AX@6
>`.pickRestart({
  A: "[~@4 [bb2,bb3,db4,f4,ab4]@8 [gb2,bb3,db4,ab4]@8 ~@15 ab3 ~@7 ab3 ~@3 db4, ~@20 [db3,f4]@7 ab3 [db3,f4]@8 bb2@8 gb2@4, ~@21 ab3@3 ab3@2 ab4@7 db4@3 ~ ab3@3 ab3@2 ab4@2 ~@2 ab3@2, ~@22 db4@3 db4@4 ab3@2 eb4@5 f4@3 f4@5 ~ gb3@3, ~@23 eb4@7 db4@2 ab3@2 ab4@2 ~@2 db4@3 db4@3 db4@3 ~]/6", // Bbm7 Gb Db
  B: "[~@2 db4@2 ~@15 ab3 ~@7 c4 ~@7 f3 ~@8 bb3 ~@2 ab3 ~@3 db4 ~@3 eb4, gb3@4 [db3,f4]@7 ab3 [db3,f4]@8 ab2@8 bb2@8 [gb2,gb4]@6 bb3 db4 [gb2,gb4]@4 ab3 db4 eb4@2 eb4@3 ~, ~ ab3@3 ~ ab3@3 ab3@2 ab4@7 db4@3 c4@6 bb3@2 db4@3 db4@2 bb3@3 ~@2 bb3@3 ab3@4 bb3@7 ~ ab3@3, ~@6 db4@3 db4@4 ab3@2 eb4@5 ~ eb3@2 bb3@2 ab3@3 ~@2 ab3@6 ~ ab3@3 gb3@12 ab2@4, ~@7 eb4@7 db4@2 ab3@2 ab4@2 ~@2 ab3@2 eb3@4 ~ f3@3 f3@2 db4@2 ~@3 f4@7 db4 f4@5 ~@2 bb3@2]/7", // Db Gb
  C: "[~@2 eb4@2 ~@7 bb3 bb3@5 ~@9 bb3@2 ab3 ~@6 ab3!2 ~@6 ab3!2 ~@6 ab3 ~@3 eb4, ab3 [bb2,ab4]@2 [gb2,gb4]@2 [gb2,gb4]@2 [db2,db3]@2 [db2,db3]@2 [ab1,ab2]@2 [ab1,ab2], ~ bb3@3 ~ bb3@3 bb3@3 ~@6 bb3@2 bb3@2 bb3@5 ~@3 ab3@3 ab3@3 ~@2 ab3@3 ab3@3 ~ db4@2 db4@3 db4@3 c4@2 c4@2, ~@6 db4@3 db4@3 db4@6 db4@4 db4@6 db4@2 db4@3 db4@3 db4@2 db4@3 db4@3 eb4@3 eb4@3 eb4@2 ~@4, ~@7 f4@3 f4@2 ~@11 f4@5 ab4@3 ab4@3 ab4@2 ab4@3 ab4@3 ab4@2 ~ ab3@3 ab3@3 ~@2 ab3@3]/7", // Bb7 Gb Db Ab
  D: "[~@2 eb4@2 bb3 ~@6 bb3!2 ~@6 bb3 ~@6 db4@2 [gb1,gb2,bb3,db4]@3 [f1,f2,ab3,db4], ab3 [bb1,bb2,ab4]@2 [bb1,bb2]@2 [gb1,gb2]@2 ~, ~ c4@3 db4@2 db4@3 db4@3 db4@2 db4@3 db4@3 db4@2 db4@3 bb3@3 ~@4, ~@5 bb3@3 bb3@2 ab3@2 ~ bb3@3 bb3@3 ~ gb3@3 gb3@5 ~@4, ~@7 f4@5 ~@3 f4@3 f4@2 ~ ab3@3 ab3@4 ~@4]/4", // Gb Db Bb7 Bb Gb
  E: "[~@2 [eb1,eb2,gb3,db4]@2 ab3 ~@6 ab3 ~@7 ab3!2 ~@6 ab3!2 ~@2 eb4, ~ [db2,db3]@2 [db2,db3]@2 [ab1,ab2]@2 [ab1,ab2], ~@4 ab4@3 ab4@5 ab4@3 ab4@3 ab4@2 ~ ab3@2 ab4@5 ~ ab3@3, ~@4 db4@2 db4@3 db4@3 db4@2 db4@3 db4@3 eb4@5 db4@3 c4@2 c4@2, ~@5 ab3@3 ab3@2 eb4@2 ~ ab3@3 ab3@3 ~ db4@2 db4@2 ab3@2 eb4@2 eb4@3 ~]/4", // Ebm7 Db Ab
  F: "[~@2 eb4@2 f3 ~@6 eb4 bb3 ~ db4 ~@4 bb3 gb3 ~@6 gb3 gb3@3 gb3@5 ~@4, ab3@4 [bb1,bb2]@6 db4@2 db4@2 ~ ab4@5 ~ gb3@3 gb3@3 ~@13, ~ c4@3 db4@3 bb3 db4 bb3@3 ~ bb3@3 bb3@2 f4@2 ab3@2 ab3@3 ab3@3 [ab3,db4]@8 ~@4, ~@4 bb3@2 ab3@6 ~@3 db4@2 db4@3 db4@3 db4@3 db4@2 ~@12, ~@5 f3@7 [bb1,bb2]@8 gb1@16 ~@4]/5", // Bb Db5 Bb
  G: "[~@7 ab5, [db3,f5]@6 db5@6 ab3 ab4@3, ab4@3 eb5@2 ab4@2 eb5@2 ab3 db4@6, ~ ab3@2 ab4 ab3@4 [db3,f5]@8, ~@2 db4@6 ab4@3 eb5@5]/2", // Db
  H: "db4@2 ~@5 bb3, bb2, bb3@4 bb3@3 ~, ab4@3 ab4@3 ab4@2, ~@2 db4@3 db4@3",
  I: "gb3 ~@5 db4@2, gb2, db4@3 db4@3 ~@2, ab3@2 ab3@3 ab3@3, ~ gb3@3 gb3@4",
  J: "[db4@3 db4@2 db4@2 db4 f3 ~@2 db4@2 ab3@2 ab3, db2 [db1,db2], ab3@5 ab3@4 f3@7, ~@3 gb3@4 gb3@3 ab3@3 db4@3, ~@8 db4@3 gb3@5]/2", // Db
  K: "bb3 ~@6 bb3, [bb2,ab4], db4@2 db4@3 db4@3, ~ bb3@3 bb3@3 ~, ~@3 f4@3 f4@2", // Bb7
  L: "gb3 ~@6 db4, gb2, db4@3 bb3@5, ab3@2 ab3@3 gb3@3, ~ gb3@3 db4@2 ab3@2",
  M: "[ab3 ~ db4 db4@2 db4@2 db4 db4@3 db4@3 [ab3,db4]@2, db2 [db1,db2,f3], db4@2 ~ gb3@4 gb3@4 gb3@5, ~ ab3@4 ab3@9 ~@2]/2", // Db5 Db
  N: "ab3 ~@5 eb4@2, ab2, eb4@3 eb4@3 ~@2, bb3@2 bb3@3 bb3@3, ~ ab3@3 ab3@4",
  O: "bb3 ~@6 bb3, bb2, ab4@3 ab4@3 ab4@2, db4@2 db4@3 db4@3, ~ bb3@3 bb3@3 ~",
  P: "[~@15 bb3, [gb2,gb4]@6 bb3@2 [gb2,gb4]@5 bb3 db4@2, ~ ab3@3 gb3@12, ~@2 bb3@3 ab3@2 db4@5 ab3@4, ~@3 f4@6 ab3 bb3 f4@5]/2", // Gb
  Q: "bb3@3 ~@3 ab4@2, bb2, ab4@5 f4@3, db4!2, ~@3 bb3@5", R: "[gb2,bb3,db4,ab4]", S: "~@3 ab4 gb5@2 f5 db5",
  T: "ab3 ~@6 ab3, db3, ab4@3 ab4@3 ab4@2, db4@2 db4@3 db4@3, ~ ab3@3 ab3@3 ~",
  U: "ab3 ~@6 ab3, ab2, eb4@3 eb4@3 eb4@2, db4@2 db4@3 db4@3, ~ ab3@3 ab3@3 ~",
  V: "~@3 eb4, ab2, c4@2 c4@3 c4@3, ~ ab3@3 ab3@4, ~@3 eb4@3 ~@2",
  W: "bb3 ~@6 bb3, [bb2,ab4], db4@2 db4@3 db4@3, ~ bb3@3 bb3@2 ab3@2, ~@3 f4@5", // Bb7
  X: "bb3 ~@6 bb3, bb2, db4@2 db4@3 db4@3, ~ bb3@3 bb3@3 ~, ~@3 f4@3 f4@2",
  Y: "~@3 db4, gb2, gb3@3 gb3@5, db4@2 db4@3 bb3@3, ~ ab3@3 ab3@4",
  Z: "[gb1,gb2,bb3,db4]@3 [f1,f2,ab3,db4]@3 [eb1,eb2,gb3,db4]@2", // Gb Db Ebm7
  AA: "ab3 ~@6 ab3, [db2,db3], ab4@3 ab4@5, db4@2 db4@3 db4@3, ~ ab3@3 ab3@2 eb4@2", // Db
  AB: "~@7 ab3, [db2,db3], ab4@3 ab4@3 ab4@2, db4@2 db4@3 db4@3, ~ ab3@3 ab3@3 ~", // Db
  AC: "ab3 ~@6 ab3, [ab1,ab2], eb4@5 db4@3, db4!2 ab3 eb4, ~ ab3@2 ab4@5", // Ab
  AD: "ab3 ~@5 eb4@2, [ab1,ab2], eb4@3 eb4@3 ~@2, c4@2 c4@3 c4@3, ~ ab3@3 ab3@4", // Ab
  AE: "f3 ~@6 eb4, [bb1,bb2]@3 db4, db4@3 bb3 db4 bb3@3, bb3 ab3@3, ~ f3@7", // Bb
  AF: "bb3 ~ db4 ~@4 bb3, [bb1,bb2], db4@2 ~ ab4@5, ~ bb3@3 bb3@2 f4@2, ~@3 db4@2 db4@3", // Bb
  AG: "gb3 ~@6 gb3, [gb1,gb2], db4@3 db4@3 db4@2, ab3@2 ab3@3 ab3@3, ~ gb3@3 gb3@3 ~", AH: "[gb3,ab3,db4]@3 gb3@3 ~@2",
  AI: "[~@7 db5, [db3,f5]@5 ab4@3 [db3,f5]@5 [db4,ab4]@3, ~ ab3@5 ab5@10, ~@2 ab4@3 db4@5 ab4 eb5@5, ~@3 eb5@6 ab3@7]/2", // Db Db5
  AJ: "~@3 ab5, [bb2,f5]@5 [bb3,ab4]@3, ~ f3@7, ~ f4@3, ~@2 ab4 eb5@5", // Bb5 Bb7
  AK: "~ ab4 [gb4,ab4,db5]@2, [gb2,gb3,bb4,gb5], ~ f5@3", // Gbsus2 Gb
  AL: "ab3 ~@6 ab3, [db2,ab2,db3], ab4@3 ab4@3 ab4@2, db4@2 db4@3 db4@3, ~ ab3@3 ab3@3 ~", // Db5
  AM: "ab3 ~@6 ab3, [ab1,eb2,ab2], eb4@3 eb4@3 eb4@2, db4@2 db4@3 db4@3, ~ ab3@3 ab3@3 ~", // Ab5
  AN: "~@3 eb4, [ab1,eb2,ab2], c4@2 c4@3 c4@3, ~ ab3@3 ab3@4, ~@3 eb4@3 ~@2", // Ab5
  AO: "bb3 ~@6 bb3, [bb1,f2,bb2,ab4], db4@2 db4@3 db4@3, ~ bb3@3 bb3@2 ab3@2, ~@3 f4@5", // Bb7
  AP: "bb3 ~@6 bb3, [bb1,f2,bb2], db4@2 db4@3 db4@3, ~ bb3@3 bb3@3 ~, ~@3 f4@3 f4@2", // Bb5
  AQ: "~@3 db4, [gb1,db2,gb2], gb3@3 gb3@5, db4@2 db4@3 bb3@3, ~ ab3@3 ab3@4", // Gb5
  AR: "[gb1,db2,gb2,bb3,db4]@3 [f1,db2,f2,ab3,db4]@3 [eb1,db2,eb2,gb3,db4]@2", // Gb Db Ebm7
  AS: "ab3 ~@6 ab3, [db2,ab2,db3], ab4@3 ab4@5, db4@2 db4@3 db4@3, ~ ab3@3 ab3@2 eb4@2", // Db5
  AT: "~@7 ab3, [db2,ab2,db3], ab4@3 ab4@3 ab4@2, db4@2 db4@3 db4@3, ~ ab3@3 ab3@3 ~", // Db5
  AU: "ab3 ~@6 ab3, [ab1,eb2,ab2], eb4@5 db4@3, db4!2 ab3 eb4, ~ ab3@2 ab4@5", // Ab5
  AV: "ab3 ~@5 eb4@2, [ab1,eb2,ab2], eb4@3 eb4@3 ~@2, c4@2 c4@3 c4@3, ~ ab3@3 ab3@4", // Ab5
  AW: "[f3@2 ~@6 db4@3 ~@4 eb4@2 bb3@2 ~@2 db4@2 ~@6 f4@3 bb3@2 gb3@2 ~@14 gb3@3 [gb3,ab3,db4]@7 ~ gb3@3, [bb1,f2,bb2]@13 db4@4 db4@4 ~@2 ab4@11 ~@2 gb3@7 gb3@7 ~@14, db4@6 bb3@4 ~ bb3@6 ~@2 bb3@6 bb3@6 ~@3 ab3@5 ab3@7 ab3@7 ~@11, bb3@4 ab3@13 ~@6 db4@4 db4@7 db4@7 db4@7 db4@5 ~@11, ~@2 f3@15 [bb1,f2,bb2]@17 [gb1,db2,gb2]@19 ~@11]/4", // Gbsus2 Bb5 Gb5
  AX: "[~@19 db5@2 ~@6 ab5@2 ~@2 ab4@2 ~@7 [db3,ab3]@5 ~@3, ~@5 [db3,f5]@5 ab4@3 [db3,f5]@5 [db4,ab4]@3 ~ f3@4 [bb3,ab4]@3 db3@11 ~@8, ~@6 ab3@5 ab5@10 ~@2 ab4 eb5@5 ~@2 f5@14 ~@3, ~@7 ab4@3 db4@5 ab4 eb5@5 ~@2 f4@6 ~@4 [gb4,ab4,db5]@12 ~@3, ~@8 eb5@6 ab3@7 [bb2,f5]@8 [gb2,gb3,bb4,gb5]@16 ~@3]/6", // Db5 Db Db5 Bb7 Gbsus2 Bb5 Gb
})).s("gm_piano").gain(0.3)

stack(piano)