Strudelify
KeyG♭ majorTempo180 bpm
0:00/0:00
// Holo — Lee Hi (ìíì)
// 180 bpm, 4/4, key Gb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/6264828; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 127 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(180/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 · "Piano, Right Hand"
const piano = note(`<
  A@5 B@4 C@3 D@2 E@8 F G H@6 I J@3 K@8 L@3 M@6 N@8 O P@6 Q@6 R@3 S@3 T@4 U@6 V@8 W@3 X@3 Y@6 Z@3 AA@3 AB@6 AC@6 AD
>`.pickRestart({
  A: "[~ bb3 db4 f4 db4 bb3@2 ~ db4 gb4 db4 ~@2 ab3 db4 f4 db4 ~@2 b3, ~@12 bb3@8 ~@8 bb3@8 bb3@8 bb3@15 ~ ab3@8 ab3@12]/5",
  B: "[db4@2 [db4,gb4]@2 ~@2 b3@2 db5@2 db5@2 db5@2 db5@2 bb4@3 ab4 bb4@2 bb4@2 bb4@2 bb4@2 ab4@4, ~@4 eb4@11 ~ gb4@11 ~ gb4@11 ~ eb4@23 ~, ~@8 db4@53 ~@3]/4", // Gb5
  C: "[ab4@4 ab4@4 ab4@4 ab4@4 bb4@4 ab4@4 [db4,gb4]@11 ~ [db4,eb4]@4 ~@4 b3@4, db4@23 ~@17 db4@8]/3", // Gb5 Dbsus2
  D: "[db5!4 bb4@2 bb4!2, [gb4,ab4]@11 ~ gb4@11 ~ [eb4,gb4]@8]/2", // Gbsus2 Ebm
  E: "[bb4!2 ab4@2 ab4!4 bb4 ab4 gb4@2 ~ gb4 ab4 bb4 bb4 bb3 ~ f4 ~ bb4 ab4 bb3 ~ gb4 ~ bb3@2 ab3 ~ f4, ~@2 eb4@21 ~ eb4@40, ~@16 db4@23 ~ db4@30 ~@2 db4@8 db4@15 ~ db4@8 db4@15 ~ db4@8]/8",
  F: "~ ab3@2 b3, db4@15 ~", G: "db4@4 [db4,eb4,gb4]@11 ~",
  H: "[db5@4 db5@4 db5@4 db5@4 bb4@8 bb4@4 bb4@4 bb4@4 bb4@4 ab4@8 ab4@4 ab4@4 ab4@4 ab4@4 bb4@4 ab4@4 gb4@8 b3@4 [db4,gb4]@11 ~, [gb4,ab4]@11 ~ gb4@11 ~ eb4@68 ~@4, ~@24 gb4@23 ~ db4@23 ~ db4@11 ~@13]/6", // Gb5 Gbsus2
  I: "db5!4, [gb4,ab4]", J: "[bb4@2 bb4!2 bb4!2 ab4@2 ab4!2 ab4@2, ~ eb4@5, ~@8 gb4@23 ~ db4@16]/3",
  K: "[bb4@2 ab4@2 gb4@4 ~@2 gb4@2 ab4@2 bb4@2 bb4@2 bb3@2 ~@2 f4@2 ~@2 bb4@2 ab4@2 bb3@2 ~@2 gb4@2 ~@2 bb3@4 ab3@2 ~@2 f4@2 ~@2 ab3@2 gb4@2 gb4@2 gb4 db5 db5@2 eb5@2 gb5@2, ~@8 db4@30 ~@2 db4@8 db4@15 ~ db4@8 db4@15 ~ db4@8 db4@8 db4@23 ~, ~ eb4@7]/8",
  L: "[gb5@11 ~ eb5@4 db5@8 gb5@11 ~ eb5@4 db5@8, bb4@23 ~ gb4@23 ~]/3",
  M: "[f5@4 f5@4 f5@4 f5@4 gb5@4 f5@4 eb5@9 ~ db5@2 db5@4 eb5@4 gb5@4 gb5@11 ~ eb5@4 db5@6 db5@2 gb5@11 ~ eb5@4 db5@6 db5@2, ab4@91 ~@5, db5@23 ~ b4@23 ~ gb4@23 ~ bb4@23 ~]/6",
  N: "[f5@4 f5@4 f5@4 f5@4 gb5@4 f5@4 eb5@9 ~ db5@2 gb5@4 ab5@4 bb5@4 bb5@19 ~ bb5@4 [db5,ab5]@27 ~@5 eb5@4 f5@15 ~ db5@4, ab4@125 ~@3, ~@24 b4@23 ~ db5@23 ~@29 db5@23 ~@5]/8", // Db5
  O: "eb5@4 [b4,db5,gb5]@11 ~", // Bsus2
  P: "[db5@4 db5@4 db5@4 db5@4 bb4@8 bb4@4 bb4@4 bb4@4 bb4@4 ab4@8 ab4@4 ab4@4 ab4@4 ab4@4 bb4@4 ab4@4 ~@4 gb5@4 f5@4 db5@11 ~, [gb4,ab4]@23 ~ gb4@46 ~@2 gb4@23 ~, ~@24 db4@23 ~]/6", // Gbsus2
  Q: "[db5@4 db5@4 db5@4 db5@4 bb4@8 bb4@4 bb4@4 bb4@4 bb4@4 ab4@8 ab4@4 ab4@4 ab4@4 ab4@4 bb4@4 db5@4 db5@8 b4@2 bb4@2 ab4@11 ~, [gb4,ab4]@23 ~ eb4@46 ~@2 gb4@23 ~, ~@24 gb4@23 ~ db4@23 ~ ab4@11 ~@13]/6", // Gbsus2
  R: "[gb5!3 eb5 db5@2 gb5!2 gb5 bb5 bb5@2, bb4@23 ~ bb4@11 ~ bb4@11 ~, db5@5 ~@11]/3",
  S: "[f5@4 f5@4 f5@4 f5@4 eb5@4 db5@4 eb5@8 db5@15 ~, ab4@23 ~, db5@19 ~@5 b4@23 ~]/3",
  T: "[db5!4 bb4@2 bb4!2 bb4!2 ab4@2 ab4!4, [gb4,ab4]@11 ~ gb4@52, ~@24 eb4@23 ~ db4@16]/4", // Gbsus2
  U: "[bb4@4 ab4@4 gb4@11 ~@5 ab4@4 bb4@4 bb4@19 ~ ab4@2 bb4@2 b4@8 bb4@11 ~ bb4@4 [db4,ab4]@11 ~ db4@4, ~@8 db4@46 ~@2 eb4@23 ~@17, ~@5 gb4@19]/6", // Db5
  V: "[~@8 gb4@9 ~ db5@2 db5@4 eb5@4 gb5@4 gb5@11 ~ eb5@4 db5@8 gb5@11 ~ eb5@4 db5@8 f5@4 f5@4 f5@4 f5@4 gb5@4 f5@4 eb5@9 ~ db5@2 db5@4 eb5@4 gb5@4, ~ db4@15, ~@8 eb4@23 ~ gb4@23 ~ gb4@23 ~ ab4@23 ~ b4@23 ~]/8",
  W: "[gb5@11 ~ eb5@4 db5@6 db5@2 gb5@11 ~ eb5@4 db5@6 db5@2, gb4@23 ~ gb4@23 ~]/3",
  X: "[f5@4 f5@4 f5@4 f5@4 gb5@4 f5@4 eb5@9 ~ db5@2 gb5@4 ab5@4 bb5@4, ab4@23 ~ b4@23 ~]/3",
  Y: "[bb5@19 ~ bb5@4 [db5,ab5]@27 ~@5 eb5@4 f5@15 ~@9 gb5@4 ab5@4 bb5@4, db5@23 ~@29 db5@23 ~ db5@6 db5@13 ~, ~@20 eb5 ~@3]/6", // Db5
  Z: "[bb5@19 ~ ab5@2 bb5@2 b5@8 bb5@11 ~ bb5@4, db5@23 ~ eb5@23 ~]/3", AA: "[ab5@17 ~ b4@2 bb4@2 ab4@2, db5@23 ~]/3",
  AB: "[db5@4 db5@4 db5@4 db5@4 bb4@6 ab4@2 bb4@4 bb4@4 bb4@4 bb4@4 ab4@8 ab4@4 ab4@4 ab4@4 ab4@4 bb4@4 ab4@4 [b3,db4,gb4]@23 ~, gb4@17 ~@7, ab4@21 ~@3 eb4@23 ~ db4@23 ~@25]/6", // Bsus2
  AC: "[db5!4 bb4@2 bb4!2 bb4!2 ab4@2 ab4!4 bb4 ab4 gb4 [db4,eb4] gb4 ab4@2 bb4, [gb4,ab4]@23 ~ gb4@46 ~@10 eb4@15 ~, ~@48 db4@27 ~ b3@19 ~]/6", // Dbsus2 Gbsus2
  AD: "[db4,f4,bb4]@15 ~", // Bbm
})).s("gm_piano").gain(0.25)

