Strudelify

Friends

Elton John

KeyF majorTempo72 bpm
0:00/0:00
// Friends — Elton John
// 72 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 44 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(72/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.

// chords · piano · "tk1"
const piano = note(`<
  A B@2 C D@2 E F G H I J K L M N O P Q R S T U V W H I J K L M N X H I J K L M N O ~@3
>`.pickRestart({
  A: "[g3,bb3,d4,f4]@2 [g3,bb3,d4,f4]@2 [g3,bb3,d4,f4]@2 [g3,bb3,d4,f4]@2 g3@2 ~@2 [bb3,d4,f4]@2 [g3,bb3,d4,f4] d3, g2@15 ~, ~@2 d3@4 d3@9 ~, ~@4 f3@4 [f3,bb3,d4,f4]@3 f3@4 ~, ~@5 g3@2 ~", // Gm7 Bb Gm7 Bb
  B: "[[g3,bb3,d4,f4]@2 [g3,bb3,d4,f4]@2 [g3,bb3,d4,f4]@2 ~ d3 g3@2 ~@2 [g3,bb3,d4,f4]@2 [g3,bb3,d4,f4] ~ [g3,a3,c4,f4]@2 ~@2 [f3,g3,a3,c4,f4]@2 ~ c3 ~@6 g3 [bb2,f3], g2@6 [g3,bb3,d4,f4]@2 ~@2 g3@2 ~@4 f3@3 c3@4 ~@2 [g3,bb3,c4,f4]@2 [g3,bb3,c4]@4 ~, ~@2 d3@5 ~@4 e3@4 c3@3 [g3,a3,c4,f4]@2 ~@2 [f3,g3,a3,c4,f4]@2 f3@2 f3@2 f3@3 ~, ~@4 f3@4 [e3,bb3,d4,f4]@4 ~@4 f2@8 ~@3 f4@2 [a3,f4]@2 ~]/2", // Gm7 F Bb5 Gm7 C7 F Bb Dm
  C: "[g3,bb3,eb4,f4]@2 g3 ~@4 [bb2,g3] [f3,bb3,d4,f4]@2 [d3,f3,bb3,d4,f4]@2 [d3,f3,bb3,d4,f4]@2 ~ c3, eb2 d2, ~@2 bb2@5 ~@9, ~@3 [g3,bb3,eb4,f4]@2 [g3,bb3,eb4,f4]@3 ~@8, ~@2 eb3!2 ~@3 [d3,f3,bb3,d4,f4]", // Eb Bb Eb Bb
  D: "[[g3,a3,c4,f4]@2 ~ [g3,c4,f4]@2 ~@5 g3 ~@4 d3 [bb3,d4,f4]@2 [g3,bb3,d4,f4]@2 [f3,g3,bb3,d4,f4]@2 [d3,g3,bb3,d4,f4] ~ g3@2 ~@2 g3@2 ~ c3, f2@15 ~ g2@7 ~@9, ~@2 f3@3 [g3,bb3,c4,f4]@2 bb3@8 ~@12 e3@5, ~@3 a3@5 f3@4 f3@2 f3@2 ~@2 d3@4 ~@2 [e3,bb3,d4,f4]@4 ~@2 g3@2, ~@6 f3 [g3,c4,f4]@2 a3@2 [g3,a3,c4,f4]@2 [g3,a3,c4,f4]@2 g3@3 ~@8 g3@2 [bb3,d4,f4]@4]/2", // F Csus4 Bb Gm7 Bb Csus4 F Bb
  E: "[g3,a3,c4,f4]@2 [g3,a3,c4,f4]@2 [g3,c4,f4]@2 ~@4 bb3 ~@4 [c3,f3], f2, ~@2 c3@11 a3@3, ~@4 a3@7 g3 f3@2 g3@2, ~@6 f3 [g3,bb3,c4,f4] f3 g3@2 [bb3,c4,f4]@5", // F Csus4 F5 Gm7 Bbsus2
  F: "[g3,bb3,eb4,f4]@2 g3 ~@5 [d4,f4]@2 ~@2 d3 ~@2 d3, eb2@7 f3@3 d3 [f4,bb4]@5, ~ bb2@2 bb2@5, ~@3 [g3,bb3,eb4,f4]@2 [g3,bb3,eb4,f4]@3 bb3@3 d4@2 d3 [f3,bb3,d4]@2, ~ eb3 d2@2", // Eb Dm Bb5 Eb Bb
  G: "[bb3,c4,e4]@2 g3 ~ [bb3,c4,e4]@2 g3!2 ~ g3 [c3,bb3,c4,e4]@2 g3!2 c3@2, c2@7 ~ c2@7 ~, g3 ~ c3@4 c3@4 ~@6, ~@4 g3 ~@2 [bb3,d4,f4]@3 g3 ~@2 [bb3,d4,f4]@3", // C7 Bb
  H: "[bb3,eb4]@4 ~@3 [bb3,eb4]@3 [g3,bb3]@4 [g3,bb3]@2, g3@5 eb4@3, ~@4 [bb3,eb4,g4]@3 g4@9, ~@5 f4@11", // Eb5 Gm Eb
  I: "[f3,bb3,d4]@3 [g3,bb3,eb4]@4 [f3,bb3,d4]@3 [f3,bb3,d4]@2 ~ [g3,bb3,eb4] [f3,bb3,d4] ~", // Bb Eb Bb Eb Bb
  J: "[f3,a3,c4]@4 [f3,bb3,d4]@3 [f3,a3,c4]@3 [f3,a3,c4]@2 [f3,bb3,d4] [f3,a3,c4]@3", // F Bb F Bb F
  K: "[g3,bb3,eb4]@4 [ab3,c4,eb4]@4 [f3,bb3,d4]@3 [g3,bb3,eb4]@3 [f3,bb3,d4]@2", L: "[f3,bb3,c4]!2 [f3,a3,c4]!2",
  M: "[f3,bb3,d4]@4 [g3,bb3,eb4]@3 [f3,bb3,d4]@3 [f3,bb3]@2 f3 [f3,bb3]@2 f3, ~@5 d4@3", // Bb Eb Bb Bb5
  N: "[f3,g3,bb3,d4]!2 [ab3,c4,eb4] [g3,bb3,eb4]", // Gm7 Ab Eb
  O: "[f3,bb3,d4]@6 [g3,bb3,eb4]@3 [g3,bb3,eb4]@2 f3 [f3,bb3]@2 [f3,bb3]@2, ~@3 d4", P: "[g3,bb3,d4,f4]!8",
  Q: "[g3,a3,c4]@2 [g3,a3,c4]@2 [g3,a3,c4]@2 [g3,a3,c4]@3 [g3,bb3,c4,f4]@2 [g3,f4]@2 ~@2 f3, f4@4 f4@5 ~@2 [bb3,c4]@5, ~@13 [a3,f4]@3, ~@7 g3", // Am7 Gm7 G7 Bbsus2 Dm
  R: "[g3,bb3,eb4,f4]@2 g3 [g3,bb3,eb4,f4]@2 [g3,bb3,eb4,f4]@2 g3 [f3,bb3,d4,f4]@2 f3 [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4]@2 f3", // Eb Bb
  S: "g3@2 g3@2 [g3,a3,c4,f4]@2 g3 [g3,bb3,c4,f4]@2 [g3,bb3,c4,f4]@2 g3@2 ~@2 f3, [a3,c4,f4]@4 ~@7 [bb3,c4,f4]@5, ~@13 a3@3, ~@7 g3", // F Gm7 F Bbsus2
  T: "[g3,bb3,d4,f4]!4 [g3,bb3,c4,e4]!4", // Gm7 C7
  U: "[g3,a3,c4]@2 [g3,a3,c4]@2 g3@2 g3@2 g3 [g3,bb3,c4,f4]@2 [g3,f4]@2 ~@2 f3, f4@4 [a3,c4,f4]@5 ~@2 [bb3,c4]@5, ~@13 [a3,f4]@3, ~@7 g3", // Am7 Gm7 G7 F Bbsus2 Dm
  V: "[g3,bb3,eb4,f4]@2 g3 [g3,bb3,eb4,f4]@2 [g3,bb3,eb4,f4]@2 g3 [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4]@2 f3@2 f3@2, ~@3 [bb3,d4,f4]", // Eb Bb
  W: "[f3,bb3,f4]@2 [f3,bb3,f4]@2 [f3,bb3,c4,f4]@2 ~ g3 [g3,c4]@2 [g3,c4]@2 [g3,bb3,c4,e4]@2 [g3,bb3,c4,e4]@2, c4@2 ~ [f3,bb3,c4,f4] [bb3,e4]@2 ~@2", // Bb5 Fsus4 C5 C7 Fsus4 Bbdim
  X: "[f3,bb3,d4]@3 ~@3 [g3,bb3,eb4]@2 ~ [g3,bb3,eb4]@2 f3 [f3,bb3]@2 [f3,bb3]@2, ~@3 d4", // Bb Eb Bb5
})).s("gm_piano").gain(0.38)

