Strudelify
Vincent cover art

1987 · American Pie

Vincent

Don McLean

KeyG majorTempo100 bpm
0:00/0:00
// Vincent — Don McLean
// 100 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 5 "slap bas" slap bass 1 (copy of ch 2 "bass" electric bass finger)
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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.

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@5 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q AA S T U V W X AB AC AD AE
  AF AG AH AI AJ AK AL AM AN AO A B AP D E F G H I J K L M N O P Q R S AQ U V AR AS AT AU AV
>`.pickRestart({
  A: "g2@5 ~ d3 b2", B: "g2@7 ~ g2@2 b2 ~ d3 ~ b2 ~", C: "a2@7 ~@5 e3 c3 b2 ~", D: "a2@8 e3@3 ~ c3@2 ~@2",
  E: "c2@5 ~@3 c2@2 e2 ~ g2 e2 c2 ~", F: "d2@6 ~ d2 f#2@2 a2@2 d3@2 a2 ~", G: "g2@7 ~ b2@2 d3@2 b2 ~ a2@2",
  H: "g2@5 ~ d3 ~ d3@4 b2 d3 b2@2", I: "g2@7 ~ g2@2 b2 ~ d3@2 g2 ~", J: "a2@5 ~ e3 ~ e3@4 c3 e3 c3@2",
  K: "a2@5 ~ a2@2 c3 ~ e3@2 c3 ~ a2@2", L: "c3@5 ~ c3@2 g2@4 c3@2 g2@2", M: "d3@6 a2 ~ a2@3 ~ f#2 ~ d2@2",
  N: "g2@5 ~ g2@2 c3@3 ~ c3@3 ~", O: "g2@6 ~@2 g2@2 b2 ~ d3 ~ b2 ~", P: "a2@5 ~ e3@2 e3@3 ~ c3 e3 c3@2",
  Q: "d3@5 ~ a2 ~ a2@3 ~ d3@3 ~", R: "g2@5 ~ d3@2 d3@2 g2 ~ f#2@2 ~@2", S: "e2@6 e2@2 g2@2 b2@2 g2 ~ e2@2",
  T: "a2@5 ~ a2@2 a2@4 e2 ~ a2@2", U: "d2@5 ~ d2@2 f#2 ~ a2@2 f#2@2 d2 ~", V: "e2@5 ~ e2 ~ b2@2 g2@2 e2@4",
  W: "a2@5 ~ a2 ~ a2@3 ~ e2@3 ~", X: "a2@5 ~ a2 ~ d2@3 ~ d2@3 ~", Y: "g2@4 ~@2 b2@2 d3@2 b2@2 d3 b2 g2 ~",
  Z: "g2@3 ~@13", AA: "g2@5 ~ d3@2 d3@2 g2 ~ f#2@2 f#2@2", AB: "g2@4 ~@2 g2 ~ b2 ~ d3 ~ b2 ~ g2 ~",
  AC: "a2@5 ~ e3 ~ e3@3 ~ e3 c3 a2 ~", AD: "d2@5 ~ a2 ~ a2@4 a2 d2 f#2 ~", AE: "g2@4 ~@2 b2@2 b2@2 ~@2 g2@3 ~",
  AF: "e2@5 ~ e2 ~ g2@2 b2 ~ g2@2 e2 ~", AG: "a2@4 ~@2 a2 ~ a2@4 e2@2 a2 ~", AH: "c3@4 ~@2 c3@2 g2@3 ~ c3@4",
  AI: "g2@5 ~ g2 ~ f2@5 ~ f2 ~", AJ: "e2@5 ~ e2@2 g#2 ~ b2@2 g#2 ~ e2 ~", AK: "a2@5 ~ a2 ~ a2@4 e2 ~ a2 ~",
  AL: "c3@5 ~ c3 ~ c3@3 ~ c3@4", AM: "d3@5 ~ d3 ~ d3@4 a2 d3 a2 ~", AN: "g2@5 ~ g2 ~ b2 ~ d3 ~ b2 ~ d3@2", AO: "g2 ~@7",
  AP: "a2@7 ~@5 e3 c3 a2 ~", AQ: "a2@5 ~ a2@2 a2@3 ~ e2 ~ a2@2", AR: "a2@5 ~ e3 ~ e3@3 ~ a2@3 ~", AS: "a2@7 ~ d3@7 ~",
  AT: "g2@6 b2@2 d3 ~ g3@2 d3@2 b2@2", AU: "g2@8 b2@3 ~ d3@3 ~", AV: "g2@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.36)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note(`<
  ~@5 A@2 B@2 C D E@6 F G@2 H@2 I@5 J@2 K@2 A@2 B@2 C D L@5 C F G@2 M@2 N@4 O J@2 ~ P@2 Q@2 R S T U V@2 W X@2 Y@2 B@2 C
  D Z@3 B@2 C F G@2 H@2 AA@4 O AB@2 AC@3
