Strudelify

Sixty Years On

Elton John

KeyA minorTempo100 bpm
0:00/0:00
// Sixty Years On — John Elton
// 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: 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 I J@2 K L M N O P Q@2 R S T U O V W G X>".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: "d1@11 ~", J: "[~@4 e1@3 g#1, d1@13 ~@11]/2", K: "a1@7 ~", L: "a1@17 ~ a1@6",
  M: "g1@17 ~ g1@6", N: "f1@8 ~ f1@3", O: "e1@8 ~ e1@3", P: "d1@16 ~@2 d1@5 ~",
  Q: "[d1@16 ~@8 e1@17 ~ e1@4 ~@2, ~@9 d1@4 ~@11]/2", R: "e1@3 g#1", S: "a1@8 ~ a1@3", T: "g1@8 ~ g1@3",
  U: "f1@17 ~ f1@6", V: "d1@6 d1 ~", W: "d1@17 ~ d1@6", X: "a1@5 ~",
})).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 ~@61 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 c4@12 c4@12 ~@24, ~@22 e3@12 ~ [e3,g#3]@12 [e3,g#3]@12 [e3,g#3]@14 ~@46 [f3,a3]@12 a3@12 a3@12 a3@13 a3@12 ~@12]/8", // F G Am E F
  C: "[~@12 a3@10 ~@14 d4@10 ~@2 e4@10 ~@2 e4@11 ~ e4@11 ~ e4@11 ~ d4@11 ~ d4@11 ~ c4@11 ~@13 c4@10 ~@2 c4@10 ~@2 a3@11 ~ a3@11 d3, a3@11 f3@11 e3@12 e3@13 ~@48 [g3,b3]@12 [g3,b3]@13 ~@22 e3@12 e3@13 f3@12 ~@13, ~@10 d3@13 g#3@12 g#3@12 c4@11 ~ c4@11 ~@62 c4@11 a3@12 a3@12 ~@25, ~@24 d4@12 ~@10 a3@12 a3@12 ~ [a3,c4]@12 [a3,c4]@13 ~@23 [f3,a3]@12 [f3,a3]@13 ~@22 d3@12 ~ [d3,f3]@12 ~]/8", // G Am F Dm
  D: "[[f3,a3]@11 ~ a3@11 ~ b3@11 ~ b3@11 ~@61 d4@11 ~ c4@11 ~ c4@11 ~ c4@11 ~ c4@11 ~ a3@11 ~ a3@10 ~ f3, ~@11 [d3,f3]@14 ~@23 d4@11 g#3@12 c4@12 c4@12 b3@12 b3@13 ~@72, ~@23 [e3,g#3]@12 [e3,g#3]@12 [e3,g#3]@11 e3@14 ~@22 g3@12 g3@13 [f3,a3]@12 [f3,a3]@13 ~@23 [d3,f3]@12 [d3,f3]@12 ~, ~@5 d4 e4!2 d4 ~@7, ~@70 a3@12 a3@13 ~@48 [e3,a3]@12 [e3,a3]@13 ~@22 d3@2]/8", // F Dm E F Dm A5
  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 T D P U@2>".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@12 a4@11 ~", 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: "~ e4@2 e4, a4@11 ~@13, ~@3 g4@8 ~@13", U: "[~@2 b4@2 ~@4 a4@7 ~, c5@6 b4@7 ~@11, ~@5 a4@3 ~@8, ~@9 g#4@4 ~@11]/2",
})).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 M N O P Q R S T@2 U V W X Y Z AA AB AC AD>".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 c6@9 ~@3 c6@2 ~ c6@2 ~",
  N: "c6@6 b5@5 ~ b5@3 a5@3 g#5@6", O: "a5@11 ~", P: "~@6 a5@5 ~ [e5,a5]@6 c6@6",
  Q: "d6@6 c6@5 ~ c6@6 b5@2 ~ b5@2 ~, g5@11 ~ g5@10 ~@2", R: "b5 a5@2 b5, f5@11 ~@13",
  S: "[e5,a5]@3 ~@3 e5@11 ~ e5@6, ~@3 g5@5 ~@16", // A5
  T: "[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
  U: "c6 b5 a5 b5, g#5@10 ~@2 g#5@11 ~", V: "c6@2 b5@2 a5@2 b5@12 a5@3 g#5@3, g#5@5 ~@19",
  W: "~@6 c6@2 ~ c6@2 ~ c6@4 ~@2 c6@6, a5!2", X: "d6@6 c6@6 b5@5 ~ b5@5 ~, g5",
  Y: "b5@6 a5@5 ~ a5@6 c6@6, f5@5 ~ f5@5 ~", Z: "~@6 e5@11 ~ e5@6, [e5,a5]@5 ~@19, ~@3 g5@5 ~@16",
  AA: "f5@5 ~ f5@6 a5@5 ~ a5@4 ~@2, d5@2 ~ f5@3", AB: "c6@5 ~ c6@18, a5",
  AC: "c6@6 b5@4 ~@2 b5@3 a5@3 g#5@6, g#5@5 ~@3", AD: "[e5,a5]@3 ~",
})).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