Strudelify
Forever Man cover art

1985

Forever Man

Eric Clapton

KeyD minorTempo109 bpm
0:00/0:00
// Forever Man — Eric Clapton
// 109 bpm, 4/4, key D minor. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(109/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 · synth brass 1
const synth_brass_1 = note(`<
  ~ A B C B D E F G H I H I H J H K H A L@2 M H I H I H N H K O A L@2 M H I H I H N H K O A L@2 M H I H I H N H P H I H
  I H N H P H I H I H N H P A L@2 M A L@2 M A L@2 M A L@2 M A L ~
>`.pickRestart({
  A: "d1@7 ~@9", B: "d1@3 ~@5", C: "[g4,a4,d5]@5 ~@11, d1@7 ~@9", D: "[g4,a4,d5]@2 ~ [g4,a4,d5] ~@12, d1@3 ~@5",
  E: "[d4,e4,a4]@3 [d4,e4,a4] ~@12, d1@3 ~@5", F: "[d4,f4,a4]@3 [d4,f4,a4] ~@12, d1@3 ~@5",
  G: "[d4,f4,g4]@2 ~ [d4,f4,g4] ~@12, d1@3 ~@5", H: "[f3,bb3,d4]@7 ~ [g3,d4,e4]@7 ~",
  I: "[a3,d4,f4]@11 ~ [g3,c4,e4]@3 ~", J: "[a3,d4,f4]@5 ~ [f3,bb3,d4]@9 ~", K: "[a3,d4,f4]@15 ~",
  L: "[g4,a4,d5]@3 [g4,a4,d5] ~@12, d1@3 ~@5", M: "[g4,a4,d5]@2 ~ [g4,a4,d5] ~@12, d1@7 ~@9",
  N: "[a3,d4,f4]@4 ~@2 [f3,bb3,d4]@9 ~", O: "[f3,bb3,d4]@7 ~ [g3,d4,e4]@8",
  P: "~@2 [g3,c4,e4]@2 ~ [g3,c4,e4]@2 ~ [a3,d4,f4]@7 ~", // C Dm
})).s("gm_synth_brass_1").gain(0.38)