// bass · fretless bass · "tk2"
const bass = note("<~@9 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 R Z AA AB AC AD AE AF@3>".pickRestart({
  A: "eb2@5 ~ eb2 ~ eb2@2 ~ eb2!3 ~ eb2", B: "f2 ~ f2@2 ~@2 f2@2 bb1@2 ~ bb1!2 bb1@3",
  C: "f2@4 f1@2 ~ f1!2 f1@2 c2 f2 c2 f2@2", D: "eb2@3 ~ ab1 ~@2 ab1 bb1@5 ~@3", E: "f2@6 ~ c2 f1!3 ~ f1@2 a1@2",
  F: "bb1@7 ~ bb1@2 ~ bb1!2 bb1@2 ab1", G: "g1@2 ~ g1!3 ~ g1 ab1@3 eb2!2 eb2@3", H: "bb1@15 ~",
  I: "g2@4 ~@2 g2 ~ c3 g2 c2 ~ c2 ~@2 c2", J: "f1@2 ~ f1 f1@2 ~ f2!2 c2 ~ f2 ~ c2 f1 c2",
  K: "eb2@3 ~ eb3 ~@2 eb3 d3 bb2 d3 ~ d3 ~ d3 ~", L: "f2@2 ~ f2 ~@2 f2 ~ f2 c2 ~ f1@2 c2 f2 ~",
  M: "g2@2 ~ g2 ~ d2 g2@2 c3 g2 c2 ~ c2 ~@2 c2", N: "f2 ~@2 f2 ~@2 f1@3 c2 f2 ~@2 f2!2 ~",
  O: "eb2@2 ~ eb2 ~@2 eb2 ~ d2@2 ~ d2 ~@3 d2", P: "c2@2 ~ c2!2 e2 g2 c3@4 g2 c2!2 db2 d2",
  Q: "eb2@2 ~ eb2 eb2@2 ~ eb2 eb2@2 ~ eb2!4 f2", R: "f2@2 ~ c2 f1@2 g1 ab1 bb1@2 ~ bb1!3 ~ bb1",
  S: "f2@3 c2 f1@2 ~ f1!2 f1@2 c2 f2 c2 f2 ~", T: "eb2@2 ~ eb2 ab1!2 ~ ab1 bb1@6 ~@2",
  U: "f2@2 ~@2 f2@2 ~ c2 f1!3 ~ f1@2 a1@2", V: "bb1@3 ~ bb1@2 ~ bb1!7 ~ ab1", W: "g1@2 ~ g1!3 ~ g1 ab1!2 ~ eb2!3 ~ bb1",
  X: "bb1@2 ~ bb1!2 ~@2 bb1!2 ~@2 bb1!3 c2 d2", Y: "eb2@2 ~ eb2 eb2@2 ~ eb2!2 ~@2 eb2!4 f2",
  Z: "f2@3 c2 f1@2 ~ f1 f1@3 c2 f2 c2 f2 ~", AA: "eb2@2 ~ eb2 ab1@2 ~ ab1 bb1@7 ~",
  AB: "f2@3 ~ f2@3 c2 f1!3 ~ f1@2 a1@2", AC: "bb1@3 ~ bb1@2 ~ bb1!6 bb1@2 ab1",
  AD: "g1@2 ~ g1!3 ~ g1 ab1!2 ~ ab1 eb2!2 ~ eb2", AE: "bb1@4 bb1@3 ~ bb1@2 ~@2 bb1@4",
  AF: "[g1@3 ~ g1@3 ~@2 ab1 ab1@3 ~ eb2 eb2@3 ~ bb1@20 ~@9]/3",
})).s("gm_fretless_bass").gain(0.35)

