Strudelify
There Must Be an Angel (Playing With My Heart) cover art

Be Yourself Tonight

There Must Be an Angel (Playing With My Heart)

Eurythmics

KeyC majorTempo112 bpm
0:00/0:00
// There Must Be an Angel (Playing With My Heart) — Eurythmics
// 112 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "SYN BASS 2" synth bass 2 (copy of ch 1 "SYN BASS 1" synth bass 1, 0.25 beats late)
// 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(112/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 · synth bass 1 · "SYN BASS 1"
const synth_bass_1 = note(`<
  ~ A B C A@2 D E F A B C A@2 D E F A B C A@2 D E F ~@16 A B C A@2 D E F A B C A@2 D E F ~@32 A B C A@2 D E F A B C A@2
  D E F A B C A@2 D E F A B C A@2 D E F A B C A@2 D E F A B G ~@2
>`.pickRestart({
  A: "f4 ~ c5 ~ a5@2 f4!2 ~ c5 ~ a5@2 ~ f4 ~", B: "g4 ~ d5 ~ b5 ~ g4!2 ~ d5 ~ b5@2 ~ g4 ~",
  C: "a4 ~ e5 ~ c6@2 a4!2 ~ e5 ~ c6@2 ~ g4 ~", D: "g4 ~ d5 ~ b5@2 g4!2 ~ d5 ~ b5@2 ~ g4 ~",
  E: "d#4 ~ a#4 ~ g5@2 d#4!2 ~ a#4 ~ g5@2 ~ d#4 ~", F: "c4 ~ g4 ~ e5@2 c4!2 ~ g4 ~ e5@2 ~ c4 ~",
  G: "a4 ~ e5 ~ c6@2 a4!2 ~ e5 ~ c6@2 ~@3",
})).s("gm_lead_8_bass_lead").gain(0.18).pan(0.2)

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

// other · whistle
const whistle = note(`<
  ~@25 A B C@2 D E F@4 G@2 H@3 I ~@16 J K L@3 B M@2 J N@3 O P Q@2 R S@3 R T U@2 R T V@2 W@2 X Y ~@24 Z AA AB AC Z AB
  AD@2 ~@13
>`.pickRestart({
  A: "f5@15 ~", B: "g#5 f5", C: "[e5@29 ~@3]/2", D: "f5", E: "g#5@7 f5@9", F: "[e5@31 f5@16 g#5@9 f5@8]/4",
  G: "[e5@31 ~]/2", H: "[f5@15 a5@9 f5@7 d#5@12 ~ f5@4]/3", I: "c5@15 ~", J: "a5 f5", K: "g#5@8 f5@7 ~",
  L: "[g5@8 c5@13 ~@10 a5@8 ~ f5@8]/3", M: "[g5@2 c5@5 ~]/2", N: "[g#5@8 f5@7 g5@8 ~ c5@17 ~@7]/3",
  O: "a5@9 g5 f5 e5 g5 f5 e5 d5", P: "f5 e5 d5 c5 e5 d5 c5 b4 d5 c5 b4 a4 c5 b4 a4 g4",
  Q: "[a#4 a4 g4 f4 a4 g4 f4 d#4 g4 f4 d#4 d4 f4 e4 d4 c4@11 ~@6]/2", R: "[f3,a#3,d4]",
  S: "[[a3,c4,f#4]@15 ~ [a#3,g4]@32, ~@5 d4@11]/3", T: "[a3,c4,f#4]", U: "[a#3,d4,g4]/2", V: "[[d4,g4], a#3@29 ~@3]/2",
  W: "[e3,e4]/2", X: "[f3,f4]", Y: "[g3,g4]@3 ~", Z: "a5", AA: "b5", AB: "g5", AC: "e5", AD: "[g5@15 ~]/2",
})).s("gm_whistle").gain(0.22).pan(0.2)

