Strudelify
Sixty Years On cover art

1971 · 17-11-70

Sixty Years On

Elton John

KeyA minorTempo100 bpm
0:00/0:00
// Sixty Years On — Elton John
// 100 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 33 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. 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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "FRETLESS"
const bass = note("<~ A B C D E F@2 G A B H@2 E I@2 J K L M N O P@2 Q R L M N S T@2 J>".pickRestart({
  A: "a1", B: "g1", C: "f1", D: "e1", E: "d1@7 ~", F: "[~@8 e1@7 ~, d1@13 ~@11]/2", G: "e1@17 ~ e1@3 g#1@3",
  H: "[~ e1, f1@13 ~@11]/2", I: "[~@4 e1@3 g#1, d1@13 ~@11]/2", J: "a1@7 ~", K: "a1@17 ~ a1@6", L: "g1@17 ~ g1@6",
  M: "f1@8 ~ f1@3", N: "e1@8 ~ e1@3", O: "d1@16 ~@2 d1@5 ~", P: "[d1@16 ~@8 e1@17 ~ e1@4 ~@2, ~@9 d1@4 ~@11]/2",
  Q: "e1@3 g#1", R: "a1@8 ~ a1@3", S: "d1@6 d1 ~", T: "[d1@16 ~@8 e1@17 ~ e1@3 g#1@3, ~@9 d1@4 ~@11]/2",
})).s("gm_fretless_bass").gain(0.17)

// chords · piano · "A.PIANO 1"
const piano = note("<A@6 B@8 C@8 D@8 E@3>".pickRestart({
  A: "[~@24 e4@11 ~ e4@11 ~ d4@11 ~ d4@11 ~ c4@11 ~ c4@11 ~ c4@10 ~@2 c4@10 ~@14 a3@11 d3, ~@23 [a3,c4]@12 [a3,c4]@12 [g3,b3]@12 [g3,b3]@12 [f3,a3]@12 [f3,a3]@12 [e3,a3]@11 e3@12 d3@12 d3@12 ~@2, ~@107 a3@12 f3@12 f3@13, ~@10 a3 ~]/6", // Am G F A5
  B: "[~@24 b3@11 ~ b3@11 ~ d4@11 ~ d4@11 ~ e4@11 ~ e4@11 ~ d4@11 ~ d4@11 ~@25 c4@10 ~@2 c4@10 ~@14 a3@10 ~ f3, [f3,a3]@11 f3@12 g#3@12 ~@60 [g3,b3]@12 [g3,b3]@13 ~@10 f3@14 ~@22 d3@12 d3@12 d3@2, ~@10 d3@14 ~@118 e3@12 e3@13 f3@12 f3@12 ~, ~@12 a3@13 ~@46 [a3,c4]@12 [a3,c4]@13 ~@24 c4@12 c4@12 ~@48, ~@22 e3@12 ~ [e3,g#3]@12 [e3,g#3]@12 [e3,g#3]@14 ~@46 [f3,a3]@12 a3@12 a3@12 a3@12 ~ a3@12 ~@12]/8", // F G Am E F
  C: "[~@12 a3@10 ~@2 d4@11 ~ d4@11 ~ e4@10 ~@2 e4@11 ~ e4@11 ~ e4@11 ~ d4@11 ~ d4@11 ~ c4@11 ~ c4@11 ~ c4@10 ~@2 c4@10 ~@14 a3@11 d3, a3@11 f3@11 e3@12 ~ [e3,g#3]@14 ~@9 a3@12 ~ [a3,c4]@12 [a3,c4]@13 ~@23 [f3,a3]@12 [f3,a3]@13 ~@10 e3@12 d3@12 d3@12 ~@2, ~@10 d3@13 g#3@12 ~@12 [a3,c4]@12 c4@11 ~@25 [g3,b3]@12 [g3,b3]@13 ~@23 [e3,a3]@12 a3@12 f3@12 f3@13, ~@14 a3 ~]/8", // E Am F Am G A5
  D: "[~@24 b3@11 ~ b3@11 ~ d4@11 ~ d4@11 ~ e4@11 ~ e4@11 ~ d4@11 ~ d4@11 ~ c4@11 ~ c4@11 ~ c4@11 ~ c4@11 ~ a3@11 ~ a3@10 ~ f3, [f3,a3]@11 f3@12 g#3@12 ~@60 [g3,b3]@12 [g3,b3]@13 ~@72, ~@10 d3@14 ~@119 [e3,a3]@12 [e3,a3]@13 ~@22 d3@2, ~@12 a3@13 ~@46 [a3,c4]@12 [a3,c4]@13 ~@96, ~@22 e3@12 ~ [e3,g#3]@12 [e3,g#3]@12 [e3,g#3]@14 ~@46 [f3,a3]@12 [f3,a3]@13 ~@23 [d3,f3]@12 [d3,f3]@12 ~]/8", // F G A5 Am E F Dm
  E: "[a3@11 ~ a3@11 ~ d4@11 ~ d4@11 ~ e4@11 ~ e4@11 ~, ~@11 [d3,f3]@12 [e3,g#3]@12 [e3,g#3]@12 [a3,c4]@12 [a3,c4]@12 ~]/3", // Dm E Am
})).s("gm_piano").gain(0.24).pan(0.4)