// other · flute · "tk5"
const flute = note("<~@17 A@2 ~@6 B C D E F G H I J K L E F M H N ~@3>".pickRestart({
  A: "f4/2", B: "~@4 g4 a4 ~@2 bb4@3 a4@2 g4@2 ~", C: "f4@2 f4@2 f4!2 eb4 f4@9", D: "~@4 eb4@2 d4 eb4@2 d4 f4@4 ~@2",
  E: "g4 g4@3 f4@2 eb4 f4@9", F: "~@4 a4 bb4@2 a4@2 g4@2 f4@2 eb4@3", G: "d4@2 d4@2 eb4@2 d4 f4@7 eb4 d4",
  H: "eb4@2 d4 eb4@2 d4@2 d4 g4 f4 eb4 d4@2 eb4@3", I: "d4@3 c4 bb3@11 ~", J: "~@4 g4 a4@2 ~ bb4@3 a4@2 g4@3",
  K: "f4@2 f4@2 g4 ~ g4 f4@9", L: "~@4 eb4@2 d4 eb4@2 d4 f4@3 ~@3", M: "d4@2 d4@2 eb4@2 d4 f4@5 ~@2 eb4 d4",
  N: "d4@3 c4 bb3@12",
})).s("gm_flute").gain(0.27).pan(0.1)

