Strudelify

It was a lover and his lass

Thomas Morley

KeyF majorTempo150 bpm
0:00/0:00
// It was a lover and his lass — Thomas Morley
// 150 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 4/4 at bar 2, 3/4 at bar 36, 1/4 at bar 37, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/196656; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(150/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(`<
  ~@4 A@8 ~@3 B@4 ~@2 C@7 D@3 ~ E@5 ~@3 F@2 G@6 ~@3 H I@2 J ~ K L M N O P Q R@2 S T K L U@3 ~@3 V W X Y Z AA AB AC ~@3
  AD AE AF AG ~ AH AI AJ AK AL AM AN AO AP AQ AR AH AI AJ AS@3
>`.pickRestart({
  A: "[~@7 f4@2 [f3,a4]@3 [g3,bb4] [a3,c5]@2 [f3,f4,a4,c5]@2 [g3,d4,g4,bb4]@2 [d3,d4,gb4,a4]@2 [g3,bb3,d4,g4]@2 ~ a4 [g4,bb4]@2 [g3,bb4] [a3,c5] [bb3,d5]@2 [bb3,d5] [c4,eb5] [d4,f4,bb4,f5]@2 d4 eb4 f4@2 [c4,eb5] [bb3,d5] [a3,f4,c5]@2 [f2,a4] [g2,bb4] a2@2 a2 bb2 [c3,e4,c5]@2 bb4 a4 [g2,d4,bb4]@2 [c3,e4,g4]@2 [f2,a3,f4]@6 ~, ~@9 f4@6 ~@8 g4@2 ~@2 g4@6 ~@6 f4@2 ~@4 c5@4 ~@2 [d3,f4]@2 ~@11]/8", // F Gm Am F Gm D Gm Am …
  B: "[~@7 c5@2 ~@2 [f3,a4,c5]@2 [bb3,bb4,d5]@2 bb4@2 [bb2,d4,d5]@2 [c3,e4] [d3,f4] [e3,g4,bb4]@2 [f3,f4,a4]@2 f4@2 e4@2 [f3,f4,a4]@2 ~, ~@9 f5@4 ~@6 c5@2 ~@4 [c3,g4,c5]@4 ~@3]/4", // F Bb C Dm Edim F C5
  C: "[eb3 [d3,bb4,f5]@2 ~@4 bb2 a2 [g2,g4,bb4,d5]@2 ~@4 [bb3,d4] [c4,e4] [f2,g4]@2 [a2,f4]@2 f4@2 e4@2 [f2,a3,f4]@2 [f3,a3,c4,f4]@2 f3@2 e3@2 [f3,c4,f4,a4]@2 [a2,c4,f4]@2 f4@2 e4@2 [f2,c4,f4,a4]@2 c5@2 ~@2 [f2,a4]@2 [bb4,d5]@2 bb4@2 bb2 c3 d3, ~@7 [f4,bb4,d5]@2 ~@6 [g2,g4,bb4]@2 [c4,a4]@4 [c3,c4,g4]@4 ~@4 [c4,g4,c5]@4 ~@4 [c3,c4,g4]@4 ~@4 f5@4 bb2@4 [bb4,d5]@3]/7", // Bb Gm Bb C Fsus2 Dm F Bb …
  D: "[e3 [f3,a4,c5]@2 g3@2 e3@2 [f3,f4,a4]@2 f4@2 e4@2 [f3,f4,a4]@2 [a3,c4,f4]@2 d4 e4 [f3,f4,a4]@2 [c4,e4,g4]@2 ~, ~@3 [g4,bb4]@4 ~@2 [c3,g4,c5]@4 ~@4 [g3,bb4]@2 ~@5]/3", // F C Gm C5 Gm
  E: "[eb3@2 [d3,bb4,f5]@4 ~@8 bb2@2 a2@2 [g2,g4,bb4,d5]@4 ~@8 [bb3,d4]@2 [c4,e4]@2 [f2,g4]@4 [a2,f4]@5 f4@5 e4@5 [f2,a3,f4]@16 ~@11, ~@14 [f4,bb4,d5]@4 ~@12 [g2,g4,bb4]@4 [c4,a4]@9 [c3,c4,g4]@10 ~@27]/5", // Bb Gm Bb C Fsus2 Dm F Bb …
  F: "[~@5 f4@4 [f3,a4]@6 [g3,bb4]@2 [a3,c5]@4 [f3,f4,a4,c5]@4 [g3,d4,g4,bb4]@4 [d3,d4,gb4,a4]@3, ~@9 f4@12 ~@11]/2", // F Gm Am F Gm D
  G: "[~ [g3,bb3,d4,g4]@4 ~@2 a4@2 [g4,bb4]@4 [g3,bb4]@2 [a3,c5]@2 [bb3,d5]@4 [bb3,d5]@2 [c4,eb5]@2 [d4,f4,bb4,f5]@4 d4@2 eb4@2 f4@4 [c4,eb5]@2 [bb3,d5]@2 [a3,f4,c5]@4 [f2,a4]@2 [g2,bb4]@2 a2@4 a2@2 bb2@2 [c3,e4,c5]@4 bb4@2 a4@2 [g2,d4,bb4]@4 [c3,e4,g4]@4 [f2,a3,f4]@12 ~@11, ~@5 g4@4 ~@4 g4@12 ~@12 f4@4 ~@8 c5@8 ~@4 [d3,f4]@4 ~@31]/6", // Gm Am Bb Cm Bb Cm Bb F …
  H: "~@5 c5@4 ~@4 [f3,a4,c5]@3, ~@9 f5@7", // F
  I: "[~ [bb3,bb4,d5]@4 bb4@4 [bb2,d4,d5]@4 [c3,e4]@2 [d3,f4]@2 [e3,g4,bb4]@4 [f3,f4,a4]@4 f4@4 e4@3, ~@13 c5@4 ~@8 [c3,g4,c5]@7]/2", // Bb C Dm Edim F C5
  J: "~ [f3,f4,a4]@4 ~@11", K: "~@7 eb3@2 [d3,bb4,f5]@4 ~@3",
  L: "~@5 bb2@2 a2@2 [g2,g4,bb4,d5]@4 ~@3, ~@5 [f4,bb4,d5]@4 ~@7", // Gm Bb
  M: "~@5 [bb3,d4]@2 [c4,e4]@2 [f2,g4]@4 [a2,f4]@3, ~@5 [g2,g4,bb4]@4 [c4,a4]@7", // Bb C Fsus2 Dm Gm F
  N: "~ f4@4 e4@4 [f2,a3,f4]@4 [f3,a3,c4,f4]@3, ~ [c3,c4,g4]@8 ~@7", // F C5
  O: "~ f3@4 e3@4 [f3,c4,f4,a4]@4 [a2,c4,f4]@3, ~ [c4,g4,c5]@8 ~@7", // F C5
  P: "~ f4@4 e4@4 [f2,c4,f4,a4]@4 c5@3, ~ [c3,c4,g4]@8 ~@7", Q: "~@5 [f2,a4]@4 [bb4,d5]@4 bb4@3, ~ f5@8 bb2@7",
  R: "[~ bb2@2 c3@2 d3@2 e3@2 [f3,a4,c5]@4 g3@4 e3@4 [f3,f4,a4]@4 f4@4 e4@3, ~ [bb4,d5]@8 ~@4 [g4,bb4]@8 ~@4 [c3,g4,c5]@7]/2", // F Bb Gm C5
  S: "~ [f3,f4,a4]@4 [a3,c4,f4]@4 d4@2 e4@2 [f3,f4,a4]@3, ~@9 [g3,bb4]@4 ~@3", T: "~ [c4,e4,g4]@4 ~@11",
  U: "[~@5 [bb3,d4]@2 [c4,e4]@2 [f2,g4]@4 [a2,f4]@5 f4@5 e4@5 [f2,a3,f4]@16 ~@4, ~@5 [g2,g4,bb4]@4 [c4,a4]@9 [c3,c4,g4]@10 ~@20]/3", // Bb C Fsus2 Dm F Gm F C5
  V: "~@3 f4", W: "[f3,a4]@3 [g3,bb4] [a3,c5]@2 [f3,f4,a4,c5]@2, f4@3 ~",
  X: "[g3,d4,g4,bb4]@2 [d3,d4,gb4,a4]@2 [g3,bb3,d4,g4]@2 ~ a4, ~@3 g4", // Gm D Gm
  Y: "[g4,bb4]@2 [g3,bb4] [a3,c5] [bb3,d5]@2 [bb3,d5] [c4,eb5], ~ g4@3", // Gm Am Bb Cm
  Z: "[d4,f4,bb4,f5]@2 d4 eb4 f4@2 [c4,eb5] [bb3,d5], ~@3 f4", AA: "[a3,f4,c5]@2 [f2,a4] [g2,bb4] a2@2 a2 bb2, ~ c5",
  AB: "[c3,e4,c5]@2 bb4 a4 [g2,d4,bb4]@2 [c3,e4,g4]@2, ~ [d3,f4] ~@2", AC: "[f2,a3,f4]@3 ~", AD: "~@3 c5",
  AE: "~ [f3,a4,c5] [bb3,bb4,d5] bb4, f5 ~", AF: "[bb2,d4,d5]@2 [c3,e4] [d3,f4] [e3,g4,bb4]@2 [f3,f4,a4]@2, ~ c5 ~@2",
  AG: "f4 e4 [f3,f4,a4] ~, [c3,g4,c5] ~", AH: "~@7 eb3", AI: "[d3,bb4,f5]@2 ~@4 bb2 a2, ~@3 [f4,bb4,d5]",
  AJ: "[g2,g4,bb4,d5]@2 ~@4 [bb3,d4] [c4,e4], ~@3 [g2,g4,bb4]", AK: "[f2,g4] [a2,f4] f4 e4, [c4,a4] [c3,c4,g4]",
  AL: "[f2,a3,f4] [f3,a3,c4,f4] f3 e3, ~ [c4,g4,c5]", AM: "[f3,c4,f4,a4] [a2,c4,f4] f4 e4, ~ [c3,c4,g4]",
  AN: "[f2,c4,f4,a4] c5 ~ [f2,a4], ~ f5", AO: "[bb4,d5]@2 bb4@2 bb2 c3 d3 e3, bb2 [bb4,d5]",
  AP: "[f3,a4,c5] g3 e3 [f3,f4,a4], ~ [g4,bb4]@2 ~", AQ: "f4 e4 [f3,f4,a4] [a3,c4,f4], [c3,g4,c5] ~",
  AR: "d4 e4 [f3,f4,a4]@2 [c4,e4,g4]@2 ~@2, [g3,bb4] ~@3", // F C Gm
  AS: "[[f2,g4]@5 [a2,f4]@4 f4@5 e4@5 [f2,a3,f4]@16 ~@13, [c4,a4]@9 [c3,c4,g4]@10 ~@29]/3", // Fsus2 Dm F C5
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft = note(`<
  A@5 ~@6 B@5 ~@2 C@4 ~@8 D@3 ~@3 E@2 F G@2 ~@6 H I J K L ~@2 M N O ~@9 P O ~@3 Q R S T U ~@6 V W X Y Z ~@2 AA AB AC ~@9
  AD AC ~@5