// chords · piano · "Piano, Left Hand"
const piano_2 = note(`<
  A@3 B@3 C@3 D@3 C@3 E F@6 G@6 H@6 I@7 J@7 K@8 L@4 M@3 N@3 O@3 P@3 Q@6 R@6 S@8 T@18 L@4 M@3 U@3 M@3 V@2 W X
>`.pickRestart({
  A: "[gb2@23 ~ eb2@23 ~]/3", B: "[bb2@23 ~ b2@11 ~ gb3@11 ~]/3", C: "[gb2@11 ~ db3@11 ~ eb2@11 ~ bb2@11 ~]/3",
  D: "[bb2@11 ~ f3@11 ~ b2@11 ~ gb3@11 ~]/3", E: "bb2@11 ~ f3@4",
  F: "[~@8 gb3@11 ~ gb3@8 ~@4 gb2@11 ~ db3@8 gb2@4 eb2@11 ~ bb2@11 ~ bb2@11 ~ f3@4, ~@8 b2@19 ~ b2@68]/6",
  G: "[~@20 gb3@11 ~ gb2@4 db3@4 gb3@4 bb3@11 ~ eb2@4 bb2@4 eb3@4 gb3@11 ~ bb2@4 f3@4 bb3@4 db4@4, ~ b2@11]/6",
  H: "[~@12 gb3@19 ~ gb2@4 db3@4 ab3@4 bb3@11 ~ eb2@4 bb2@4 eb3@4 gb3@11 ~ bb2@4 f3@4 bb3@4 db4@4, ~ b2@11]/6",
  I: "[~@12 gb3@4 b3@15 ~ gb2@11 ~ db3@8 gb2@4 eb2@11 ~ bb2@11 ~ bb2@11 ~ f3@11 ~ [b2,gb3]@4 [b2,gb3]@4, ~@8 b2@91 ~@13]/7", // B5
  J: "[gb3@15 ~ gb2@4 gb3@4 bb3@4 f4@4 bb3@4 gb3@4 eb2@4 eb3@4 gb3@4 db4@4 gb3@4 eb3@4 bb1@4 bb2@4 db3@4 bb3@4 db3@4 bb2@4 b1@4 b2@4 eb3@4 b3@4 eb3@4 b2@4, b2@27 ~ db4@23 ~ bb3@23 ~ f3@23 ~ gb3@12]/7",
  K: "[gb2 ~ bb3 f4 bb3 gb3 eb2 eb3 gb3 eb4 gb3 eb3 bb1 bb2 db3 bb3 db3 bb2 b1 b2 eb3 b3 eb3 b2 gb2 ~ bb3 f4 bb3 gb3 eb2 eb3, ~@4 gb3@8 db4@23 ~ bb3@23 ~ f3@23 ~ gb3@15 ~ gb3@8 db4@20]/8",
  L: "[gb3@4 db4@4 gb3@4 eb3@4 bb1@4 bb2@4 db3@4 bb3@4 db3@4 bb2@4 b1@4 b2@4 eb3@4 [gb3,b3]@11 ~, ~@4 bb3@23 ~ f3@23 ~@13]/4", // B5
  M: "[[gb3,db4]@23 ~ [eb3,bb3]@23 ~]/3", N: "[[bb2,f3]@23 ~ [b2,gb3]@11 ~ [db3,ab3]@11 ~]/3",
  O: "[db4@11 ~ db4@8 gb3@4 bb3@11 ~ bb3@8 eb3@4, gb3@19 ~@5 eb3@19 ~@5]/3",
  P: "[f3@11 ~ f3@8 bb2@4 [b2,gb3]@11 ~ [db3,ab3]@12, bb2@19 ~@29]/3", // B5 Db5
  Q: "[gb2@4 ~@4 ab3@4 bb3@11 ~ eb2@4 bb2@4 eb3@4 gb3@11 ~ bb2@4 f3@4 bb3@4 db4@11 ~ b2@4 gb3@4 b3@4 db4@11 ~, ~@4 db3@91 ~]/6",
  R: "[gb2@4 ~@4 ab3@4 bb3@11 ~ eb2@4 bb2@4 eb3@4 gb3@11 ~ bb2@4 f3@4 bb3@4 db4@11 ~ [b2,gb3]@11 ~ [db3,ab3]@12, ~@4 db3@65 ~@27]/6", // B5 Db5
  S: "[gb2@4 ~@4 ab3@4 bb3@11 ~ eb2@4 bb2@4 eb3@4 gb3@11 ~ bb2@4 f3@4 bb3@15 ~ gb3@23 ~ gb2@4 gb3@4 bb3@4 f4@4 bb3@4 gb3@4 eb2@4 eb3@4, ~@4 db3@65 ~@3 b2@34 ~@2 db4@20]/8",
  T: "[gb3 db4 gb3 eb3 bb1 bb2 db3 bb3 db3 bb2 b1 b2 eb3 b3 eb3 b2 gb2 ~ bb3 f4 bb3 gb3 eb2 eb3, ~@4 bb3@23 ~ f3@23 ~ gb3@15 ~ gb3@8 db4@20]/6",
  U: "[[bb2,f3]@23 ~ [b2,gb3]@23 ~]/3", V: "[ab3@11 ~ f3@15 ~ [b2,gb3]@4, bb2@27 ~@5]/2", W: "eb3 db3@2 b2",
  X: "gb2@15 ~",
})).s("gm_piano").gain(0.25)

stack(piano, piano_2)