Strudelify
KeyD majorTempo140 bpm
0:00/0:00
// a thousand years — David Hodges and Christina Perri
// 140 bpm, 3/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 9 "Classical Guitar (Tablature)" acoustic guitar nylon (copy of ch 5 "Acoustic Guitar" acoustic guitar steel)
// note: Transcription provider: pdmx. https://musescore.com/score/5497980; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 204 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/3)

// 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@3 B C@3 D E@4 F@4 G@4 H@4 I@2 J K L@4 M@4 N@2 J K O@4 P@2 Q@2 R@3 S T@3 U V@4 W@4 X@4 G@4 H@4 I@2 J K L@4 M@4 N@2 J
  K O@4 P@2 Q@2 R@3 S T@3 U V@4 Y@7 Z@2 AA@2 AB@2 AC@2 AD@2 AE@3 AF AG AH AI@2 AJ@4 AK AL AM AN AO AP AQ AR AS AT AU AV
  AW AX AY@2 AZ@2 BA@2 BB@2 BC BD BE@2 BF BG BH@4 BI@2 BJ@2 BK@3 BL BM BN BO@2 BP@2 BQ BR BS BT BU BR BV@2 BW@2 BX@2
  BY@2 BZ@3
>`.pickRestart({
  A: "[[d3,a4,f#5]@15 ~ [d3,a4,f#5]@15 ~ [d3,a4,f#5]@15 ~, d4@23 ~]/3", B: "[c#3,c#4,a4,e5]@15 ~",
  C: "[[b4,f#5]@15 ~ [b4,f#5]@15 ~ [b4,f#5]@15 ~, [b2,b3]@23 ~]/3", D: "[a2,a3,f#4,e5]@15 ~",
  E: "[[b4,g5]@15 ~ [b4,g5]@15 ~ [b4,g5]@15 ~ d5@15 ~, [g2,g3]@61 ~@3]/4", // Em G
  F: "[[a4,f#5]@15 ~ [a4,f#5]@15 ~ [a4,e5]@15 ~ d5@5 c#5@5 ~ a4@5, [a2,a3]@61 ~@3]/4", // D A5 A
  G: "[[g4,d5]@15 ~ [g4,d5]@15 ~ [g4,d5]@15 ~ f#5@3 e5@8 d5@5, [g2,g3]@61 ~@3]/4", // G5 G
  H: "[[f#4,d5]@15 ~ [f#4,d5]@15 ~ [f#4,d5]@15 ~ a5@5 g5@3 f#5@8, [d3,d4]@61 ~@3]/4", // D
  I: "[d5@3 b4@10 ~@3 a5@5 g5@3 f#5@8, [b2,b3]@15 ~]/2", J: "e5 f#5, [a2,a3,a4]@15 ~", K: "c#5 d5, [d3,a3,f#4]@15 ~",
  L: "[[g4,d5]@15 ~ [g4,d5]@15 ~ [g4,d5]@15 ~ f#5@3 e5@8 d5@5, [g2,g3]@61 ~@3, ~@48 g4@15 ~]/4", // G5 G
  M: "[[f#4,d5]@15 ~ [f#4,d5,a5]@15 ~ [f#4,d5,f#5]@15 ~ a5@5 g5@3 f#5@8, [d3,d4]@61 ~@3, ~@48 a4@15 ~]/4", // D
  N: "[d5@3 b4@10 ~@3 a5@5 g5@3 f#5@8, [b2,b3]@15 ~, f#4@15 ~ a4@15 ~]/2", // B
  O: "[g3@15 ~ g3@15 ~ [g3,d5,g5,b5]@15 ~ [g3,c#5,a5,c#6]@15 ~, g2@61 ~@3, [g4,b4]@15 ~@17]/4", // G A7 G
  P: "[[b3,f#5,a5]@15 ~ b3@15 ~, [b2,d5,d6]@15 ~]/2", Q: "[a3@15 ~ a6@15 ~, [c#5,c#6]@15 ~, a2@9 ~@7]/2",
  R: "[[d5,f#5]@5 a5@3 [d5,f#5]@8 [d5,f#5]@5 a5@3 [d5,f#5]@8 [d5,f#5,b5]@10 ~ a5@5, d3@23 ~, d4@15 ~ d4@15 ~ d4@15 ~]/3", // D Bm
  S: "e5@5 d5@10 ~, [c#3,c#4]@15 ~", // C#
  T: "[[d5,f#5]@5 a5@3 [d5,f#5]@8 [d5,f#5]@5 a5@3 [d5,f#5]@8 [d5,f#5,b5]@10 ~ a5@5, b2@23 ~, b3@15 ~ b3@15 ~ b3@15 ~]/3", // D Bm
  U: "e5@5 d5@5 ~ d5@2 e5@3, [a2,a3]@15 ~", // A
  V: "[g3@15 ~@6 f#5@5 ~@19 b4@3 [b4,d5]@3 [c#5,e5]@5 [b4,d5]@5 [c#5,e5]@3, g2@61 ~@3, [b4,d5,g5]@20 ~@7 [b4,d5]@15 ~@22, ~@16 g3@15 ~ g3@15 ~ g3@15 ~]/4", // Bm C#m Bm C#m G Bm
  W: "[[a3,a4,c#5,g5]@15 ~ [a3,a4,c#5,f#5]@15 ~ [a3,c#5,e5]@30 ~@2, a2@61 ~@3]/4", // A7 F#m A
  X: "[[d4,f#4,a4,d5]@15 ~ [c#4,e4,a4,c#5]@15 ~@17 [g2,g3]@15 ~, [g2,g3]@23 ~@9, ~@16 a4@15 ~]/4", // D A G
  Y: "[[a3,a4,c#5,g5]@15 ~ [a3,a4,c#5,f#5]@15 ~@17 [d4,f#4,a4,d5]@15 ~ [c#4,e4,a4,c#5]@15 ~@17 [g2,g3]@15 ~, a2@61 ~@19 a4@30 ~@2, ~@24 [g2,g3]@23 ~@9]/7", // A7 F#m D A G
  Z: "[a1@20 ~ a2@5 ~@3 d4@3, e4@25 ~@2 a1@5]/2",
  AA: "[[d4,f#4]@5 [f#4,a4]@3 [d4,f#4]@8 [d4,f#4]@5 [f#4,a4]@3 [d4,f#4]@8, d2@15 ~]/2", // D F#m D F#m D
  AB: "[[f#4,b4]@10 ~ [f#4,a4]@2 ~@8 d4@10 ~, d3@15 ~ [c#2,c#3]@15 ~, ~@13 e4@8 ~@11]/2", // B5 F#m C#
  AC: "[[d4,f#4]@5 [d4,a4]@3 [d4,f#4]@5 b3@3 [d4,f#4]@5 [f#4,a4]@3 [d4,f#4]@8, [b1,b2]@15 ~]/2", // D D5 D F#m D B
  AD: "[a4@5 [f#4,b4]@5 ~ [f#4,a4]@2 ~@8 d4@5 ~ d4@2 e4@3, a2@15 ~ f#2@15 ~, ~@13 e4@8 ~@11]/2", // B5 F#m
  AE: "[g2@10 ~ g2@5 ~@5 [d4,f#4]@5 ~ g1@5 g2@10 ~@3 b3@3, [d4,g4]@20 ~@7 [g3,b3]@15 ~ g2@5, ~@8 g1@5 ~@11]/3", // D G5 G
  AF: "d4@3 e4@5 ~@5 e4@3, g1@10 ~ g2@5, ~@8 d4@5 ~@3", AG: "a2@10 ~ a2@5, [e4,g4]@15 ~", AH: "[a3,d4,f#4]@15 ~",
  AI: "[a3@15 ~ a2@15 ~, [e4,a4]@15 ~]/2", // A5
  AJ: "[[a4,d5,f#5,a5]@15 ~ [d5,f#5,d6]@15 ~ [c#5,a5,c#6]@15 ~ [a4,d5,a5]@15 ~, [f#3,a3]@61 ~@3]/4", // D F#m D5 F#m
  AK: "[b2,b3,a4,d5,f#5,a5]@15 ~", AL: "[b2,b3,d5,f#5,d6]@15 ~", AM: "[b2,b3,c#5,a5,c#6]@15 ~",
  AN: "[a2,a3,f#4,d5,f#5]@15 ~", AO: "[g2,g3,g5]@15 ~", AP: "[e3,e5,e6]@15 ~", AQ: "[d3,d5,d6]@15 ~",
  AR: "[c#3,a4,a5]@15 ~", AS: "[b2,g4,g5]@15 ~", AT: "[d4,f#5,f#6]@15 ~", AU: "[b3,d5,d6]@15 ~", AV: "[a3,a4,a5]@15 ~",
  AW: "[e4,a4,b4] [g4,d5], e3@15 ~", AX: "c#5 [g4,d5], e3@15 ~", AY: "~ g4, e3@15 ~", AZ: "~ f#4, b2@15 ~",
  BA: "~ [a4,c#5], a2@15 ~", BB: "[e2,e3]@15 ~", BC: "[e2,e3,g4,b4]@15 ~", BD: "[a2,a3,a4,c#5]@15 ~",
  BE: "[[f#4,b4,d5]@15 ~ f#5@5 [b1,e5]@5 ~ [b2,d5]@5, [b2,b3]@5 ~@3]/2", BF: "[c#3,c#4,c#5]@15 ~",
  BG: "[a2,a3,a5]@15 ~", // A
  BH: "[[d4,f#4]@5 [f#4,a4]@3 [d4,f#4]@8 [d4,f#4]@5 [f#4,a4]@3 ~@8 [f#4,b4]@10 ~ [f#4,a4]@2 ~@8 [b3,d4]@10 ~, d3@24 [d4,f#4]@8 ~@13 [c#4,e4]@8 ~@11, ~@27 d3@20 ~ [c#2,c#3]@15 ~]/4", // D F#m D F#m B5 F#m Bm D …
  BI: "[[d4,f#4]@5 [f#4,a4]@3 [d4,f#4]@8 [d4,f#4]@5 [f#4,a4]@3 ~@3 b1@5, [b1,b2]@3 [d4,f#4]]/2", // D F#m D F#m B D
  BJ: "[[f#4,b4]@10 ~ [f#4,a4]@2 ~@8 d4@5 ~ d4@2 e4@3, b2@15 ~ a2@15 ~, ~@13 e4@8 ~@11]/2", // B5 F#m
  BK: "[g2@10 ~ g2@5 ~@5 [d4,f#4]@5 ~ g1@5 g2@10 ~@3 b3@3, [d4,g4]@20 ~@7 [b3,d4]@15 ~@6, ~@16 g1@10 ~@17 g2@5]/3", // D G5 Bm
  BL: "[b3,d4]@3 [c#4,e4]@5 ~@5 [c#4,e4]@3, g1@10 ~ g2@5, ~@8 [b3,d4]@5 ~@3", BM: "[a2,e4,g4]@15 ~",
  BN: "a2@10 ~ a2@5, [d4,f#4,d5]@15 ~", BO: "[a1@15 ~ a2@15 ~, [c#4,e4,c#5]@25 ~@7]/2",
  BP: "[b2@15 ~ b2@15 ~, [d4,g4]@15 ~]/2", BQ: "[b2,d5,d6]@15 ~", BR: "[a2,c#5,c#6]@15 ~", BS: "[f#2,a4,d5,a5]@15 ~",
  BT: "[f#2,d3,a4,d5,f#5,a5]@15 ~", BU: "[f#2,d3,a3,d5,d6]@15 ~", BV: "[d3@15 ~ [d2,a2]@15 ~, [a4,d5,e5,a5]@15 ~]/2",
  BW: "[[d4,a4,d5]@20 ~ [e4,e5]@10 ~, [g2,b2]@15 ~]/2", BX: "[[b2,d3,f#3]@15 ~ d3@5 c#3@5 ~ a2@5, [f#4,b4,f#5]@15 ~]/2",
  BY: "[e3@5 c#3@5 ~ a2@5 e3@5 [f#3,b4]@5 ~ [d3,e4]@5, [e4,a4,b4,e5]@5 ~@3]/2", BZ: "[[d2,d3,f#3,b3,d4,a4]@23 ~]/3",
})).s("gm_piano").gain(0.4)

// other · cello · "Violoncello"
const cello = note(`<
  A@3 B C@3 B D@3 E F@3 A@4 D A@3 C D@2 G@2 D@2 C@2 A@3 H C@2 B@2 D@3 B C@2 B@2 A@3 H C@3 B D@5 G I@2 J K L M A@3 D A@3
  C D@2 G@2 D@2 C@2 A@3 H C@2 B@2 D@3 B C@2 B@2 A@3 H C@3 B D@5 G ~ J K L M N@2 A J K L O J K L M J K L M J P@2 O J K L
  O J K L M Q J L M R J L M@3 A@3 H@2 C S T U V@2 W@2 A@3 B C@3 B D@3 E B A X@2 Y Z Y AA AB AC AD H L AE AF@2 AG@2 AH AI
  AJ@3