// bass · electric bass finger
const bass = note(`<
  ~ A B A@2 C@2 D E F G H I J K L M N O P Q R S T H U V W X Y Z AA AB AC C S T H AD V W X Y Z AE AB AF R AG AH AI AJ AI
  K AK AL AM AN AO AP AI K AK AL AQ AR AS AT AI K AK AU A@3 AV A@3 AV B AW AX C B AY A AZ B AY ~
>`.pickRestart({
  A: "d1@5 ~@11", B: "d1@3 ~@5", C: "d1@4 ~@2 g1 a1@2 c2 ~ a1 d2@3 ~", D: "d1@5 ~ g1 a1 ~ c2 ~ a1 d2@3 ~",
  E: "d1@5 ~ g1 a1@2 c2 ~ a1 d2@3 ~", F: "bb1@3 bb1 f1@3 ~ c2@3 c2 g1@3 ~", G: "d1@4 ~ c2 ~ a1 d2@4 c2@4",
  H: "bb1@2 ~ bb1 f1@3 ~ c2@2 ~ c2 g1@2 ~@2", I: "d2@4 ~ e2 ~ d2 f2 e2@2 ~ d2@4",
  J: "bb1@2 ~ bb1 f1@3 ~ c2@2 ~ c2 g1@3 ~", K: "d1@2 f1 ~ a1 ~ g1@10", L: "bb1@3 bb1 f1@4 c2@2 ~ c2 g1@3 c2",
  M: "d2@4 ~ d2 ~ a1 d2@4 c2@4", N: "bb1@2 ~ bb1 f1@3 ~ c2@4 c3@4", O: "d1@6 ~@4 e1 ~ f1@3 ~",
  P: "d1@7 ~@3 e1 ~ f1@3 ~", Q: "d1@7 ~@2 e1 ~ d1 f1@3 ~", R: "d1@3 ~@3 g1 a1@2 c2 ~ a1 d2@3 ~",
  S: "bb1@3 bb1 f1@3 ~ c2@3 ~ g1 ~ c2 ~", T: "d2@4 a1@3 ~ f1@2 ~ f1 e1@2 d1@2", U: "d2@4 ~ e2 ~ d2 f2@2 e2@2 d2@2 c2@2",
  V: "bb1@2 ~ bb1 f1@3 ~ c2@2 ~ c2 g1@4", W: "d1@2 f1 ~ a1 ~ g1@7 ~ f1@2", X: "bb1@3 bb1 f1@2 bb1@2 c2@3 ~ g1@2 c2@2",
  Y: "d2@4 ~ g2 ~ d2 f2@2 e2@2 d2@4", Z: "bb1@2 ~ bb1 f1@3 ~ c2@4 f2@4", AA: "d1@6 ~@4 f1 ~ e1@3 ~",
  AB: "d1@7 ~@4 a1 d2@3 ~", AC: "d1@7 ~@5 f1@2 e1@2", AD: "d2@4 ~ e2 ~ d2 f2 e2@3 d2@2 c2@2", AE: "d1@3 ~@3 e1 f1",
  AF: "d1@7 ~@5 e1@2 f1@2", AG: "bb1@4 f1@4 c2@4 g1@3 ~", AH: "d1@5 e1 ~ d1 e1@2 f1 ~ g1 ~ a1 ~",
  AI: "bb1@2 ~ bb1 f1@2 bb1 f1 c2@2 ~ c2 g1@3 ~", AJ: "d2@4 a2 c3@2 c3 g2 a2 ~@2 f2 d2@3",
  AK: "bb1@4 f1@2 bb1 f1 c2@4 c3@4", AL: "~@2 c2@2 ~ c2@2 ~ d2@4 c2@4", AM: "bb1@2 ~ bb1 f1@2 bb1 f1 c2@3 g1 g1@3 c2",
  AN: "d2@3 ~ a1 d2@2 c2 f2 e2@2 ~ d2@3 ~", AO: "bb1@4 f1@3 bb1 c2@3 ~ g2@3 ~",
  AP: "d3 c3 ~@2 a2 g2@2 ~ f2 d2@2 ~ c2@3 ~", AQ: "bb1@2 ~ bb1 f1@2 bb1 f1 c2@2 ~ c2 ~ g2 c2 g2",
  AR: "d2@3 ~ a2 d2 ~ a2 d2 a2 d2 ~ a2@2 c2@2", AS: "bb1@4 f1@2 bb1 f1 c2@3 ~ g1@3 c2",
  AT: "d2@2 d2 ~ d2@2 d3!2 ~ d3@3 c3@3 ~", AU: "~@2 c2@2 ~ c2@2 ~ d2@4 ~@4",
  AV: "d1@4 ~@2 g1 a1@2 c2 ~ a1 c2 d2 [c2,d2] c2", AW: "d1@3 ~@3 f1@2", AX: "d1 ~@3", AY: "d1@6 ~@3 f1 ~@2 f1@4",
  AZ: "d1@7 ~@9",
})).s("gm_electric_bass_finger").gain(0.44)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A B C D E F G H I J K L M N O P Q E F G H I J K L M N O P Q E F G H I J K L M N O P Q E F G H I J K L M N O R I J K
  L M N O R I J K L M N O R E F G H E F G H E F G H E F G H E F ~
