Strudelify
Vulnerable cover art

Vulnerable

Roxette

KeyA♭ majorTempo67 bpm
0:00/0:00
// Vulnerable — Roxette
// 67 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 9, 4/4 at bar 10, 2/4 at bar 29, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 7 "Guitar 1" named as a guitar, played on electric guitar clean (its pad metallic patch is not one)
// note: Full arrangement: all 84 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(67/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 · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  A B C D ~@8 E ~ F G ~@15 H I ~ J K L M N@2 ~ O@2 ~@8 P Q R S@2 ~ T Q R S@2 ~ U@2 V W V W V W V W V W V W V X@2 Y Z
  AA@2
>`.pickRestart({
  A: "gb4@2 db4@2 f4@2 db4 gb4@3 ab4@2 db4@4", B: "gb4@2 db4@2 f4@2 db4 gb4@3 db5@2 ab4@4",
  C: "gb5@2 db5@2 f5@2 gb5 gb5@3 ab5@2 db5@4", D: "gb5@2 db6@2 f5@2 gb5 gb5@3 db6@2 ab5@4", E: "db5 b4 a4 ab4 gb4@4",
  F: "~@4 db5 ab5 [db5,db6] [gb4,gb5]", G: "[f4,f5] ~", H: "~@4 db5 b4 a4 ab4", I: "gb4 ~",
  J: "db5 ab5 [db5,db6] [gb4,gb5] [f4,f5]@4", K: "[gb4,gb5]@2 [db4,db5] [ab4,ab5]",
  L: "[gb4,gb5]@4 [db4,db5] [ab3,ab4] [b3,b4] [bb3,bb4]", M: "[gb3,gb4]@2 [db4,db5] [ab4,ab5]",
  N: "[[gb4,gb5]@4 [ab4,ab5] [db4,db5] [b4,b5] [bb4,bb5]@4 ~@5]/2", // Gb Ab Db B Bb
  O: "[[gb4,gb5]@4 [ab4,ab5] [gb4,gb5] [b4,b5] [bb4,bb5]@3 [gb4,gb5] [db4,db5]@5]/2", // Gb Ab Gb B Bb Gb Db
  P: "[ab4,ab5]@2 [eb4,eb5] [bb4,bb5]", Q: "[ab4,ab5]@4 [eb4,eb5] [bb3,bb4] [db4,db5] [c4,c5]",
  R: "[ab3,ab4]@2 [eb4,eb5] [bb4,bb5]", S: "[[ab4,ab5]@4 [bb4,bb5] [eb4,eb5] [db5,db6] [c5,c6]@4 ~@5]/2",
  T: "~@2 [eb4,eb5] [bb4,bb5]", U: "[[ab4,ab5]@4 [bb4,bb5] [ab4,ab5] [db5,db6] [c5,c6]@3 [ab4,ab5] [eb4,eb5]@5]/2",
  V: "ab5@2 eb6@2 g5@2 ab5 ab5@3 bb5@2 eb5@4", W: "ab5@2 eb6@2 g5@2 ab5 ab5@3 eb6@2 bb5@4",
  X: "[ab5@2 eb6@2 g5@2 ab5 ab5@3 eb6@2 ~@4 eb5@16, ~@3 bb5@5]/2",
  Y: "[bb4,eb5]@4 [eb5,bb5,c6]@6 ~@4 [g4,g5] [bb4,bb5]", // Eb5 Cm7 G Bb
  Z: "[g4,g5] [ab4,ab5] [bb4,bb5]@2 [g4,g5] [ab4,ab5] [bb4,bb5] [f5,f6] [eb5,eb6] [f5,f6] [ab5,ab6] [f5,f6] [eb5,eb6] [f5,f6] [ab5,ab6] [c6,c7]", // G Ab Bb G Ab Bb F Eb …
  AA: "[[bb5,bb6] [c6,c7] [bb5,bb6] [c6,c7] [bb5,bb6] [db6,db7] [eb4,eb6,eb7]@14 ~@12]/2", // Bb C Bb C Bb Db Eb
})).s("gm_string_ensemble_1").gain(0.64)

// other · string ensemble 2 · "Strings/D"
const string_ensemble_2 = note(`<
  A B A B ~@5 C D@4 E@2 ~@13 F G H I F J ~@30 K L K L K L K L K L K L K M N O P@3