>`.pickRestart({
  A: "[[g3,b3,d4,g4,b4,d5]@31 ~]/2", B: "[[a3,c4,e4,a4,c5,e5]@31 ~]/2", C: "[g3,c4,e4,g4,c5,e5]", D: "[a3,c4,a4,c5]",
  E: "[g4@16 [g4,g5]@31 [a3,c4,e4,a4,c5,e5]@31 ~ [g3,c4,e4,g4,c5,e5]@16 ~, [g3,b3,d4,b4,d5]@23 ~@25]/6", // G Am C G
  F: "[d4,d5]@7 ~@2 [f#4,f#5]@6 ~, [a3,c4,a4,c5]@15 ~", // D F# Am
  G: "[[g3,b3,d4,g4,b4,d5]@2 [c4,e4,c5,e5]@2 [b3,d4,b4,d5]@3 ~, ~@8 [g3,g4]@19 ~@5]/2", // G C Bm G
  H: "[[e5,e6]@4 [d5,d6]@3 [c5,c6], [a4,a5], [c5,c6]@21 ~@11]/2", // E D C A C
  I: "[~@48 [d4,f#4,d5,f#5]@15 ~ [b3,b4]@15 ~, [g4,g5]@3 ~@2, [b4,b5]@33 [a4,a5]@30 ~@17, ~@16 [e4,e5]@32 ~@15 [e4,g4,e5,g5]@15 ~@2]/5", // D B G B A E Em
  J: "[[a3,c#4,a4,c#5]@2 ~ [f#4,f#5], [e4,g4,e5,g5]@3 ~, ~@16 [a3,c4,a4,c5]@15 ~]/2", // A F# Em Am
  K: "[[b3,d4,g4,b4,d5,g5]@19 ~@13]/2", // G
  L: "[g4@16 [g4,g5]@31 ~ [a3,a4]@31 ~, [g3,b3,d4,b4,d5]@46 ~ [c4,e4,c5,e5]@31 ~@2]/5", // G A G C
  M: "[[e5,e6]@4 [d5,d6]@3 [c5,c6], [a4,a5]@31 ~, [c5,c6]@21 ~@11]/2", // E D C A C
  N: "[~@48 [d4,d5]@15 ~, [g4,g5]@3 ~, [b4,b5]@34 ~@13 [f#4,f#5]@16 ~, ~ [e4,e5]@2 ~, ~@16 [a4,a5]@15 ~]/4", // D G B F# E A
  O: "[b3,e4,g4,b4,e5,g5]@15 ~", // Em
  P: "[~@16 [d3,d4,a4,c5,f#5,a5,c6,f#6]@15 ~, [a4,c5,e5,a5,c6,e6]@15 ~@17, ~@6 [e3,e4]@3 ~@7]/2", // D7 Am E
  Q: "[[g3,d5,g5,d6]@16 [e3,e4]@15 ~, [g4,b4,b5]@15 ~]/2", R: "[a3,a4,c5,e5,g5,a5,c6,e6,g6]",
  S: "[c4,c5,d#5,a5,c6,d#6,a6]", T: "[g3,g4,b4,d5,g5,b5,d6,g6] [f3,f4,a4,c5,d#5,a5,c6,d#6]",
  U: "[e3,e4,g#4,b4,d5,g#5,b5,d6]", V: "[[a3,a4,e5,g5,a5,e6,g6] [c3,c4,g4,e5,g5,e6], [c5,c6]]/2",
  W: "[d5,d6]@11 ~ [c5,c6]@4, [d3,d4,a4,f#5,a5,f#6]", X: "[[g4,b4,d5,b5,d6]@9 ~@7, [g3,g5]@15 ~@17]/2",
  Y: "[~ [g3,b3,d4,g4,b4,d5]@31]/2", Z: "[g4@16 [g4,g5]@31 ~, [g3,b3,d4,b4,d5]@23 ~]/3",
  AA: "[~@3 [d4,f#4,d5,f#5], [g4,g5]@3 ~, [b4,b5]@33 [a4,a5]@30 ~, ~ [e4,e5]@2 ~]/4", // D G B A E
  AB: "[[c#4,a4,c#5,e5]@2 ~ [d3,d4,f#4,f#5], a3@31 ~, [e4,g4]@3 ~, g5@12 ~@4 c4@15 ~]/2", // A D Em
  AC: "[b4@8 [b4,b5]@9 ~@7, [g2,g3,b3,d4,g4,d5,g5]@17 ~@7]/3", // B G
})).s("gm_string_ensemble_1").gain(0.18)

// other · piano · "future 2"
const piano = note(`<
  ~ A B A B C D E F G H B C B E I G J K L M N O P Q@5 R@2 C D E F G H B C B E I G J K L M N O S T@4 U V@2 W X Y Z AA AB
  AC AD AE AF AG AH C D E F G H B C B E I G J K L M N O AI AJ AK AL AM AN AO AP AQ