>`.pickRestart({
  A: "d3@5 ~ g3 a3 ~ c4 ~ a3 [c4,d4] c4 [c4,d4]!2", B: "d3@4 ~@2 g3 a3 ~ c4 ~ a3 [c4,d4] c4 [c4,d4] ~",
  C: "d3@4 ~@2 g3 a3 ~ c4 ~ a3 [c4,d4] c4 [c4,d4] d4", D: "d3@4 ~@2 g3 a3 ~ c4 ~ ab3 [c4,d4] c4 [c4,d4]!2",
  E: "d3@4 ~@2 g3 a3 ~ c4 ~@2 [c4,d4] c4 [c4,d4] d4", F: "d3@4 ~@2 g3 a3 ~ c4 ~@2 [c4,d4] c4 [c4,d4]!2",
  G: "d3@4 ~@2 g3 a3 ~ c4 ~ a3 [c4,d4] c4 [c4,d4]!2", H: "d3@3 ~@3 g3 a3 ~ c4 ~ a3 [c4,d4] c4 [c4,d4]!2",
  I: "[bb3,d4]@3 [d4,f4] ~@2 [bb3,d4] ~ [c4,e4]@3 [e4,g4] ~@2 [c4,e4] ~", // Bb Dm Bb C Em C
  J: "[c4,e4] [d4,f4]@2 [f4,a4] ~@2 [c4,e4] f4 [f4,a4]!2 ~ [a3,d4,f4]@3 d4 ~, ~@7 d4@3 ~@6", // C Dm F C F Dm
  K: "[bb3,d4]@3 [bb3,d4,f4] ~@2 [bb3,d4] ~ [c4,e4,g4]@3 [e4,g4] ~@2 [c4,e4] ~", // Bb C Em C
  L: "[c4,e4] ~ a4 [f4,a4] ~@2 [c4,e4] f4!2 [f4,a4] ~ [d4,f4]@2 d4 [d4,f4] ~, ~ [d4,f4]@3 ~@3 d4@3 ~@6", // C F C F Dm
  M: "[d4,f4]@3 f4!2 ~ [bb3,d4] ~ [c4,e4]@3 [e4,g4] ~@2 [c4,e4,g4] ~, bb3 ~@7", // Dm Bb C Em C
  N: "[c4,e4] d4@2 [f4,a4] ~@2 [bb3,d4,g4]@6 [bb3,d4,g4]@2 ~@2, ~ f4 ~@14", // C F Gm
  O: "[bb3,d4,f4]@3 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~ [c4,e4]@3 [e4,g4] ~ e4 [c4,e4,g4] ~", // Bb C Em C
  P: "[c4,e4] f4 [f4,a4]!2 ~@2 [c4,e4] f4 [f4,a4]!2 ~ [d4,f4,a4]@2 [f4,a4] f4 ~, ~ d4@3 ~@3 d4@3 ~@6", // C F C F Dm F
  Q: "[bb3,d4]@3 [bb3,d4,f4] [bb3,f4] ~ [bb3,d4] ~ [c4,e4]@3 [c4,e4,g4] ~ e4 [c4,e4,g4]@2", // Bb Bb5 Bb C
  R: "~@2 [c4,e4,g4] ~@2 [c4,e4,g4] ~@2 [d4,f4,a4]@7 ~", // C Dm
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.7)

// chords · electric guitar clean · soft notes
const electric_guitar_clean_2 = note(`<
  ~@2 A B ~ C D ~@2 E F G H I J K L M C D ~@2 E F G H I J K L M C D ~@2 E F G H I J K L M C D ~@2 E F G H I J K ~ E F G
  H I J K ~ E F G H I J K ~ C D ~@2 C D ~@2 C D ~@2 C D ~@2 C D ~
