Strudelify
Bladerunner cover art

Bladerunner

Vangelis

KeyC minorTempo110 bpm
0:00/0:00
// Bladerunner — Vangelis
// 110 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 2 "SAW WAVE" lead 2 sawtooth (copy of ch 3 "FRETLESS" fretless bass)
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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.

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  A@6 B@10 C@2 D@2 E@4 B@8 C@2 D@2 E@4 B@10 C@2 D@2 E@4 B@10 C@2 D@2 E@4 B@10 C@2 D@2 E@4 B@15 F
>`.pickRestart({
  A: "[~@64 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2, ~ g2@7, ~@3 c3@17 ~@4]/6",
  B: "c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2", C: "g2!2 a2 bb2 g2!2 a2 bb2 g2!2 a2 bb2 g2!2 a2 bb2",
  D: "d2!2 e2 f2 d2!2 e2 f2 d2!2 e2 f2 d2!2 e2 f2", E: "f2!2 g2 ab2 f2!2 g2 ab2 f2!2 g2 ab2 f2!2 g2 ab2",
  F: "c2!2 d2 eb2 c2!2 d2 eb2 c2!2 d2 eb2 ~@4",
})).s("gm_fretless_bass").gain(0.35).pan(1)

// other · taiko drum · "TAIKO"
const taiko_drum = note("<~@7 A ~@3 A ~@15 A ~@14 A ~ A ~@15 A ~ A ~@15 A ~ A ~@15 A ~ A ~ A ~@9>".pickRestart({
  A: "f5 ~ f4 ~ f5 ~ f4 ~ f5 ~ f4@2 f5 ~ f4 ~",
})).s("gm_taiko_drum").gain(0.19)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note("<~@10 A@2 ~@82 B C D E F G H I J@8>".pickRestart({
  A: "[c2@31 ~]/2", B: "c4 g4", C: "d5 eb5", D: "g5 c6", E: "c6 g5", F: "c5 d5, c6", G: "eb5 g5", H: "c6 eb6",
  I: "d6!2", J: "c6/8",
})).s("gm_synth_brass_1").gain(0.2).pan(0.2)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@12 A@4 B@2 C@2 D@4 A@8 B@2 C@2 D@4 E@6 A@4 B@2 C@2 D@4 E@6 A@4 B@2 C@2 D@4 E@6 A@4 B@2 C@2 D@4 F@8 ~@8
>`.pickRestart({
  A: "[c4,eb4,g4]/4", B: "[bb3,d4,f4]/2", C: "[a3,d4,f4]/2", D: "[d4,f4,ab4]/2", E: "[c4,eb4,g4]/6", F: "[c4,eb4,g4]/8",
})).s("gm_synth_strings_2").gain(0.2).pan(0.3)