>`.pickRestart({
  A: "gb3 f3", B: "eb3 db3", C: "~ ab4", D: "[a4 ab4@2 gb4@2 e4@3 eb4@16 db4@16 gb4@16 ab4@8]/4",
  E: "[a4 ab4@2 gb4@2 e4@3 f4@16 ~@8]/2", F: "ab4@8 a4 ab4@2 gb4@2 e4@3", G: "eb4", H: "db4", I: "gb4", J: "f4",
  K: "ab3 g3", L: "db3 eb3", M: "db3 eb3, ab3 ~@3", N: "~@2 g3 ~@2 bb3 [eb3,ab4]@2, ab2 g2, ~@3 ab3@2 ~@3",
  O: "ab3@2 eb4@2 g3@2 ~@4 eb4@2 ~@2 g5 bb5, f2 [eb2,ab4], eb5 g4 ~@2, ~@3 ab3@2 ~ bb3@2", // Ab5
  P: "[g5 ab5 bb5@2 g5 ab5 bb5 f6 eb6 f6 ab6 f6 eb6 f6 ab6 c7 bb6 c7 bb6 c7 bb6 db7 eb7@14 ~@12, [ab2,ab3] [eb3,eb4] [g2,g3] [ab2,ab3]@6 ~@3]/3", // Ab Eb G Ab
})).s("gm_string_ensemble_2").gain(0.64)

// bass · electric bass finger · "Fingered Bass"
const bass = note(`<
  ~@2 A B ~@11 C D E D E D E F G H I J K L M N O P M Q A R A R A R S T U V U Q U V U W X Y X Y X Y X Y X Y X Y Z AA X Y
  X Y X Y X Y X Y X Y X Y ~@5
>`.pickRestart({
  A: "gb2@6 ~ gb2 f2 ~ f2@6", B: "eb2@6 ~ eb2 db2 ~ db2@6", C: "~@8 gb2@6 ~ gb2", D: "f2 ~ f2@6 b1@6 ~ b1",
  E: "db2 ~ db2@6 gb2@6 ~ gb2", F: "b2 ~ b2@6 gb2@6 ~ gb2", G: "db2 ~ db2@6 e2@6 ~ e2", H: "e2 ~ e2@6 eb2@6 ~ eb2",
  I: "eb2 ~ eb2@6 a1@6 ~ a1", J: "a1 ~ a1@6 gb2@6 ~ gb2", K: "gb2 ~ gb2@6 e2@6 ~ e2", L: "e2 ~ e2@6 b1@6 ~ b1",
  M: "e2@6 ~ e2!2 ~ e2@6", N: "eb2@6 ~ eb2!2 ~ eb2@6", O: "a1@6 ~ a1!2 ~ a1@6", P: "gb2@6 ~ gb2!2 ~ gb2@6",
  Q: "db2@6 ~ db2!2 ~ db2@6", R: "b1@6 ~ b1 db2 ~ db2@6", S: "gb2@6 ~ gb2 b2 ~ b2@6", T: "gb2@6 ~ gb2 db2 ~ db2@6",
  U: "eb2@6 ~ ab1!2 ~ ab1@6", V: "db2@6 ~ gb1!2 ~ gb1@6", W: "db2@6 ~ eb2!2 ~ eb2@6", X: "ab2@6 ~ ab2 g2 ~ g2@6",
  Y: "db2@6 ~ db2 eb2 ~ eb2@6", Z: "ab2@6 ~ ab2 db3 ~ db3@6", AA: "ab2@6 ~ ab2 eb2 ~ eb2@6",
})).s("gm_electric_bass_finger").gain(0.56)

// chords · synth strings 2 · "Chords"
const synth_strings_2 = note(`<
  A B A B C D E F C G@7 H I H I J I K L@6 C D E F C M N B N B O B P Q ~@8 R S R S T S R S R S T S U V R S R S R S R S R
  S R S R S ~@5
