Strudelify

Total Eclipse of the Heart

Nicki French

KeyG majorTempo136 bpm
0:00/0:00
// Total Eclipse of the Heart — Nicki French
// 136 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(136/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 · "A.PIANO 3"
const piano = note(`<
  A B C D A B C D E F G H E F G H E F G H E F G H I@2 J@2 I@2 J@2 K L@2 K L M N O P Q N O P Q N O P Q C R S T U V W@2 E
  F G H E F G H E F G H E F G H I@2 J@2 I@2 J@2 K L@2 K L M N O P Q N O P Q N O P Q P X Y Z@2 N Q Y Z@2 N AA P AB C R S
  T A V AC AD C R S T A V W@2 ~@4
>`.pickRestart({
  A: "~ e4 c5 e4 b4 e4 a4 e4, a3", B: "~ f4 c5 f4 b4 f4 a4 f4, f3", C: "~ d4 b4 d4 a4 d4 g4 d4, g3",
  D: "~ e4 b4 e4 a4 e4 g4 e4, e3@15 ~", E: "[e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [a4,c5,e5] ~@3 [e4,a4,c5] ~@3 [e4,a4,c5] ~",
  F: "[f4,a4,c5] ~@2 [f4,a4,c5] ~@2 [a4,c5,f5] ~@3 [g4,c5,e5] ~@3 [g4,b4,d5] ~", // F C G
  G: "[g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [d4,g4,b4] ~@3 [g4,b4,d5] ~@3 [a4,b4,d5] ~", // G Bm7
  H: "[g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [e4,g4,b4] ~@3 [g4,b4,d5,f5] ~@3 [a4,c5,e5] ~", // G Em G7 Am
  I: "[c5,e5,g5] ~@2 [c5,e5,g5] ~@2 [c5,e5,g5] ~@3 [c5,e5,g5] ~@3 [c5,e5,g5] ~", // C
  J: "[a#4,c5,f5] ~@2 [a#4,c5,f5] ~@2 [a#4,c5,f5] ~@3 [a#4,c5,f5] ~@3 [a#4,c5,f5] ~", // A#sus2
  K: "[d#4,g4,a#4] ~@2 [d#4,g4,a#4] ~@2 [d#4,g4,a#4] ~@3 [d#4,g4,a#4] ~@3 [d#4,g4,a#4] ~", // D#
  L: "[d#4,g#4,c5] ~@2 [d#4,g#4,c5] ~@2 [d#4,g#4,c5] ~@3 [d#4,g#4,c5] ~@3 [d#4,g#4,c5] ~", // G#
  M: "[d#4,g#4,c5] ~@3 [d#4,g#4,c5] ~@3 [d#4,g#4,c5] ~@7", // G#
  N: "[g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,d5] ~", // G
  O: "[g4,b4,d5,e5] ~@2 [g4,b4,d5,e5] ~@2 [g4,b4,d5,e5] ~@3 [g4,b4,d5,e5] ~@3 [g4,b4,d5,e5] ~", // Em7
  P: "[g4,c5,e5] ~@2 [g4,c5,e5] ~@2 [g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~", // C
  Q: "[f#4,a4,d5] ~@2 [f#4,a4,d5] ~@2 [f#4,a4,d5] ~@3 [f#4,a4,d5] ~@3 [f#4,a4,d5] ~", R: "~ e4 b4 e4 a4 e4 g4 e4, e3",
  S: "~ d#4 a4 d#4 g4 d#4 f#4 d#4, b3", T: "~ e4 c5 e4 b4 e4 a4 e4, c4@15 ~",
  U: "~ e4 c5 e4 b4 e4 a4 e4, a3, ~@8 a4 ~@7", V: "~ d4 a4 d4 g4 d4 f#4 d4, d3@15 ~",
  W: "~ d4 b4 d4 a4 d4 g4 d4, g3@15 ~",
  X: "[a4,d5,f#5] ~@2 [a4,d5,f#5] ~@2 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~", // D
  Y: "[g4,b4,e5] ~@2 [g4,b4,e5] ~@2 [g4,b4,e5] ~@3 [g4,b4,e5] ~@3 [g4,b4,e5] ~", // Em
  Z: "[a4,c#5,e5] ~@2 [a4,c#5,e5] ~@2 [a4,c#5,e5] ~@3 [a4,c#5,e5] ~@3 [a4,c#5,e5] ~", // A
  AA: "[e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,d5] ~", AB: "[f#4,a4,d5]",
  AC: "[b4,d5,g5] ~@2 [b4,d5,g5] b4 ~ [d4,b4,d5,g5]@2 a4@2 [d4,b4,d5]@2 g4@2 [b4,d5,g5] ~, g3@15 ~, ~@2 d4@2 ~@6 g5 ~@3 d4@2", // G
  AD: "[b4,d5,g5]@2 ~ [b4,d5,g5] b4 ~ [d4,b4,d5,g5]@2 a4@2 [d4,b4,d5,g5]@2 g4@2 [b4,d5,g5] ~, g3@15 ~, ~ d4 ~@5 d4", // G
})).s("gm_piano").gain(0.43).pan(0.7)