>`.pickRestart({
  A: "~@15 [c4,d4]", B: "~@15 c4", C: "~@11 ab3 ~@3 c4", D: "~@11 ab3 ~@4",
  E: "f4@3 ~@2 [bb3,eb4] f4 ~ g4@2 g4 ~@2 [c4,e4] g4 ~", F: "~@2 a4 ~@3 a4 ~@9", G: "~@5 [bb3,d4] ~@7 e4 g4 ~",
  H: "~@8 a4 ~@2 a3@2 ~@3", I: "~@6 f4 ~ g4@3 ~@2 e4 ~@2", J: "~@2 [f4,a4] ~@2 gb4 ~@10",
  K: "~@5 [bb3,d4] ~@2 g4@3 ~@2 c4 ~@2", L: "~@6 a4 ~@7 d4 ~", M: "~@5 [bb3,d4] f4 ~ g4@3 ~@2 c4 ~@2",
})).s("gm_electric_guitar_clean").gain(0.1).pan(0.7)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~ A@5 B A C D E F G H I J K L A B A C D E F G H I J K L A B A C D E F G H I J K L A B A C D E F G H I J M D E F G H I
  J M D E F G H I J M A B A C A B A C A B A C A B A C A B ~
>`.pickRestart({
  A: "~@2 c4!2 ~@2 c4!2 ~@2 c4!2 ~@2 c4!2", B: "~@2 c4!2 ~@2 c4!2 ~@2 c4!2 ~ d4 ~ d4",
  C: "~@2 c4!2 ~@2 c4!2 ~@2 c4!2 ~@4", D: "[f3,bb3]@3 [bb3,d4] ~@2 [f3,bb3,d4] ~ [g3,d4,e4]@3 [d4,e4] ~@2 [g3,d4,e4] ~",
  E: "g3@2 d4 [d4,f4] ~ [d4,f4] ~ f4 g3@2 ~ f4 ~ [d4,f4] ~@2, ~@5 [a3,d4,f4] ~@2", // Dm
  F: "[f3,bb3]@3 d4 ~@2 [f3,bb3] ~ [g3,d4]@3 [d4,e4] ~@2 [g3,d4] ~", // Bb5 G5 Dsus2 G5
  G: "g3@2 d4 [d4,f4] ~ [d4,f4] ~@2 g3@2 ~ f4 ~ [d4,f4] ~@2, ~@5 [a3,d4] ~@2", // Dm D5
  H: "[f3,bb3]@3 [bb3,d4] ~@2 [f3,bb3,d4] ~ [g3,d4]@3 d4 ~@2 [g3,d4] ~", // Bb5 Bb G5
  I: "[a3,d4]@3 [d4,f4] ~@2 [f3,bb3,d4]@4 [f3,bb3]@2 [f3,bb3,d4] ~@3", // D5 Dm Bb Bb5 Bb
  J: "[f3,bb3]@3 [bb3,d4] ~@2 [f3,bb3,d4] ~ [g3,d4]@3 [d4,e4] ~@2 [g3,d4,e4]@2", // Bb5 Bb G5 Dsus2 Em7
  K: "g3@2 d4 [d4,f4] ~ [d4,f4] ~ f4 g3@2 ~ [d4,f4] ~ [a3,d4,f4] ~@2, ~@5 d4 ~@2", // Dm
  L: "[f3,bb3]@3 d4 ~@2 [f3,bb3,e5] ~ [g3,d4]@3 [d4,e4] ~@2 [g3,d4,e4] ~", // Bb5 Bb G5 Dsus2 Em7
  M: "~@2 [g3,c4,e4]@2 ~ [g3,c4,e4] ~@2 [a3,d4,f4]@6 ~@2", // C Dm
})).s("gm_electric_guitar_muted").gain(0.25).pan(0.2)

