Strudelify
Breath of Life cover art

Breath of Life

Breath of Life

Erasure

KeyE♭ minorTempo133 bpm
0:00/0:00
// Breath of Life — Erasure
// 133 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 130 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(133/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 warm · "Warm pad"
const pad_warm = note(`<
  A@2 B@2 A@2 B@2 C D E F C D E F C D E F C D E F C D E F C D E F C D E@2 G@2 C G E D H F D G I@2 C D E F C D E F C D E
  F C D E F C D E F C D E F C D E@2 G@2 C G E D H F D G I@2 C G C G C G C G C D E F C D E F C G E D H F D G I@2 C D E F
  C D E F C D E F C D E F
>`.pickRestart({
  A: "eb2/2", B: "b1/2", C: "eb2", D: "bb1", E: "db2", F: "ab1", G: "b1", H: "gb1", I: "gb2",
})).s("gm_pad_warm").gain(0.51)

// other · pad poly · "Polysynth"
const pad_poly = note(`<
  ~@20 A B@2 C ~@4 A B@2 C ~@16 A B@2 C A B@2 C ~@4 A B@2 C ~@4 A B@2 C ~@16 D@8 ~@18 A B@2 C A B@2 C A B@2 C A B@2 C
>`.pickRestart({
  A: "~@2 eb4 ~ gb4 ~ eb4 ~@3 eb4 ~ bb4 ~ eb4 ~", B: "~@2 db4 ~ f4 ~ db4 ~@3 db4 ~ ab4 ~ db4 ~",
  C: "~@2 c4 ~ eb4 ~ c4 ~@3 c4 ~ ab4 ~ c4 ~", D: "eb5!2 ~ bb4 db5 eb5 ~ bb4 db5 ~ eb5 ~ eb5 db5 bb4 ~",
})).s("gm_pad_poly").gain(0.46).pan(0.1)

// other · pad sweep · "Sweeper"
const pad_sweep = note(`<
  ~ A B@3 C D@2 ~@28 E F G H I J K L J H M@2 ~@12 N O@2 P ~@4 Q R@2 S ~@4 E F ~@52
>`.pickRestart({
  A: "~ eb4@3", B: "[~@3 eb4@16 ab3@4 gb3@3 f3@3 db3@2 eb3@14 ~@3, gb4@5 ~@43]/3", C: "~@4 ab3@4 ~@2 db4@3 eb5@3",
  D: "[~ a4@2 ab4@2 ~ gb4@12 ~@14]/2", E: "b7 a7 g7 f7 eb7 db7 b6 a6", F: "g6 f6 eb6 db6 b5 a5 ~@2", G: "eb5", H: "b4",
  I: "db5", J: "bb4", K: "gb4", L: "ab4", M: "gb5/2", N: "~@2 eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4 ~",
  O: "f4@2 gb4 f4@4 eb4", P: "f4@2 gb4 f4@5", Q: "eb4", R: "db4", S: "c4",
})).s("gm_pad_sweep").gain(0.46).pan(0.3)

// chords · pad new age · "New age pad"
const pad_new_age = note("<~@38 A ~ B ~ C D E F ~@32 A ~ B ~ C D E F ~@18 A ~ B ~ C D E F ~@18>".pickRestart({
  A: "[bb6,eb7]@2 ~@2 [bb6,eb7] ~ [ab6,db7] ~ [bb6,eb7] ~ [ab6,db7] ~ [gb6,b6]@2 ~@2", // Eb5 Db5 Eb5 Db5 B5
  B: "[ab6,db7]@2 ~@2 [ab6,db7] ~ [gb6,b6] ~ [ab6,db7] ~ [gb6,b6] ~ [f6,bb6]@2 ~@2", C: "db6 ~@7, gb6 ~@15",
  D: "[eb6,ab6] ~@7", E: "[f6,bb6] ~@5 [f6,bb6] ~", F: "[gb6,b6] ~@7",
})).s("gm_pad_new_age").gain(0.41).pan(0.3)