// bass · synth bass 2 · "+SYNBASS 4"
const bass = note(`<
  ~@16 A B C D A B C D E F G H I@2 G J K L M N O P Q R S T Q R S T Q R S T U V W X Y Z AA@2 ~@8 A B C D A B C D E F G H
  I@2 G J K L M N O P Q R S T Q R S T Q R S T AB AC AB AD AE Q AF AB AD@2 AG AH AI AJ ~@8 AK AL AM AN AO Z AP@2 AQ@4
>`.pickRestart({
  A: "a1@2 ~@2 a1@2 ~ a1 ~@2 a1@2 ~@2 a1 ~", B: "f1@2 ~@2 f1@2 ~ f1 ~@2 f1@2 ~@2 f1@2",
  C: "g1@2 ~@2 g1@2 ~ g1 ~@2 g1@2 ~@2 g1 ~", D: "e1@2 ~@2 e1@2 ~ e1 ~@2 e1@2 ~@2 g1 ~",
  E: "c2@3 ~ c2@2 ~ c2@2 ~ c2@2 ~@2 c2 ~", F: "c2@2 ~@2 c2@2 ~ c2@2 ~ c2@3 ~ c2@2",
  G: "a#1@3 ~ a#1@2 ~ a#1 ~@2 a#1@2 ~@2 a#1 ~", H: "a#1@2 ~@2 a#1@2 ~ a#1 ~@2 a#1@2 ~@2 a#1 ~",
  I: "c2@3 ~ c2@2 ~ c2 ~@2 c2@2 ~@2 c2 ~", J: "a#1@3 ~ a#1@2 ~ a#1 ~@2 a#1@2 ~@2 a#1@2",
  K: "d#1@3 ~ d#1@2 ~ d#1@2 ~ d#1@3 ~ g1@2", L: "g#1@3 ~ g#1@2 ~ g#1@2 ~ g#1@3 ~ g#1 ~",
  M: "g#1@3 ~ g#1@2 ~ g#1@2 ~ g#1@3 ~ g#1@2", N: "d#1@3 ~ d#1@2 ~ d#1 ~@2 d#1@3 ~ g1@2",
  O: "g#1@3 ~ g#1@2 ~ g#1 ~@2 g#1@2 ~@2 g#1 ~", P: "g#1@3 ~ g#1@3 ~ g#1@3 ~@5", Q: "g1@3 ~ g1@2 ~ g1@2 ~ g1@2 ~@2 g1@2",
  R: "e1@3 ~ e1@2 ~ e1@2 ~ e1@3 ~ g1@2", S: "c2@3 ~ c2@2 ~ c2@2 ~ c2@3 ~ c2@2", T: "d2@3 ~ d2@2 ~ d2@2 ~ d2@3 ~ d2@2",
  U: "g1@2 ~@2 g1@2 ~ g1@2 ~ g1@3 ~ g1@2", V: "e1@3 ~ e1@2 ~ e1@2 ~ e1@3 ~ e1@2",
  W: "b1@3 ~ b1@2 ~ b1@2 ~ b1@2 ~@2 b1 ~", X: "c2@3 ~ c2@2 ~ c2@2 ~ c2@3 ~ b1@2", Y: "a1", Z: "d2",
  AA: "[~ g0, g1@31 ~]/2", AB: "e1@3 ~ e1@2 ~ e1@2 ~ e1@2 ~@2 e1@2", AC: "f#1@2 ~@2 f#1@2 ~ f#1@2 ~ f#1@2 ~@2 f#1 ~",
  AD: "a1@3 ~ a1@2 ~ a1@2 ~ a1@2 ~@2 a1 ~", AE: "a1@3 ~ a1@2 ~ a1@2 ~ a1@2 ~@2 a1@2",
  AF: "f#1@3 ~ f#1@2 ~ f#1@2 ~ f#1@2 ~@2 f#1@2", AG: "b1@3 ~ b1@2 ~ b1@2 ~ b1@2 ~@2 b1@2",
  AH: "a1@3 ~ a1@2 ~ b1@2 ~ b1@2 ~@2 b1 ~", AI: "c2@2 ~@2 c2@2 ~ c2@2 ~ c2@2 ~@2 c2@2", AJ: "d1", AK: "g1",
  AL: "e1@15 ~", AM: "b1", AN: "c2@9 ~ b1@5 ~", AO: "a1@15 ~", AP: "g1@15 ~", AQ: "[g1@53 ~@11]/4",
})).s("gm_synth_bass_2").gain(0.63).pan(0.6)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<A B C D A B C D A B C D A B C D ~@42 A B C D A B C D A B C D A B C D ~@60>".pickRestart({
  A: "c5 a4 e4 a3 a4 a3 c5 a4 a3 c5 a4 e4 a4 c5 b4 a4", B: "c5 a4 f4 f3 a4 f3 c5 a4 f3 c5 a4 f4 a4 c5 b4 a4",
  C: "b4 g4 d4 g3 g4 g3 b4 g4 g3 b4 g4 d4 g4 b4 a4 g4", D: "b4 g4 e4 e3 g4 e3 b4 g4 e3 b4 g4 e4 g4 b4 a4 g4",
})).s("gm_lead_2_sawtooth").gain(0.33)

