Strudelify

Oh L'Amour

Erasure

KeyE♭ majorTempo123 bpm
0:00/0:00
// Oh L'Amour — Erasure
// 122.5 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 7 "Bright Acoustic" piano (copy of ch 8 "Koto" koto)
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122.5/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 · pad warm · "Pad 2 (warm)"
const pad_warm = note("<A@5 B@8 ~@80>".pickRestart({
  A: "[~@13 g3@22 ~@2 f3@22 ~ [ab3,c4]@20, ~@13 eb4@67, ~@13 bb3@47 ~@20]/5", // Ab
  B: "[~@4 [f3,d4]@22 ~@2 g3@22 ~@2 f3@21 ~@3 [ab3,c4]@22 ~@2 [f3,bb3,d4]@28, ~@2 bb3@35 ~@27, ~@14 eb4@35 ~@15]/8", // Dm Ab Bb
})).s("gm_pad_warm").gain(0.07)

// chords · pad metallic · "Pad 6 (metallic)"
const pad_metallic = note(`<
  ~@25 A@2 B C A@2 B C ~@10 A@2 B C A@2 B C ~@2 D E F G H I J K ~@8 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
>`.pickRestart({
  A: "[~@4 [eb4,bb4]@3 ~ [eb4,ab4] ~ [eb4,g4]@2 ~@2 [eb4,f4]@17 ~]/2", // Eb5 Ab5 Eb Ebsus2
  B: "~@4 [eb4,bb4]@2 ~@2 [eb4,ab4] ~ [eb4,g4]@3 ~ [bb3,d4]@2", C: "~@2 [bb3,d4]@3 ~ [bb3,eb4]@3 ~ [bb3,f4]@6",
  D: "~ bb4 f5 bb5 ~ bb4 f5 bb5", E: "~ ab4 eb5 ab5 ~ ab4 eb5 ab5", F: "~ bb4 eb5 g5 ~ bb4 eb5 g5",
  G: "~@2 bb4@2 eb5@2 g5 ~@3 bb4@2 eb5@2 g5 ~", H: "~@2 bb4@2 f5@2 bb5@2 ~@2 bb4@2 f5@2 bb5 ~",
  I: "~@2 ab4@2 eb5@2 ab5@2 ~@2 ab4@2 eb5@2 ab5 ~", J: "~ g4 c5 g5 ~ g4 c5 g5",
  K: "~@2 g4@2 c5@2 g5 ~@3 g4@2 c5@2 g5 ~",
})).s("gm_pad_metallic").gain(0.5).pan(0.3)

// other · vibraphone
const vibraphone = note("<~@52 A@3 B@4 C ~@33>".pickRestart({
  A: "[~@6 bb4 ~ bb4@2 ab4@2 g4@2 f4@7 ~ f4 ~ f4@2 eb4@2 d4 ~ c4@7 ~ bb4 ~ bb4@2 ab4 ~ g4@4]/3",
  B: "[eb4@6 bb3@2 eb4@2 bb3@2 eb4@2 g4@7 ~ bb4 ~ bb4@2 ab4@2 g4@2 f4@7 ~ bb4 ~ bb4@2 ab4@2 g4@2 eb4@7 ~ eb4@4 c4@2 eb4@3 ~]/4",
  C: "c4 ~ c4 ~ eb4 ~ eb4@2 g4 ~ g4 ~ bb4@2 c5 ~",
})).s("gm_vibraphone").gain(0.19)

// other · lead 2 sawtooth · "Lead 2 (sawtooth)"
const lead_2_sawtooth = note(`<
  ~@24 A B C D@2 B C E@2 F ~@8 A B C D@2 B C E@2 F ~@16 A B C D@2 B C G@2 B C D@2 B C G@2 B C D@2 B C E@2
>`.pickRestart({
  A: "~@12 bb1@3 ~", B: "eb2", C: "~@3 bb1", D: "[ab1@5 ~ ab1 bb1@6 ~ bb1@2]/2", E: "[ab1@11 ~ ab1@2 bb1@12 ~@6]/2",
  F: "c6 bb5 c6 bb5 c6 eb6 ~ c6@2 bb5 c6 bb5 c6@2 eb6@2", G: "[ab1@11 ~ ab1@2 bb1@12 ~@2 bb1@3 ~]/2",
})).s("gm_lead_2_sawtooth").gain(0.8)

// chords · koto
const koto = note(`<
  ~@13 A B A B A B A B C A D A E F G H E F G H I J A B A B C A D A E F G H E F G H I J A C B@2 A C I J A B A B C A D A
  ~@8 E F G H E F G H E F G H E F G H
>`.pickRestart({
  A: "[bb3,d4,f4]!5 ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", // Bb
  B: "[bb3,eb4,g4] ~ [bb3,eb4,g4]!3 ~ [bb3,eb4,g4]!5 ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~", // Eb
  C: "[ab3,c4,eb4]!5 ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~", // Ab
  D: "[ab3,c4,f4]!5 ~ [ab3,c4,f4] ~ [ab3,c4,f4] ~ [ab3,c4,f4] ~ [ab3,c4,f4] ~ [ab3,c4,f4] ~", // Fm
  E: "[bb3,eb4,g4]!5 ~@2 [bb3,eb4,g4]!2 ~ [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~", // Eb
  F: "[bb3,eb4,f4]!5 ~@2 [bb3,eb4,f4]!2 ~ [bb3,eb4,f4] ~@3 [bb3,eb4,f4] ~", // Bbsus4
  G: "[ab3,c4,eb4]!5 ~@2 [ab3,c4,eb4]!2 ~ [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~", // Ab
  H: "[bb3,d4,f4]!5 ~@2 [bb3,d4,f4]!2 ~ [bb3,d4,f4] ~@3 [bb3,d4,f4] ~", // Bb
  I: "[c4,eb4,g4]!5 ~@2 [c4,eb4,g4]!2 ~ [c4,eb4,g4] ~@3 [c4,eb4,g4] ~", // Cm
  J: "~@2 [c4,eb4,g4]!3 ~ [c4,eb4,g4]!5 ~ [c4,eb4,g4] ~ [c4,eb4,g4]!2", // Cm
})).s("gm_koto").gain(0.32)