// other · vibraphone
const vibraphone = note("<~@32 A B C D E F ~@34 A B C D E F ~@52>".pickRestart({
  A: "eb3 f3 eb3 gb3 f3 ab3 gb3 bb3 ab3 b3 bb3 db4 b3 eb4 db4 eb4",
  B: "db4 eb4 db4 b3 db4 bb3 b3 ab3 bb3 gb3 ab3 f3 gb3 eb3 f3 eb3",
  C: "db3 eb3 db3 f3 eb3 gb3 f3 ab3 gb3 bb3 ab3 b3 bb3 db4 c4 db4",
  D: "b3 db4 b3 bb3 b3 ab3 bb3 gb3 ab3 f3 gb3 eb3 f3 db3 eb3 db3",
  E: "b2 db3 b2 eb3 db3 f3 eb3 gb3 f3 ab3 gb3 bb3 ab3 b3 bb3 b3",
  F: "bb3 b3 bb3 ab3 bb3 gb3 ab3 f3 gb3 eb3 f3 db3 eb3 b2 db3 b2",
})).s("gm_vibraphone").gain(0.36)

// other · piano · "Honky-tonk Piano"
const piano = note("<~@96 A B A B A B A C ~@18 A B A B A D ~@2>".pickRestart({
  A: "eb5 ~ eb5!2 gb5 ~ eb5 ~ bb5 ~ a5 ~ ab5 ~ gb5 ~", B: "eb5 ~ eb5!2 gb5 ~ eb5 ~ bb5 ~ a5 ~ ab5 ~@3",
  C: "eb5 ~ eb5!2 gb5 ~ eb5 ~ db6 ~ d6 ~ eb6 ~@3", D: "eb5 ~ eb5!2 gb5 ~ eb5 ~@9",
})).s("gm_piano").gain(0.51).pan(0.1)

// other · piano · "Honky-tonk Piano" · soft notes
const piano_soft = note(`<
  ~@127
  [~@8 bb5 ~ a5 ~ ab5 ~@3]
  [eb5 ~ eb5!2 gb5 ~ eb5 ~ bb5 ~ a5 ~ ab5 ~ gb5 ~]
  [eb5 ~ eb5!2 gb5 ~ eb5 ~ db6 ~ d6 ~ eb6 ~@3]
>`).s("gm_piano").gain(0.15).pan(0.1)

// bass · guitar harmonics
const bass = note(`<
  ~@8 A B C D A B C D A B C D A B C D A B C D A B C D A B C@2 E@2 F G H I G H I G J@2 A B C D A B C D A B C D A B C D A
  B C D A B C D A B C@2 E@2 F G H I G H I G J@2 ~@8 A B C D A B C D F G H I G H I G J@2 A B C D A B C D A B C D K L ~@2
>`.pickRestart({
  A: "eb2 ~ eb2!3 eb3 eb2 ~@3 eb2!2 eb3 ~ eb2 ~", B: "bb1 ~ bb1!3 bb2 bb1 ~@3 bb1!2 bb2 ~ bb1 ~",
  C: "db2 ~ db2!3 db3 db2 ~@3 db2!2 db3 ~ db2 ~", D: "ab1 ~ ab1!3 ab2 ab1 ~@3 ab1!2 ab2 ~ ab1 ~",
  E: "b1 ~ b1!3 b2 b1 ~@3 b1!2 b2 ~ b1 ~", F: "eb2 ~ eb2!3 eb3 eb2 ~ eb2 ~ eb2!2 eb3 ~ eb2 ~",
  G: "b1 ~ b1!3 b2 b1 ~ b1 ~ b1!2 b2 ~ b1 ~", H: "db2 ~ db2!3 db3 db2 ~ db2 ~ db2!2 db3 ~ db2 ~",
  I: "bb1 ~ bb1!3 bb2 bb1 ~ bb1 ~ bb1!2 bb2 ~ bb1 ~", J: "d2 ~ d2!3 d3 d2 ~ d2 ~ d2!2 d3 ~ d2 ~",
  K: "eb2 ~ eb2!3 eb3 eb2 ~@3 eb2!2 ~@2 eb2 ~", L: "bb1 ~ bb1 ~ bb1 ~ bb1 ~@9",
})).s("gm_guitar_harmonics").gain(0.36).pan(0.2)