// chords · pan flute
const pan_flute = note("<~@25 A@4 B@8 C@4 ~@16 B@12 D@4 ~@61>".pickRestart({
  A: "[~@4 [c5,f5]@2 [c5,f5]@2 [c5,f5]!4 [d5,g5]@2 [c5,f5]@6 [c5,f5]@2 [c5,f5]@2 [c5,f5]!4 [d5,g5]@2 [c5,f5]@6 [c5,e5]@2 [c5,e5]@2 [c5,e5]!4 [d5,f5]@2 [c5,e5]@10 ~@8]/4", // F5 G5 F5 G5 F5 C Dm C
  B: "[~@4 [c5,f5]@2 [c5,f5]@2 [c5,f5]!4 [d5,g5]@2 [c5,f5]@6 [c5,f5]@2 [c5,f5]@2 [c5,f5]!4 [d5,g5]@2 [c5,f5]@6 [c5,e5]@2 [c5,e5]@2 [c5,e5]!4 [d5,f5]@2 [c5,e5]@7 ~@11]/4", // F5 G5 F5 G5 F5 C Dm C
  C: "[~@4 [c5,f5]@2 [c5,f5]@2 [c5,f5]!4 [d5,g5]@2 [c5,f5]@6 [c5,e5,g5]@2 [c5,e5,g5]@2 [c5,e5,g5]!4 [d5,f5,a5]@2 [c5,e5,g5]@6 [c5,d#5,g5]@2 [c5,d#5,g5]@2 [c5,d#5,g5]!4 [d5,f5]@2 [c5,e5]@4 ~@14]/4", // F5 G5 F5 C Dm C Cm Dm …
  D: "[~@4 [c5,f5]@2 [c5,f5]@2 [c5,f5]!4 [d5,g5]@2 [c5,f5]@6 [c5,e5,g5]@2 [c5,e5,g5]@2 [c5,e5,g5]!4 [d5,f5,a5]@2 [c5,d#5,g5]@6 [c5,d#5,g5]@2 [c5,d#5,g5]@2 [c5,d#5,g5]!4 [d5,f5]@2 [c5,e5]@12 ~@6]/4", // F5 G5 F5 C Dm Cm Dm C
})).s("gm_pan_flute").gain(0.16)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@25 A B C@2 A B C@2 A B D@2 A E F G ~@8 H I J K ~@3 L A B C@2 A B C@2 A B D@2 A E M G ~@32 H I N O ~@4 P Q R S T U V
  W X Y Z AA AB AC AD@2 ~@5
>`.pickRestart({
  A: "[a4,c5,f5]@15 ~", B: "[c5,d#5,f5,g#5]@15 ~", C: "[[c5,e5,g5]@31 ~]/2", D: "[~@16 a4@15 ~, [c5,e5,g5]@31 ~]/2",
  E: "[b4,d5,g5]@7 ~", F: "[d#5,f5,a#5,c6]@3 [d5,f5,a5,c6]", G: "[c5,e5,g5]", H: "a3", I: "b3", J: "~@3 [e3,e4]",
  K: "[a3,a4]", L: "~@6 g5@7 ~@3, c4@5 ~@3, ~ g4@3 ~@4, ~@2 c5@3 ~@3", M: "[d#5,f5,a#5,c6]@11 ~ [d5,f5,a5,c6]@3 ~",
  N: "a3@2 ~@4 g3 e3", O: "f3", P: "a3@2 b3 c4", Q: "d4 e4 f4 g4", R: "a4@3 g4", S: "f4@7 ~ c5@4 f5@4", T: "a5",
  U: "g5", V: "g5@3 c6", W: "c6", X: "a4@2 b4 c5", Y: "d5 g5", Z: "a5 e5", AA: "d5@2 c5@13 ~", AB: "c5 d5",
  AC: "b4@7 g4", AD: "[c5@31 ~]/2",
})).s("gm_synth_strings_1").gain(0.33).pan(0.6)

// other · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@25 A B C@2 D B E@2 A B C@2 F G@3 ~@16 A B E@2 A H I@2 J@2 K L@2 M@2 N ~@61
>`.pickRestart({
  A: "f4", B: "g#4", C: "[~@2 g6 e6, g4]/2", D: "f4, c6 ~", E: "g4/2", F: "[f4,c6]", G: "[d6@16 c7@31 ~, g4]/3",
  H: "c5 d5, g#4", I: "[g4, c5@13 ~@3]/2", J: "[~@8 [a3,a4]@7 ~ c5@4 d5 ~@3 [d4,d5]@8, ~@15 c4@8 ~@9]/2",
  K: "[e4,e5]@7 ~ g4@8, ~@7 g5@8 ~", L: "[[a4,a5]@8 [c5,c6]@7 ~ c6@16, ~@15 c5@16 ~]/2",
  M: "[[d5,d6]@15 ~ c5@16, ~@15 c6@16 ~]/2", N: "[c3,c4]@15 ~",
})).s("gm_synth_strings_2").gain(0.38).pan(0.6)

// other · harpsichord · "HARPSICHRD"
const harpsichord = note(`<
  ~ A B C D@2 E F G A B C D@2 E F G A B C D@2 E H I ~@16 A B C D@2 E H I A B C D@2 E H I ~@32 A B C D@2 E H I A B C D@2
  E H I A B C D@2 E H I A B C D@2 E H I A B C D@2 E H I A B C ~@2
>`.pickRestart({
  A: "d2 ~ d2!2 d3@2 d2@2 ~@8", B: "g2 ~ g2!2 d3@2 g2@2 ~@8", C: "a2 ~ a2!2 c3@2 a2 ~@5 g2@3 ~",
  D: "f2 ~ f2!2 c3@2 f2@2 ~@8", E: "g2 ~ g2!2 b2@2 g2@2 ~@8", F: "d#2@9 ~@3 d2@2 ~@2", G: "c2 ~",
  H: "d#2 ~ d#2!2 ~@2 d#2!2 d#3@2 d#2!2 d3@2 d2@2, ~ a#2 ~@2", I: "c3@2 c2 ~@13",
})).s("gm_harpsichord").gain(0.43).pan(0.6)