// other · pad halo · "Pad 7 (halo)"
const pad_halo = note(`<
  ~@57
  [bb4 ~ bb4@2 d5@2 f5 ~ bb4 ~ bb4@2 d5@2 f5 ~]
  [ab4 ~ ab4@2 c5@2 eb5 ~ ab4 ~ ab4@2 c5@2 eb5 ~]
  [g4 ~ g4@2 c5@2 eb5 ~ g4 ~ g4@2 c5@2 eb5 ~]!2
  ~@32
>`).s("gm_pad_halo").gain(0.6).pan(0.8)

// bass · electric bass finger · "Electric Bass (finger)"
const bass = note(`<
  ~@13 A B A B A B A B C A D A B A C A B A C A E F A B A B C A D A B A C A B A C A E F A C B@2 A C E F A B A B C A D A
  ~@8 B A C A B A C A B A C A B A C A
>`.pickRestart({
  A: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2", B: "eb2 eb3 eb2 eb3 eb2 eb3 eb2 eb3", C: "ab1 ab2 ab1 ab2 ab1 ab2 ab1 ab2",
  D: "f1 f2 f1 f2 f1 f2 f1 f2", E: "c2 c3 c2 c3 c2 c3 c2 c3", F: "c2 c3@2 c2 c3@2 c2 c3",
})).s("gm_electric_bass_finger").gain(0.6)

// chords · orchestral harp
const orchestral_harp = note("<~@17 A@5 ~@13 A@5 ~@21 B@3 C ~@28>".pickRestart({
  A: "[~@3 eb6@2, ~@7 [g4,bb4]@16 [g4,bb4]@16 ~, ~@15 [eb5,g5,bb5]@32 [eb5,g5,bb5]@32 ~, ~ eb6@2 ~@2]/5", // Gm Eb
  B: "[~@47 [eb5,g5,bb5], ~@7 [g4,bb4]@16 [g4,bb4], ~@15 [eb5,g5,bb5]@32 ~, ~ eb6@2]/3", C: "eb6 ~@15",
})).s("gm_orchestral_harp").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@13 A@3 B A@17 B A@17 B A@7 B A@8 ~@8 A@16>".pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x!5 ~@3",
})).gain(0.64)

// drums · clap
const clap = s("cp").struct(`<
  ~@25 A B A B A B A B ~@10 A B A B A B A B ~@18 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: "x ~@2 x!2 ~@2 x!2 ~ x ~@5", B: "x!5 ~@2 x!2 ~ x ~@5",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@16 A B@17 C B@17 C B@7 D B@8 E ~@6 B@17>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@2 x ~@3 x ~@5 x ~ x!2", D: "x!3 ~@3 x ~@5 x ~ x!2", E: "x",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@13 [x!16]!80>").gain(0.43)

// drums · low tom
const low_tom = s("lt").struct("<~@24 [~@7 x] ~@17 [~@7 x] ~@25 [~@7 x] ~@24>").gain(0.71)

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 [~@2 x!5 ~ x!6 ~@2] ~@17 [~@2 x!5 ~ x!6 ~@2] ~@25 [~@2 x!5 ~ x!6 ~@2] ~@24>")
  .gain(0.71)

// drums · crash
const crash = s("cr").struct("<~@17 A ~@7 A ~@9 A ~@7 A ~@9 A ~@14 B A ~@7 A ~@15>".pickRestart({
  A: "x", B: "~@5 x ~@2",
})).gain(0.71)

// drums · tambourine
const tambourine = s("tb").struct("<~@13 [x!2]!4 ~@76>").gain(0.64)

// drums · cowbell
const cowbell = s("cb").struct("<~@52 [~ x] ~@23 [~ x] ~@16>").gain(0.71)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@52 [~@3 x] ~@23 [~@3 x] ~@16>").gain(8.39)

// drums · ride
const ride = s("rd").struct("<~@16 A B C D C ~@13 A B C D C ~@22 D C D C ~@28>".pickRestart({
  A: "~@12 x!4", B: "x ~@13 x!2", C: "x", D: "~@14 x!2",
})).gain(0.71)

stack(
  pad_warm, pad_metallic, vibraphone, lead_2_sawtooth, koto, pad_halo, bass, orchestral_harp, kick, clap, snare, hihat,
  low_tom, mid_tom, crash, tambourine, cowbell, vibraslap, ride
)

More by Erasure