// chords · electric guitar muted · soft notes
const electric_guitar_muted_2 = note(`<
  ~@9 A B C D E F G H I ~@4 A B C D E F G H I ~@4 A B C D E F G H I ~@4 A B C D E F G ~ A B C D E F G ~ A B C D E F G
  ~@20
>`.pickRestart({
  A: "d4 ~@7", B: "~@2 [a3,f4] ~@2 a3 ~@7 a3 ~@2", C: "~@2 d4 ~@5 e4@3 ~@5", D: "~@2 [a3,f4] ~@2 a3 ~@4 f4@2 ~ a3 ~@2",
  E: "~@13 [g3,d4] ~@2", F: "~@3 g4@3 ~@2", G: "~@4 e4 ~@3", H: "~@2 [a3,f4] ~@2 a3 ~ f5 ~@2 a3@2 ~@4",
  I: "d4@2 d4 ~@2 f3 ~@2 e4@3 ~@5",
})).s("gm_electric_guitar_muted").gain(0.11).pan(0.2)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@35 A B C D E F G H I J ~@6 K@2 L M ~@8 N O@2 P Q R S T ~@4 U V@3 W X Y@2 Z@2 AA AB AC ~@3
>`.pickRestart({
  A: "~@2 ab5@6 g5@5 g5@2 f5", B: "g5@2 ~ gb5 db5@4 d5@4 ~@4", C: "~@2 c5@3 d5@3 gb5@4 gb5@3 d5",
  D: "db5@5 ~@5 g4@2 a4 g4@2 a4, f5 ~@15", E: "g4@2 a4 g4@2 a4 g4@2 a4 g4@2 a4 c5@4",
  F: "~@2 d5 c5 a4 g4!2 f4 g4 f4 d4@2 d4@2 f4@2", G: "d4 ~@3 c5@4 d5 c5 f5@6", H: "~@2 f5@2 d5@3 ~ d5 e5 d5@3 ~@3",
  I: "~@2 g5@5 f5 g5@2 ~ f5 d5@4", J: "d5@12 b4 ab4 ~@2", K: "[~@9 g3 a3 c4 f4 d4@2 d4@5 ~@12]/2",
  L: "~@2 g4@3 ~@2 f4 d4@2 ab3!2 g3 f3 d3 c3", M: "f3 d3@2 ~@13", N: "~@2 c4@2 ~ c4@2 ~ d4@5 ~@3",
  O: "[~@2 g4@2 ~ g4@2 ~ g4@3 d4 g4 e4 g4@5 ~@13]/2", P: "g4@4 ~ g4@3 g4@5 ~@3",
  Q: "~@2 c5@3 d5@2 ~ c5 e5 f5 c5 f5!2 c5 f5", R: "f5 c5 f5!2 c5 f5!2 c5 f5!2 c5 f5!2 c5 f5!2",
  S: "e5 ~ f5@2 g5 ~ f5@3 ~ g5 ~ g5 ~ g5 ~", T: "g5 [f5,g5] ~@6", U: "~@2 g4@7 f4 d4 f4@3 d4@2",
  V: "[d4@3 b3 ~@6 c5 ab4 g4 f4 d4 f4@3 d4@2 b3 ~@9 c5@6 d5@2 d5 d5@2 d5 d5@2 d5!4]/3", W: "d5@2 d5 d5@3 d5 d5@3 d5!6",
  X: "d5@2 d5!2 d5@2 ~@8 c5 ab4", Y: "[a4@3 gb4 ~@6 g4@2 g4 f4 d4 f4@2 f4 d4 ~ b3 ~@11]/2",
  Z: "[f4!2 d4@3 ~ ab3 c4 a3 g3 f3 d3 g3 f3 d3 d3@2 bb2 ~@14]/2", AA: "~@10 d4@2 b3 d4@2 ~", AB: "c4 d4@4 ~@11",
  AC: "f4@2 d4@3 ~@3 g4 e4 d4 f4@3 d4@2",
})).s("gm_overdriven_guitar").gain(0.49)

// chords · pan flute
const pan_flute = note("<~@29 A ~@27 A ~ A ~@5 A ~ A ~ A ~@21>".pickRestart({
  A: "[d5,f5,a5]@3 [c5,f5,a5]@2 [a4,f5,a5] [d5,f5,a5]@7 ~@3", // Dm F Dm
})).s("gm_pan_flute").gain(0.28).pan(0.2)

// other · clavinet
const clavinet = note(`<
  ~ A B C A@2 B C A ~@9 A B C A ~@9 A B C A ~@9 A B C A ~@24 A B C A@2 B C A@2 B C A@2 B C A@2 B ~
