Strudelify
Chains of Love cover art

Chains of Love

Chains of Love

Erasure

KeyC majorTempo122 bpm
0:00/0:00
// Chains of Love — Erasure
// 122 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 17, 4/4 at bar 18, 2/4 at bar 42, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 "Acoustic Bass" acoustic bass (copy of ch 1 "Synth Bass 1" synth bass 1)
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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 strings 1 · "SynthStrings 1"
const synth_strings_1 = note("<A@3 B@7 ~@109>".pickRestart({
  A: "[~@2 [g3,c4,e4]@11 [g3,a#3,d4]@11]/3", // C Gm
  B: "[~ [g3,c4,e4]@22 [g3,a#3,d4]@22 ~ [g3,c4,e4]@22 [g3,a#3,d4]@22 [g3,c4,e4]@21 ~]/7", // C Gm C Gm C
})).s("gm_synth_strings_1").gain(0.4)

// bass · synth bass 1
const bass = note(`<
  ~@10 A@2 B C B C B D E F G@2 H D E D I G H J K L H M N L H D E D E B C B G@3 B C B C G@2 B O P G B Q P G B@2 G@2 B P
  G@2 B C B C B C B G@2 B C G@2 B O P G B Q P G B O P G B Q P G B O P G B Q P G B O P G B Q P G B O P G ~
>`.pickRestart({
  A: "f1!4", B: "c1 c2 c1 c2 c1 c2 c1 c2", C: "g1 g2 g1 g2 g1 g2 g1 g2", D: "c1 c2 c1 c2 g1 g2 g1 g2",
  E: "g1 g2 g1 g2 c1 c2 c1 c2", F: "c1 c2 c1 c2 f1 f2 f1 f2", G: "f1 f2 f1 f2 f1 f2 f1 f2",
  H: "f1 f2 f1 f2 c1 c2 c1 c2", I: "g1 g2 g1 g2 f1 f2 f1 f2", J: "c1 c2 c1 c2 a1 a2 a1 a2",
  K: "a1 a2 a1 a2 a#1 a#2 a#1 a#2", L: "a#1 a#2 a#1 a#2 f1 f2 f1 f2", M: "c1 c2 c1 c2 g#1 g#2 g#1 g#2",
  N: "g#1 g#2 g#1 g#2 a#1 a#2 a#1 a#2", O: "a1 a2 a1 a2 a1 a2 a1 a2", P: "a#1 a#2 a#1 a#2 a#1 a#2 a#1 a#2",
  Q: "g#1 g#2 g#1 g#2 g#1 g#2 g#1 g#2",
})).s("gm_synth_bass_1").gain(0.5)

// other · lead 1 square · "Lead 1 (square)"
const lead_1_square = note(`<
  ~@11 A B@2 C@2 D ~@3 E ~@4 D ~@10 F G H G I J ~@2 K J ~@3 I J ~@13 A L@2 M@2 ~@3 N ~@3 O P ~@41
>`.pickRestart({
  A: "~@10 a#4 c5 d5 c5 a#4@2", B: "[c5@4 g4@4 ~@2 g4@2 c5@2 a#4@6 ~@6 a#4 c5 d5 c5 a#4@2]/2",
  C: "[c5@2 g4@2 ~ g4 c5 a#4@3 ~@6]/2", D: "~@2 c5 g5 c6 g5 c5 g5 c6 ~@7", E: "~@2 c5 f5 c6 f5 c5 f5 c6 ~@7",
  F: "~@2 c5 g4", G: "~ g4 c5 a#4@3 ~@2", H: "~@2 a#4 c5 d5 c5 a#4@2 c5@4 g4@4", I: "~@10 c5 g5 c6 g5 c5 g5",
  J: "c6 ~@15", K: "~@10 c5 f5 c6 f5 c5 f5", L: "[c5@2 g4@2 ~ g4 c5 a#4@3 ~ a#4!2 c5 d5@2]/2",
  M: "[c5@2 f4@2 ~ c4 d4 f4@3 ~@6]/2", N: "~@6 a#4 f5 c6 f5 a#4 f5 c6 f5 a#4 f5",
  O: "~@6 c5 f5 c6 f5 c5 f5 c6 f5 c5 f5", P: "~@3 f5 c6 f5 c5 f5 c6 f5 c5 f5 c6 f5 c5 ~",
})).s("gm_lead_1_square").gain(0.42)

// other · lead 1 square · "Lead 1 (square)" · soft notes
const lead_1_square_soft = note("<~@16 A ~@3 B ~@4 A ~@15 C ~@3 D ~@4 C ~@26 E ~@41>".pickRestart({
  A: "~@9 g5 c5 ~@5", B: "~@9 f5 c5 ~@5", C: "~ g5 c5 ~@13", D: "~ f5 c5 ~@13", E: "c6 f5 c5 ~@13",
})).s("gm_lead_1_square").gain(0.24)