// other · pad metallic · "METAL PAD"
const pad_metallic = note("<~@40 A B ~@6 C ~@3 D E ~@5 C ~@16 A B ~@32>".pickRestart({
  A: "~@14 eb4!2", B: "eb4@3 ~@3 c4!3 c4@4 ~@3", C: "~@6 c4!3 ~@7", D: "~@6 f4!3 ~@7", E: "~@6 d4!3 ~@7",
})).s("gm_pad_metallic").gain(0.25)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@46 A B C@3 D E@3 F G@2 H@6 A B C@3 D E@3 F G@2 H@6 A B C@3 D E@3 F G@2 I@8 ~@8
>`.pickRestart({
  A: "c5", B: "bb4 ab4", C: "[g4@2 bb4]/3", D: "a4 g4", E: "[f4@2 ab4]/3", F: "g4 f4", G: "[c4@3 eb4]/2", H: "c4/6",
  I: "c4/8",
})).s("gm_string_ensemble_1").gain(0.25).pan(0)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@46 A B C@2 D E F@2 G H I@2 J@6 A B C@2 D E F@2 G H I@2 J@6 A B C@2 D E F@2 G H I@2 K@6 L M N@8
>`.pickRestart({
  A: "c4@15 ~", B: "bb3@7 ~ ab3@7 ~", C: "[g3@31 ~]/2", D: "bb3@15 ~", E: "a3@7 ~ g3@7 ~", F: "[f3@31 ~]/2",
  G: "ab3@15 ~", H: "g3@7 ~ f3@8", I: "[c3@23 ~ eb3@8]/2", J: "[c3@95 ~]/6",
  K: "[~ g4 d5 eb5 g5 c6@2 g5 c5 d5 eb5 g5, c3@95 ~]/6", L: "c6 eb6", M: "d6 g5", N: "c6/8",
})).s("gm_string_ensemble_2").gain(0.04).pan(1)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<~@66 A B C@2 D E F@2 G H I@2 J@4 A K L M N O P Q G R S T J@8 U@8>".pickRestart({
  A: "c4", B: "bb3 ab3", C: "g3/2", D: "f3", E: "a3 d4", F: "ab3/2", G: "ab3", H: "c4 eb4", I: "c4/2", J: "c3/4",
  K: "eb4", L: "g4 c4", M: "eb4 g4", N: "bb3", O: "d4 g4", P: "f3 a3", Q: "d4 f4", R: "g3 f3", S: "c3 c4", T: "ab3 eb3",
  U: "c3/8",
})).s("gm_lead_2_sawtooth").gain(0.04)

// other · lead 2 sawtooth · "SAW WAVE" · soft notes
const lead_2_sawtooth_soft = note("<~@42 A@4 ~@15 B@3 ~@14 A@4 ~@14 A@4 ~@10>".pickRestart({
  A: "[~@15 c6@42 ~@7]/4", B: "[c6@5 ~]/3",
})).s("gm_lead_2_sawtooth").gain(0.03)

// chords · orchestral harp · "HARP"
const orchestral_harp = note("<~@84 A@2 ~@2 B@2 ~@2 C@2 ~@4 C@2 ~@10>".pickRestart({
  A: "[~@13 [c3,db3,d3] ~@2, ~ [bb6,b6,c7] [d6,eb6,e6,f6] [gb5,g5,ab5,a5] [db5,bb6,b6,c7] [d6,eb6,e6,f6] [gb5,g5,ab5,a5] [bb4,b4,c5,db5] [d4,eb4,e4,f4] [g5,ab5,a5,bb5] [b4,c5,db5,d5] [eb4,e4,f4,gb4] [g3,ab3,a3,bb3] ~@3, ~@3 [gb6,g6,ab6,a6]@2 [bb5,b5,c6,db6]@2 [d5,eb5,e5,f5]@2 [gb6,g6,ab6,a6]@2 [bb5,b5,c6,db6]@2 [d5,eb5,e5,f5]@2 [gb4,g4,ab4,a4]@2 [c4,db4,b5,c6]@2 [eb5,e5,f5,gb5]@2 [g4,ab4,a4,bb4]@2 [b3,c4,db4,d4]@2 [eb3,e3,f3,gb3]@2 ~@5]/2",
  B: "[~@17 [f3,gb3]@2 ~@11 [b6,c7]@2, ~@2 [b6,c7]@2 [eb6,e6,f6,gb6]@2 [g5,ab5,a5,bb5]@2 [d5,eb6,e6,f6]@2 [g5,ab5,a5,bb5]@2 [b4,c5,db5,d5]@2 [eb4,e4,f4,gb4]@2 [g3,ab3,a3,bb3]@2 ~ gb3@2 [b3,c4,db4,d4]@2 [g4,ab4,a4,bb4]@2 [eb5,e5,f5,gb5]@2 [b5,c6,db6,d6]@2 [g6,ab6,a6,bb6]@2 ~, ~@3 [g6,ab6,a6,bb6]@2 [b5,c6,db6,d6]@2 [eb5,e5,f5,gb5]@2 [b5,c6,db6,d6]@2 [eb5,e5,f5,gb5]@2 [g4,ab4,a4,bb4]@2 [b3,c4,db4,d4]@2 ~@3 [g3,ab3,a3,bb3]@2 [eb4,e4,f4,gb4]@2 [b4,c5,db5,d5]@2 [g5,ab5,a5,bb5]@2 [eb6,e6,f6,gb6]@2 ~@2]/2", // Gbmaj7 Cmaj7
  C: "[~@17 [f3,gb3]@2 ~@13, ~ [b6,c7] [eb6,e6,f6,gb6] [g5,ab5,a5,bb5] [d5,eb6,e6,f6] [g5,ab5,a5,bb5] [b4,c5,db5,d5] [eb4,e4,f4,gb4] [g3,ab3,a3,bb3] ~@7, ~@3 [g6,ab6,a6,bb6]@2 [b5,c6,db6,d6]@2 [eb5,e5,f5,gb5]@2 [b5,c6,db6,d6]@2 [eb5,e5,f5,gb5]@2 [g4,ab4,a4,bb4]@2 [b3,c4,db4,d4]@2 ~@15]/2", // Gbmaj7 Cmaj7
})).s("gm_orchestral_harp").gain(0.13)

