Strudelify
Tainted Love cover art

1982

Tainted Love

Soft Cell

KeyG majorTempo146 bpm
0:00/0:00
// Tainted Love — Soft Cell
// 146 bpm, 4/4, key G major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(146/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 · synth bass 1 · "Synth.Bas"
const bass = note(`<
  ~@5 A B C D A B C D A B E F A B C D A B E F G@2 H@2 I@2 J@4 A B C D A B C D A B E F A B C D A B E F G@2 H@2 I@2 J@4 A
  B C D A B C D A B E F A B C D A B C D A B C D A B C D A B C D A B C D
>`.pickRestart({
  A: "g1@2 ~@2 g1@4 a#1@3 ~ a#1@4", B: "d#2@3 ~ d#2@4 a#1@3 c2@5", C: "g1@2 ~@2 g1@3 ~ a#1@2 ~@2 a#1@3 ~",
  D: "d#2@3 ~ d#2@3 ~ a#1@3 c2@4 ~", E: "g1@2 ~@2 g1@2 ~@2 g1@2 ~@2 g1@3 ~", F: "a#1@2 ~@2 a#1@2 ~@2 a#1@2 ~@2 a#1@3 ~",
  G: "g1 ~ g1 ~ g1 ~ g1 ~", H: "a#1 ~ a#1 ~ a#1 ~ a#1 ~", I: "d#2 ~ d#2 ~ d#2 ~ d#2 ~", J: "c2 ~ c2 ~ c2 ~ c2 ~",
})).s("gm_synth_bass_1").gain(0.3)

// other · drawbar organ · "#Even Bar"
const drawbar_organ = note(`<
  ~@5 A B A B A B A B A B C D A B A B A B ~@2 E@2 F@2 G@2 H@4 A B A B A B A B A B C D A B A B A B ~@2 E@2 F@2 G@2 H@4 A
  B A B A B A B A B C D A B A B A B A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "[g3,g4] ~ [g3,g4]@2 [a#3,a#4] ~ [a#3,a#4]@2", B: "[d#4,d#5]@2 ~@2 [d#4,d#5]@4 [a#3,a#4]@3 [c4,c5]@5",
  C: "[g3,g4]", D: "[a#3,a#4]", E: "[g3,g4]/2", F: "[a#3,a#4]/2", G: "[d#4,d#5]/2", H: "[[c4,c5]@63 ~]/4",
})).s("gm_drawbar_organ").gain(0.16).pan(0.4)

// other · clarinet · "#Clarinet"
const clarinet = note(`<
  A B A B A B ~@2 C ~@3 D ~ D ~@3 C ~ C ~ C ~@11 C ~ C E C ~@3 D ~ D ~@5 D ~ D ~@11 C ~ C E C ~ C E C ~ C E C ~ C E C ~
  C E C ~ C E C ~ C E C ~ C E C ~ C E C
>`.pickRestart({
  A: "~@15 g4", B: "~@4 g4 ~@11", C: "~@7 g4 ~@4 g4 ~@3", D: "g4 ~@6 g4 ~@8", E: "g4 ~@3 g4 ~@11",
})).s("gm_clarinet").gain(0.4).pan(0.3)

// other · clarinet · "#Clarinet" · soft notes
const clarinet_soft = note("<~@7 A ~@3 A ~ A ~@5 B ~ B ~@19 A ~ A ~@5 A ~ A ~@49>".pickRestart({
  A: "g4@2 ~@2 g4@3 ~@9", B: "g4 ~ g4 ~@5",
})).s("gm_clarinet").gain(0.24).pan(0.3)

// other · synth strings 1 · "#OB.Strin"
const synth_strings_1 = note("<~@25 A@2 B@2 C@2 D@4 ~@9 E@2 ~@9 A@2 B@2 C@2 D@4 ~@9 F@3 ~@24>".pickRestart({
  A: "[g3@31 ~]/2", B: "a#3/2", C: "d#4/2", D: "[[c4,c6]@31 ~]/4", E: "[~@15 g1@13 ~@4]/2", F: "[~@5 g2@11]/3",
})).s("gm_synth_strings_1").gain(0.12).pan(0.7)

// other · synth strings 1 · "#OB.Strin" · soft notes
const synth_strings_1_soft = note("<~@25 A@2 B@2 C@2 ~@24 A@2 B@2 C@2 ~@40>".pickRestart({
  A: "[g5@31 ~]/2", B: "a#5/2", C: "d#6/2",
})).s("gm_synth_strings_1").gain(0.07).pan(0.7)

// other · rock organ · "#Rot.Orga"
const rock_organ = note(`<
  ~@3 A ~@3 A ~@3 A ~ A ~@5 A ~ A ~@13 A ~ A ~@3 A ~ A ~@5 A ~ A ~@13 A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ B ~ B ~ A ~ A
  ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "[g3,g4] ~ [g3,g4] ~@5", B: "[g3,g4]@4 [g3,g4]@3 ~@9",
})).s("gm_rock_organ").gain(0.4).pan(0.7)

