Strudelify

Hello My Love

Ed Sheeran Westlife

KeyF majorTempo120 bpm
0:00/0:00
// Hello My Love — Ed Sheeran Westlife
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5977953; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 106 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 B C D E F@2 G A B H D E I@4 J@2 K@3 L M@8 N O P@2 Q@3 R@2 A S H D E F@2 G A T H D E I@4 U@2 V@3 L W@8 X Y Z@2 AA@3
  AB@3 J@2 K@3 AC@3 AD@8 AE AF AG@4 AH@3
>`.pickRestart({
  A: "~@14 c6!2, [f2,c3]", B: "~@2 a5!2 ~@2 g5!2 ~@2 f5@2 f5@4, [f2,f3,c6], ~ a5@3, ~ g5", C: "~@14 f5!2, [d2,a2]",
  D: "~ a5 ~ f5 ~ a5 a5@2, [d2,d3], f5@3 ~ f5@4, ~@2 a5@3 ~@3", E: "~@7 f5, [a1,a2]",
  F: "[~ a5 ~ f5 ~@11 a5, [bb1,bb2] [f2,f3], f5@6 ~@2 f5@8 ~@11 f5@5, ~@2 a5@3 a5@2 a5@8 ~, ~@3 g5 ~@2 g5@2]/2", // Bb F
  G: "~@5 f5 f5@2, [c2,c3,g5], ~@2 f5@3 ~@3, ~@3 e5@5", H: "~@7 f5, [d2,a2]",
  I: "[~ a5 ~ f5 ~@15 f5 ~@9 g5!3, [bb1,bb2]@8 [f2,f3]@8 [c2,c3]@7 bb5@7 a2@2, f5@3 ~ f5@4 ~@5 f5@3 ~@4 f5@4 d2@8, ~@2 a5@3 a5@2 a5@7 a5@2 ~@6 a5@2 ~@2 a5@6, ~@6 g5@2 ~@4 g5@3 g5@6 g5@3 ~@2 a2@2 d3@4]/4", // Bb F C
  J: "[~ f5 ~@4 f2@2 ~@6 [c3,a5]@2, [bb1,g5]@4 ~ c3 [f3,g5]@2, ~ f2@2 a5@4 ~, ~ f5 [bb2,f5]@2 f2@4, ~@3 c5@5 ~ g5@2 f5@5]/2", // F Eb Fsus2 Bb5
  K: "[g5@3 ~@3 f5@2 ~@4 g2@4 ~@2 c6@2 c6@2 ~@5 c6 ~@6 c6@2 ~@11 g5, c2@8 d2@7 d6@5 [bb2,g5] f5 f2 f5, ~@3 g5@13 ~@6 c6@2 d3@8 ~@4 f2@2 a5@10, ~ g2@2 c5@5 ~ c6@3, ~@2 [c3,f5]@2 ~ a2 d6 [a2,c6] bb1@4]/3", // Eb F5 Am
  L: "a5!4 ~@3 g5, f2, ~ c3@2 [c3,f5], ~ [f3,a5], ~@5 c6@3", // F5 F
  M: "[~@10 a5 ~@28 g2 ~@2 a5 ~@20 c6, [c2,e2,g2,c3]@8 [f2,f3]@6 [f2,f3]@2 ~@5 c5@2 f5@8 g5@9 ~@5 g5@2 g5@8 f5@7 d3@2, ~@4 f5@2 f5@10 ~ f5@5 d5@2 d3@5 a5@3 ~@2 f5 g2@2 [c2,c3]@3 [f2,f3]@6 [f2,f3]@2 ~@5 c5@3 d3@5 a5@3, ~@5 g5@3 ~@3 [c2,c3,a5]@5 [bb1,bb2]@8 d2@8 [c2,c3]@5 f5@11 ~ f5@5 d5@2 ~@3 g5@5, ~@13 g5@2 g5@9 ~@3 g5@3 d3@2 ~@3 e5@5 ~@3 [c2,c3,a5]@5 [bb1,bb2]@8 d2@8]/8", // C F C F Bb C F Bb
  N: "~@7 g2, [c2,c3]@5 [c2,c3,f5]@3, ~@2 f5@3 ~@3, ~@3 e5@5, ~@3 g2@4 ~", // C F5
  O: "~ a5!3 ~ g5 ~ f5, [f2,f3]@3 [f2,f3,g5], ~@3 [c2,c3]@5, ~ a5", // F Fsus2 C
  P: "[~@9 a5!2 ~@4 g5, [bb1,bb2] d2, g5@2 g5@6 d3@5 g5@2 ~, ~ a5@7 ~@3 a5@5, ~@3 f5@11 [d3,f5]@2]/2", // Bb Dm
  Q: "[~@7 g2 ~@2 a5 ~@8 a5@2 a5@3, [c2,c3]@5 [c2,c3,a5]@3 [f2,f3]@6 [f2,f3]@2 ~@8, ~@3 bb5@5 ~@5 c6@3 ~@2 c5@6, ~@3 g2@4 f5@8 f5@9, ~@6 g5@2 ~@3 [c2,c3,a5]@5 [bb1,bb2]@8]/3", // C F Bb
  R: "[~@15 g2, [d2,f5]@7 c6@9, d3@6 d3@2 [c2,c3]@3 g2@4 ~, ~@3 g5@5 ~@2 f5@3 [c2,c3,f5]@3, ~@5 a5@3 ~@3 e5@5]/2", // Dm C F5
  S: "~ a5 ~ g5 ~ f5 f5@2, [f2,f3,c6], ~ a5@3, ~ g5", T: "~@2 a5!2 ~@2 g5@2 ~@2 f5@2 f5@4, [f2,f3,c6], ~ a5@3, ~ g5",
  U: "[~ f5 ~@4 f2@2 ~@6 [c3,a5]@2, [bb1,g5]@4 ~ c6@3, ~ f2@2 a5@2 c3 [f3,g5]@2, ~ f5 [bb2,f5]@2 f2@4, ~@3 c5@5 ~ f5@7]/2", // F Eb Fsus2 Bb5
  V: "[g5@3 ~@3 f5@2 ~@4 g2@4 ~@11 c6 ~@6 c6@2 ~@11 g5, c2@8 d2@7 d6@5 [bb2,g5] f5 f2 f5, ~@3 g5@13 ~@2 c6@4 c6@2 d3@8 ~@4 f2@2 a5@10, ~ g2@2 c5@5 ~ c6@3, ~@2 [c3,f5]@2 ~ a2 d6 [a2,c6] bb1@4]/3", // Eb F5 Am
  W: "[~@10 a6 ~@28 g2 ~@2 a6 ~@20 c7, [c2,e2,g2,c3]@8 [f2,f3]@6 [f2,f3]@2 ~@5 c6@2 f6@8 g6@9 ~@5 g6@2 g6@8 f6@7 d3@2, ~@4 f5@2 f5@10 ~ f6@5 d6@2 d3@5 a6@3 ~@2 f6 g2@2 [c2,c3]@3 [f2,f3]@6 [f2,f3]@2 ~@5 c6@3 d3@5 a6@3, ~@5 g5@3 ~@3 [c2,c3,a6]@5 [bb1,bb2]@8 d2@8 [c2,c3]@5 f6@11 ~ f6@5 d6@2 ~@3 g6@5, ~@13 g6@2 g6@9 ~@3 g6@3 d3@2 ~@3 e6@5 ~@3 [c2,c3,a6]@5 [bb1,bb2]@8 d2@8]/8", // C F C F Bb C F Bb
  X: "~@7 g2, [c2,c3]@5 [c2,c3,f6]@3, ~@2 f6@3 ~@3, ~@3 e6@5, ~@3 g2@4 ~", // C F5
  Y: "~ a6!3 ~ g6 ~ f6, [f2,f3]@3 [f2,f3,g6], ~@3 [c2,c3]@5, ~ a6", // F Fsus2 C
  Z: "[~@9 a6!2 ~@4 g6, [bb1,bb2] d2, g6@2 g6@6 d3@5 g6@2 ~, ~ a6@7 ~@3 a6@5, ~@3 f6@11 [d3,f6]@2]/2", // Bb Dm
  AA: "[~@7 g2 ~@2 a6 ~@8 a6@2 a6@3, [c2,c3]@5 [c2,c3,a6]@3 [f2,f3]@6 [f2,f3]@2 ~@8, ~@3 bb6@5 ~@5 c7@3 ~@2 c6@6, ~@3 g2@4 f6@8 f6@9, ~@6 g6@2 ~@3 [c2,c3,a6]@5 [bb1,bb2]@8]/3", // C F Bb
  AB: "[~@11 f5 ~@3 g2 ~@5 g5!3, [d2,f6]@7 c7@8 bb5@7 a2@2, d3@6 d3@2 [c2,c3]@5 [c2,c3,g5]@3 d2@8, ~@3 g6@5 ~@3 g2@3 a5@2 ~@2 a5@6, ~@5 a6@3 ~@4 f5@4 ~@2 a2@2 d3@4]/3", // Dm C C5
  AC: "[a5!4 ~@10 f5@6 ~@3 [a5,a6], f2@14 g5@12 g5@17 [g5,g6]@5, ~ c3@2 [c3,f5] [c2,e2,g2,c3]@8, ~ [f3,a5] ~@4, ~@5 c6@3 ~@4 f5@2 ~@6 [f5,f6]@4]/3", // A G F5 C F
  AD: "[~@2 [a5,a6] ~@28 g2 ~@2 [a5,a6] ~@28 g2, [f2,f3]@6 [f2,f3]@2 ~ [f5,f6]@5 [d5,d6] [f5,f6]@8 [g5,g6]@9 ~@5 [g5,g6]@2 [g5,g6]@8 [f5,f6]@7 d3 [c6,c7]@9, ~@3 [c2,c3,a5,a6]@5 [bb1,bb2]@8 d2@8 [c2,c3]@3 g2@2 [c2,c3]@3 [f2,f3]@6 [f2,f3]@2 ~@5 [c5,c6]@3 d3@5 [a5,a6]@3 ~@3 [e5,e6]@5, ~@5 [g5,g6]@2 [g5,g6]@9 ~@3 [g5,g6]@3 d3@2 ~@3 [e5,e6]@5 ~@3 [c2,c3,a5,a6]@5 [bb1,bb2]@8 d2@8 [c2,c3]@3 g2@4 ~, ~@13 [c5,c6]@3 d3@5 [a5,a6]@3 ~@2 [f5,f6]@3 [f5,f6]@11 ~@2 [f5,f6]@4 [d5,d6]@2 ~@3 [g5,g6]@5 ~@2 [f5,f6]@3 [c2,c3,f5,f6]@3]/8", // A F D F G F C F …
  AE: "~ [a5,a6]!3 ~ [g5,g6] ~ [f5,f6], [f2,f3]@3 [f2,f3,g5,g6], ~@3 [c2,c3]@5, ~ [a5,a6]", // A G F Fsus2 C A
  AF: "~@6 f6@8 ~ g6, [bb1,bb2]@7 f6, [g5,g6] [g5,g6]@3, ~ [a5,a6]@7, ~@3 f5@5", // Bb G A
  AG: "[[a5,a6]!3 ~@12 g2 ~@2 [a5,a6] ~@8 [a5,a6]@2 [a5,a6]@3, d2@8 [c2,c3]@5 [c2,c3,a5,a6]@3 [f2,f3]@6 [f2,f3]@2 ~@8, d3@6 [d3,f5,f6]@2 ~@3 g2@4 [f5,f6]@8 [f5,f6]@9, ~@3 [a5,a6]@5 ~@3 [bb5,bb6]@5 ~@5 [c6,c7]@3 ~@2 c6@6, ~@5 [g5,g6]@2 [g5,g6]@7 [g5,g6]@2 ~@3 [c2,c3,a5,a6]@5 [bb1,bb2]@8]/4", // A C F Dm F A Bb C …
  AH: "[~@5 g2@3, [d2,f5,f6]@7 [c6,c7]@16 ~, d3@6 d3@2 [c2,c3]@3 g2@4 ~@9, ~@3 [g5,g6]@5 ~@2 [f5,f6]@3 [c2,c3,f5,f6]@11, ~@5 [a5,a6]@3 ~@3 [e5,e6]@13]/3", // Dm C G F F5 A E
})).s("gm_piano").gain(0.3)

// chords · piano
const piano_2 = note(`<
  A B C D E F G H I J K L M N O P Q R S T Q R S H U V W X U V W X U V W X U V W X A B C D E F G H A B C D E F G P Q R S
  T Q R S H U V W X U V W X U V W X U V W X Q R S T Q R S Y@2 Z AA AB AC Z AA AB AC Z AA AB AC Z AA AB AD@2
