Strudelify
KeyG majorTempo120 bpm
0:00/0:00
// lovely — Vi Do & Sarah Chung
// 120 bpm, 4/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: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5980537; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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@2 B@2 C D B@2 C D E@2 F@2 G@2 H@2 I J K L M@2 N O P@2 Q R S@2 T U V@2 W@2 X@2 Y@4 Z@2 T AA AB@2 T AC AD AE AF U P@2
  Q AG S@2 AH L AI@2 T U V@2 W@2 V@2 AJ@2 AK@2 AL AM AN@2 AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF@5 BG@2
  BH BI BJ@2
>`.pickRestart({
  A: "e4 g4 e4 g4 e4 g4 e4 g4", B: "[e4 g4 e4 g4 e4 g4 e4 g4 e4 g4 e4 g4 b4 g4 e4 g4, c2@15 ~]/2",
  C: "e4 g4 e4 g4 e4 g4 e4 g4, e2@15 ~", D: "e4 g4 e4 g4 b4 g4 e4 g4, b1@15 ~",
  E: "[~ b4 ~ a4 ~@11 g3, c3@13 g3 e3@2, a4 e3 a4@6, ~ g3@2 g3 e3 g3 e3 g3 e3 g3 e3 g3 b3@4, ~ b4@7]/2",
  F: "[~ [g4,b4] ~ [f#4,a4] ~@3 g3 ~@6 g4 [f#3,g4], e2@6 g4@7 f#3@2 ~, [f#4,a4]@2 g4@2 e3 g3 e4@10, ~ g3 e3 g3 [f#4,a4]@2 e3@2 b2@8, ~@2 b4@6 ~ f#3 d3 f#3 d3@2 d3@2]/2", // G F#m Gmaj7 F#m
  G: "[~ b4 ~ a4 ~@10 [e4,g4] [g3,e4,g4], c3@13 g3 e3@2, a4 e3 a4@6, ~ g3@2 g3 e3 g3 e3 g3 e3 g3 e3 g3 b3@4, ~ b4@7]/2", // Em C
  H: "[~ [g4,b4] ~ [f#4,a4] ~@3 g3 ~@3 b4 ~@3 f#3, e2@6 e3@2 b2@3 f#3 [b3,b4,d5] f#3 [d3,a4,c5]@2, [f#4,a4]@2 g4@2 e3 g3 [e4,g4]@10, ~ g3 e3 g3 [f#4,a4]@4 ~ f#3 [d3,d5] e5@5, ~ b4@3 ~ f#4@3]/2", // G F#m Bm D7 F#m Em F#m D
  I: "~@3 c3, [c2,e4,g4], c3@3 ~, ~ [e3,f#4,a4]", J: "~@3 [c3,c5,e5], [g4,b4], g3 [g3,a4,d5], ~ c3@2 ~",
  K: "~@7 g3, [e2,a5], ~ b2@7, ~ e3!3, ~@3 g3@2 g3@2 ~", // A5
  L: "~@7 f#3, [b1,b2], ~ f#3@2 b4@5, ~@2 d3@3 f#3 [d3,g4]@2, ~@2 a4 f#3 [b3,a4]@4", // B G5 B7
  M: "[~@15 g3, [c2,c4]@8 [e3,e4] g3 e3 g3 [b3,e4,a4] g3 [e3,e4,b4]@2, e4@3 g3 [e3,e4] g3 e3 g3 g4@8, ~ g2@15, ~ e3 f#4@6]/2", // C E Esus4 E5 E
  N: "~@7 g3, [e2,e5], b4@3 g3 e3 g3 e3@2, ~ b2@7, ~ e3 [b4,d5]@2", // E Bm
  O: "~@7 f#3, [b1,b2,e4], b4@2 a4 f#3 [b3,a4]@4, ~ f#3@2 b4@5, ~@2 d3@3 f#3 [d3,g4]@2", // E5 B7 G5
  P: "[~@15 g3, [c2,e4,e5]@8 [e3,b4] g3 e3 g3 [b3,a4,a5] g3 [e3,b4,b5]@2, g4@4 [e3,a4] g3 e3 g3 [g4,g5]@8, ~ g2@15, ~@2 e3 g3 [f#4,f#5]@12]/2", // C E5 B7 E5 A5 G F#
  Q: "~@7 g3, [e2,e5,e6], ~ b2@7, ~ e3 [d5,d6]@2, ~@3 g3 e3 g3 e3@2", // E D
  R: "~@7 f#3, [b1,b2,b5], b4@2 a4 f#3 [b3,f#4,a4,d5]@4, ~ f#3@2 b4@2 f#3@2 ~, ~ d3@2 [d3,e4,g4,b4]", // B Bm7 Em7
  S: "[~@15 [g3,d6], c2@5 g3 [e3,e5] [g3,f#5] [e3,g5] [g3,e5] [e3,g5] [g3,a5] [b3,b5] [g3,a5] [e3,b5]@2, e5@2 e3 [g3,c5] [e3,f#5] c5@11, ~ [g2,e4]@15, ~ g4@7]/2", // G5 E Gmaj7 Em C Em Gsus2 B …
  T: "~@7 g3, e2, ~ b2@7, ~ e3!3, ~@3 g3@2 g3@2 ~", U: "~@7 f#3, [b1,b2], ~ f#3@2 f#3@2 f#3@2 ~, ~ d3@2 d3, ~ b3",
  V: "[b5 g5@5 ~@18 f#5@8, c5@23 g5@9, e5@7 g5@5 e5@20, ~ b5@31, ~@3 a5 f#5@7 a5@5]/2",
  W: "[~@3 g5, [e4,b5]@17 [f#4,b4] d5@2 e5@12, ~ g4@31, ~ b4@6 g5 f#5@4 e5@4 [d4,f#5]@16, ~ e5@2 a5@13]/2", // E5 B5 D
  X: "[b4 g4@5 ~@18 f#4@8, c4@23 g4@9, e4@7 g4@5 e4@20, ~ b4@31, ~@3 a4 f#4@7 a4@5]/2",
  Y: "[~@4 f#5@4 ~@23 g4, [e4,g4]@8 e4!4 e4 e4@2 e4, e5@5 e5@3 ~@6 b4@2, b4@8 [d4,f#4,b4,d5,f#5]@8 ~ g4@2 g4@2 g4@2 g4@2 g4@2 g4@2 g4@2 ~, ~@2 f#5 g5@11 g5@16 ~@2]/4", // Em Bm
  Z: "[~@15 g4, e3, ~ [g3,c4]@31, ~ g4@2 g4@2 g4@2 g4@2 g4@2 g4 b4@4, ~@2 e4@2 e4@2 e4@2 e4@2 e4@3 g4 e4@2]/2", // C5
  AA: "~@7 f#3, b2@3 f#3 [b3,a4] [f#3,b4] [d3,a4]@2, e4 e4@3, ~ f#4@7, ~ f#3 d3 d4@5", // B7 B5 D5
  AB: "[~@15 g3, c2@10 e3 [g3,d5] [b3,b4] g3 e3@2, ~ g2@15, ~@2 e3@2 e3@2 e3@2 [e3,e5] g3 e5@6, ~@3 g3@2 g3@2 g3@2 f#5@7]/2", // G5 B E
  AC: "~@7 f#3, b2, ~ f#3@2 [g4,b4]@2 f#3@2 ~, ~ d3@2 [d3,e4,g4,b4], ~@2 [f#4,a4] f#3 [b3,f#4,a4,d5]@4", // G Em7 F#m Bm7
  AD: "~@3 c3, [c2,e4], c3@3 ~, ~ [e3,f#4]", AE: "g3 c3 [g3,a4] [c3,c5], g4 ~",
  AF: "~@7 g3, [e2,e5], ~ b2@7, ~ e3 d5@2, ~@3 g3 e3 g3 [e3,b4]@2", // E E5
  AG: "~@7 f#3, [b1,b2,b4,b5], ~ f#3@2 f#3@2 f#3@2 ~, ~ d3@2 d3, ~ b3", // B
  AH: "~@7 g3, [e2,e4,g4,b4], ~ b2@7, ~ e3!3, ~@3 g3@2 g3@2 ~", // Em
  AI: "[~@15 g3, [c2,g4], ~ g2@15, ~@2 e3@2 e3@2 e3@2 e3@2 e3@3 g3 e3@2, ~@3 g3@2 g3@2 g3@2 g3@2 g3 b3@4]/2", // C5
  AJ: "[~@15 c5, f#5@2 d5@10 b4 c5 b4@2, ~ g5@2 e5@5 b4 c5 e5@6, ~ f#5!3 f#5@4, ~@3 g5@2 g5@2 g5@3 b4 c5 g5@4]/2",
  AK: "[c2!8 c2!7 [c2,a5], e5, c1@2 ~ c6, ~@13 b5@3]/2", AL: "e2!8, [e1,b5]",
  AM: "b1!8, b0, ~ [f#3,f#4]!3, ~@3 [g3,g4]@2 [g3,g4]@3", AN: "[c2!8 c2!8, e5, c1 ~]/2",
  AO: "e2!8, e1, ~ [b4,g5,b5]!3, ~@3 [c5,a5,c6]@2 [c5,a5,c6]@3", AP: "b1!8, [b0,b4], ~ a4@3, ~ g4, ~@3 f#4",
  AQ: "c2!8, [c1,e5,g5,b5]", AR: "c2!8, [e5,g5,b5]", AS: "e2!8, e1", AT: "b1!6 b1@2, [b0,g5,b5,d6]",
  AU: "b5@6 [f#5,a5] [e5,g5] [d5,f#5]@4 [c5,e5]@4, [c4,e4,g4,b4]@15 ~", AV: "f#5 g5 f#5@2 ~@4",
  AW: "c2 e2 g2 c3 e3 g3 c4 g3 e4 g3 e3 c3 g2 e3 c3 g2, [e5,g5,b5] a4", // Em
  AX: "c2 e2 g2 c3 e3 g3 c4 g3 e4 g3 e3 c3 g2 e3 c3 g2, [e4,b4]@2 d5 e5", // E5
  AY: "e2 g2 b2 e3 g3 b3 e4 b3 g4 b3 g3 e3 b2 g3 e3 b2, [g4,e5,g5] f#5", // C
  AZ: "b1 d2 f#2 b2 d3 f#3 b3 f#3 d4 f#3 d3 b2 f#2 d3 b2 f#2, [b3,d5]@2 d5 e5 d5@2 b4@2", // Bm
  BA: "c2 e2 g2 c3 e3 g3 c4 g3 e4 g3 e3 c3 g2 e3 c3 g2, [e4,e5] [f#4,f#5]", // E F#
  BB: "c2 e2 g2 c3 e3 g3 c4 g3 e4 g3 e3 c3 g2 e3 c3 g2, [g4,g5]@2 [a4,a5] [b4,b5]", // G A B
  BC: "e2 g2 b2 e3 g3 b3 ~ b3 g4 b3 g3 e3 b2 g3 e3 b2, e5 ~, e4@3 e4 [d4,d5]@4", // D
  BD: "b1 d2 f#2 b2 d3 f#3 b3 f#3 d4 f#3 d3 b2 f#2 d3 b2 f#2, [b3,b4] [a4,a5]!2 [g4,g5]", BE: "[c3,e3,g3]@15 ~",
  BF: "[[e3,g3,c4]@35 ~@2 [g3,b3,e4]@17 ~ [f#3,b3,d4]@17 ~ b5@7]/5", BG: "[a5 g5 f#5@4 ~ e5@11 a5 g5 ~ f#5@9 ~@2]/2",
  BH: "~@2 f#5@2 ~ g5@2 f#5@9", BI: "f#5@4 ~ e5@4 g5@2 f#5@2 ~ e5@2", BJ: "[d5@2 e5@17 ~@13]/2",
})).s("gm_piano").gain(0.3)

stack(piano)