// chords · piano · "A.PIANO 3"
const piano = note("<~@73 A B C D E F G H I J K@2 L M N O P Q R S P T U V ~@37>".pickRestart({
  A: "[a#2,d3,f3]@2 ~@2 [a#2,f3] ~ [a#2,d3,f3]@5 ~ [a#2,d3,f3]@2 ~@2", // A# A#5 A#
  B: "[c3,d3]@2 ~@2 [f#3,a3] ~ [c3,d3,f#3,a3]@5 ~ [c3,d3,f#3,a3]@2 ~@2, [f#3,a3] ~@15", // Csus2 F#m D7 F#m
  C: "[d3,a#3] ~@3 a#3 ~ [d3,g3,a#3]@5 ~ [d3,g3,a#3]@2 ~@2, g3 ~@7", // Gm
  D: "[g3,a#3] ~@5 [d3,g3,a#3]@5 ~ [c3,f3,a3]@3 ~, d3 ~@7", E: "[a#2,f3] ~@5 [a#2,d3,f3]@5 ~ [a#2,d3,f3]@2 ~@2, d3 ~@7",
  F: "[c3,d3,f#3,a3]@2 ~@4 [c3,d3,f#3,a3]@5 ~ [c3,d3,f#3,a3]@2 ~@2", // D7
  G: "[g3,a#3] ~@5 [d3,g3,a#3]@5 ~ [d3,g3,a#3]@3 ~, d3 ~@7", H: "[d3,g3,a#3] ~@5 [d3,g3,a#3]@5 ~ [c3,f3,a3]@2 ~@2",
  I: "[d3,f3]@2 ~@4 [a#2,d3,f3]@5 ~ [a#2,d3,f3]@2 ~@2, a#2 ~@15", // Dm A#
  J: "[c3,d3]@2 ~@4 [c3,d3,f#3,a3]@5 ~ [c3,d3,f#3,a3]@2 ~@2, [f#3,a3] ~@15", // Csus2 D7 F#m
  K: "[d3,g3,a#3] ~@5 [d3,g3,a#3]@5 ~ [g3,a#3] ~@3, ~@6 d3 ~", // Gm
  L: "[c3,g3,a#3] ~@3 [g3,a#3] ~ [c3,e3,g3,a#3]@5 ~ [c3,g3,a#3] ~@3, e3 ~@5 e3 ~", // C7 Gm C7
  M: "[c3,e3,g3,a#3] ~@5 [c3,e3,g3,a#3]@5 ~ [c3,e3,g3,a#3]@2 ~@2", N: "[c3,f3,a3] ~@5 [c3,f3,a3]@5 ~ [c3,f3,a3]@2 ~@2",
  O: "~ [g4,g5] [a4,a5] [e5,e6] [d5,d6] [c5,c6] [b4,b5] [g4,g5], [d3,g3,b3]@11 ~@5", P: "[a4,a5] [d5,d6]",
  Q: "[b4,b5]@8 [e5,e6]@5 ~@3", R: "[d5,d6] [c5,c6] [a4,a5] [c5,c6]@10 ~@3",
  S: "~ [g4,g5] [a4,a5] [e5,e6] [d5,d6] [c5,c6] [b4,b5] [g4,g5]", T: "[b4,b5] [d5,d6]", U: "[c5,c6]@11 ~@5",
  V: "[c4,c5]@3 ~@5", // C
})).s("gm_piano").gain(0.24)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x ~@4]!131 ~@2>").gain(0.49)

// drums · snare
const snare = s("sd").struct("<~ A@23 B A@15 B A@15 B A@15 B A@15 B A@15 B A@27 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.38)

// drums · clap
const clap = s("cp").struct("<~@73 [~ x ~ x]!16 ~@45>").gain(0.44)

// drums · low tom
const low_tom = s("lt").struct("<~@40 A ~@31 A ~@15 A ~@15 A ~@15 B ~@13>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@14 x!2",
})).gain(0.44)

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 A ~@15 B ~@15 A ~@15 B ~@15 B ~@15 C ~@15 D ~@13>".pickRestart({
  A: "~@9 x ~ x!2 ~ x ~", B: "~ x", C: "~@4 x ~@4 x ~@6", D: "~@9 x ~ x ~@4",
})).gain(0.44)

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

// drums · high tom
const high_tom = s("ht").struct("<~@24 A ~@31 A ~@47 B ~@15 C ~@13>".pickRestart({
  A: "~@6 x!2 ~@8", B: "~@2 x ~@3 x!2 ~@8", C: "~@3 x ~@4",
})).gain(0.49)

stack(
  synth_bass_1, bass, whistle, pan_flute, synth_strings_1, synth_strings_2, harpsichord, piano, kick, snare, clap,
  low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom
)

More by Eurythmics