Strudelify

Glass Angel

Erasure

KeyD majorTempo120 bpm
0:00/0:00
// Glass Angel — Erasure
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 6 "Distortion Guitar / Lead 1 (square)" named as a guitar, played on distortion guitar (its lead 1 square patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 2 "Electric Grand Piano" piano (copy of ch 1 "Electric Guitar (clean)" electric guitar clean); ch 16 "Lead 2 (sawtooth)" lead 2 sawtooth (copy of ch 7 "Vibraphone / Pad 3 (polysynth)" pad poly)
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · electric guitar clean · "Electric Guitar (clean)"
const electric_guitar_clean = note(`<
  ~@10 A@8 B C B C B C B D@2 E F D G E G H I H I H I H I E A@4 B C B C B C B D@2 E F D G E G H I H I H I H I H I H I E
  ~@9 B C B C B C B D@2 E F D G E G H I H I H I H I H I H I H I H I H I H I H I H I E
>`.pickRestart({
  A: "[a3,d4,f#4] ~@3 [a3,d4,f#4] ~@2 [a3,d4,f#4]!4 ~ [a3,d4,f#4] ~ [a3,d4,f#4] ~", // D
  B: "[a3,d4,f#4] ~@3 [a3,d4,f#4] ~@2 [a3,d4,f#4] [a3,c#4,e4]!3 ~ [a3,c#4,e4] ~ [a3,c#4,e4] ~", // D A
  C: "[g3,b3,d4] ~@3 [g3,b3,d4] ~@2 [g3,b3,d4] [a3,c#4,e4]!3 ~ [a3,c#4,e4] ~ [a3,c#4,e4] ~", // G A
  D: "[g3,b3,d4] ~@3 [g3,b3,d4] ~@2 [g3,b3,d4]!4 ~ [g3,b3,d4] ~ [g3,b3,d4] ~", // G
  E: "[a3,c#4,e4] ~@3 [a3,c#4,e4] ~@2 [a3,c#4,e4]!4 ~ [a3,c#4,e4] ~ [a3,c#4,e4] ~", // A
  F: "[b3,d4,f#4] ~@3 [b3,d4,f#4] ~@2 [b3,d4,f#4]!4 ~ [b3,d4,f#4] ~ [b3,d4,f#4] ~", // Bm
  G: "[e3,g3,b3] ~@3 [e3,g3,b3] ~@2 [e3,g3,b3]!4 ~ [e3,g3,b3] ~ [e3,g3,b3] ~", // Em
  H: "[a3,c#4,e4] ~@3 [a3,c#4,e4] ~@2 [a3,c#4,e4]!4 ~ [a3,c#4,e4] ~ [a3,c#4,e4] [d4,f#4]", // A D
  I: "[a3,d4,f#4] ~@3 [a3,d4,f#4] ~@2 [a3,d4,f#4] [g3,b3,d4]!3 ~ [g3,b3,d4] ~ [g3,b3,d4] ~, [a4,d5] ~", // D G D5
})).s("gm_electric_guitar_clean").gain(0.25)

// other · piano · "Electric Grand Piano"
const piano = note(`<
  ~@10
  [d3 ~ d3!4 a2!2 d3!3 ~ d3 ~@3]!8
  ~@24
  [d3 ~ d3!4 a2!2 d3!3 ~ d3 ~@3]!4
  ~@29
  [d3 ~ d3!4 a2!2 d3!3 ~ d3 ~@3]!8
  ~@40
>`).s("gm_piano").gain(0.5)

// bass · fretless bass
const bass = note(`<
  ~@14 A B A B C D C D C D C B@2 E F B G E G E H E H E H E H E A B A ~ C D C D C D C B@2 E F B G E G E H E H E H E H E H
  E H E ~@9 C D C D C D C B@2 E F B G E G E H E H E H E H E H E H E H E H E H E H E H E H E
>`.pickRestart({
  A: "d2 ~ d2!3 ~ d2!3 ~ d2!3 ~ d2 ~", B: "g1 ~ g1!3 ~ g1!3 ~ g1!3 ~ g1 ~", C: "d2 ~ d2!3 ~ d2!2 a1 ~ a1!3 ~ a1 ~",
  D: "g1 ~ g1!3 ~ g1!2 a1 ~ a1!3 ~ a1 ~", E: "a1 ~ a1!3 ~ a1!3 ~ a1!3 ~ a1 ~", F: "b1 ~ b1!3 ~ b1!3 ~ b1!3 ~ b1 ~",
  G: "e1 ~ e1!3 ~ e1!3 ~ e1!3 ~ e1 ~", H: "d2 ~ d2!3 ~ d2!2 g1 ~ g1!3 ~ g1 ~",
})).s("gm_fretless_bass").gain(0.48)

// chords · pad warm · "Pad 2 (warm)"
const pad_warm = note("<~@10 A@6 ~@57 B@2 C@8 ~@16 D@8 ~@16>".pickRestart({
  A: "[f#4@11 ~]/6", B: "[e4,a4,c#5]/2", C: "[d4,g4,a4,g5]/8",
  D: "[d5@16 c#5@16 d5@16 c#5@16 d5@16 c#5@16 d5@16 c#5@15 ~, a4@127 ~]/8",
})).s("gm_pad_warm").gain(0.25)

// other · distortion guitar · "Distortion Guitar / Lead 1 (square)"
const distortion_guitar = note(`<
  ~@62 A B@2 C A B@2 C A B@2 C ~@25 A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C
>`.pickRestart({
  A: "a4 ~ d5@2 ~ d5@2 ~ d5 ~@2 b4@2 ~ c#5 ~", B: "a4 ~ d5@2 ~ d5@2 ~ d5@2 ~ b4@2 ~ c#5 ~",
  C: "a4 ~ d5@2 ~ d5@2 ~ d5@2 ~ b4@2 ~ c#5@2",
})).s("gm_distortion_guitar").gain(0.32).pan(0.6)

// other · vibraphone · "Vibraphone / Pad 3 (polysynth)"
const vibraphone = note("<~@6 [f4 e4 d4 f4 g4 d4!2 g4 a4 d4!2 a4 g4 d4!2 e4]!12 ~@105>").s("gm_vibraphone").gain(0.14)

// other · pad poly · "Vibraphone / Pad 3 (polysynth)"
const pad_poly = note("<~@82 A B C D@2 E C F@2 ~@32>".pickRestart({
  A: "~@14 a4 b4", B: "d5@3 ~ e5@4 c#5@2 b4 a4@3 ~ a4", C: "b4@2 g4@2 d5@2 g4@2 b4@2 a4 g4@3 b4@2",
  D: "[a4@28 ~@2 a4 b4]/2", E: "d5@4 e5@4 c#5@2 b4 a4@3 ~ a4", F: "a4/2",
})).s("gm_pad_poly").gain(0.64).pan(0.3)

// other · lead 1 square · "Lead 1 (square)"
const lead_1_square = note(`<
  ~@4 A@2 ~@28 B C B C B C B C ~@20 B C B C B C B C B C B C@4 ~ D E F@7 ~@12 B C B C B C B C B C B C B C B C B C B C B C
  B C
>`.pickRestart({
  A: "d4/2", B: "d6 a6 d7 a6 d6 a6 d7 a6 g5 d6 g6 d6 g5 d6 g6 d6", C: "a5 e6 a6 e6 a5 e6 a6 e6 a5 e6 a6 e6 a5 e6 a6 e6",
  D: "~@15 [g4,g5]", E: "[d6,g6] ~@15", F: "[d3,d4]/7",
})).s("gm_lead_1_square").gain(0.14)

// chords · koto
const koto = note(`<
  ~@18 A@7 B@2 A C B D A D A B A B A B A B A ~@4 A@7 B@2 A C B D A D A B A B A B A B A B A B A ~@9 A@7 B@2 A C B D A 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 A
>`.pickRestart({
  A: "~@9 [a3,c#4,e4]!7", B: "~@9 [g3,b3,d4]!7", C: "~@9 [b3,d4,f#4]!7", D: "~@9 [e3,g3,b3]!7",
})).s("gm_koto").gain(0.3).pan(0.6)

// other · pad new age · "Pad 1 (new age)"
const pad_new_age = note(`<
  ~@18 A B@2 ~ C D E F G H I J K L M N O P O Q O P O Q ~@4 R S T ~ U@2 V F W X I Y M Z AA@2 O P O Q O P O AB O P O AC@4
  ~@13 AD AE AF AG AH K L M AI AJ@2 AK@2 AJ@2 AK@2 O P O Q O P O AB O P O Q O P O AB
>`.pickRestart({
  A: "d5 ~ d5 ~ d5 ~ e5 ~ c#5 ~ b4 a4@3 ~ a4", B: "[b4 ~ b4 ~ b4 ~ d5 ~ b4 ~ a4 g4@2 ~ b4@4 a4@4 b4@2 ~@8]/2",
  C: "d5@3 ~ e5@3 ~ c#5 ~ b4 a4@4 ~", D: "b4 ~ b4 ~ b4 ~ d5 ~ b4 ~ a4 g4@2 ~ b4@2", E: "~@2 a4@5 ~@9", F: "~@14 g4 ~",
  G: "g4@2 ~ g4@8 ~ g4@2 a4 ~", H: "f#4@2 e4 e4@10 ~ e4 ~", I: "f#4@2 ~ f#4@6 ~ f#4@2 ~ a3@2 ~", J: "b3@3 a3 g3@10 ~@2",
  K: "~@2 g4 ~ g4 ~ b4@3 ~ g4@3 ~ a4@2", L: "~ g4 e4@12 ~@2", M: "g4 ~ g4 ~ g4 ~ b4@3 ~ g4@3 ~ a4@2",
  N: "~@2 a4@3 ~ a4 ~ b4 ~ d5@5 ~", O: "a4 ~ a4 ~ f#5 ~ e5@3 ~ d5@3 ~ c#5@2", P: "~@2 e5@3 ~ g5@3 ~ c#5@5 ~",
  Q: "~@2 g5@3 ~ c#5@3 ~ a4@5 ~", R: "d5 ~ d5!2 ~ d5 c#5@3 ~ b4@2 a4 ~ a4@2",
  S: "b4!2 ~ b4@2 ~ d5 ~ b4 ~ a4 ~ g4 b4@2 ~", T: "a4@3 ~@5",
  U: "[d5@3 ~ e5@3 ~ c#5 ~ b4 a4@3 a4 b4@2 ~ b4 b4@2 ~ d5 ~ b4 ~ a4 g4@2 ~ b4@2]/2", V: "~ a4@2 ~@5",
  W: "g4@2 ~ g4@8 ~ g4 ~ a4 ~", X: "f#4@2 ~ e4@10 ~ e4 ~", Y: "b3@3 a3 g3@11 ~", Z: "~ f#4 e4@11 ~ e4 ~",
  AA: "[g4 ~ g4 ~ g4 ~ b4@3 ~ g4@3 ~ a4@5 ~ a4 ~ b4@3 ~ d5@4 ~@2]/2", AB: "~@2 g5@3 ~ c#5@3 ~ a4@4 ~@2",
  AC: "[~@2 e5@3 ~ f#5@3 ~ g5@54]/4", AD: "~@12 g5 ~ g5 ~", AE: "g5@2 ~ g5@6 ~ g5 ~ f#5 ~ g5 ~",
  AF: "f#5 ~ e5 e5@10 ~ e5 ~", AG: "f#5@2 ~ f#5@6 ~ f#5@2 ~ a4@2 ~", AH: "b4@3 a4 g4@10 ~@2",
  AI: "~@2 a4@3 ~ b4@3 ~ d5@5 ~", AJ: "[d5@14 c#5@12 d5@3 ~ e5@2]/2", AK: "[d5@10 b4@2 d5@2 c#5@17 ~]/2",
})).s("gm_pad_new_age").gain(0.55)

// other · lead 4 chiff · "Lead 4 (chiff lead)"
const lead_4_chiff = note(`<
  ~@34 A@2 B@2 A@2 C@2 ~@20 A@2 B@2 A@2 C@2 A@2 D@3 ~@32 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2
>`.pickRestart({
  A: "[d2 ~ d2 ~ d3 ~ b2@4 g2@3 ~ a2@8 a2@3 ~ a2@4 a2@2]/2",
  B: "[d2 ~ d2 ~ d3 ~ b2@3 ~ g2@3 ~ e2@8 e2@3 ~ e2@3 ~ e2 ~]/2",
  C: "[d2 ~ d2 ~ d3 ~ b2@3 ~ g2@3 ~ c#2@4 g2@3 ~ c#2@3 ~ a1@4 ~@2]/2",
  D: "[d2 ~ d2 ~ d3 ~ b2@3 ~ g2@3 ~ e2@4 a2@4 c#3@4 e3@22]/3",
})).s("gm_lead_4_chiff").gain(0.4)

// chords · music box
const music_box = note("<~@26 A@6 ~@22 B@6 C@4 ~@27 B@6 C@4 ~@22>".pickRestart({
  A: "[~@15 d4@8 ~, ~@3 g4@16 b4@16 ~@13, ~@3 d4@8 f#4@8 ~@5, ~@11 a3@16 g3@16 ~@5, ~@7 e4@8 ~@9]/6",
  B: "[~@23 e4, ~@3 g4@16 b4@16 e4@11 ~@2, ~@3 d4@8 f#4@8 b4@5, ~@11 a3@16 g3@16 a4@5, ~@7 e4@8 d4@8 ~]/6",
  C: "[~@7 a5@8 ~, ~@3 e4@16 ~@13, ~@3 b4@8 ~@5, ~@11 a4@16 ~@5]/4",
})).s("gm_music_box").gain(0.71).pan(0.6)

// other · pad metallic · "Pad 6 (metallic)"
const pad_metallic = note("<~@70 A@2 B C@2 ~@27 D@7 E@8 F@6>".pickRestart({
  A: "[d5@13 ~ c#5@11 ~ d5@3 ~ e5 ~]/2", B: "d5@13 ~ c#5@2", C: "[~@2 e5@3 ~ c#5@3 ~ a4@21 ~]/2",
  D: "[~@10 a4 ~ e5 ~ d5@11 ~ a4 ~ f#5 ~ e5@11 ~ a4 ~ g5 ~ f#5@5 ~ f#5 ~ g5 ~ a5 ~ d5@3 ~@13 a4 ~ e5 ~ d5@11 ~ a4 ~ f#5 ~ e5@11 ~ a4 ~ g5 ~ f#5@2, ~@62 c#5@17 ~@33]/7",
  E: "[~@4 f#5 ~ g5 ~ a5 ~ d5@3 ~@13 a4 ~ e5 ~ d5@11 ~ a4 ~ f#5 ~ e5@11 ~ a4 ~ g5 ~ f#5@5 ~ f#5 ~ g5 ~ a5 ~ d5@3 ~@13 a4 ~ e5 ~ d5@11 ~ a4 ~ f#5 ~ e5@11 ~ a4 ~ g5 ~ f#5@2, ~@14 c#5@17 ~@47 c#5@17 ~@33]/8",
  F: "[~@4 f#5 ~ g5 ~ a5 ~ d5@3 ~@13 a4 ~ e5 ~ d5@11 ~ a4 ~ f#5 ~ e5@11 ~ a4 ~ g5 ~ f#5@5 ~ f#5 ~ g5 ~ a5 ~ d5@3 ~ c#5@17 ~, ~@14 c#5@17 ~@65]/6",
})).s("gm_pad_metallic").gain(0.72).pan(0.3)

// drums · rim
const rim = s("rim").struct("<~@17 [~ x] ~@105>").gain(0.6)

// drums · kick
const kick = s("bd").struct(`<
  ~@14
  [x!4]!4
  [x ~ x ~ x ~ x!2]!24
  [x!4]!4
  [x ~ x ~ x ~ x!2]!28
  ~
  [x!4]!8
  [x ~ x ~ x ~ x!2]!40
>`).gain(0.54)

// drums · snare
const snare = s("sd").struct("<~@18 A@15 B A@11 ~ A@15 B A@12 ~@9 A@15 C A@7 B A@7 B A@7 B>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@6 x!2 ~ x!2", C: "~@4 x ~@7 x ~ x!2",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@10 [x!16]!64 ~@9 [x!16]!40>").gain(0.54)

// drums · low tom
const low_tom = s("lt").struct("<~@33 A ~@27 A ~@44 A ~@7 A ~@7 A>".pickRestart({
  A: "~@10 x ~@2 x ~@2",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@18 A ~@7 A ~@7 A ~@11 A ~@7 A ~@7 A ~@20 A ~@15 A ~@7 A ~@7 A ~@7>".pickRestart({
  A: "x",
})).gain(0.48)

// drums · congas
const congas = s("conga:13").struct("<~@17 A ~@7 B ~@19 A ~@7 B ~@28 C ~@40>".pickRestart({
  A: "~@12 x!4", B: "~@12 x ~ x!2", C: "~@14 x!2",
})).gain(1.54)

// drums · shaker
const shaker = s("sh").struct("<~@10 [~ x ~ x ~ x ~ x]!64 ~ [~ x ~ x ~ x ~ x]!48>").gain(0.6)

stack(
  electric_guitar_clean, piano, bass, pad_warm, distortion_guitar, vibraphone, pad_poly, lead_1_square, koto,
  pad_new_age, lead_4_chiff, music_box, pad_metallic, rim, kick, snare, hihat, low_tom, crash, congas, shaker
)

More by Erasure