Strudelify
KeyA minorTempo70 bpm
0:00/0:00
// Thats Life — Maximilian Rolf Belle
// 70 bpm, 4/4, key A minor. 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/6301969; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 71 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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 ~@9 E F G H F I J K F I J K F I J L ~@7 M@2 N O P@4 Q@2 R S@2 ~@6 T U V@2 W@2 X Y@2 ~@2 Z@5
>`.pickRestart({
  A: "~@6 f5 e5", B: "d5@11 ~ d5@11 ~ d5@11 ~ d5@6 c5@6, [a#3,d4]@23 ~",
  C: "a4@11 ~ a4@11 ~ a4@11 ~ a4@6 g4@6, [f3,a3]@23 ~", D: "[d3,a3]@23 ~, d4@11 ~@37",
  E: "d4@11 ~ d4@11 ~ d4@11 ~ d4@6 c4@6, [a#2,d3]@23 ~", F: "a3@11 ~ a3@11 ~ a3@11 ~ a3@6 g3@6, [f2,a2]@23 ~",
  G: "d3@11 ~ d3@11 ~ d3@11 ~ e3@6 f3@6, [d2,a2]@23 ~", H: "~@12 c4@12 c4@11 ~ c4@6 b3@6",
  I: "e3@11 ~ e3@11 ~ e3@11 ~ e3@6 d3@6, [c2,e2]@23 ~", J: "a2@11 ~ a2@11 ~ a2@11 ~ b2@6 c3@6, [a1,e2]@23 ~",
  K: "c4@11 ~ c4@11 ~ c4@11 ~ c4@6 b3@6, [a2,c3]@23 ~", L: "c6 ~@3",
  M: "[~@42 d5@11 ~ d#4 f#4 a#4 f#5 ~@14 e1@19 ~@3 [b2,e3,b3]@2, ~@29 [e4,g4,b4,g5]@16 ~@3]/2", // E5 Em
  N: "~@5 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@2 ~@2 e1@2 ~ [b2,e3,b3]@2 ~@6 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@4", // E5
  O: "~@3 [b2,e3,b3]@2 ~@2 e1@2 ~@2 [b2,e3,b3]@2 ~@6 [b2,e3,b3]@4 ~@3 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@2 ~@2 e1@3 [b2,e3,b3]@4 ~@3", // E5
  P: "[~ [b2,e3,b3]@4 [b2,e3,b3]@4 g1@4 f#1@3 f1@4 e1@2 ~@2 [b2,e3,b3]@2 ~@6 [b2,e3,b3]@3 b5@4 [b2,e3,b3,c6]@4 b5@4 [b2,e3,b3]@2 ~@2 f5@4 [b2,e3,b3]@2 ~@5 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@4 ~@3 [b2,e3,b3]@2 ~@2 b5@4 [b2,e3,b3]@2 ~@2 b5@4 [b2,e3,b3]@4 ~@3 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@2 ~@2 e1@4 [b2,e3,b3,a5]@3 a5@4 [b2,e3,b3,c6]@4 [b2,e3,b3,b5]@4 [g1,g5]@4 [f#1,a#5]@4 [f1,a5]@3 e1@2 ~@2 [b2,e3,b3]@2 ~@6 [b2,e3,b3]@4 b5@3 [b2,e3,b3,c6]@4 b5@4 [b2,e3,b3]@2 ~@2 f5@4 [b2,e3,b3]@2 ~@5 [b2,e3,b3]@4 ~@4, ~@20 b5@7 ~ b5@7 ~@12 a5@4 e1@2 ~@2 b5@7 b5@7 ~ b5@7 d6@4 e1@2 ~@2 g5@4 ~@4 a5@7 a5@7 ~ a5@7 ~@27 b5@7 ~ b5@7 ~@12 a5@4 e1@2 ~@2 b5@7 b5@7 ~]/4", // E5 Cmaj7 E5 Esus4 Cmaj7 E5 G F# …
  Q: "[[b2,e3,b3]@4 ~@4 [b2,e3,b3]@2 ~ b5@4 [b2,e3,b3]@2 ~@2 b5@4 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@4 ~@3 [b2,e3,b3]@2 ~@2 e1@4 [b2,e3,b3,a5]@4 a5@3 [b2,e3,b3,c6]@4 [b2,e3,b3,b5]@4 [g1,g5]@4 [f#1,a#5]@4 [f1,a5]@4 e1@2 ~ [b2,e3,b3]@2 ~@6 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@4, b5@7 ~ d6@3 e1@2 ~@2 g5@4 ~@4 a5@7 ~ a5@7 a5@7 ~@51]/2", // E5 Esus4 Cmaj7 E5 G F# F E5
  R: "~@3 [b2,e3,b3]@2 ~@2 e1@2 ~@2 [b2,e3,b3]@2 ~@6 [b2,e3,b3]@4 ~@3 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@2 ~@2 e1@2 ~ [b2,e3,b3]@2 ~@5", // E5
  S: "[~ [b2,e3,b3]@4 ~@4 [b2,e3,b3]@4 ~@3 [b2,e3,b3]@2 ~@2 e1@4 [b2,e3,b3]@4 ~@4 [b2,e3,b3]@3 [b2,e3,b3]@4 g1@4 f#1@4 f1@4 ~@45]/2", // E5
  T: "~@15 a4", U: "~ a4@3 a4@2 a4@2 f5@2 e5@4 d5@4 b4@4 g4@3 d5@4 ~@2 c5@4 b4@4 g#4@4 g4@5",
  V: "[~@2 f4@4 g4@4 a4@4 a4@3 a4@2 a4@2 f5@2 e5@4 g5@4 b5@4 d6@3 g5@4 g5@4 d5@4 b4@4 a4@4 b4@3 e5@4 a5@4 g5@4 d5@4 a4@3 f4@4 c4@4 b3@4 c4@4]/2",
  W: "[b3@4 ~ b3@8 b3@8 b3@7 c4@6 b3@2 [b2,e3,a3]@11 ~ f#3@11 ~ [b3,e4,g#4]@23 ~ [b2,e3,g3,b3,e4,g4]@11 ~, ~@4 c4@2 ~@30 [b3,e4,e5]@23 ~ [b2,e3,g#3]@17 ~@19]/2", // Esus4 E Em E5 E
  X: "[c3,f3,a3,c4,f4,a4]@11 ~@7 [c3,f3,a3,c4,f4,a4]@3 [c#3,f#3,a#3,c#4,f#4,a#4]@3 ~@6 [d3,g3,b3,d4,g4,b4]@11 ~@7", // F F# G
  Y: "[[d3,g3,b3,d4,g4,b4]@3 [e3,a3,c4,e4,a4,c5]@3 [f3,a#3,c#4,f4,a#4,c#5]@3 ~@3 [g#2,c#3,f3,g#4,c#5,f5]@11 ~ [g#2,c#3,g3,g#4,c#5,g5]@11 ~ g#3@11 ~ g#3@11 ~ g#3@11 ~ g#3@11 ~@13, ~@3 [c5,e5,g#5]@4 ~]/2", // G Am A#m C# Caug
  Z: "[~@12 a2!3 ~ a3!3 ~ g#2!3 ~ g#3!3 ~ g3 ~ g4 ~ f3 ~ f4 ~ e3 ~ e4 ~ c3 ~ c4!2 [d3,g3,b3,d4,g4,b4,d5]@32 ~@4, ~@12 a4@3 a2@9 [g#4,b4,e5]@3 g#3 g4 g3@2 g4 f4 f3@2 f4 e4 e3@2 e4 c4 c3@3 ~@36, ~@4 [a4,c5,f5]@7 ~@9, ~@19 a3@25 ~@36, ~@20 g#4@3 g#2@21 ~@36]/5", // G E F
})).s("gm_piano").gain(0.4)

// chords · piano · soft notes
const piano_soft = note("<A ~@2 B C D E F G H I J K ~@3 L ~@11 M N O P Q@4 R ~@34>".pickRestart({
  A: "f5@11 ~ f5@11 ~ f5@11 ~@13, [d4,f4]@23 ~", B: "~@12 d4@11 ~ d4@11 ~ e4@6 f4@6",
  C: "f6@11 ~ f6@11 ~ f6@11 ~ f6@6 e6@6, [d5,f5]@23 ~", D: "d6@11 ~ d6@11 ~ d6@11 ~ d6@6 c6@6, [a#4,d5]@23 ~",
  E: "a5@11 ~ a5@11 ~ a5@11 ~ a5@6 g5@6, [f4,a4]@23 ~", F: "d5@11 ~ d5@11 ~ d5@11 ~ e5@6 f5@6, [d4,a4]@23 ~",
  G: "f5@11 ~ f5@11 ~ f5@11 ~ f5@6 e5@6, [d4,f4]@23 ~", H: "d5@11 ~ d5@11 ~ d5@11 ~ d5@6 c5@6, [a#3,d4]@23 ~",
  I: "a4@11 ~ a4@11 ~ a4@11 ~ a4@6 g4@6, [f3,a3]@23 ~", J: "d4@11 ~ d4@11 ~ d4@11 ~ e4@6 f4@6, [d3,a3]@23 ~",
  K: "f4@11 ~ f4@11 ~ f4@11 ~ f4@6 e4@6, [d3,f3]@23 ~", L: "[a2,c3]@23 ~, c4@11 ~@37",
  M: "~@12 c6@11 ~ c6@11 ~ c6@6 b5@6", N: "a5@11 ~ a5@11 ~ a5@11 ~ a5@6 g5@6", O: "e6@11 ~ e6@11 ~ e6@11 ~ e6@6 d6@6",
  P: "a5@11 ~ a5@11 ~ a5@11 ~ b5@6 c6@6",
  Q: "[~@42 f5@11 ~ d5@11 ~ a4@11 ~ f4@11 ~ a4@11 ~ c5@11 ~ f5@11 ~ e5@11 ~ a#5@11 ~ g5@11 ~ a5@11 ~ f5@11 ~ f5@6]/4",
  R: "d5@6 c5@6 g#4@6 a4@23 ~@7",
})).s("gm_piano").gain(0.15)

// other · cello · C A E A
const cello = note("<~@24 [[c3,c4]] [[a2,a3]] [[e2,e3]] [[a2,a3]] ~@43>").s("gm_cello").gain(0.45)

// other · tremolo strings
const tremolo_strings = note("<~@20 A B C B ~@24 D@7 ~@7 E F G H I@2 J@2 ~>".pickRestart({
  A: "c3", B: "a2", C: "e2",
  D: "[~@3 e2@30 e2@31 e2@30 e2@31 g2@15 g2@15 e2@15 ~ c3@15 c3@15 b2@15 ~ b2@15 a2@15 [a2,d3]@15 g2@15 ~ e2@15 g#2@15 a2@28]/7", // D5
  E: "~@3 g#2", F: "c3 a2 f2 c3", G: "a3 e3!2 f3", H: "e3 c3 b2 g#2", I: "[~ g#2@2 [a2,a3]@2 [g#2,g#3]@2 [g2,g3]]/2",
  J: "[[f2,f3] [e2,e3] [c2,c3] [g2,d3]@4 ~]/2", // F E C G5
})).s("gm_tremolo_strings").gain(0.2)

stack(piano, piano_soft, cello, tremolo_strings)