Strudelify

Siren Song

Erasure

KeyF majorTempo92 bpm
0:00/0:00
// Siren Song — Erasure
// 92 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 4 "Sitar" piccolo (copy of ch 9 "Choir Aahs" choir aahs)
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(92/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 · pad metallic · "Pad 6 (metallic)"
const pad_metallic = note(`<
  ~@4 A B A B A B A B A B A C D E F G H E I J F K ~@8 A B A B A B A C D E F G H E I J F K ~@16 H E I J F K ~@12 L B A B
  A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "d4 a3 f4 d4!2 a3 e4 a3", B: "bb3 f3 d4 bb3 c4 g3 e4 c4", C: "bb3 f3 d4 bb3 d4 bb3 f4 bb3",
  D: "a3 f3 b3 f3 a3 f3 a3 c4", E: "bb3 f3 d4 f3 bb3 f3 d4 bb3", F: "db4 a3 e4 a3 db4 a3 e4 a3",
  G: "db4 a3 g4 a3 db4 a3 g4 a3", H: "d4 a3 gb4 d4!2 a3 gb4 d4", I: "a3 f3 c4 f3 a3 f3 f4 c4",
  J: "bb3 g3 d4 g3 bb3 f3 d4 bb3", K: "db4 a3 g4 a3 db4 a3 e4 db4", L: "~ a3 f4 d4!2 a3 e4 a3",
})).s("gm_pad_metallic").gain(0.54).pan(0.8)

// other · banjo
const banjo = note("<~@20 A B C B D@2 ~@20 A B C B D@2 ~@8 E F E G H I J K A B C B D@2 ~@35>".pickRestart({
  A: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 db3 c3 b2", B: "bb2@2 bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~",
  C: "f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 e3 d3 c3", D: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  E: "d4 a3 f4 d4!2 a3 e4 a3", F: "bb3 f3 d4 bb3 c4 g3 e4 c4", G: "bb3 f3 d4 bb3 d4 bb3 f4 bb3",
  H: "a3 f3 b3 f3 a3 f3 a3 c4", I: "bb3 f3 d4 f3 bb3 f3 d4 bb3", J: "db4 a3 e4 a3 db4 a3 e4 a3",
  K: "db4 a3 g4 a3 db4 a3 g4 a3",
})).s("gm_banjo").gain(0.28).pan(0.4)

// other · sitar
const sitar = note("<~@20 A B C B D@2 ~@20 A B C B D@2 ~@16 A B C B D@2 ~@35>".pickRestart({
  A: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 db3 c3 b2", B: "bb2@2 bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~",
  C: "f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 e3 d3 c3", D: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
})).s("gm_sitar").gain(0.24).pan(0.4)

// other · recorder
const recorder = note(`<
  ~ A@3 B@2 C@2 D@3 E@2 ~@13 F G F G F G ~@20 F G F G F G ~@16 F G F G F G ~@10 F G F G F G F G F G F G F G F G F G ~
>`.pickRestart({
  A: "[~ b5@2 ~]/3", B: "[~ b5@6 ~]/2", C: "[~@5 b5@11]/2", D: "[~@7 b5@11 ~@6]/3", E: "[~ a5@12 ~@3]/2", F: "d6 gb5",
  G: "g5",
})).s("gm_recorder").gain(0.24).pan(0.3)

// other · recorder
const recorder_2 = note(`<
  A@2 ~ B@2 A@2 C@3 D@2 E@2 ~@12 F G F G F G ~@20 F G F G F G ~@16 F G F G F G ~@10 F G F G F G F G F G F G F G F G F G
  ~
>`.pickRestart({
  A: "[~ b5@3]/2", B: "[b5@3 ~]/2", C: "[~ b5@2 ~]/3", D: "[bb5@11 ~@5]/2", E: "[~@2 g5@11 ~@3]/2", F: "d5 gb4",
  G: "g4",
})).s("gm_recorder").gain(0.24).pan(0.8)

// chords · pad warm · "Pad 2 (warm)"
const pad_warm = note("<~@60 A B A C D C E@2 ~@41>".pickRestart({
  A: "[a3,d4,f4] [g3,c4,e4]", B: "[f3,bb3,d4] [g3,c4,e4]", C: "[f3,bb3,d4]", D: "[f3,a3,c4]",
  E: "[~ g4, [e3,a3,db4]]/2", // A
})).s("gm_pad_warm").gain(0.2)

// chords · pad warm · "Pad 2 (warm)" · soft notes
const pad_warm_soft = note("<~@24 A@2 B@6 ~@18 A@2 B@6 ~@14 A@2 B@6 ~@29>".pickRestart({
  A: "[e3,a3,db4,g4]/2", B: "[d2,d3]/6",
})).s("gm_pad_warm").gain(0.11)

// other · synth strings 1 · "SynthStrings 1"
const synth_strings_1 = note(`<
  ~@24 A B C@6 D@2 E@4 ~@12 A B ~@6 D F G H G I J K L M ~@4 A B ~@6 D@2 ~@27
>`.pickRestart({
  A: "db4@2 ~@2 db4 d4 e4@2 g4@3 ~ g4 a4 db5@2", B: "e5 db5 a4 g4 e4@4", C: "d2 ~@7",
  D: "a1!2 ~@2 a1@2 ~ a1@2 ~ a1!2 ~ a1@2 ~", E: "d2!3 ~ d2@2 ~ d2@2 ~ d2!2 ~ d2@2 ~",
  F: "a1!2 ~@2 a1@2 ~ a1@2 ~ a1!2 ~@2 f5@2, ~@6 d5 ~, ~@13 a1@2 ~", G: "a5@10 g5 a5 g5 f5 c5@2", H: "d5@11 ~ d5@2 f5@2",
  I: "d5@7 ~", J: "d5 e5 f5 g5", K: "a5@6 bb5 a5 g5@7 ~", L: "a5@2 bb5 a5 g5@2 a5 g5 f5@2 g5 f5 e5@4",
  M: "a4@2 bb4 a4 g4@2 a4 g4 f4@2 d4@2 e4@4",
})).s("gm_synth_strings_1").gain(0.48)

// other · glockenspiel · "Glockenspiel / Pad 1 (new age)" · Abmaj7 Bbmaj7 Cmaj7 Dmaj7 Emaj7 Gbmaj7 Abmaj7 Bbmaj7 …
const glockenspiel = note(`<
  ~@25
  [[g3,ab3] [a3,bb3] [b3,c4] [db4,d4] [eb4,e4] [f4,gb4] [g4,ab4] [a4,bb4] [b4,c5] [db5,d5] [eb5,e5] [f5,gb5] [g5,ab5] [a5,bb5] [b5,c6] [db6,d6]]
  ~@25
  [[g3,ab3] [a3,bb3] [b3,c4] [db4,d4] [eb4,e4] [f4,gb4] [g4,ab4] [a4,bb4] [b4,c5] [db5,d5] [eb5,e5] [f5,gb5] [g5,ab5] [a5,bb5] [b5,c6] [db6,d6]]
  ~@21
  [[g3,ab3] [a3,bb3] [b3,c4] [db4,d4] [eb4,e4] [f4,gb4] [g4,ab4] [a4,bb4] [b4,c5] [db5,d5] [eb5,e5] [f5,gb5] [g5,ab5] [a5,bb5] [b5,c6] [db6,d6]]
  ~@35
>`).s("gm_glockenspiel").gain(0.25)

// other · pad new age · "Glockenspiel / Pad 1 (new age)"
const pad_new_age = note(`<
  ~@26 A B A B A B ~@11 C@2 ~@7 A B A B A B ~@16 A B A B A B ~@10 D E A E A E A E A E A E A E A E A E ~
>`.pickRestart({
  A: "d4 a4 d5 a4 d4 a4 d5 a4 d4 a4 d5 a4 d4 a4 d5 a4", B: "d4 g4 d5 g4 d4 g4 d5 g4 d4 g4 d5 g4 d4 g4 d5 g4",
  C: "[~@5 a4 a5 e5@5 ~@4]/2", D: "~ a4 d5 a4 d4 a4 d5 a4 d4 a4 d5 a4 d4 a4 d5 a4",
  E: "d4 bb4 d5 bb4 d4 bb4 d5 bb4 d4 g4 d5 g4 d4 g4 d5 g4",
})).s("gm_pad_new_age").gain(0.22)

// other · steel drums
const steel_drums = note("<~@27 A ~ B ~ C ~@21 A ~ B ~ C ~@17 A ~ B ~ C ~@29>".pickRestart({
  A: "d5@3 e5 d5@3 e5 d5@3 e5 d5 e5 gb5@2", B: "gb5@3 g5 gb5@3 g5 gb5@3 g5 gb5 g5 a5@2",
  C: "a5@3 b5 a5@3 b5 a5@3 b5 a5 b5 d6@2",
})).s("gm_steel_drums").gain(0.5)

// bass · synth bass 1
const bass = note(`<
  ~@32 A@2 B@4 C D C E F E G@2 B E F E G@2 H I H I H I A@2 C D C E F E G@2 B E F E G@2 H I H I H I A@2 B@26 ~
>`.pickRestart({
  A: "a1!2 ~@2 a1@2 ~ a1@2 ~ a1!2 ~ a1@2 ~", B: "d2!3 ~ d2@2 ~ d2@2 ~ d2!2 ~ d2@2 ~",
  C: "d2!3 ~ d2@2 ~ c2@2 ~ c2!2 ~ c2@2 ~", D: "bb1!3 ~ bb1@2 ~ c2@2 ~ c2!2 ~ c2@2 ~",
  E: "bb1!3 ~ bb1@2 ~ bb1@2 ~ bb1!2 ~ bb1@2 ~", F: "f1!3 ~ f1@2 ~ f1@2 ~ f1!2 ~ f1@2 ~",
  G: "a1!3 ~ a1@2 ~ a1@2 ~ a1!2 ~ a1@2 ~", H: "d2 ~ d2 ~@7 d2 ~@5", I: "d2 ~ d2 ~@6 d2!2 ~@3 d2@2",
})).s("gm_synth_bass_1").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@34
  [x!3 ~@4 x ~@2 x!2 ~ x ~@2]!18
  ~@6
  [x!3 ~@4 x ~@2 x!2 ~ x ~@2]!16
  ~@6
  [x!3 ~@4 x ~@2 x!2 ~ x ~@2]!28
  ~
>`).gain(0.21)

// drums · clap
const clap = s("cp").struct("<~@34 [~@3 x]!74 ~>").gain(0.57)

// drums · low tom
const low_tom = s("lt").struct("<~@34 [x!3 ~@13]!74 ~>").gain(0.36)

// drums · ride
const ride = s("rd").struct("<~@26 [x!8]!6 ~@77>").gain(0.29)

// drums · triangle
const triangle = s("triangles:30").struct("<~@34 [~@2 x!3 ~ x ~@3 x!3 ~ x ~]!74 ~>").gain(3.73)

stack(
  pad_metallic, banjo, sitar, recorder, recorder_2, pad_warm, pad_warm_soft, synth_strings_1, glockenspiel, pad_new_age,
  steel_drums, bass, kick, clap, low_tom, ride, triangle
)

More by Erasure