Strudelify
Annie's Song cover art

1974 · Back Home Again

Annie's Song

John Denver

KeyD majorTempo120 bpm
0:00/0:00
// Annie's Song — John Denver
// 120 bpm, 3/4, key D major. Source: mcgill + 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: Full arrangement: all 133 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Nylon-str. Gt..
setcpm(120/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.

// other · recorder
const recorder = note("<~@38 A B C ~@5 D B E F G@2 ~@81>".pickRestart({
  A: "c6@8 d6@3 e6@5", B: "b5@8 c6@3 d6@5", C: "a5@5 e5@5 ~@6", D: "f5@8 g5@3 a5@5", E: "a5@4 ~@7 a5@5",
  F: "b5@5 c6@7 ~ d6@3", G: "c6/2",
})).s("gm_recorder").gain(0.35)

// bass · acoustic bass · "Acoustic Bs."
const bass = note(`<
  ~@58 A B C A D E C B A F G A H@3 ~ A B C A D E C B A F G A D ~@7 B C E B I J E C B K F B L@3 ~ B C E B I J E C B K F B
  I ~@7 M@3
>`.pickRestart({
  A: "f2", B: "g2", C: "a2", D: "c3", E: "b2", F: "e2", G: "d2", H: "[g2@47 ~]/3", I: "d3", J: "c#3", K: "f#2",
  L: "[a2@47 ~]/3", M: "[~@5 d2@16 ~@3]/3",
})).s("gm_acoustic_bass").gain(0.45)

// chords · acoustic guitar steel · "Steel-str. Gt."
const acoustic_guitar_steel = note(`<
  ~@14 A B A B A B A B C D E C A F G H I J K C D L D L C D E C A F G H I J K C A B A B A B A B C D E C A F G H I J K C D
  L D L C D E C A F G H I J K C A B A B M N M N O P Q O M R S T U V J O P W P W O P Q O M R S T U V J O M N M N M N M
  X@4
>`.pickRestart({
  A: "~@13 g3@3, c3, ~@3 e3@5 e3@8, ~@5 g3@8 ~@3, ~@11 c4@5", B: "~@13 g3@3, c3, ~@3 f3@13, ~@5 g3@6 c4@5, ~ e3",
  C: "~@13 a3@3, f2, ~@3 f3@5 f3@8, ~@5 a3@8 ~@3, ~@11 c4@5",
  D: "~@13 g3@3, g2, ~@3 d3@5 d3@8, ~@5 g3@8 ~@3, ~@11 b3@5",
  E: "~@13 a3@3, a2, ~@3 e3@5 e3@8, ~@5 a3@8 ~@3, ~@11 c4@5",
  F: "~@13 g3@3, b2, ~@3 e3@5 e3@8, ~@5 g3@8 ~@3, ~@11 c4@5",
  G: "~@13 g3@3, a2, ~@3 e3@5 e3@8, ~@5 g3@8 ~@3, ~@11 c4@5",
  H: "~@13 g3@3, g2, ~@3 e3@5 e3@8, ~@5 g3@8 ~@3, ~@11 c4@5",
  I: "~@13 c4@3, f3, ~@3 a3@5 a3@8, ~@5 c4@8 ~@3, ~@11 f4@5",
  J: "~@13 b3@3, e3, ~@3 g3@5 g3@8, ~@5 b3@8 ~@3, ~@11 e4@5",
  K: "~@13 a3@3, d3, ~@3 f3@5 f3@8, ~@5 a3@8 ~@3, ~@11 d4@5",
  L: "~@13 g3@3, g2, ~@3 d3@5 d3@8, ~@5 g3@8 ~@3, ~@11 c4@5",
  M: "~@13 a3@3, d3, ~@3 f#3@5 f#3@8, ~@5 a3@8 ~@3, ~@11 d4@5", N: "~@13 a3@3, d3, ~@3 g3@13, ~@5 a3@6 d4@5, ~ f#3",
  O: "~@13 b3@3, g2, ~@3 g3@5 g3@8, ~@5 b3@8 ~@3, ~@11 d4@5",
  P: "~@13 a3@3, a2, ~@3 e3@5 e3@8, ~@5 a3@8 ~@3, ~@11 c#4@5",
  Q: "~@13 b3@3, b2, ~@3 f#3@5 f#3@8, ~@5 b3@8 ~@3, ~@11 d4@5",
  R: "~@13 a3@3, c#3, ~@3 f#3@5 f#3@8, ~@5 a3@8 ~@3, ~@11 d4@5",
  S: "~@13 a3@3, b2, ~@3 f#3@5 f#3@8, ~@5 a3@8 ~@3, ~@11 d4@5",
  T: "~@13 a3@3, a2, ~@3 f#3@5 f#3@8, ~@5 a3@8 ~@3, ~@11 d4@5",
  U: "~@13 d4@3, g3, ~@3 b3@5 b3@8, ~@5 d4@8 ~@3, ~@11 g4@5",
  V: "~@13 c#4@3, f#3, ~@3 a3@5 a3@8, ~@5 c#4@8 ~@3, ~@11 f#4@5",
  W: "~@13 a3@3, a2, ~@3 e3@5 e3@8, ~@5 a3@8 ~@3, ~@11 d4@5",
  X: "[~@16 a3@3 ~@9 f#4@35 ~, d3@19 ~@7 [d3,a3]@38, ~@3 f#3@6 ~ f#3@9 ~@45, ~@3 a3@5 ~@24, ~@13 d4@6 ~@8 d4@37]/4", // D5
})).s("gm_acoustic_guitar_steel").gain(0.35)

// chords · acoustic guitar nylon · "Nylon-str. Gt."
const acoustic_guitar_nylon = note("<~ A@8 B@4 ~@120>".pickRestart({
  A: "[~@13 e4@21 ~@11 f4@21 ~@11 g4@21 ~@11 e4@19, ~@11 [e3,a3]@21 ~@11 [f3,a3]@21 ~@11 [g3,b3]@21 ~@11 [e3,a3]@21, ~@3 c4@5 ~@3 c4@5 ~@3 e4@5 ~@3 c4@5]/8", // A5 F G A5
  B: "[~@13 f4@21 ~@11 d4@19, ~@11 [f3,a3]@21 ~@11 [d3,g3]@21, ~@3 c4@5 ~@3 b3@5]/4", // F G5
})).s("gm_acoustic_guitar_nylon").gain(0.3)

// chords · harpsichord · "Harpsicord"
const harpsichord = note(`<
  ~@58 A B C A D@4 E F G A B H B H A B C A D@4 E F G A ~@8 I J K I L@4 M N F I J O J O I J K I L@4 M N F I ~@8 P@2 ~
>`.pickRestart({
  A: "~@11 c4@5, ~@3 f3@5 f3@8, ~@5 a3@10 ~", B: "~@11 b3@5, ~@3 d3@5 d3@8, ~@5 g3@10 ~",
  C: "~@11 c4@5, ~@3 e3@5 e3@8, ~@5 a3@10 ~", D: "~@11 c4@5, ~@3 e3@5 e3@8, ~@5 g3@10 ~",
  E: "~@11 f4@5, ~@3 a3@5 a3@8, ~@5 c4@10 ~", F: "~@11 e4@5, ~@3 g3@5 g3@8, ~@5 b3@10 ~",
  G: "~@11 d4@5, ~@3 f3@5 f3@8, ~@5 a3@10 ~", H: "~@11 c4@5, ~@3 d3@5 d3@8, ~@5 g3@10 ~",
  I: "~@11 d4@5, ~@3 g3@5 g3@8, ~@5 b3@10 ~", J: "~@11 c#4@5, ~@3 e3@5 e3@8, ~@5 a3@10 ~",
  K: "~@11 d4@5, ~@3 f#3@5 f#3@8, ~@5 b3@10 ~", L: "~@11 d4@5, ~@3 f#3@5 f#3@8, ~@5 a3@10 ~",
  M: "~@11 g4@5, ~@3 b3@5 b3@8, ~@5 d4@10 ~", N: "~@11 f#4@5, ~@3 a3@5 a3@8, ~@5 c#4@10 ~",
  O: "~@11 d4@5, ~@3 e3@5 e3@8, ~@5 a3@10 ~", P: "[~@12 f#4@19 ~, ~@10 [d3,a3]@19 ~@3, ~@11 d4@19 ~@2]/2",
})).s("gm_harpsichord").gain(0.2)

// other · vibraphone
const vibraphone = note(`<
  ~@14 A B A B A B A C ~@12 D E D F ~@12 A B A B A B A C ~@12 D E D F ~@12 A B A B G H G I ~@12 J K J L ~@12 G H G H G H
  G M@3 ~
>`.pickRestart({
  A: "c6@8 g5@3 g5@5", B: "c5@8 g5@3 g5@5", C: "c5 ~", D: "g5@8 d5@3 d5@5", E: "g4@8 d5@3 d5@5", F: "g4 ~",
  G: "d6@8 a5@3 a5@5", H: "d5@8 a5@3 a5@5", I: "d5 ~", J: "a5@8 e5@3 e5@5", K: "a4@8 e5@3 e5@5", L: "a4 ~",
  M: "[d5@9 ~ a5@3 a5@6 ~@7 c7@19 ~@3]/3",
})).s("gm_vibraphone").gain(0.25)

// other · french horn
const french_horn = note("<~ A@2 B@2 C@2 A@2 B@2 C@2 D@2 ~@118>".pickRestart({
  A: "a2/2", B: "f2/2", C: "g2/2", D: "c2/2",
})).s("gm_french_horn").gain(0.35)

// other · pad new age · "Fantasia"
const pad_new_age = note("<A B@2 C@2 D@2 E@2 F@2 G@2 H@2 ~@27 I J K L ~@87>".pickRestart({
  A: "~@5 a4@5 ~ b4@5", B: "[c5@21 b4@11]/2", C: "a4/2", D: "[g4@21 f5@11]/2", E: "[e5@21 d5@11]/2",
  F: "[c5@11 d5@10 c5@11]/2", G: "[b4@11 c5@16 d5@5]/2", H: "c5/2", I: "c7", J: "b6", K: "a6@13 ~@3", L: "g6",
})).s("gm_pad_new_age").gain(0.3)

// chords · string ensemble 2 · "Slow Strings"
const string_ensemble_2 = note(`<
  ~ A@2 B@2 C@2 A@2 B@2 C@2 D@2 ~@43 E F G E H@4 E I J K L@4 E F G E M@4 E I J K H@4 N@4 O P Q O N@4 O R I F S@4 T U V O
  N@4 W X Y Z AA@4 AB@7
>`.pickRestart({
  A: "[a1,e3,a3,c4]/2", B: "[f1,f3,a3,c4]/2", C: "[g1,d3,g3,b3]/2", D: "[c2,e3,g3,c4]/2", E: "[a3,c4,f4]",
  F: "[g3,b3,d4]", G: "[a3,c4,e4]", H: "[g3,c4,e4]/4", I: "[g3,b3,e4]", J: "[f3,a3,d4]", K: "[f3,a3,c4]",
  L: "[g3,b3,d4]/4", M: "[c6 b5 a5 g5, [g3,c4,e4]]/4", N: "[a3,d4,f#4]/4", O: "[b3,d4,g4]", P: "[a3,c#4,e4]",
  Q: "[b3,d4,f#4]", R: "[a3,c#4,f#4]", S: "[a3,c#4,e4]/4", T: "d6@8 e6@3 f#6@5, [b3,d4,g4]",
  U: "c#6@8 d6@3 e6@5, [a3,c#4,e4]", V: "b5@5 f#5@5 ~@6, [b3,d4,f#4]", W: "g5@8 a5@3 b5@5, [b3,d4,g4]",
  X: "c#6@8 d6@3 e6@5, [a3,c#4,f#4]", Y: "b5@4 ~@7 b5@5, [g3,b3,e4]", Z: "c#6@5 d6@7 ~ e6@3, [g3,b3,d4]",
  AA: "[[a3,d4,f#4], d6 ~]/4", AB: "[[a3,d4,f#4]@67 ~@7 [d2,f#3,a3,d4,d5,d6]@32 ~@6]/7",
})).s("gm_string_ensemble_2").gain(0.4)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@50 A B A B A B A B ~@28 A B A B C D C D ~@28 C D C D C D C E F ~@2>".pickRestart({
  A: "~@3 c5@2 g5@3 e5@3 g5@2 c5@3", B: "~@3 c5@2 g5@3 f5@3 g5@2 c5@3", C: "~@3 d5@2 a5@3 f#5@3 a5@2 d5@3",
  D: "~@3 d5@2 a5@3 g5@3 a5@2 d5@3", E: "~@3 d5@3 a5@3 ~ g5@3 a5@3", F: "d5@3 ~@13",
})).s("gm_string_ensemble_1").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@58 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A C ~@3
>`.pickRestart({
  A: "x ~@7 x ~@2 x ~@4", B: "x ~@10 x ~@4", C: "x ~@12 x ~@2",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct(`<
  ~@59 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@57 [x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2]!72 [x ~@2 x ~@2 x ~@3 x ~@2 x ~@2] x ~@2>")
  .gain(0.3)

stack(
  recorder, bass, acoustic_guitar_steel, acoustic_guitar_nylon, harpsichord, vibraphone, french_horn, pad_new_age,
  string_ensemble_2, string_ensemble_1, kick, rim, hihat
)

More by John Denver