// chords · string ensemble 1 · "+ORCHESTRA"
const string_ensemble_1 = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D E@2 F@2 G@2 H@2 I J@2 I K@2 L M N O L M N O L M N O P Q R S T U V@2 A
  B C D A B C D A B C D A B C D E@2 F@2 G@2 H@2 I J@2 I K@2 L M N O L M N O L M N O W X Y Z@2 AA AB@4 AA AC@2 AD C D AE
  AF@2 AG@3 C D AE AF@2 AG@3 AH@4
>`.pickRestart({
  A: "[a3,c4,e4]", B: "[a3,c4,f4]", C: "[g3,b3,d4]", D: "[g3,b3,e4]",
  E: "[~@3 g4 c5 [g4,g5] [c5,c6] [e5,e6], [g3,c4,e4]]/2", // G C E C
  F: "[[f5,f6]@3 [e5,e6]@3 [c5,c6]@6 [a#4,a#5] [c5,c6] [d5,d6]@2, [a#3,c4,f4]]/2", // F E C A# C D A#sus2
  G: "[c6@11 g4@5 c5@4 [g4,g5]@4 [c5,c6]@4 [e5,e6]@4, [g3,c4,e4], c5@7 ~@25]/2", // G C E C
  H: "[[f5,f6]@3 [e5,e6]@3 c6@10, [a#3,c4,f4,a#4], ~@6 c5@7 ~@3]/2", // F E A#sus2
  I: "[d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3, [d#3,g3,a#3]@15 ~", // D#
  J: "[[d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3, [d#3,g#3,c4]@31 ~]/2", // D# G#
  K: "[[d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@3 [d#5,d#6] ~@7, [d#3,g#3,c4]@25 ~@7]/2", // D# G#
  L: "[d3,g3,b3,d4,g5,g6]", M: "[f#5,f#6] [d5,d6], [e3,g3,b3,e4]", N: "[e3,g3,c4,e4,e5,e6]",
  O: "[d3,f#3,a3,d4,d5,d6]@15 ~", P: "[b3,d4,g4,g5,g6]", Q: "[e5,e6] [g5,g6], [b3,e4,g4]", R: "[b3,d#4,f#4,f#5,f#6]",
  S: "[c4,e4,g4,g5,g6]", T: "[a3,c4,e4]@15 ~", U: "f#4@8 g4@4 f#4@3 ~, [a3,d4]@15 ~", V: "[[b3,d4,g4]@15 ~]/2",
  W: "[g3,c4,e4,e5,e6]", X: "[f#3,a3,d4,f#5,f#6]", Y: "[e3,g3,b3,g5,g6]", Z: "[[e3,a3,c#4], [a5,a6]@15 ~]/2",
  AA: "[g3,b3,d4,g5,g6]", AB: "[[b5,b6]@7 ~ [d6,d7]@7 ~ [e3,g3,b3]@16 [e3,a3,c#4]@32, [f#3,a3,d4]@15 [e6,e7]@47 ~@2]/4",
  AC: "[[e3,a3,c4,a5,a6]@8 [g3,b3,d4,b5,b6]@7 ~ [c4,c6,c7]@16, ~@15 e4@16 ~, ~@15 g3@8 ~@9]/2", AD: "[f#3,a3,d4,d6,d7]",
  AE: "[f#3,d#4], b3 ~@15", AF: "[[g3,c4,e4]@15 ~ e4@16, ~@15 [a3,c4]@16 ~]/2",
  AG: "[[f#3,a3,d4]@15 ~ [g3,b3]@32, ~@15 d4@16 ~@17]/3", AH: "[[g2,g3,b3,d4,g4]@61 ~@3]/4",
})).s("gm_string_ensemble_1").gain(0.17).pan(0)

// chords · synth strings 1 · "+SYN STR 3"
const synth_strings_1 = note("<~@54 A B C ~@57 D E F G H I D@3 E F G H I D@2 J ~@3>".pickRestart({
  A: "[a3,c4,e4,a4,c5,e5,g5] ~@15", B: "[a4,d5,f#5] ~@5 a5 ~@3 g5 ~ f#5 ~@3", C: "[b4,d5,g5] ~@15", D: "[b4,d5,g5]",
  E: "[b4,e5,g5]", F: "[b4,d#5,f#5]", G: "[c5,e5,g5]", H: "[c5,e5,a5]", I: "[a4,d5,f#5]", J: "[b4,d5,g5]@9 ~@7",
})).s("gm_synth_strings_1").gain(0.07).pan(0.3)

// bass · lead 8 bass lead · "BASS&LEAD"
const bass_2 = note(`<
  A B C D A B C D A B C D A B C D ~@38 A E F@2 A B C D A B C D ~@48 G H I J K L M@2 C D N O A E P@2 Q@4