// chords · piano · "A.PIANO 1"
const piano_2 = note("<~ A B@2 C D E F G@2 H I J D E K L@2 M N O D P F Q R S I J D P K T>".pickRestart({
  A: "~ a4 ~ c5, ~ a4", B: "[~@2 c5@2 ~@2 b4!2 ~@2 a4@2 ~@2 b4@2, d5@6 c5@7 ~@5 a4@6, ~@24 b4@13 ~@11]/2",
  C: "~@2 e4@4 e4!2, a4@11 ~@13, ~@3 g4@8 ~@13", D: "f4!2 a4!2", E: "c5@2 c5@4 c5!2", F: "~ b4 ~ b4, c5 a4",
  G: "[~@10 c5!2 c5@2 c5@2, c5@11 ~@37, ~ b4@2 b4@15 ~@6, ~@4 a4@7 ~@37]/2", H: "~ c5 b4@2, d5 ~", I: "a4!2 ~ c5, ~ a4",
  J: "~ e4@2 e4, a4@5 ~@7, ~@3 g4@7 ~@14", K: "~ b4 ~ g#4, c5 b4, ~@5 a4@3", L: "[a4@5 a4 ~ c5, ~@3 a4]/2",
  M: "d5@4 ~@2 b4!2, ~ c5", N: "~ a4 ~ b4, b4 a4", O: "~ e4@2 e4, a4@3 ~@5, ~ g4@2 ~@5", P: "c5 c5@3",
  Q: "c5 ~@2 b4@9, ~ b4@2 ~@9, ~@4 a4@7 ~@13", R: "~@2 c5!2 c5@2 c5@2", S: "~ c5 b4!2, d5 ~", T: "a4@7 ~",
})).s("gm_piano").gain(0.32).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~ A@3 B@5 C@6 D E@2 F G@8 H@2 I@4>".pickRestart({
  A: "[~ a3@22 [b3,b4]@24 ~ c4@24, a4@24 ~@23 c5@25]/3", // B
  B: "[[a3,e5]@23 ~ f3@13 a3@10 ~ c4@23 b3@24 ~@6 b5@6 d6@6 e5@7, ~@23 f5@24 a5@24 g#5@31 ~@18, ~@4 g#3]/5", // A5
  C: "[~@24 b3@23 ~@25 e5@23 [f3,f5]@24 [a3,a5]@25, [a3,a5]@25 ~@23 a3@48 ~@48, ~@23 g5@24 f5@26 ~@71]/6", // F A
  D: "~@17 a5@3 b5@4, g#3, g#5@19 ~@5", E: "[a5@18 ~@6 a3@23 ~, a3@21 ~ c6@26, ~@3 e6 ~@4]/2", F: "[b3,b5]",
  G: "[[c4,a5]@41 d4@3 e4@3 ~@25 f4@18 ~@29 c5@3 b4@2 a4@2 b4@11 ~@3 b5@3 ~@18 c6@6 g5@18 b5@7, ~@41 e5@6 f5@24 a5@24 g#5@14 ~@10 d6@20 ~@53, ~@48 d4@25 ~@17 a4@6 g#4@21 ~@21 c5@6 a4@23 g4@25, ~@107 b5@14 ~@16 c6@4 ~@2 a5@18 ~@31]/8", // F
  H: "[f5@11 ~@12 e5@18 a5@7, a4@47 ~, ~@11 a5@14 ~@23]/2",
  I: "[f5@12 ~@6 a4@5 ~ c5@17 ~@21 d6@4 c6@3 g#5@2 ~ a4@17 ~@7, f4@18 ~@5 c6@24 e6@16 ~@8 a5@17 ~@8, ~@6 a5@6 ~@9 a4@3 g#4@11 ~@13]/4",
})).s("gm_string_ensemble_2").gain(0.13).pan(0.2)