>`.pickRestart({
  A: "[~@7 f4@2 [f3,a4]@3 [g3,bb4] [a3,c5]@2 [a3,c4,c5]@2 d4 e4 [f3,f4,a4]@2 [c3,e4,g4]@2 [e3,c4,g4,bb4]@2 [f3,g4]@2 [a2,f4]@2 f4@2 e4@2 [f2,c3,a3,f4]@6 ~, ~@9 f4@6 ~@2 [g3,bb4]@2 ~@6 [c4,a4]@4 [c3,c4,g4]@4 ~@7]/5", // F Gm Am F C C7 Fsus2 Dm …
  B: "[~@7 [f2,f4,a4,c5]@2 [f2,f4,a4,c5]@2 [f3,f4,a4,c5]@2 [bb2,f4,bb4,d5]@2 [f3,f4,a4,c5]@2 [g3,d4,g4,bb4]@2 [d3,d4,gb4,a4]@2 [g3,bb3,d4,g4]@2 g4@2 ~@2 [d3,gb4,a4]@2 [g3,g4,b4]@2 g4@2 ~@2 [c3,e4,g4]@2 [f3,f4,a4]@2 ~, ~@25 d5@4 ~@4 a4@4 ~@3]/5", // F Bb F Gm D Gm D G …
  C: "[~@7 [a3,c4,f4]@2 d4 e4 [f3,f4,a4]@2 [c3,e4,g4]@2 c4 bb3 [a3,f4,c5]@2 ~@4 [a4,c5,f5]@2 ~@7, ~@9 [g3,bb4]@2 ~@4 [e4,g4,c5]@2 ~@6 f3 ~@8]/4", // F C F Gm C
  D: "[~@7 c4 bb3 [a3,f4,c5]@2 ~@4 [a4,c5,f5]@2 ~@7, ~@7 [e4,g4,c5]@2 ~@6 f3 ~@8]/3", // F C
  E: "[~@5 f4@4 [f3,a4]@6 [g3,bb4]@2 [a3,c5]@4 [a3,c4,c5]@4 d4@2 e4@2 [f3,f4,a4]@3, ~@9 f4@12 ~@4 [g3,bb4]@4 ~@3]/2", // F Gm Am F Gm
  F: "~ [c3,e4,g4]@4 [e3,c4,g4,bb4]@4 [f3,g4]@4 [a2,f4]@3, ~@9 [c4,a4]@7", // C C7 Fsus2 Dm F
  G: "[~ f4@4 e4@4 [f2,c3,a3,f4]@12 ~@11, ~ [c3,c4,g4]@8 ~@23]/2", // F C5
  H: "~@5 [f2,f4,a4,c5]@4 [f2,f4,a4,c5]@4 [f3,f4,a4,c5]@3", // F
  I: "~ [bb2,f4,bb4,d5]@4 [f3,f4,a4,c5]@4 [g3,d4,g4,bb4]@4 [d3,d4,gb4,a4]@3", // Bb F Gm D
  J: "~ [g3,bb3,d4,g4]@4 g4@4 ~@4 [d3,gb4,a4]@3, ~@9 d5@7", K: "~ [g3,g4,b4]@4 g4@4 ~@4 [c3,e4,g4]@3, ~@9 a4@7",
  L: "~ [f3,f4,a4]@4 ~@11", M: "~@5 [a3,c4,f4]@4 d4@2 e4@2 [f3,f4,a4]@3, ~@9 [g3,bb4]@4 ~@3",
  N: "~ [c3,e4,g4]@4 c4@2 bb3@2 [a3,f4,c5]@4 ~@3, ~@5 [e4,g4,c5]@4 ~@7", O: "~@5 [a4,c5,f5]@4 ~@7, ~@5 f3@2 ~@9",
  P: "~@5 c4@2 bb3@2 [a3,f4,c5]@4 ~@3, ~@5 [e4,g4,c5]@4 ~@7", Q: "~@3 f4",
  R: "[f3,a4]@3 [g3,bb4] [a3,c5]@2 [a3,c4,c5]@2, f4@3 ~", // F Gm Am
  S: "d4 e4 [f3,f4,a4]@2 [c3,e4,g4]@2 [e3,c4,g4,bb4]@2, [g3,bb4] ~@3", T: "[f3,g4] [a2,f4] f4 e4, [c4,a4] [c3,c4,g4]",
  U: "[f2,c3,a3,f4]@3 ~", V: "~@3 [f2,f4,a4,c5]", W: "[f2,f4,a4,c5] [f3,f4,a4,c5] [bb2,f4,bb4,d5] [f3,f4,a4,c5]",
  X: "[g3,d4,g4,bb4] [d3,d4,gb4,a4] [g3,bb3,d4,g4] g4", Y: "~ [d3,gb4,a4] [g3,g4,b4] g4, d5 ~",
  Z: "~ [c3,e4,g4] [f3,f4,a4] ~, a4 ~", AA: "~@3 [a3,c4,f4]",
  AB: "d4 e4 [f3,f4,a4]@2 [c3,e4,g4]@2 c4 bb3, [g3,bb4] ~@2 [e4,g4,c5]", AC: "[a3,f4,c5] ~@2 [a4,c5,f5], ~@6 f3 ~",
  AD: "~@6 c4 bb3, ~@3 [e4,g4,c5]", // C
})).s("gm_piano").gain(0.2)

stack(piano, piano_soft)