Strudelify
The Chain cover art

1977 · Rumours

The Chain

Fleetwood Mac

KeyG majorTempo76 bpm
0:00/0:00
// The Chain — Fleetwood Mac
// 76 bpm, 4/4, key G 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: ch 13 "Elec Guitar - Lead 5 Charang" named as a guitar, played on overdriven guitar (its lead 5 charang patch is not one)
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Nylon Acoustic Guitar, Elec Guitar - Lead 5 Charang.
setcpm(76/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.

// other · distortion guitar
const distortion_guitar = note("<~@8 A ~@53 B C@2 D E@2 F G@2 H I J K L M N C@3 O ~@4>".pickRestart({
  A: "~ [c4,e4] g3 e3 d3 [b2,e3] [b2,e3]@2 [e2,b2,e3] ~@7", B: "~@9 e4!7", C: "e4!16", D: "e4!8 e4@2 e4@2 e4!2 e4@2",
  E: "[e4,e5]!16", F: "g5!2 [e5,g5] e4!5 g5 e5 [e4,e5]!6",
  G: "[[e4,g5] [e4,e5]!2 [e4,g5] [e4,e5]!2 [e4,g5]!3 [e4,e5] [e4,e5]@2 e5 g5 a5 b5@3 b5@2 b5!12]/2", // Em E Em E Em E
  H: "b5!10 ~ b5!3 ~ b5", I: "b5@2 a5@2 a5@2 g5 e5 e5@2 e5@2 d5 b4 d5 e5",
  J: "e5@2 e5@2 ~ d5 ~ g5 [e5,g5]!8, ~@2 e5!2 ~@4", K: "[e5,g5]!16", L: "[e5,g5]!12 ~ e4 g4 a4",
  M: "a4@2 a4@2 a4@2 a4 g4 a4 b4 g4 [e4,a4]@2 g4 a4 g4", N: "d5 a4 b4 g4 a4 e4 g4 e4 [e4,g4]!3 e4@2 e4 g4 a4",
  O: "e4!12 ~@4",
})).s("gm_distortion_guitar").gain(0.48).pan(0.9)

// other · distortion guitar · soft notes
const distortion_guitar_soft = note("<~@62 [~ e4!8 ~@7] ~@18 [~@12 e4!4] [e4!16]!2 [e4!13 ~@3] ~>")
  .s("gm_distortion_guitar").gain(0.18).pan(0.9)

// chords · acoustic guitar steel · "Steel Acoustic Guitar"
const acoustic_guitar_steel = note(`<
  ~@2 A B C D E F G H I J@2 K L M@2 N O P Q R O P Q S T U V W I X Y W I X Z W I X AA N O P Q R O P Q N O P Q AB@2 AC@2
  AD ~@28
>`.pickRestart({
  A: "~@3 d5@2 b4 d5@10", B: "e3 e4 [d4,d5] b4@5", C: "~@3 c#5 b4 f#5 d5@6 e5@4, e3 e4@7, ~ b4@2 ~@13",
  D: "~@5 e4 b4 ~ e3@4 e3@4, e3 e4 d4@2 ~@4, ~ b4@2 e5@2 ~@2 e5@9",
  E: "~@2 e3!2, e3 e4 d4 e4 ~@4, ~ b4@2 e5@2 b4@2 e5@9",
  F: "~@4 d4 ~@3 e4@2 e3@6, ~ b4@2 e5@2 ~ e4@2 ~@8, ~@2 e4@2 ~ [b3,b4]@2 e5@9", // B
  G: "~ [c5,e5] g4 e4 d4 [b3,e4] [b3,e4]@2 [e3,b3,e4] ~@7", H: "e3@3 g3 g#3 g3 [e4,b4]@10, ~@3 b4@3 ~@10", I: "a3",
  J: "[d4@8 c4@4 g3!2 g3@6 g#3 e3 [b3,e4]@10]/2", // E5
  K: "[e3,b3,e4,b4,e5,f#5]@3 ~ g#3 e3 b3@8 g3@2, ~@3 [b4,e5]@3 [b4,e5]@10", L: "~ [e4,a4]@3, a3",
  M: "[d4@8 c4@2 ~@2 g3!2 [e3,b3,e4]@6 [g#3,e4] e3 [b3,e4]@10, ~@5 e4 ~@10, ~@11 e5@5 ~@16]/2", // E5 C#m E5
  N: "[a3,e4,a4,c5]@3 [a3,e4,a4,c5,e5,a5] [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2", // Am
  O: "[a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]!2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2", // Am
  P: "[e4,g4,d5,e5,a5]@2 [e4,g4,d5,e5,a5]!2 [e4,g4,d5,e5,a5]@2 [e4,g4,d5,e5,a5]!2 [e4,g4,c5,e5,a5]@2 [e4,g4,c5,e5,a5]!6", // Em7 Am7
  Q: "[d4,a4,d5,e5,a5]@2 [d4,a4,d5,e5,a5]!2 [d4,a4,d5,e5,a5]@2 [d4,a4,d5,e5,a5]!2 [d4,a4,d5,e5,a5]@2 [d4,a4,d5,e5,a5]!2 [d4,a4,d5,e5,a5]@2 [d4,a4,d5,e5,a5]@2", // Dsus2
  R: "[a3,e4,a4,c5,e5,a5]@3 [a3,e4,a4,c5,e5,a5] [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2 [a3,e4,a4,c5,e5,a5]@2", // Am
  S: "~@2 e5 d5@5, e3", T: "e3@2 e3@2 d5@2 d5 ~ e3@8, ~@4 e4@3 e5@9",
  U: "e3@2 ~@2 d4 b4 ~@2 e4@8, ~@2 e4@2 ~ b3@3 ~@8, ~@3 e5@2 ~ e5@10", V: "g4 e4 d4 b3 g3 b3 e3@2 ~@8",
  W: "e3@3 ~ g3@2 [e4,b4]@10, ~@3 b4@3 ~@10", X: "d4@8 c4@4 g3!2 e3@2", Y: "~ e5 g4 f#4 e4 d4 e4@10",
  Z: "~ b4 g#4 e4 d4 ~ e3@10, ~@5 e4@3 ~@8", AA: "[b3,g4] f#4 e4 d4 c#4 g3 e3@10",
  AB: "[[e3,b3,e4,b4,e5]@4 [e3,b3,e4,b4,e5]!2 [e3,b3,e4,c5,e5]@4 f#5 e5 c5 f#5 e5 ~ e5@6 [c5,e5,f#5]@10, ~@15 b4@7 ~@10]/2", // E5 Cmaj7 F#m7b5
  AC: "[[e3,b3,e4,b4]@4 [e3,b3,e4,b4,e5]!2 [e3,b3,e4,c5,e5]@4 f#5 e5 c5 f#5 e5 ~ e5@8 f#5 e5 c5 f#5 e5 c5 e5 b4, ~@15 b4@9 ~@8]/2", // E5 Cmaj7
  AD: "e5 ~",
})).s("gm_acoustic_guitar_steel").gain(0.35).pan(0.2)

// chords · reed organ · "Reeds"
const reed_organ = note(`<
  ~@6 A@3 B@2 C D@3 C E F G H I J@2 K@2 L@4 B@2 M D@3 M D@3 M E N@2 K@2 J@2 K@2 J@2 K@2 O@5 ~@6 P Q P Q P Q P Q P Q P Q
  P Q P Q P Q ~@4
>`.pickRestart({
  A: "[~@8 e5@12 g5@2 f#5@2 e5@2 d5@3 e5@11 ~@8]/3", B: "[e4,b4,e5]/2", C: "g5 f#5 [a4,e5]@2, b4 ~", D: "[e4,b4,e5]/3",
  E: "[e4,b4,e5]", F: "[a4,c5,e5]@3 [g4,b4,d5]", G: "[a4,c5,e5]@2 [g4,b4,d5] [a4,c5,e5]", H: "[g4,b4,e5] [a4,c5,e5]",
  I: "[a4,d5,f#5]", // D
  J: "[g5@3 [d5,f#5]@3 g5@2 [d5,f#5]@3 g5@3 [d5,f#5]@2 g5@3 [d5,f#5]@3 g5@2 [d5,f#5]@3 g5@3 [d5,f#5]@2, [a4,c5], e5@6 e5@5 e5@5 e5@6 e5@5 e5@5]/2", // D Am
  K: "[g5@3 [d5,f#5]@3 [e5,g5]@2 [d5,e5,f#5]@3 g5@3 ~@2 a4@16, [g4,b4] [a4,c5] ~@2, e5@6 ~@5 e5@5 ~@16, ~@7 [d5,f#5]@9]/2", // D Em D G Am D
  L: "[[e4,e5]@7 ~]/4", M: "[b4,f#5] [a4,e5]",
  N: "g5@3 [d5,f#5]@3 g5@2 [d5,f#5]@3 ~ d5@2 [d5,f#5]@2, [a4,c5]@3 [g4,b4], e5@6 e5@5 [e5,g5]@3 ~@2", O: "[e4,e5]/5",
  P: "[a4,c5,e5]@2 [g4,c5,e5] [g4,b4,d5]", Q: "[e4,g4,b4]",
})).s("gm_reed_organ").gain(0.1).pan(0.9)

// chords · reed organ · "Reeds" · soft notes · Am C G Em Am C G
const reed_organ_soft = note(`<
  ~@82
  [[a4,c5,e5]@2 [g4,c5,e5] [g4,b4,d5]]
  [[e4,g4,b4]]
  [[a4,c5,e5]@2 [g4,c5,e5] [g4,b4,d5]]
  ~
>`).s("gm_reed_organ").gain(0.04).pan(0.9)

// bass · electric bass pick · "Picked Bass"
const bass = note(`<
  ~@17 A B C D A E F G ~@16 A B H I J K L G A M H N O@2 P@3 Q R Q S Q T U V W X Y Z W AA W AB AC AD AE AF AC AF W AG ~@4
>`.pickRestart({
  A: "a1 ~ a1 ~ a1 ~ a1 ~", B: "a1 ~ a1 ~ a1 ~ a1 c2", C: "e2@6 e2 d2 c2@4 c2@2 c2@2",
  D: "d2@2 d2@2 d2@2 d2!2 d2@2 d2@2 d2@2 d2@2", E: "a1 ~ a1 ~ a1 ~ a1 d2", F: "e2@6 e2 d2 c2@4 c2@4",
  G: "d2@2 d2@2 d2@2 d2!2 d2@2 d2!2 d2@2 d2@2", H: "e2@2 e2 d2 c2@2 c2!2", I: "d2@4 d2@2 d2!2 d2@2 d2@2 d2@2 d2@2",
  J: "a1@2 ~@2 a1@2 ~@2 a1 g1 a1@2 a1@2 ~@2", K: "a1 g1 a1@2 a1@2 ~@2 a1 g1 a1@2 a1@2 d2@2",
  L: "e2 b1 e2@2 e2@2 d2@2 c2@4 c2@4", M: "a1 g1 a1@2 a1@2 ~@2 a1@2 ~@2 a1@2 d2 e2", N: "d2!2 d2@2 d2@2 d2!4 d2@2 d2!4",
  O: "e1/2", P: "[e1@23 ~]/3", Q: "a1@6 a1 b1 c2@2 b1 a1 g1 a1 b1@2", R: "e1@13 ~@3", S: "e1@13 ~ f#1 a1",
  T: "e1@4 e2!4", U: "a1@2 a1!2 a1@2 a1 b1 c2@2 b1 a1 g1 a1 b1@2", V: "e1@2 e1!2 e1@2 e1!6 e1@2 g1 a1",
  W: "a1@2 a1@4 a1 b1 c2@2 b1 a1 g1 a1 b1@2", X: "e1 e2 e1!2 e1@2 e1!8 g1 a1",
  Y: "a1@2 a1@2 a1@2 a1 b1 c2@2 b1 a1 g1 a1 b1@2", Z: "e1@2 e1@2 e2!2 e1@2 e1@2 e1@2 e1!2 g1 a1",
  AA: "e1!2 e1@4 e1!8 g1 g#1", AB: "e1!14 g1 g#1", AC: "a1!2 a1@2 a1@2 a1 b1 c2@2 b1 a1 g1 a1 b1@2",
  AD: "e1!2 e1@2 e1!2 e1@2 e1@2 e1@2 e1!2 g1 a1", AE: "a1@2 a1@2 a1!3 b1 c2@2 b1 a1 g1 a1 b1@2",
  AF: "e1!2 e1@2 e1!10 g1 g#1", AG: "e1!2 e1@2 e1!9 ~@3",
})).s("gm_electric_bass_pick").gain(0.64)

// bass · electric bass pick · "Picked Bass" · soft notes
const bass_soft = note(`<
  ~@81
  [~@13 e1 g1 g#1]
  [a1!2 a1@2 a1@2 a1 b1 c2@2 b1 a1 g1 a1 b1@2]
  [e1!2 e1@2 e1!10 g1 g#1]
  [a1!2 a1@2 a1@2 a1 b1 c2@2 b1 a1 g1 ~@3]
  ~
>`).s("gm_electric_bass_pick").gain(0.21)

// chords · electric guitar clean · "Clean Electric Guitar"
const electric_guitar_clean = note(`<
  ~ A B A C D E F G H I J K L M N O P Q R S T Q R S U V W X H I J K H I J K H I J K T Q R S T Q R S T Q R S Y@2 Z@2 AA
  ~@28
>`.pickRestart({
  A: "~@5 b4 [b3,f#5]@10, e3 e4 d4 ~@5, ~ b4@2 d5@2 ~@11", // B5
  B: "~@2 e3 ~ e3!2 ~ [d5,f#5], e3 e4 ~ [e4,d5] ~@2 e3@2, ~ b4@2 d5@3 ~ e5@7 ~@2", // D E7
  C: "~@2 e3 [e4,d5] ~@2 f#5@2, e3 e4 ~@2 [e3,d5] e4@3, ~ b4@2 d5@3 ~@3 e5@3 ~@4", // E7
  D: "~@2 d4 [e4,d5] ~@2 f#5@2, e3 e4 ~@2 [e3,d5] e3@3, ~ b4@2 d5@3 ~@3 e5@3 ~@4", // E7
  E: "~@4 d4@2 ~ b4 ~ e5 e4@2 e3@4, e3 e4 ~ [e4,f#5] [d4,d5] ~@3, ~ b4@2 d5@3 ~@4 e5@6", // Esus2 D
  F: "~@4 d4 b3 [d4,d5]@2 ~@2 e4@2 e3@2 e4@2, e3 e4 ~@2 [e3,d5] ~@3, ~ b4@2 d5@3 ~@3 e5@7", // D E7
  G: "~@4 d4@2 e5@2 [e3,b3,e4] ~@7, e3 e4 ~@6, ~ b4@2 e5@3 ~@10", H: "e3 ~ d4 [e4,e5]@5, ~ e4 ~@6, ~@3 e5@2 ~@11",
  I: "a3 ~@3 a3@4, ~ e4 a3@2 ~@4, ~@3 a5@3 g5@10",
  J: "b5@2 f#5 b5!2 f#5@3 [c4,a5]@2 ~ e5 c5 a4 e4@2, d4@2 d4@2 ~ e4 c4@2", // F
  K: "~ b4 e5 ~@5 e3@8, e3@3 e5@3 e5@10, ~ d4 ~@2", L: "~@2 e4 ~ d4 ~ e5@10, e3@3 e5@2 b3@3 ~@8",
  M: "a3@2 ~ a5@3 g5@8 [e3,b3,e4] ~, ~ e4@6 ~", // E5
  N: "~@2 f#5 ~@2 f#5 e5 a4 ~ e5 ~@3 e5 e4@2, d4@3 b5@2 ~@6 a5@2 ~@3, ~@2 d4 ~ [c4,a5] e4 c4 ~", // F
  O: "b4 a4 e5 b4 d5 g5 e5@10, e3", P: "[a3,e4,a4,e5,a5]@4 ~@8 [a3,g4] e4 [a3,g4]@2",
  Q: "[b3,e4,a4]@2 [b3,e4,a4]@2 ~@2 [e4,a4] [d4,g4]", R: "[b3,e4]!2 [c4,e4,a4]!2", S: "[d4,a4,d5,a5]!4",
  T: "[a3,e4,a4]@4 ~@8 [a3,g4] e4 [a3,g4]@2", U: "e3 ~@3 e3@2 ~@2, ~ e4 e3@2 ~@4, ~@3 e5@3 d5@10",
  V: "~ b4 [e4,d5]@2 ~ d5 e4@2 e3@2 e3@6, e3 ~ e3 e5@5", // E7
  W: "~@6 e5@6 [e4,b4] ~ [e4,b4]!2, e3 e4 d4@2 ~@4, ~ b4@2 e5@3 ~@10", // E5
  X: "[e4,b4] e4 d4 b3 d4 ~ e5@2 ~@8, ~ e5@4 e4@3 ~@8", // E5
  Y: "[[e3,b3,e4,b4]@4 [e3,b3,e4,b4,e5]!2 [e3,b3,e4,c5,e5]@4 f#5 e5 c5 f#5 e5 ~ e5@6 [c5,e5,f#5]@10, ~@15 b4@7 ~@10]/2", // E5 Cmaj7 F#m7b5
  Z: "[[e3,b3,e4,b4]@4 [e3,b3,e4,b4,e5]!2 [e3,b3,e4,c5,e5]@4 f#5 e5 c5 f#5 e5 ~ e5@8 f#5 e5 c5 f#5 e5 c5 e5 b4, ~@15 b4@9 ~@8]/2", // E5 Cmaj7
  AA: "e5 ~",
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.9)

// other · overdriven guitar · "Elec Guitar - Lead 5 Charang"
const overdriven_guitar = note("<~@71 [~@10 b5 ~@3 b5 ~] ~@14>").s("gm_overdriven_guitar").gain(0.48).pan(0.2)

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

// drums · snare
const snare = s("sd").struct("<~@17 A@2 B C A@3 D ~@16 A@2 B C A@3 D A@3 E ~@4 F G E@5 H@17 I ~@4>".pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x!3 ~", C: "x ~@3 x ~@3 x!8", D: "x ~@3 x ~@2 x!9", E: "x!16", F: "~ x",
  G: "x ~@5 x!10", H: "~ x ~ x ~ x ~ x", I: "~ x ~ x ~ x ~@2",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@56 A B C ~@22 D E@2 F ~>".pickRestart({
  A: "~@2 x!14", B: "x!8 ~ x!7", C: "~ x!5 ~@10", D: "~@7 x", E: "~ x ~ x ~ x ~ x", F: "~ x ~ x ~ x ~@2",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@17 A@2 B C D A D E ~@15 F A@2 B C D A D E D B G ~ H I J ~ K L@5 M ~@13 N O ~ I P ~@4
>`.pickRestart({
  A: "x!4", B: "~ x!2 ~", C: "~@4 x!4 ~@8", D: "~ x!3", E: "x ~@3 x!2 ~@10", F: "~@3 x", G: "x!2 ~ x", H: "~@14 x!2",
  I: "~@15 x", J: "x ~@6 x", K: "x!2", L: "x!16", M: "x!12 ~@4", N: "~@5 x!11", O: "x", P: "x!2 ~ x!2 ~ x ~@9",
})).gain(0.4)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@56 [~@2 x!14] [~ x!7 ~ x!7] ~@28>").gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~@28 A ~@24 B C@2 ~@2 D C@4 E F G H I J H@8 K L H M N ~@4>".pickRestart({
  A: "~@5 x ~@2", B: "~@2 x!2 ~@4", C: "~ x ~ x ~ x ~ x", D: "~@3 x ~ x ~ x", E: "~ x ~ x ~@4", F: "~@2 x!6 ~ x!7",
  G: "~ x!15", H: "x!16", I: "~@4 x!12", J: "x!2 ~@2 x!12", K: "x!8 ~@8", L: "~@2 x!14", M: "x!15 ~", N: "~@8 x!4 ~@4",
})).gain(0.4)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@56 [~ x ~ x ~ x ~ x]!2 [~ x ~@6] ~@22 [~@12 x!4] [x!16]!2 [x!13 ~@3] ~>")
  .gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A ~@23 B ~@12 C D E ~@30>".pickRestart({
  A: "~@6 x!2", B: "~@12 x!3 ~", C: "~@7 x!7 ~@2", D: "~@13 x!2 ~", E: "~@5 x!2 ~@5 x!2 ~@2",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@28 A ~@35 A B ~ C D ~@17>".pickRestart({
  A: "~ x", B: "x", C: "x!4 ~@12", D: "~@2 x!2 ~@12",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@20 [~ x!2 ~@13] ~@23 [~ x!2 ~@13] ~@41>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@19 A@3 ~ A ~ A ~@17 A@3 ~ A ~ A B C A@3 ~ A ~@7 A ~@21>".pickRestart({
  A: "x", B: "x ~@2 x", C: "~ x",
})).gain(0.4)

// drums · ride
// … 20 more lines

More by Fleetwood Mac