>`.pickRestart({
  A: "[bb3,db4,gb4] [bb3,db4,f4]", B: "[b3,eb4,gb4] [db4,f4,ab4]", C: "[e4,ab4,b4]", D: "[eb4,ab4,b4]",
  E: "[a3,db4,e4]", F: "[gb4,a4,db5]",
  G: "[[b3,eb4,gb4] [e4,ab4,b4]@2 [eb4,ab4,b4]@2 [a3,db4,e4]@2 [gb4,a4,db5]@2 [e4,ab4,b4]@2 [db4,f4,ab4]@2 [db4,gb4,bb4]]/7", // B E Abm A Gbm E Db Gb
  H: "[bb3,db4,gb4,bb4] [b3,eb4,gb4]", I: "[db4,f4,ab4] [db4,gb4,bb4]", J: "[bb3,db4,gb4] [b3,eb4,gb4]",
  K: "[b3,eb4,gb4,b4] [db4,gb4,bb4]", // B Gb
  L: "[[db4,f4,ab4] [e4,ab4,b4]@2 [eb4,ab4,b4]@2 [a3,db4,e4]@2 [gb4,a4,db5]@2 [e4,ab4,b4]@2 [b3,eb4,gb4]]/6", // Db E Abm A Gbm E B
  M: "[db4,f4,ab4]", N: "[db4,gb4,bb4] [bb3,db4,gb4,bb4]", O: "[db4,gb4,bb4] [bb3,db4,gb4]",
  P: "[db4,gb4,bb4] [b3,eb4,gb4,b4]", Q: "[db4,gb4,bb4] [db4,f4,ab4]", R: "[eb4,ab4,c5] [c4,eb4,ab4,c5]",
  S: "[db4,f4,ab4] [eb4,g4,bb4]", T: "[eb4,ab4,c5] [c4,eb4,ab4]", U: "[eb4,ab4,c5] [db4,f4,ab4,db5]",
  V: "[eb4,ab4,c5] [eb4,g4,bb4]", // Ab Eb
})).s("gm_synth_strings_2").gain(0.4)

// chords · electric guitar clean · "Guitar 1"
const electric_guitar_clean = note(`<
  ~@15 A B C B C B C D E ~@11 F G F G F G H I J K J L J M J N O P O P O P O P O P O P Q R O P O P O P O P O P O P O P
  ~@5