// bass · guitar harmonics · soft notes
const bass_soft = note(`<
  ~@8 A B C D A B C D A B C D A B C D A B C D A B C D A B C E F@2 G H I J H I J H K L A B C D A B C D A B C D A B C D A
  B C D A B C D A B C E F@2 G H I J H I J H K L ~@8 A B C D A B C D G H I J H I J H K L A B C D A B C D A B C D M N O P
>`.pickRestart({
  A: "~@8 eb2 ~@4 eb3 ~@2", B: "~@8 bb1 ~@4 bb2 ~@2", C: "~@8 db2 ~@4 db3 ~@2", D: "~@8 ab1 ~@4 ab2 ~@2",
  E: "~@8 db2 ~@4 db3 ~ db2", F: "~@8 b1 ~@4 b2 ~ b1", G: "~@13 eb3 ~@2", H: "~@13 b2 ~@2", I: "~@13 db3 ~@2",
  J: "~@13 bb2 ~@2", K: "~@13 d3 ~@2", L: "~@13 d3 ~ d2", M: "~@8 eb2 ~@3 eb3!2 ~@2",
  N: "~@3 bb1 ~ bb2 ~@2 bb1 ~ bb1!2 bb2!2 bb1 ~", O: "db2 ~ db2!3 db3 db2 ~ db2 ~ db2!2 db3!2 db2 ~",
  P: "ab1 ~ ab1!3 ab2 ab1 ~@9",
})).s("gm_guitar_harmonics").gain(0.1).pan(0.2)

// chords · string ensemble 1 · "String Ensemble"
const string_ensemble_1 = note("<~@32 A B C@2 D@2 ~@34 A B C@2 D@2 ~@10 E@2 F@2 G@2 F@2 ~@34>".pickRestart({
  A: "[bb3,eb4,gb4,bb4]", B: "[bb3,db4,f4,ab4]", C: "[ab3,db4,f4,ab4]", D: "[gb3,b3,eb4,gb4]/2",
  E: "[bb3,eb4,gb4,bb4]/2", F: "[b3,eb4,gb4,bb4]/2", G: "[bb3,eb4,g4,bb4]",
})).s("gm_string_ensemble_1").gain(0.2)

// drums · kick
const kick = s("bd").struct("<~@12 [x!4]!76 ~@6 [x!4]!36>").gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@15 A B@7 C B@7 C B@5 D B@17 C B@7 C B@7 C B@5 D B@10 ~@7 E B@7 F B@13 C B@3 C B@7 C
>`.pickRestart({
  A: "~@12 x ~@2 x", B: "~ x ~ x", C: "~@4 x ~@7 x ~@2 x", D: "~@4 x ~@3 x ~ x ~ x!4", E: "x ~@3 x!4 ~ x!3 ~ x!2 ~",
  F: "~@4 x ~ x!2 ~ x!4 ~ x!2",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@20 A@4 ~@4 A@4 ~@28 A@4 ~@4 A@4 ~@58>".pickRestart({
  A: "~@6 x!2",
})).gain(0.5)

// drums · low tom
const low_tom = s("lt").struct("<~@3 [~@12 x!4] ~@126>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@8 [x!4]!40 ~@40 [x!16]!8 ~@34>").gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@8 x!4 ~@4] ~@126>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~ x ~ x ~ x ~ x]!40 ~@46 [~ x ~ x ~ x ~ x]!2 ~@34>").gain(0.5)

// drums · high tom
const high_tom = s("ht").struct("<~@3 [~@6 x!2 ~@8] ~@126>").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@48 [x!16]!40 ~@8 [x!16]!34>").gain(0.4)

// drums · splash
const splash = s("cr").struct("<~@12 A ~@3 A ~@7 A ~@13 A ~@17 A ~@7 A ~@13 A ~@17 A ~@7 A ~@17 A ~@7>".pickRestart({
  A: "x",
})).gain(0.5)

// drums · shaker
const shaker = s("sh").struct("<~@12 x ~@117>").gain(0.5)

stack(
  pad_warm, pad_poly, pad_sweep, pad_new_age, vibraphone, piano, piano_soft, bass, bass_soft, string_ensemble_1, kick,
  snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, tambourine, splash, shaker
)

More by Erasure