>`.pickRestart({
  A: "[g3,g4] [d4,d5] [b4,b5] [d4,d5] [g3,g4] [d4,d5] [c5,c6] [d4,d5]", // G D B D G D C D
  B: "[g3,g4] [d4,d5] [b4,b5] [d4,d5] [g3,g4] [d4,d5] [b4,b5] [d4,d5]", // G D B D G D B D
  C: "[g3,g4]@2 [d4,d5]@2 [b4,b5]@2 [d4,d5]@2 [g3,g4]@2 [d4,d5]@2 [c5,c6] ~ [d4,d5]@2", // G D B D G D C D
  D: "[g3,g4]@2 [d4,d5]@2 [b4,b5]@2 [d4,d5]@2 [g3,g4]@2 [d4,d5]@2 [b4,b5]@2 [d4,d5] ~", // G D B D G D B D
  E: "[a3,a4] [e4,e5] [c5,c6] [e4,e5] [a3,a4] [e4,e5] [b4,b5] [e4,e5]", // A E C E A E B E
  F: "[a3,a4] [e4,e5] [a4,a5] [e4,e5] [a3,a4] [e4,e5] [c5,c6] [e4,e5]", // A E A E A E C E
  G: "[c4,c5] [g4,g5] [c5,c6] [g4,g5] [c4,c5] [g4,g5] [b4,b5] [a4,a5]", // C G C G C G B A
  H: "[d4,d5]@2 [f#4,f#5]@2 [c5,c6]@2 [a4,a5]@2 [d4,d5]@2 [f#4,f#5]@2 [a4,a5]@2 [f#4,f#5] ~", // D F# C A D F# A F#
  I: "[a3,a4] [e4,e5] [a4,a5] [e4,e5] [a3,a4] [e4,e5] [a4,a5] [e4,e5]", // A E A E A E A E
  J: "[d4,d5] [a4,a5] [c5,c6] [a4,a5] [d4,d5] [a4,a5] [c5,c6] [d4,d5]", // D A C A D A C D
  K: "g4@3 ~ [b3,b4]@2 g3@2 [c4,c5]@2 [d4,d5]@2 [c4,c5]@2 [b3,b4]@2, g5@7 ~@9, ~@3 [g3,g4]@3 g4 ~@9", // B C D C B G
  L: "[g3,g4]@3 ~@5", M: "~@4 [a3,a4]@2 [b3,b4]@2 [c4,c5]@4 [d4,d5]@2 [e4,e5] ~", N: "[a3,d4,f#4,a4,d5,f#5]@13 ~@3",
  O: "[b3,d4,b4,d5]@3 ~@5", P: "[b3,d4,b4,d5] ~@3, [g3,g4]@13 ~@3",
  Q: "[[a3,c4,e4,a4,c5,e5]@8 ~@3 [c4,g4,c5,g5]@3 ~@2 [f#4,f#5]@12 ~@3 g4 [g4,g5]@13 ~@2 [a3,c#4,e4,g4,a4,c#5,e5,g5]@8 g4 [c#4,e4,g4,c#5,e5,g5]@6 a3 [g4,g5]@13 [d4,d5]@2 [f#4,f#5]@2, ~@15 [a3,c4,a4,c5]@13 ~@3 [g3,b3,e4,b4,e5]@14 ~@10 g3@6 ~ [c4,a4,c5]@12 ~@2 [a3,c4,a4,c5]@4, ~@63 [e4,e5]@11 ~@6]/5", // Am C5 F# G A7 C#dim G D …
  R: "[[b3,d4,g4,b4,d5,g5]@19 ~@13, g3@3 ~@29]/2", S: "[g3,e4,g4,e5]@13 ~@3, [b3,b4] ~@15",
  T: "[[a3,c4,e4,a4,c5,e5]@8 ~@3 [c4,g4,c5,g5]@3 ~@2 [f#4,f#5]@12 ~@3 g4 [g4,g5]@13 ~@2 [a3,c#4,e4,g4,a4,c#5,e5,g5]@8 ~ [g3,c#4,e4,g4,c#5,e5,g5]@6 ~@2, ~@5 a4@2 ~@25, ~@10 a3@2 ~@3 [a3,c4,a4,c5]@13 ~@3 [g3,b3,e4,b4,e5]@14 ~@19]/4", // Am C5 F# G A7 C#dim Am Em
  U: "[c4,g4,c5,g5]@6 [d4,d5] [f#4,f#5], [a3,e4,a4,e5]@11 ~ [a3,c4,a4,c5]@4", // C5 D F# A5 Am
  V: "[[b3,d4,b4,d5,g5]@6 ~@10 [a3,c4,e4,g4,a4,c5,e5]@9 ~@7, g3@19 ~@13, g4@16 g5@3 ~@13]/2", // G Am7
  W: "[a3,c4,f#4,a4,c5,f#5]@13 ~@3", X: "[g3,b3,d4,g4,b4,d5]@13 ~@3", Y: "[g3,b3,e4,g4,b4]@3 ~, e3@5 ~@3",
  Z: "[a3,c4,e4,g4,a4,c5,e5,g5]@13 ~@3", AA: "[g4,g5]@8 [a4,a5]@3 [g4,g5]@3 ~@2, [c4,d#4,c5,d#5]@7 ~",
  AB: "[b3,d4,g4,b4,d5,g5]@7 ~ [a3,c4,d#4,f4,a4,c5,d#5,f5]@6 ~@2", AC: "[b3,d4,g#4,b4,d5,g#5]@13 ~@3",
  AD: "[a3,c4,e4,g4,a4,c5,e5,g5]@15 ~", AE: "[g3,c4,e4,g4,c5,e5]@7 ~", AF: "[a3,c4,f#4,a4,c5,f#5]@7 ~",
  AG: "~@6 [d3,d4]@3 ~ [g4,g5] [d4,d5] [b3,b4] [g3,g4] [d4,d5] [b3,b4], g3@9 ~@7, g4@2 d5@7 ~@7, ~ [b3,b4]@8 ~@7, ~@2 d4 [g4,g5]@6 ~@7", // D G D B G D B G
  AH: "[g4,g5] ~, g3 ~@7", AI: "[g3,b3,e4,g4,b4,e5]@13 ~@3",
  AJ: "[a3,c4,e4,a4,c5,e5]@8 ~@4 [c4,g4,a4,c5,g5]@3 ~, ~@12 a3 ~@3", AK: "[a3,f#4,a4,f#5]@3 ~, [c4,c5] ~@3",
  AL: "[g3,b3,e4,g4,b4,e5,g5]@13 ~@2 [a3,c#4,e4,g4,a4,c#5,e5,g5]", AM: "[a3,c#4,e4,g4]@3 ~",
  AN: "[c4,e4,g4,a4,c5,e5,g5]@7 ~ [d3,c4,d4,f#4,c5,f#5]@6 ~@2", AO: "[g3,b3,d4,g4,b4,d5,g5]",
  AP: "[g3,g4]@2 [b3,b4]@2 [d4,d5] ~ [g4,g5]@2 [b4,b5]@2 [d5,d6] ~ [g5,g6]@2 [b5,b6] ~", // G B D G B D G B
  AQ: "[g5,b5,d6,g6,b6,d7,g7]@3 ~@5", // G
})).s("gm_piano").gain(0.31)

// drums · kick
const kick = s("bd").struct("<~ A@28 B C A@24 C D@6 B D@5 C A@24 B C@2>".pickRestart({
  A: "x ~@3 x!2 ~ x", B: "x ~@2 x!2 ~@3", C: "x", D: "x ~@2 x!3 ~ x",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct("<~ A@29 B A@24 B C@6 A C@5 B A@25 B D>".pickRestart({
  A: "~ x ~ x", B: "x ~@7 x ~@2 x ~@2 x!2", C: "~@4 x ~@2 x ~@4 x ~@3", D: "x",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<A B@28 C D B@24 D B@6 C B@5 D B@24 C D ~>".pickRestart({
  A: "x!4", B: "x!7 ~", C: "x!5 ~ x!2", D: "x ~ x!5 ~",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@29 A B ~@24 B ~@6 A ~@5 B ~@24 A B ~>".pickRestart({
  A: "~@12 x!3 ~", B: "~@8 x!3 ~@5",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<~ A@28 B ~ A@24 ~ A@6 B A@5 ~ A@24 B ~ C>".pickRestart({
  A: "~@7 x", B: "~@5 x ~@2", C: "x",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@29 A B ~@24 B ~@6 A ~@5 B ~@24 A B ~>".pickRestart({
  A: "~@10 x ~@4 x", B: "~@3 x",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct("<~@29 A B ~@31 A B ~@29 A B ~>".pickRestart({
  A: "~@15 x", B: "x",
})).gain(0.36)

// drums · tambourine
const tambourine = s("tb").struct("<~@29 A B ~@24 B C@6 A C@5 B ~@24 A B ~>".pickRestart({
  A: "~ x ~ x", B: "x!16", C: "~ x ~@2",
})).gain(0.36)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@29 ~ A@24 ~ B@6 A B@5 ~ A@25 ~@2>".pickRestart({
  A: "x!8", B: "x!4",
})).gain(2.08)

stack(bass, string_ensemble_1, piano, kick, snare, hihat, mid_tom, open_hat, high_tom, crash, tambourine, cabasa)

More by Don McLean