// chords · pad halo · "Pad 7 (halo)"
const pad_halo = note(`<
  ~@12 A B A B A C@8 D@8 E@8 ~ B A F@2 G H I J K L@2 A M N O A P Q R A S G T ~@4 U V U V U V U W@2 J K L@2 A M N O A P Q
  R A M N O A P Q R A M N O A P Q R A M N O A P Q R A M N T ~
>`.pickRestart({
  A: "[e4,g4,c5]", B: "[d4,g4,a#4]",
  C: "[~ [d4,g4,a#4]@2 [e4,g4,c5]@2 [f4,a4,f5]@4 [f4,a4,f5]@2 [c5,e5,g5]@2 [a#4,d5,g5]@2 [c5,e5,c6]]/8", // Gm C F C Gm C
  D: "[~ [a#4,d5,a#5]@2 [g#4,c5,g#5]@4 [e4,g4,c5]@2 [e4,a4,c5]@2 [f4,a#4,d5]@2 [f4,a4,c5]@2 [e4,g4,c5]]/8", // A# G# C Am A# F C
  E: "[~ [d#4,g#4,c5]@2 [a#4,d5,f5]@2 [a4,c5,f5]@2 [e4,g4,c5]@2 [d4,g4,a#4]@2 [e4,g4,c5]@2 [d4,g4,a#4]@2 [e4,g4,c5]]/8", // G# A# F C Gm C Gm C
  F: "[f4,a4,f5]/2", G: "[f4,a4,f5]", H: "[c5,e5,g5]", I: "[a#4,d5,g5]", J: "[c5,e5,c6]", K: "[a#4,d5,a#5]",
  L: "[g#4,c5,g#5]/2", M: "[e4,a4,c5]", N: "[f4,a#4,d5]", O: "[f4,a4,c5]", P: "[d#4,g#4,c5]", Q: "[a#4,d5,f5]",
  R: "[a4,c5,f5]", S: "[e4,g#4,c5]", T: "[f4,g#4,c5]", U: "[c4,e4,c5]", V: "[a#3,d4,g4]", W: "[f4,a4,c5]/2",
})).s("gm_pad_halo").gain(0.54)

// other · synth bass 1
const synth_bass_1 = note("<A B C D@2 E F G H I J@2 ~@107>".pickRestart({
  A: "~@4 c4 g4 ~ c4 g4 c5@3 c4 ~ g4 c4", B: "g4 ~ c5@3 c4 g4 c5 ~ g4 a#3 ~ f4 a#3 f4 ~",
  C: "a#4@3 a#3 f4 a#3 ~ f4 a#4@3 a#3 f4 ~ a#4 f4",
  D: "[~ c4 g4 c4 ~ g4 c5@3 c4 g4 ~ c4 g4 ~ c5@3 c4 g4 c5 ~ g4 a#3 ~ f4 a#3 f4 ~ a#4@3]/2",
  E: "a#3 f4 a#3 ~ f4 a#4@3 a#3 f4 ~ a#4 f4 ~ c4 g4", F: "c4 ~ g4 c5@3 c4 g4 ~ c4 g4 ~ c5@2 c4 ~",
  G: "g4 c5 ~ g4 a#3 f4 ~ a#3 f4 ~ a#4@2 a#3 ~ f4 a#3", H: "~ f4 a#4@3 a#3 f4 ~ a#4 f4 c4 ~ g4 c4 ~ g4",
  I: "c5@3 c4 g4 ~ c4 g4 c5@3 c4 g4 c5 ~ g4", J: "c4 f4 c4 f4 c5@2 c4 f4 c4 f4 c5@2 c4 f4 c5 f4",
})).s("gm_synth_bass_1").gain(0.25)

// other · kalimba
const kalimba = note("<A B C D@2 E F G H I J@2 ~@57 K L K L K L K J@2 ~@41>".pickRestart({
  A: "~@4 c6 g6 ~ c6 g6 c7@3 c6 ~ g6 c6", B: "g6 ~ c7@3 c6 g6 c7 ~ g6 a#5 ~ f6 a#5 f6 ~",
  C: "a#6@3 a#5 f6 a#5 ~ f6 a#6@3 a#5 f6 ~ a#6 f6",
  D: "[~ c6 g6 c6 ~ g6 c7@3 c6 g6 ~ c6 g6 ~ c7@3 c6 g6 c7 ~ g6 a#5 ~ f6 a#5 f6 ~ a#6@3]/2",
  E: "a#5 f6 a#5 ~ f6 a#6@3 a#5 f6 ~ a#6 f6 ~ c6 g6", F: "c6 ~ g6 c7@3 c6 g6 ~ c6 g6 ~ c7@2 c6 ~",
  G: "g6 c7 ~ g6 a#5 f6 ~ a#5 f6 ~ a#6@2 a#5 ~ f6 a#5", H: "~ f6 a#6@3 a#5 f6 ~ a#6 f6 c6 ~ g6 c6 ~ g6",
  I: "c7@3 c6 g6 ~ c6 g6 c7@3 c6 g6 c7 ~ g6", J: "c6 f6 c6 f6 c7@2 c6 f6 c6 f6 c7@2 c6 f6 c7 f6",
  K: "c6 g6 c6 g6 c7@2 c6 g6 c6 g6 c7@2 c6 g6 c7 g6", L: "a#5 f6 a#5 f6 a#6@2 a#5 f6 a#5 f6 a#6@2 a#5 f6 a#6 f6",
})).s("gm_kalimba").gain(0.25)

