Strudelify

A Winter Story

Tim Chang cover

KeyG majorTempo67 bpm
0:00/0:00
// A Winter Story — Tim Chang cover
// 67 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 1, 2/4 at bar 53) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5871340; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 54 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(67/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 G H I J B C D E F G H K L M N O P Q R S T U V W X Y Z AA AB AC AD@2 B C D E F G H K L AE AF AG AH AI@3
>`.pickRestart({
  A: "~@10 d4@4 ~ d4, ~@7 a4", B: "~@12 d5@3 g4, g2@8 [b2,f#3,a4] a3 b4@6, a4@4 b4 a3 b3@10, ~ d3@7, ~ g3@3",
  C: "~@7 d5, g4, [d3,d4]@3 a4@5, a4 e4 ~@2, e4 c4@3 [d3,c4,d4,e4,f#4]@4", // D D7
  D: "~@2 c5@2 ~@3 [b3,g4], [e3,g3,d5], g4@3 [c4,a4], e4 [e4,c5], ~ c4@9 [d4,b4]@6", // Em Em7 F C G
  E: "~@12 b4@3 d4, [b2,e4,f#4]@8 d4@7 ~, b3@3 b3@5, ~ f#3@7, ~ a3@3", // Bsus4
  F: "~@12 b4@3 d4, a2 f#4, f#4@3 c#4@5, c#4 a3@3, a3 f#3@7",
  G: "~@7 g4, g2@6 b3 d4 g4@4 d4@4, [b3,d4]@5 a3@11, a3 g3@3, ~ d3@7", // Bm
  H: "[a3,d4]@2 ~@5 [e3,c4], [d3,g4]@3 [f#3,d4], ~@2 d4@3 [g3,e4]@3, ~ [a3,f#4] [d2,a3,f#4]@2, ~@3 a2@5", // D5 C G5 D C D
  I: "~@4 c#4@3 c#4, [g2,d3,g3,b3], ~ [a2,e3,a3]", // G A5
  J: "~@12 d4@2 ~ d4, f#3@7 a4, d4 [c#3,a3], ~ [e3,c#4]@2 [e3,c#4]@5, ~ [d3,b3]@3", // F#m C#m G
  K: "d3 ~@3 e3 ~@2 c#4, g2@4 [a2,a3,c#4] e3 a3@2, b3@3 b3@5, g3 g3@3, ~ d3@7", // A
  L: "~@15 d5, d2@4 a3@4 [d2,a#3,a#4] d3 f#3 a#3 d4 g4 a#4@2, [a3,d4]@3 f#3@3 f#4@10, ~ a2@15, ~@2 d3@3 d4@2 a4@9", // Gm D5
  M: "~@4 a#4 ~@2 a4, [c3,g3], a#4@3 a4@2 a#4@3, g4 g4@3, ~ [c4,e5]@15", // C5 C
  N: "~@7 f4, f2@5 [g3,a#4] [a3,c5]@2, g4@2 a3 g4@5, ~ c3@7, ~@2 f4 g3 [f3,a4]@4", // Gm Am F
  O: "~@8 [f2,c3,f3,a4]@7 f4, [a#2,a#3,e5], f3@6 f4@9 ~, ~ d5@7, ~ c5@3", // F A#dim
  P: "~@4 a#3@3 ~@8 a4, [a#2,e5]@8 [f2,a4]@5 f4 g4@2, ~ d5@7, ~@2 f3@5 [f3,a#3,a#4]@9, ~ [d4,f5]@3", // A#dim F A#5 Dm
  Q: "~@3 b4 ~@3 [e3,d4,g4], a2@6 e3@2 [g2,g4,b4] d3 [g3,f#4,a4] a3 [b3,g4,b4] g3@3, [a4,c5]@2 [a3,b4] b3 a4 a3 d5@10, ~ e3@3 [c4,c5]@12, ~ g#4@7", // Em7 G D Em Am Asus2 C
  R: "~@3 e5 ~@3 [g3,g4,c5], d3@8 [c3,c5,e5] g3 [c4,b4,d5] d4 [e4,c5,e5] c4@3, [d5,f5]@2 [d4,e5] e4 d5 d4 [a3,g5]@10, ~ a3@3 [f4,f5]@12, ~ c#5@7", // C5 C G C Dm Dsus2 A7 F
  S: "~@2 f5@2 ~@3 a#4, [b3,e4,a5], ~ [a#3,d4,f4,f5], ~@5 d5@3, ~@3 c5", // Esus4 A#
  T: "~@3 [d4,g4] ~@7 [e4,a4] ~@3 d4, [c3,c5]@8 [d3,d4,d5] a3 d4@2 [e4,a4] f#4 e4@2, ~ g3@15, ~@2 c4@2 d4 e4 d4 c4@9, ~ g4@3", // G5 A5 C D A5
  U: "~@12 d5@3 d5, g2@4 b3 d4 g4 a4 b4@8, b3@3 a3@13, ~ d3@15, ~ g3@7",
  V: "~@3 [f3,e4,f4,d5], [f3,e4,f4,d5]@3 ~, ~ d4@7, ~ a4@3", W: "~@7 c5, [e3,e4], c5@7 ~, g4@3 g4, ~ g5",
  X: "~@3 [d#3,d#4,f4,c5], [d#3,d#4,c5]@3 ~, ~ d4@7, ~ c4@3, ~ g4", // F7 Cm
  Y: "~@7 a#4, [d3,c4,d4], a#4@3 f4, ~@3 c3@5, ~ [a#2,f5]", Z: "~@3 c5, [c#3,c#4,a#4], ~ c4@7, ~ a#3@3, ~ f4",
  AA: "~@7 a4, [c3,c4,g#4], d#4@3 d#4, ~@3 a#2@5, ~ g#2", AB: "g#4@8 g#4@3 g#4@2 g#4 ~ g#4, [b2,c#4,d4]",
  AC: "~@3 f4, [a#3,d#4,g#4], a#2@3 a#2@5, ~ a#4@3, ~ [b2,d4,g4]", // D#sus4 G
  AD: "[~@27 a4@4 d4, g4, g2@6 a3@2 b3@2 c4@4 d4@2 ~@6 d4@9 ~, b3@4 g3@11 b3@17, ~ d3@7 g3@8]/2",
  AE: "~@15 e6, [g2,g4,b4]@6 g5 b5 [a2,a4,c#5,e5] e3 a3 b3 [c#4,e6] a5 c#6@2, d5@3 [a3,b5] [b3,g5] d5@11, ~ d3@15, ~ [g3,d6]@7", // G A C#m Asus2 Em G5
  AF: "~@15 d4, [a4,d5]@7 [a3,d6]@2 g5 [d3,f#5] d5 [a2,a4] g4 [d2,f#4]@2, [d3,f#5]@3 [d4,f#6]@5, ~ a3@3 f#6 [e4,g6]@11, ~@2 d4 e4 f#4@4 [f#3,a5]@8", // D5 D A D Em F#m
  AG: "~@15 e5, [g2,g4,b4]@4 [b3,g5] d5 g5 b5 [f#2,a#4,c#5,e5] c#3 f#3 g#3 [a#3,a#5] c#5 f#5@2, d5@3 a3@13, ~ d3@15, ~ g3@7", // G Em F#7 A#
  AH: "~@4 d5 [b4,d5] ~ [a4,c#5] ~ [f#4,b4] f#4 [f#4,a4] f#4 [c#4,f#4] ~ [a3,d4], d3@4 [b3,c#5]@2 [d3,a4] [b2,c#4,f#4], [b4,d5,f#5]@3 c#4 f#5@12, ~ f#3@5 b4 c#4 a4@2 [f#3,b4]@6, ~@2 b3@2 d4 f#4 [d4,d5]@10", // Bm A B5 F#m F#5 D5 Bsus2 D5 …
  AI: "[~@8 [g2,g4,a#4]@3 g2@3 [g2,d5]@3 [g2,d5,f#5,a#5]@7 [d3,d5,f#5,a5]@15 ~@9, a5@6 g5 d3 e5@3 [g4,a#4,f#5]@3 [b4,g5]@10 ~@24, g2@3 a3 b3@12 ~@32, ~ d3@2 g4@2 a3@11 ~@32, ~@2 g3 d5@3 g3@10 ~@32]/3", // Gm G5 Gm D Gm Em
})).s("gm_piano").gain(0.4)

// other · viola · "中提琴"
const viola = note("<~@10 A B C D E F G H I J K L M N O P Q R ~@10 A B C D E F G H I S T U V W X@2>".pickRestart({
  A: "a3@2 b3@2 a3 b3 d4@2", B: "a3@4 f#3@3 d4", C: "d4@2 c4@2 e4 d4 c4 b3", D: "b3@12 b3@3 d3", E: "a3@12 b3@3 d3",
  F: "d3@6 d3 g3", G: "g3@2 f#3@2 d4 c4 b3 a3", H: "b3 c#4", I: "d4", J: "e4", K: "g3", L: "e4@4 f4 e4 d4 c4",
  M: "d4@4 f4 e4 d4 c4", N: "e4 d4", O: "f4 e4 f4 g4 e4 d4 e4 c4", P: "a4@2 g4@2 g4 d4 c4 a#3", Q: "c4 d4", R: "b3 ~",
  S: "d4 e4", T: "d4 a3 d4 e4 f#4@4 g4 f#4 d4 a3 d4 a3 d3 a3", U: "b3@2 g4 a#4",
  V: "b4@4 b4 f#4!2 d4 b3 d4!2 e4!2 f#4 g4 a4", W: "a4@3 d4@3 g4@2 e4@3 f#4@3 f#4@2", X: "[~ d4@7 d4@16 ~@8]/2",
})).s("gm_viola").gain(0.14)

// other · viola · "中提琴" · soft notes
const viola_soft = note("<~@27 A B C@2 D@2 E@2 F G@2 ~@16>".pickRestart({
  A: "~@3 d4", B: "a4", C: "g4", D: "f4", E: "d#4", F: "d#4 f4 d4 c4", G: "[d4@5 ~@3]/2",
})).s("gm_viola").gain(0.08)

// other · cello · "大提琴"
const cello = note("<~@10 A B C D E F@2 G F H I J@2 K L M N O ~@10 A B C D E F@2 G F P F Q R S T@2>".pickRestart({
  A: "g2 b2", B: "d3@4 d3@2 a3 f#3", C: "e3@4 c3 b2 a2 g2", D: "b2@10 g2@2 b2@3 e3", E: "f#3@10 f#2@2 a2@3 c#3",
  F: "d3", G: "g2 a2", H: "~@7 g2", I: "f2", J: "d3 f2", K: "a2 g2", L: "d3 c3", M: "g3 f3", N: "c3 d3", O: "g2@3 ~",
  P: "d3 e3", Q: "d3 c#3", R: "f#3", S: "g2@4 g2@3 f#3", T: "[e3 d3@3 d3@8 ~@4]/2",
})).s("gm_cello").gain(0.16)

stack(piano, viola, viola_soft, cello)