>`.pickRestart({
  A: "d3", B: "a2", C: "b2", D: "g2", E: "d2", F: "[a2,c#3]", G: "f#2", H: "c#3", I: "e2/2", J: "d4", K: "c#4", L: "a3",
  M: "g3", N: "a2/2", O: "f#3", P: "[d4@3 c#4@29]/2", Q: "e4", R: "f#4", S: "b2 d3", T: "b2@5 a2@5 ~ b2@5",
  U: "c#3@5 c#3@5 ~ c#3@5", V: "[b2,d3]/2", W: "[c#3,e3]/2", X: "[c#3@27 ~@5]/2", Y: "g3@5 f#3@5 ~ d3@5",
  Z: "a2@5 d3@5 ~ f#3@5", AA: "a2@3 b2@2 c#3@3 d3@3 c#3@2 a2@3", AB: "d4@5 c#4@5 ~ a3@5", AC: "a3@5 f#3@5 ~ d3@5",
  AD: "d3@5 a2@5 ~ d3@5", AE: "[d3,f#3]", AF: "[a3@21 a3@5 ~ f#3@5]/2", AG: "[d3,f#3]/2",
  AH: "b2@3 a2@2 b2@3 c#3@3 d3@2 a2@3", AI: "f#3@3 e3@2 f#3@3 d3@3 b2@2 d3@3", AJ: "[f#2 f#2 f#2, d2]/3",
})).s("gm_cello").gain(0.3)

stack(piano, cello)