// chords · pad poly · "Pad 3 (polysynth)"
const pad_poly = note(`<
  ~@28 A B C D E F G H I ~@12 J K L@2 M N O P Q R O S T U V W ~@13 J K L@2 M N O P Q R O S M N O P Q R O S M N O P Q R O
  S M N O P Q R O S M N O P ~
>`.pickRestart({
  A: "~@4 [c5,e5] ~ [c5,e5] ~", B: "d5 [c5,e5] ~ [c5,e5] ~@2 [c5,e5] ~",
  C: "d5 c5 ~@2 [d5,f5] ~ [d5,f5] ~, ~@2 e5 ~@13", D: "e5 f5 ~ [c5,f5] ~@2 [c5,f5] ~, ~@2 d5 ~@13",
  E: "e5 f5 ~@2 [c5,e5] ~ [c5,e5] ~, ~@2 c5 ~@13", F: "d5@2 [c5,e5] ~@3 [c5,d#5]@2 ~@4 [c5,d#5]@2 ~@2",
  G: "d5@2 [c5,d#5] ~@5 [d5,f5]@2 ~@2 [d5,f5]@2 ~@2", H: "e5@2 f5@2 ~@2 [c5,f5]@3 ~@3 [c5,f5]@2 ~@2, ~@2 d5 ~@13",
  I: "e5 [c5,f5] ~@6", J: "~@2 [c4,e4,g4] ~ [c4,e4,g4] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [c4,e4,g4] ~ [c4,e4,g4]@2 ~@2",
  K: "~@2 [d4,g4,a#4] ~ [d4,g4,a#4] ~ [g4,a#4,d5] ~ [g4,a#4,d5] ~ [d4,g4,a#4] ~ [d4,g4,a#4]@2 ~@2", // Gm
  L: "~@2 [c4,f4,g#4] ~ [c4,f4,g#4] ~ [f4,g#4,c5] ~ [f4,g#4,c5] ~ [c4,f4,g#4] ~ [c4,f4,g#4]@2 ~@2", // Fm
  M: "[c5,e5] ~ [c5,e5] ~ d5 [c5,e5] ~ [c5,e5]", N: "~@2 [c5,e5] ~ d5 c5 ~@2, ~@10 e5 ~@5",
  O: "[d5,f5] ~ [d5,f5] ~ e5 f5 ~ [c5,f5], ~@10 d5 ~@5", P: "~@2 [c5,f5] ~ e5 f5 ~@2, ~@10 c5 ~@5",
  Q: "[c5,e5]@2 ~@2 [c5,e5]@2 ~@2 d5@2 [c5,e5] ~@3 [c5,d#5]@2", R: "~@4 [c5,d#5]@2 ~@2 d5@2 [c5,d#5] ~@5",
  S: "~@2 [c5,f5] ~ e5 [c5,f5] ~@2", T: "[c5,e5]@2 ~@2 [c5,e5]@2 ~@2 d5@2 [c5,e5] ~@3 [c5,e5] ~",
  U: "~@4 [c5,e5] ~@3 d5@2 [c5,e5] ~@5", V: "c5@2 ~@2 [c5,f5]@2 ~@2 e5@2 f5 ~@3 [c5,f5]@2, f5 ~@7 c5@4 ~@4",
  W: "~@4 c5@2 ~@2 e5@2 f5 ~@5, ~@4 f5 ~@3 c5@4 ~@4",
})).s("gm_pad_poly").gain(0.4)

// chords · epiano1 · "Rhodes Piano"
const epiano1 = note("<~@36 A@5 ~@78>".pickRestart({
  A: "[~@8 [e4,g4,c5]@14 ~@2 [d4,g4,a#4]@13 ~@3 [e4,g4,c5]@13 ~@3 [d4,g4,a#4]@10 ~@14]/5", // C Gm C Gm
})).s("gm_epiano1").gain(0.5)

// drums · kick
const kick = s("bd").struct("<~@10 [x!4]!108 ~>").gain(0.71)

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

// drums · low tom
const low_tom = s("lt").struct("<~@15 A ~@11 B C ~@10 B C ~@11 D ~@15 D ~@8 D ~@3 D ~@37>".pickRestart({
  A: "~@2 x!2 ~ x!2 ~", B: "~@14 x!2", C: "x!3 ~@5", D: "~@6 x!3 ~ x ~ x ~@3",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@11 B ~@11 B ~@12 C ~@15 C ~@8 C ~@3 C ~@37>".pickRestart({
  A: "x!4 ~@12", B: "~@8 x!6 ~@2", C: "x!6 ~@10",
})).gain(0.64)

// drums · ride
const ride = s("rd").struct("<~@12 [x!8]!57 ~@9 [x!8]!40 ~>").gain(0.57)

stack(
  synth_strings_1, bass, lead_1_square, lead_1_square_soft, pad_halo, synth_bass_1, kalimba, pad_poly, epiano1, kick,
  snare, low_tom, mid_tom, ride
)

More by Erasure