>`.pickRestart({
  A: "a1", B: "f1", C: "g1", D: "e1", E: "d2", F: "[~ g0, g1@31 ~]/2", G: "[g3,b3,d4]", H: "[e3,g3,b3]",
  I: "[d#3,f#3,b3]", J: "~@3 b2, [c3,e3,g3]@7 ~", K: "a2", L: "d3", M: "g2", N: "b1", O: "c2@5 b1@3",
  P: "[~@16 g0@15 ~, g1]/2", Q: "[g1@63 ~]/4",
})).s("gm_lead_8_bass_lead").gain(0.51).pan(0.9)

// other · pad sweep · "SWEEP PAD"
const pad_sweep = note("<A B C D A B C D A B C D A B C D ~@41 E A B C D A B C D ~@56 F ~@11>".pickRestart({
  A: "[a1,a2] ~@15", B: "[f1,f2] ~@15", C: "[g1,g2] ~@15", D: "[e1,e2] ~@15", E: "[d#-1,a#-1,d#0,d#1] ~@15",
  F: "[g1,d2,g2] ~@3", // G5
})).s("gm_pad_sweep").gain(0.8).pan(0.8)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@16 ~@42 A@8 ~@68>".pickRestart({
  A: "[g7@63 ~]/8",
})).s("gm_string_ensemble_2").gain(0.08).pan(0.8)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@16 A@7 B A@6 C D A@2 C A E F A@7 G A@2 H I A@4 ~@19 J A@6 C D A@2 C A E F A@7 G A@2 H I A@4 G A@4 K A E A L ~@20
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x!3 ~@2 x!4 ~ x!2", C: "~@4 x ~@7 x ~ x!2", D: "x ~ x!6 ~ x!7", E: "~@4 x ~@3 x!2 ~ x!5",
  F: "x!3 ~", G: "~@4 x ~ x!3 ~ x!6", H: "~@4 x ~@7 x ~@2 x", I: "x!6 ~ x!2 ~ x!6", J: "~@4 x!12",
  K: "x!2 ~ x!3 ~ x ~ x!7", L: "~ x!6 ~@3 x!6",
})).gain(0.8)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@72 [x!16] [x!4 ~@12] ~@39 [~@9 x ~@6] ~@20>").gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<A ~@6 B A ~@6 B ~@41 C A ~@6 B ~@56 A ~@5 B ~@5>".pickRestart({
  A: "x", B: "~@7 x", C: "x ~@6 x",
})).gain(0.56)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@16 A B C@2 D E ~@2 A B C@2 D E ~@2 A B C@2 D E A B C@2 A B C@2 A B C@2 A B C@2 ~@20 A B C@2 D E ~@2 A B C@2 D E A B
  C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A ~@21
>`.pickRestart({
  A: "x!4", B: "~ x ~ x", C: "~ x", D: "~ x ~@2", E: "x!2",
})).gain(0.24)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5 A ~@3 A ~@3 A ~@3 A ~@23 A ~@3 A ~@3 A ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@22
>`.pickRestart({
  A: "~@7 x",
})).gain(0.8)

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

// drums · ride
const ride = s("rd").struct("<~@114 x!17 ~@3>").gain(0.32)

// drums · tambourine
const tambourine = s("tb").struct("<~@7 A ~@7 A B@21 C B@16 ~@11 A ~@8 B@13 C B@26 ~@20>".pickRestart({
  A: "~@14 x!2", B: "x!16", C: "x!3 ~",
})).gain(0.4)

stack(
  piano, bass, lead_2_sawtooth, string_ensemble_1, synth_strings_1, bass_2, pad_sweep, string_ensemble_2, kick, snare,
  snare_soft, low_tom, hihat, hihat_soft, open_hat, crash, ride, tambourine
)