>`.pickRestart({
  A: "~@8 [db4,gb4,bb4,db5]@4 [db4,gb4,bb4,db5]@2 db4 gb4", // Gb
  B: "[bb3,db4,gb4]@4 [db4,gb4,ab4,db5]@4 [b3,eb4,gb4,b4]@4 [db4,gb4,b4,db5]@2 b3 gb4", // Gb Dbsus4 B Gbsus4
  C: "f4@2 f4@2 db4@2 db4@2 [db4,gb4,bb4,db5]@4 [db4,gb4,bb4,db5]@2 db4 gb4, [db4,ab4] [gb4,ab4,db5] ~@2", // Gb Db5 Gbsus2
  D: "[b3,eb4,gb4,b4]@4 [db4,gb4,b4,db5]@2 b3 gb4 [db4,gb4,bb4,db5]@4 [db4,gb4,bb4,db5]@2 db4 gb4", // B Gbsus4 Gb
  E: "f4!2 db4!2 ~@4, [db4,ab4] [gb4,ab4,db5] ~@2", // Db5 Gbsus2
  F: "[db4,gb4,bb4,db5]@4 [db4,gb4,bb4,db5]@2 db4 gb4 [bb3,db4,gb4]@4 [db4,gb4,ab4,db5]@4", // Gb Dbsus4
  G: "[b3,eb4,gb4,b4]@4 [db4,gb4,b4,db5]@2 b3 gb4 f4@2 f4@2 db4@2 db4@2, ~@2 [db4,ab4] [gb4,ab4,db5]", // B Gbsus4 Db5 Gbsus2
  H: "[db4,gb4,bb4,db5]@4 [db4,gb4,bb4,db5]@2 db4 gb4 [b3,eb4,gb4,b4]@4 [db4,gb4,b4,db5]@2 b3 gb4", // Gb B Gbsus4
  I: "[db4,gb4,bb4,db5]@4 [db4,gb4,bb4,db5]@2 db4 gb4 f4@2 f4@2 db4@2 db4@2, ~@2 [db4,ab4] [gb4,ab4,db5]", // Gb Db5 Gbsus2
  J: "[eb3,gb3,bb3]@3 [ab3,c4,eb4]@5", K: "[db3,f3,ab3]@3 [db3,gb3,bb3,db4]@5", L: "[db3,f3,ab3]",
  M: "[db3,f3,ab3]@3 [gb3,bb3,db4]@5", N: "[db3,f3,ab3]@3 [eb3,g3,bb3]@5",
  O: "[eb4,ab4,c5,eb5]@4 [eb4,ab4,c5,eb5]@2 eb4 ab4 [c4,eb4,ab4]@4 [eb4,ab4,bb4,eb5]@4", // Ab Ebsus4
  P: "[db4,f4,ab4,db5]@4 [eb4,ab4,db5,eb5]@2 db4 ab4 g4@2 g4@2 eb4@2 eb4@2, ~@2 [eb4,bb4] [ab4,bb4,eb5]", // Db Dbsus2 Eb5 Absus2
  Q: "[eb4,ab4,c5,eb5]@4 [eb4,ab4,c5,eb5]@2 eb4 ab4 [db4,f4,ab4,db5]@4 [eb4,ab4,db5,eb5]@2 db4 ab4", // Ab Db Dbsus2
  R: "[eb4,ab4,c5,eb5]@4 [eb4,ab4,c5,eb5]@2 eb4 ab4 g4@2 g4@2 eb4@2 eb4@2, ~@2 [eb4,bb4] [ab4,bb4,eb5]", // Ab Eb5 Absus2
})).s("gm_electric_guitar_clean").gain(0.4)

// other · pizzicato strings · "StrPizz"
const pizzicato_strings = note("<~@9 A B C D A ~@15 E F G H E ~@50>".pickRestart({
  A: "~@4 e4 b4 ab4 b4", B: "~@4 ab4 b4 ab4 b4", C: "~@4 a3 e4 db4 e4", D: "~@4 gb4 a4 db5 a4", E: "e4 b4 ab4 b4 ~@4",
  F: "ab4 b4 ab4 b4 ~@4", G: "a3 e4 db4 e4 ~@4", H: "gb4 a4 db5 a4 ~@4",
})).s("gm_pizzicato_strings").gain(0.4)

// chords · synth strings 1 · "StrSyn2"
const synth_strings_1 = note("<~@43 A B A C A D A E ~@31 F@2>".pickRestart({
  A: "[eb3,gb3,bb3]@3 [ab3,c4,eb4]@5", B: "[db3,f3,ab3]@3 [db3,gb3,bb3,db4]@5", C: "[db3,f3,ab3]",
  D: "[db3,f3,ab3]@3 [gb3,bb3,db4]@5", E: "[db3,f3,ab3]@3 [eb3,g3,bb3]@5", F: "[~@8 bb2 eb3 ab3 bb3@9 ~@12]/2",
})).s("gm_synth_strings_1").gain(0.48)

// other · whistle
const whistle = note("<~@74 A@4 B@2 ~@4>".pickRestart({
  A: "[~@8 g6!3 ab6@2 bb6@2 f6@2 eb6@2 ~@13]/2", B: "[~@8 g6!3 ab6@2 bb6@2 eb7@2 ~@15]/2",
})).s("gm_whistle").gain(0.48)

// drums · kick
const kick = s("bd").struct(`<
  A B A B ~@11 C D E D E D E D E D E D E D B A B A B F A B A B A B A B A B A B A B A G A B A B A H A B A B A B A B A B A
  B A B A B A B A B A B ~@5