// other · tubular bells · "TUBULARBEL"
const tubular_bells = note("<A B C D E ~@92 F ~@3 F ~@3 F ~@3 F>".pickRestart({
  A: "~@11 bb6 ~ g6 b6 a6", B: "[f6,b6] ~@2 d6 [gb6,bb6] ~@2 [d6,g6]@2 a6 db6 f6@2 g6 ~ bb6, ~ g6 ~@5 e6",
  C: "e6 ~ f6 ~ eb6 g6 a6 d6 ~ [gb6,a6] f6 ~ b6 g6 a6 eb6", // Gbm
  D: "db6 ~ [f6,ab6] ~ g6 e6 ~@2 gb6@2 e6 ~ g6 ~ [e6,a6] [c6,g6], ~@4 d6@3 a6@2 ~@7", // Fm A5 C5
  E: "f6 bb6 ~@2 g6 eb6 gb6 ~ a6 f6 ~ bb6 ~ gb6 ~ ab6", F: "c4 ~",
})).s("gm_tubular_bells").gain(0.03)

// drums · kick
const kick = s("bd").struct("<~@82 A ~@3 A ~ A ~@3 A ~ A ~@3 A ~@11>".pickRestart({
  A: "~@15 x",
})).gain(0.25)

// drums · snare
const snare = s("sd").struct("<~@30 A@2 ~@2 A@2 ~@3 A ~@26 A@2 ~@2 A@2 ~@2 A@2 ~@6 A@20 B A B A B A B A>".pickRestart({
  A: "~@2 x ~@2 x ~@2", B: "~@4 x ~@5 x ~@4 x",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<~@83 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A>".pickRestart({
  A: "x",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@30 [x ~@14 x] x ~@2 [x ~@14 x] x ~@74>").gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@31 A B ~@2 A B ~@38 C B ~@5 B@28>".pickRestart({
  A: "~@7 x", B: "x", C: "~@15 x",
})).gain(0.2)

// drums · ride
const ride = s("rd").struct("<~@30 x!2 ~@2 x!2 ~@74>").gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@4 [x!16]!105 [x!12 ~@4]>").gain(0.15)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@6 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 B 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 B 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 B 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 C
>`.pickRestart({
  A: "x!4 ~@2 x!6 ~@2 x!2", B: "x!14 ~@2", C: "x!12 ~@4",
})).gain(0.25)

stack(
  bass, taiko_drum, synth_brass_1, synth_strings_2, pad_metallic, string_ensemble_1, string_ensemble_2, lead_2_sawtooth,
  lead_2_sawtooth_soft, orchestral_harp, tubular_bells, kick, snare, low_tom, mid_tom, crash, ride, tambourine, shaker
)

More by Vangelis