// other · english horn · "tk6"
const english_horn = note("<~@13 A B C D E F ~@10 G@3 H ~@4 G@3 H ~@3>".pickRestart({
  A: "~@4 f4 g4@2 f4@2 eb4@2 d4@2 c4@3", B: "bb3@4 c4 bb3 c4 d4@7 c4 bb3", C: "c4 f4 c5@6", D: "bb4", E: "bb3", F: "a3",
  G: "[~@4 f4 g4@2 f4@2 eb4@2 d4@2 c4@2 bb3@5 c4 bb3 c4 d4@6 ~ c4 bb3@5 c4@3 bb3 c4 eb4 ab4 g4@2 bb3 f4 eb4]/3",
  H: "d4@3 eb4@3 d4 ~",
})).s("gm_english_horn").gain(0.33).pan(0.8)

// other · french horn · "tk7"
const french_horn = note("<~@11 A B ~@6 C D@2 E F G ~ H I J ~@2 K@2 ~ H I J ~@2 K@2 L M@2>".pickRestart({
  A: "~@15 eb5", B: "d5 c5 bb4 ab4 g4@2 eb4 f4@9", C: "eb4@3 f4@3 eb4 f4 d4 c4@3 bb3@4", D: "c4@15 ~", E: "c4@7 ~",
  F: "bb3 c4", G: "f4 e4", H: "~@12 f4!4", I: "f4@14 ~ eb4", J: "eb4 d4 c4 bb3 ab3 g3 f3 f3@9",
  K: "[[g4,c5] [c4,f4] [f3,bb3]!2 [g3,c4]@8 eb4@4 d4@5 ~ eb4@6 d4@4, ~@3 bb3@5]/2", // C5 F5 Bb5 C5
  L: "g4@4 g4@4 ~ ab4 g4 f4 ~ eb4@2 f4", M: "[g4@2 ~ f4@20 ~@9]/2",
})).s("gm_french_horn").gain(0.44).pan(0.3)

// chords · string ensemble 1 · "tk8"
const string_ensemble_1 = note(`<
  ~@8 A B C@2 D E B F G H I@2 J K J L@2 B C@2 D E B M@2 B C@2 D E B N@2 O@3
>`.pickRestart({
  A: "c4", B: "bb4", C: "[d4@3 eb4@3 eb4 d4@4 ~ d4 eb4 f4@18]/2", D: "g4 bb4@3", E: "c5", F: "d4@2 c4 eb4", G: "f4@7 ~",
  H: "[bb3,d4]", I: "[a3@9 ~@7 eb4@8 d4@8, c4 ~, ~@9 bb3@23]/2", J: "a3@9 bb3@5 a3@2, c4", K: "[bb3,c4]",
  L: "[eb4 d4 c4@2, bb3]/2", M: "[[c5,c6] ~@7 [c4,c5]@4 eb4@4 f4@15 ~, d4@2 ~ [bb3,bb4]@5]/2",
  N: "[d4@8 c4@4 eb4@4 f4@15 ~, ~@3 [bb3,bb4]@5]/2", // Bb
  O: "[[f3,g3,d4]@9 [ab3,c4]@5 [g3,bb3]@5 [bb3,c4,d4,f4]@20 ~@9, bb3@11 ~@37, ~@9 eb4@10 ~@29]/3", // G7 Ab Gm Bb
})).s("gm_string_ensemble_1").gain(0.27)