>`.pickRestart({
  A: "d2@4 ~@2 g2 a2@2 c3 ~ a2 d3@3 ~", B: "d2@4 ~@2 g2 a2 ~ c3 ~ a2 d3@3 ~", C: "d2@5 ~ g2 a2 ~ c3 ~ a2 d3@3 ~",
})).s("gm_clavinet").gain(0.36).pan(0.4)

// bass · slap bass 1 · Csus2
const bass_2 = note("<~@75 [~@6 g1 a1@2 c2 ~ a1 c2 d2 [c2,d2] c2] ~@3 [~@6 g1 a1@2 c2 ~ a1 c2 d2 [c2,d2] c2] ~@11>")
  .s("gm_slap_bass_1").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~ A@8 B@46 C B@7 C B@7 C ~@4 A@3 D B@10 ~>".pickRestart({
  A: "~ x ~ x", B: "x!2", C: "~@2 x ~@2 x ~@2 x ~@7", D: "~ x ~@2",
})).gain(0.44)

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

// drums · low tom
const low_tom = s("lt").struct("<~@4 A ~@3 B ~@12 C ~@9 D ~@2 C ~@8 C ~@3 C ~@23 D@8 E ~@11>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@13 x!2 ~", D: "x", E: "x ~@6 x",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B@7 C D@5 C D C@2 D C D C D@5 C D C@2 D C D C D@3 C D C D C@2 D C D C D C D C D C E C D C D C D C E C D C D C D C
  F G@3 H I J@3 C D@5 C D C@2 ~
>`.pickRestart({
  A: "~ x!13 ~@2", B: "x!14 ~@2", C: "~ x!5 ~@2 x!6 ~@2", D: "x!6 ~@2 x!6 ~@2", E: "x!2 ~ x", F: "x!2 ~@2", G: "x!4",
  H: "x!3 ~", I: "x!15 ~", J: "~@2 x!13 ~",
})).gain(0.27)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@4 A ~@3 B ~@7 C ~@2 D ~ E ~ F ~ G ~@3 F H ~@3 I ~@8 I ~@3 I ~@6 C J ~@6 C K ~@6 C ~ L@7 M ~@11
>`.pickRestart({
  A: "~@11 x ~@4", B: "x ~@2 x ~@3 x ~@2 x ~ x!2 ~@2", C: "~@15 x", D: "~@7 x ~ x ~@6", E: "~@11 x!4 ~",
  F: "~@13 x!2 ~", G: "~@7 x", H: "~@10 x!3 ~ x!2", I: "~@11 x!2 ~@3", J: "x ~@9 x ~@3 x!2", K: "x ~@4 x ~ x", L: "x",
  M: "x ~@10 x ~@4",
})).gain(0.38)

// drums · open hat
const open_hat = s("oh").struct("<~ A@8 B@5 A B@38 A B ~ B@5 A B ~ B@5 A B ~@9 B@10 ~>".pickRestart({
  A: "~@7 x", B: "~@3 x ~@3 x",
})).gain(0.33)

// drums · crash
const crash = s("cr").struct(`<
  A B ~@7 B ~@4 C B ~ B@2 ~@3 B ~@5 B ~ B@2 ~@3 B ~@3 B ~ B ~ B@2 ~@3 B ~ B ~ B C B D B ~ B ~ B C B D B ~ B ~ B C B E
  ~@3 A ~@4 B ~@5 B ~ B@2 ~
>`.pickRestart({
  A: "~@3 x", B: "x", C: "~@3 x ~@4", D: "~@2 x ~@2 x ~@2 x ~@7", E: "~@2 x ~@2 x ~@2 x ~@3 x ~@3",
})).gain(0.33)

// drums · congas
const congas = s("conga:13").struct(`<
  ~
  [~ x ~@3 x ~@2]
  [~@2 x ~@2 x ~@2]!7
  [~ x ~@3 x ~@2]!62
  ~@9
// … 34 more lines

More by Eric Clapton