// other · brass section · "Brass Sec"
const brass_section = note(`<
  ~@3 A ~@3 A ~@3 A ~ A ~@5 A ~ A ~@13 A ~ A ~@3 A ~ A ~@5 A ~ A ~@13 A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "g3 ~ g3 ~@5", B: "g3@4 g3@3 ~@9",
})).s("gm_brass_section").gain(0.27).pan(0.7)

// chords · tremolo strings · "#Susp.Str"
const tremolo_strings = note("<~@15 A@2 ~@8 B@5 C@5 ~@4 D@8 ~@4 E@2 ~@2 F@5 G@5 H@8 ~@10 I@8 ~ J@8 ~>".pickRestart({
  A: "[~@15 [g2,g3]@16 ~]/2", B: "[g3@29 a#3@32 d#4@19]/5", C: "[~@17 [g2,g3]@60 ~@3, ~@7 c4@32 ~]/5",
  D: "[~@93 [g1,g2]@12 ~@23, g5]/8", E: "[~@6 [d5,d6]@8 ~ d#6@7 [a#4,a#5]@4 [c5,c6]@4 ~@2, ~@7 d#5@4 ~@5]/2",
  F: "[g3@29 ~@34 d#6@17, d6@31 e6@9, ~@29 a#3@32 d#4@19, ~@31 a#5@32 ~@17]/5",
  G: "[~@17 [g2,g3]@60 ~@3, ~@7 c4@32 ~, ~@15 [c6,d6]@61 ~@4]/5", H: "[g5@121 ~@7]/8",
  I: "[~@115 g2@13, ~@3 g4@61, ~@25 g5@103, ~@30 g2@83 ~@15, ~@31 g1@88 ~@9]/8", J: "[~ g4@31]/8",
})).s("gm_tremolo_strings").gain(0.13)

// chords · tremolo strings · "#Susp.Str" · soft notes
const tremolo_strings_soft = note("<~@52 A ~@2 B@2 C@2 ~ D E@4 ~@8 F@3 ~@6 G@2 ~@7 H ~@2 I@7>".pickRestart({
  A: "~@5 c#5 ~@10", B: "[g5@31 ~]/2", C: "[~@3 d#6@28 ~]/2", D: "~@15 d#6", E: "[~@3 d#6@27 ~@2]/4",
  F: "[~@4 g5@37 ~@7]/3", G: "[~@11 g4@10 ~@11]/2", H: "~@13 g5@2 ~", I: "[g5@109 ~@3]/7",
})).s("gm_tremolo_strings").gain(0.06)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!100>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!100>").gain(0.4)

// drums · clap
const clap = s("cp").struct("<~@11 A ~ A ~@20 B ~@6 A ~ A ~@20 B ~@6 A ~@14 A ~ A ~@12>".pickRestart({
  A: "x!2 ~@2", B: "~@2 x!2",
})).gain(0.5)

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

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~@6 A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~@11 A ~ A ~ A ~ A ~@3 B ~@3 B ~@3 A ~@11 A ~ A ~ A ~ A ~@3 B ~@3 B ~@3 B ~@3 B
  ~@3 B ~@3 B ~@3 B
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@11 x ~@3 x",
})).gain(0.25)

// drums · whistle
const whistle = s("ballwhistle:0").struct("<~@4 [x!2 ~ x!3 ~ x!3 ~ x!3 ~ x] ~@96>").gain(0.58)

stack(
  bass, drawbar_organ, clarinet, clarinet_soft, synth_strings_1, synth_strings_1_soft, rock_organ, brass_section,
  tremolo_strings, tremolo_strings_soft, kick, snare, clap, shaker, shaker_soft, whistle
)

More by Soft Cell