// chords · string ensemble 1 · "tk9"
const string_ensemble_1_2 = note("<~@9 A B C D@2 E F@2 ~@8 A B C D@2 E F@2 A B C D@2 E F@2 ~@3>".pickRestart({
  A: "[eb4,f4,g4]", B: "f3@3 g3@4 f3@9, bb3", C: "a3@4 bb3@3 a3@5 bb3 a3@3, c4",
  D: "[[g3,bb3]@4 [ab3,c4]@4 d4@3 eb4@3 d4@2 ~@8 a3@8, ~ bb3@2 ~, ~ c4]/2", // Gm Ab
  E: "[f3,d4]@4 [g3,eb4]@3 [f3,d4]@9, bb3@15 ~", // Dm Cm Dm
  F: "[bb3@8 ab3@4 g3@4 [f3,c4,d4]@15 ~, f3@12 bb3@19 ~, g3@3 ~ eb3@4 ~@8]/2", // Dm7
})).s("gm_string_ensemble_1").gain(0.27)

// drums · kick
const kick = s("bd").struct("<~@17 A B C D E F G H I J K L I M N O I P K L I M Q R S ~@2>".pickRestart({
  A: "~@15 x", B: "x ~@2 x ~@4 x!2 ~ x ~ x ~ x", C: "x ~@2 x ~@3 x ~@3 x ~@2 x ~", D: "x ~@3 x!2 ~@2",
  E: "x ~@5 x ~ x ~ x ~@4 x", F: "x ~@2 x ~@2 x ~ x ~@2 x ~@3 x", G: "x ~@8 x ~@3 x ~ x", H: "x ~@2 x ~@4 x ~@7",
  I: "x ~@6 x!3 ~ x ~@2 x ~", J: "x ~@6 x!2 ~@7", K: "x ~@2 x ~@3 x!3 ~ x ~@3 x", L: "x ~@2 x ~@2 x!3 ~@3 x ~@3",
  M: "x ~@2 x ~@2 x ~ x ~ x ~@5", N: "x ~@2 x ~@2 x ~ x!2 ~ x ~@2 x ~", O: "x ~@2 x!2 ~ x ~", P: "x ~@2 x!2 ~@3",
  Q: "x ~@2 x ~@2 x ~ x!2 ~ x ~@3 x", R: "x!2", S: "x",
})).gain(0.35)

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

// drums · snare
const snare = s("sd").struct("<~@18 A B C D@2 E F E G E H E D@2 H E G E H E D@2 G ~@3>".pickRestart({
  A: "~@7 x ~@4 x ~@3", B: "~@4 x ~@4 x ~@6", C: "~@4 x ~@2 x ~ x ~@2 x ~@3", D: "~@4 x ~@2 x ~@4 x ~@3", E: "~ x ~ x",
  F: "~@4 x ~@2 x ~ x ~ x!4 ~", G: "~@2 x ~@2 x ~@2", H: "~@4 x ~@2 x ~ x ~@3 x ~@2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@17 A B C D E B F G ~@19>".pickRestart({
  A: "~@9 x ~ x!2 ~ x ~", B: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", C: "~@2 x ~ x ~ x ~ x ~ x!3 ~ x ~",
  D: "x ~ x ~ x ~ x!4 ~@2 x ~ x ~", E: "x!5 ~ x!2", F: "x ~ x!3 ~ x ~ x ~@3 x ~ x ~", G: "x!5 ~ x ~",
})).gain(0.35)

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

// drums · open hat
const open_hat = s("oh").struct("<~@17 [~@10 x ~@2 x ~@2] ~ [~@15 x] [~@5 x ~@2]!2 ~ [~@5 x ~@2] ~@20>").gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@9 A@9 ~@7 B C D E D@3 E D@3 E D@3 C F ~@2>".pickRestart({
  A: "x!2", B: "~ x!7", C: "x!5 ~@3", D: "x!8", E: "x!5 ~ x ~", F: "x",
})).gain(0.35)

// drums · splash
const splash = s("cr").struct("<~@25 x ~ x ~@7 x ~@8>").gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@25 [x!16] [x!11 ~ x!4] [x!16]!14 x ~@2>").gain(0.75)

stack(
  piano, bass, flute, english_horn, french_horn, string_ensemble_1, string_ensemble_1_2, kick, rim, snare, hihat,
  mid_tom, open_hat, ride, splash, cabasa
)

More by Elton John