// other · ocarina
const ocarina = note("<~ A B C D E F G H I J K L E F M N O P Q R S@2 T U V W X Y Z AA AB AC>".pickRestart({
  A: "~@6 a5@5 ~ a5@6 c6@6", B: "d6@6 c6@5 ~ c6@6 b5@2 ~ b5@2 ~", C: "b5@3 a5@2 ~ a5@3 b5@3",
  D: "a5@3 g5@3 e5@10 ~@2 e5 ~@2 e5@3", E: "f5@5 ~ f5@6 a5@5 ~ a5@6", F: "c6@6 c6@10 ~@2 c6@2 ~ c6@2 ~",
  G: "c6 b5 a5 b5", H: "c6 b5 a5 b5@9", I: "~@6 c6@2 ~ c6@2 ~ c6@5 ~ c6@6", J: "d6 c6 b5@2",
  K: "a5@5 ~ a5@4 ~@2 a5@6 c6@6", L: "a5@3 g5@3 e5@10 ~@2 e5@6", M: "c6@6 b5@5 ~ b5@3 a5@3 g#5@6", N: "a5@11 ~",
  O: "~@6 a5@5 ~ [e5,a5]@6 c6@6", P: "d6@6 c6@5 ~ c6@6 b5@2 ~ b5@2 ~, g5@11 ~ g5@10 ~@2", Q: "b5 a5@2 b5, f5@11 ~@13",
  R: "[e5,a5]@3 ~@3 e5@11 ~ e5@6, ~@3 g5@5 ~@16", // A5
  S: "[f5@5 ~ f5@4 ~@2 a5@6 a5@4 ~@2 [a5,c6]@6 a5@18, d5@12 f5@15 ~@3 c6@14 ~@4]/2", // Am
  T: "c6 b5 a5 b5, g#5@10 ~@2 g#5@11 ~", U: "c6@2 b5@2 a5@2 b5@12 a5@3 g#5@3, g#5@5 ~@19",
  V: "~@6 c6@2 ~ c6@2 ~ c6@4 ~@2 c6@6, a5!2", W: "d6@6 c6@6 b5@5 ~ b5@5 ~, g5",
  X: "b5@6 a5@5 ~ a5@6 c6@6, f5@5 ~ f5@5 ~", Y: "~@6 e5@11 ~ e5@6, [e5,a5]@5 ~@19, ~@3 g5@5 ~@16",
  Z: "f5@5 ~ f5@6 a5@5 ~ a5@4 ~@2, d5@2 ~ f5@3", AA: "c6@5 ~ c6@18, a5", AB: "c6@6 b5@4 ~@2 b5@3 a5@3 g#5@6, g#5@5 ~@3",
  AC: "[e5,a5]@3 ~", // A5
})).s("gm_ocarina").gain(0.09).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~ A@3 B A B A@2 C@3 A@2 C@19>".pickRestart({
  A: "x", B: "x ~@6 x", C: "x ~@2 x ~@4",
})).gain(0.15)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@2 A ~@2 A ~@3 A ~@2 A B ~@19>".pickRestart({
  A: "~@7 x", B: "~@3 x ~@4",
})).gain(0.1)

// drums · rim
const rim = s("rim").struct("<~@9 [~ x]!24>").gain(0.18)

// drums · hihat
const hihat = s("hh").struct("<~ A B@6 C B@4 D B@2 E F@2 G F H I J K I H F L H@2 F M>".pickRestart({
  A: "x ~ x!2", B: "x!4", C: "x ~ x ~@3 x!2", D: "~ x!3", E: "x ~ x ~ x!3 ~", F: "x!4 ~ x!2 ~", G: "x!2 ~ x ~ x!2 ~",
  H: "x!4 ~ x!3", I: "x ~ x!2 ~ x!3", J: "x!4 ~@2 x!2", K: "x!6 ~ x", L: "x!2 ~ x ~ x!3", M: "x!4 ~@4",
})).gain(0.13)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A ~@15 B@2 C B ~ D E ~ D ~ B A ~@2 B ~>".pickRestart({
  A: "~ x ~@2", B: "~@7 x", C: "~@2 x ~@4 x", D: "~ x ~@6", E: "~@5 x ~@2",
})).gain(0.08)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A ~@4 B ~@2 C A@7 D A@8>".pickRestart({
  A: "~ x", B: "x", C: "~@7 x", D: "~@3 x",
})).gain(0.15)

stack(bass, piano, piano_2, string_ensemble_2, ocarina, kick, kick_soft, rim, hihat, hihat_soft, open_hat)

More by Elton John