>`.pickRestart({
  A: "x ~@6 x ~@2 x ~@2 x ~@2", B: "x ~@6 x ~@5 x ~@2", C: "~ x!2 ~@2 x!2 ~ x ~@6 x", D: "~@2 x ~@2 x ~@2 x ~@6 x",
  E: "~@5 x ~@2 x ~@6 x", F: "x ~@6 x ~ x!2 ~@2 x!2 ~", G: "x ~@6 x ~@5 x!2 ~", H: "x ~@6 x ~ x!2 ~@3 x ~",
})).gain(0.56)

// drums · rim
const rim = s("rim").struct("<~@15 A ~@7 B ~@10 C ~@15 D ~@5 E ~@27>".pickRestart({
  A: "x", B: "~@6 x!2 ~@8", C: "~@3 x!2 ~@3", D: "~@3 x", E: "~@8 x ~@2 x!2 ~@3",
})).gain(0.56)

// drums · clap
const clap = s("cp").struct("<A@4 ~@11 B A@18 C A@15 C A@5 C A@22 ~@5>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.56)

// drums · snare
const snare = s("sd").struct("<A@4 ~@11 B A@18 C A@15 C A@5 C A@22 ~@5>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@15 [~ x ~@2] ~@18 [~@3 x] ~@49>").gain(0.56)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@4 A@5 B C@5 D ~@7 E C@4 F A@6 ~@49>".pickRestart({
  A: "~@4 x ~@4 x ~@2 x!2 ~@2", B: "x ~@3 x ~@2 x ~@4 x ~@3", C: "~ x ~@2 x!2 ~@6 x ~@3", D: "~ x ~@2 x!2 ~@10",
  E: "~@3 x", F: "~ x ~@2 x!2 ~@2 x ~@3 x ~@2 x",
})).gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 [~@3 x ~@12] ~@18 [~@11 x ~@4] ~@49>").gain(0.56)

// drums · ride bell
const ride_bell = s("rd").struct("<~@28 [~@5 x ~@2] ~@55>").gain(0.8)

// drums · tambourine
const tambourine = s("tb").struct("<~@10 [~ x ~@2]!6 ~@13 [~@3 x]!6 ~@49>").gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@12 B ~@3 B ~@3 B ~@5 A ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~@3 A ~@3 A ~ A ~ A ~@5 A ~ A ~@6
>`.pickRestart({
  A: "x", B: "~ x",
})).gain(0.64)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[~@11 x ~@3 x]!9 ~ [~@3 x ~@3 x ~@8]!19 [~@11 x ~@3 x]!50 ~@5>").gain(2.03)

// drums · shaker
const shaker = s("sh").struct(`<
  [~@3 x ~@2 x ~ x ~ x ~@3 x ~]!9
  [~@3 x ~@2 x ~@4 x ~@2 x ~]
  [x ~ x ~@3 x ~@4 x ~@2 x ~]!19
  [~@3 x ~@2 x ~ x ~ x ~@3 x ~]!50
  ~@5
>`).gain(0.4)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<[~ x!2 ~@13]!9 [~ x!2 ~@6 x!2 ~@5] [~@9 x!2 ~@5]!19 [~ x!2 ~@13]!50 ~@5>")
  .gain(0.24)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  [x ~ x ~@2 x ~ x ~@8]!9
  [~@2 x ~@2 x!2 ~ x ~ x ~@2 x ~ x]
  [~@8 x ~ x ~@2 x ~ x]!18
  [~@10 x ~@2 x!2 ~]
  [x ~ x ~@2 x ~ x ~@8]!50
  ~@5
>`).gain(3.48)

stack(
  string_ensemble_1, string_ensemble_2, bass, synth_strings_2, electric_guitar_clean, pizzicato_strings,
  synth_strings_1, whistle, kick, rim, clap, snare, low_tom, pedal_hat, mid_tom, ride_bell, tambourine, crash, cabasa,
  shaker, shaker_soft, triangle
)

More by Roxette