>`.pickRestart({
  A: "~@3 a4, [f2,c3,f4], ~ g4@15, ~ a4@5 a4@6 ~@4, ~@3 c5@5 c5@8", B: "~@3 d5, [f2,f3], a4@3 a4@5, ~@3 c5@5 c5@8",
  C: "~@3 a4, [d2,a2,f4], ~ g4@15, ~ a4@5 a4@6 ~@4, ~@3 c5@5 c5@8", D: "~@3 d5, [d2,d3], a4@3 a4@5, ~@3 c5@5 c5@8",
  E: "~@3 a4, [a1,a2,f4], ~ g4@15, ~ a4@5 a4@6 ~@4, ~@3 c5@5 c5@8", // Dm
  F: "~@3 bb4, [bb1,bb2], bb4@3 bb4@3 ~@2, ~@3 c5@5 c5@8", // Bb
  G: "~@3 a4, [f2,f3,f4], ~ g4@15, ~ a4@5 a4@6 ~@4, ~@3 c5@5 c5@8", H: "~@3 g4, [c2,c3], g4@3 g4@3 ~@2, ~@3 c5@5 c5@8",
  I: "~@2 [f2,c3] [f2,c3,a4], f4, [f2,c3]@3 c5@3 a4@6 ~@4, ~ g4@15, ~ a4@3 [f2,c3]@4 c5@8", // F5 F F5
  J: "[f2,f3]@3 ~@5 [f2,f3]@4 [f2,f3,d5]@4, a4@3 a4@5, ~@3 c5@5 c5@8, ~ [f2,f3] ~@2", // F Dm F
  K: "~@2 [d2,a2] [d2,a2,a4], f4, [d2,a2]@3 c5@3 a4@6 ~@4, ~ g4@15, ~ a4@3 [d2,a2]@4 c5@8", // D5
  L: "[d2,d3]@3 ~@5 [d2,d3]@4 [d2,d3,d5]@4, a4@3 a4@5, ~@3 c5@5 c5@8, ~ [d2,d3] ~@2", // D
  M: "~@2 [a1,a2] [a1,a2,a4], f4, [a1,a2]@3 c5@3 a4@6 ~@4, ~ g4@15, ~ a4@3 [a1,a2]@4 c5@8", // A
  N: "[bb1,bb2]@3 ~@5 [bb1,bb2]@4 [bb1,bb2,bb4]@4, bb4@3 bb4@3 ~@2, ~@3 c5@5 c5@8, ~ [bb1,bb2] ~@2", // Bb
  O: "~@2 [f2,f3] [f2,f3,a4], f4, [f2,f3]@3 c5@3 a4@6 ~@4, ~ g4@15, ~ a4@3 [f2,f3]@4 c5@8", P: "[c2,c3,g4]",
  Q: "~@3 [d2,d3,f4], [d2,d3]@3 ~, f4@3 f4@3 ~@2, ~@3 a4@5 a4@8", // Dm D
  R: "~@3 [bb1,bb2,a4], [bb1,bb2]@3 ~, a4@3 a4@3 ~@2, ~@3 c5@5 c5@8", // Bbmaj7 Bb
  S: "~@3 [f2,f3,a4], [f2,f3]@3 ~, a4@3 a4@3 ~@2, ~@3 c5@5 c5@8", // F
  T: "~@3 [c2,c3,g4], [c2,c3]@3 ~, g4@3 g4@3 ~@2, ~@3 c5@5 c5@8", // C5 C
  U: "c5@3 c5@3 [f4,a4,c5]@2, [f2,f3], [f4,a4]@3 ~, ~@3 [e4,g4]@5", // F Em
  V: "~@3 f4, [bb1,bb2,d4,bb4], f4@3 ~, ~@3 a4@5, ~@5 g4@3", W: "[d2,d3,d4,f4,a4]",
  X: "~@5 f4@3, [c2,c3,g4,c5], e4@3 e4@5, ~@2 f4@3 ~@3", Y: "[c2,c3,e4,g4,c5]/2",
  Z: "f2 c3 f3 c3 g3 c3 a3 [c2,c3], [f4,a4,c5]@3 [e4,g4,c5]@3 [f4,a4,c5]@2", // C F C F
  AA: "bb1 bb2 bb1 bb2 bb1 [bb2,g4] f2 bb1, [d4,f4,bb4]@3 a4@2 ~ f4@2", AB: "d2 a2 d3 a2, [d4,f4,a4]@15 ~",
  AC: "[e4,g4,c5]@2 f4 [g2,c3,e4]@2 [c2,g2]@2 [g2,c3], [c2,g2]@3 ~@2 f4@3", // C C5
  AD: "[[e4,g4,c5]@4 f4@2 [g2,c3,e4]@4 g2@4 [g2,c3]@17 ~, [c2,g2]@6 ~@4 f4@21 ~, ~@10 c2@19 ~@3]/2", // C C5
})).s("gm_piano").gain(0.25)

stack(piano, piano_2)