Strudelify
KeyE majorTempo76 bpm
0:00/0:00
// Angels — Robbie Williams
// 76 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 74 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(76/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 · piano
const piano = note("<A@8 B@2 C@8 D@8 E@2 F G@8 H I@8 J@4 E@2 K@8 D@8 L@2 M@4>".pickRestart({
  A: "[~@12 g#3@2 f#3 a3 ~@28 g#3@2 f#3 a3 ~@60 g#3@2 f#3 a3 ~@14 e3@2, [e1,e2] [e1,e2] [e1,e2] [e1,e2] [a1,a2] [b1,b2] [e1,e2] [e1,e2], [g#3,b3,e4]!3 [b3,e4] [g#3,b3,e4]!4 [g#3,b3,e4]!3 [b3,e4] [g#3,b3,e4]!4 [a3,c#4,e4]!3 [g#3,c#4,e4] [b3,d#4,f#4]!4 [g#3,b3,e4]!3 [b3,e4] [g#3,b3,e4]!4, ~ e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 f#3@2 f#3@2 f#3@2 f#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~]/8", // E A B E E5 E E5 E …
  B: "[~@15 f#3, [a1,a2] [b1,b2], [a3,c#4,e4]!3 [g#3,c#4,e4] [b3,d#4,f#4]!4, ~ e3@2 e3@2 e3@2 e3@2 f#3@2 f#3@2 f#3@2 ~]/2", // A B A C#m B
  C: "[~@32 d3 ~@7 c#3 ~@14 e3 [d2,d3,f#3,a3,d4]@4 [c#2,c#3,e3,a3,c#4]@4, [f#1,f#2] [a1,a2] [c#2,c#3] [a1,a2] d2 c#2 e1@2, [f#3,a3,c#4]!4 [a3,c#4,e4]!4 [g#3,c#4,e4]!4 [a3,c#4,e4]!4 [f#3,a3,d4]!4 [e3,a3,c#4]!4 e2@4 ~@4, ~ e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 d3@2 d3@2 d3@2 d3@2 c#3@2 c#3@2 c#3@2 c#3@2 e3@2 e3@2 e3@2 ~@9, ~@24 [g#3,b3,e4]!4 ~@4]/8", // D A F# A C# A F#m A …
  D: "[~@63 e3, [e1,e2] [b1,b2] [c#2,c#3] [a1,a2] [e1,e2] [b1,b2] [c#2,c#3] [a1,a2], [g#3,b3,e4]!4 [f#3,b3,d#4]!4 [g#3,c#4,e4]!4 [a3,c#4,e4]!4 [g#3,b3,e4]!4 [f#3,b3,d#4]!4 [g#3,c#4,e4]!4 [a3,c#4,e4]!4, ~ e3@2 e3@2 e3@2 e3@2 d#3@2 d#3@2 d#3@2 d#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 d#3@2 d#3@2 d#3@2 d#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~]/8", // E B C# A E B C# A …
  E: "[e3!7 ~@5 [a4,c#5] [g#4,b4] [f#4,a4] [e4,g#4], [g#1,g#2] [f#1,f#2], [g#3,b3]!4 [f#3,a3,c#4] f#3@3, ~@7 e3@2 c#3@2 c#3@5, ~@5 [a3,c#4] ~@2]/2", // A G#m F#m E G# F# G#m F#m …
  F: "[d2,d3,f#3,a3,d4] [c#2,c#3,e3,a3,c#4,e4]", // D A
  G: "[[e1,e2,g#3,b3,e4]@16 ~@12 g#3@2 f#3 a3 ~@60 g#3@2 f#3 a3 ~@30 e3@2, e3@9 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 f#3@2 f#3@2 f#3@2 f#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~, ~ [e1,e2] [e1,e2] [a1,a2] [b1,b2] [e1,e2] [e1,e2] [a1,a2], ~@4 [g#3,b3,e4]!3 [b3,e4] [g#3,b3,e4]!4 [a3,c#4,e4]!3 [g#3,c#4,e4] [b3,d#4,f#4]!4 [g#3,b3,e4]!3 [b3,e4] [g#3,b3,e4]!4 [a3,c#4,e4]!3 [g#3,c#4,e4]]/8", // E A B E A E E5 E …
  H: "~@7 f#3, [b1,b2], [b3,d#4,f#4]!4, ~ f#3@2 f#3@2 f#3@2 ~", // B
  I: "[d3 ~@7 c#3 ~@54 e3, d2 c#2 e1@2 [e1,e2] ~@3, [f#3,a3,d4]!4 [e3,a3,c#4]!4 e2@4 [d2,d4]@2 [c#2,c#4]@2 ~@4 [b1,b2]@4 [c#2,c#3]@4 [a1,a2]@4, ~ d3@2 d3@2 d3@2 d3@2 c#3@2 c#3@2 c#3@2 c#3@2 e3@2 e3@2 e3@2 e3@2 d3@2 d3@2 c#3@2 c#3@2 e3@2 e3@2 e3@2 e3@2 d#3@2 d#3@2 d#3@2 d#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~, ~@8 [g#3,b3,e4]!4 [f#3,a3]!2 [e3,a3]!2 [g#3,b3,e4]!4 [f#3,b3,d#4]!4 [g#3,c#4,e4]!4 [a3,c#4,e4]!4]/8", // E D A D C# B C# A …
  J: "[~@31 e3, [e1,e2] [b1,b2] [c#2,c#3] [a1,a2], [g#3,b3,e4]!4 [f#3,b3,d#4]!4 [g#3,c#4,e4]!4 [a3,c#4,e4]!4, ~ e3@2 e3@2 e3@2 e3@2 d#3@2 d#3@2 d#3@2 d#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 ~]/4", // E B C# A E B C#m A
  K: "[[d2,d3,f#3,a3,d4]@4 [c#2,c#3,a3,c#4,e4]@4 ~@55 c#3, ~@4 e3@5 e3@2 e3@2 e3@2 e3@2 d3@2 d3@2 d3@2 d3@2 c#3@2 c#3@2 c#3@2 c#3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 e3@2 d3@2 d3@2 d3@2 d3@2 c#3@2 c#3@2 c#3@2 ~, ~ [e1,e2] [b1,b2] [a1,a2] [e1,e2] [e1,e2] [b1,b2] [f#1,f#2], ~@4 [g#3,b3,e4]!4 [f#3,b3,d4]!4 [e3,a3,c#4]!4 [g#3,b3,e4]!4 [g#3,b3,e4]!4 [f#3,b3,d4]!4 [f#3,a3,c#4]!4]/8", // D A E B A E B F# …
  L: "[e3!7 ~@5 a4 g#4 ~ e4, [g#1,g#2] [f#1,f#2], [g#3,b3]!4 [f#3,a3,c#4] f#3@3, ~@7 e3@2 c#3@2 c#3@5, ~@5 [a3,c#4] f#4!2]/2", // G# F# G#m F#m A
  M: "[[d2,d3,f#3,a3,d4,f#4]@9 [c#2,c#3,e3,a3,c#4,e4]@9 ~ [e1,e2,e3,g#3,b3,e4]@30 ~@15]/4", // D A E
})).s("gm_piano").gain(0.51)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@19 A B C D A B C E F G H I@2 C J I@2 C A K L I M I A B C D A B C E F G I A C I@2 A N O A B C D A B C E F P@3 ~
>`.pickRestart({
  A: "b1@4 b1@3 f#1 b1@2 b1@6", B: "c#2@4 c#2@3 g#1 c#2@2 c#2@6", C: "a1@4 a1@3 e1 a1@2 a1@6",
  D: "e2@4 e2@3 b1 e2@2 e2@6", E: "g#1@4 g#1@3 d#1 g#1@2 g#1@6", F: "f#1 f#1@3", G: "d2 c#2", H: "e1",
  I: "e1@4 e1@3 b1 e1@2 e1@6", J: "b1@4 b1@3 b1 f#1@2 b1@6", K: "d1@4 d1@3 a1 d1@2 d1@6",
  L: "c#2@4 c#2@3 a1 c#2@2 c#2@6", M: "d1 c#2", N: "f#1@4 f#1@3 c#2 f#1@2 f#1@6", O: "g#1@4 g#1@3 e1 g#1@2 g#1@6",
  P: "[d2@9 c#2@9 ~ e1@24 ~@5]/3",
})).s("gm_electric_bass_finger").gain(0.51)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@2 A@2 B C A@2 D E F G H@2 I@2 J K L M N O@2 M N P@2 Q R S A@2 B C A@2 D E I@2 J K L M N O@2 M N P@2 Q R L T U V@2
  W@2 X Y Z AA@2 Y Z AB@2 AC AD@3 ~
>`.pickRestart({
  A: "[e2,g#3]/2", B: "a3@7 g#3, a2", C: "[b2,f#3]", D: "a3@7 g#3, [a2,c#4]", E: "[b2,f#3,b3]", F: "[f#2,e3,a3,c#4]",
  G: "[a2,a3,c#4,e4]", H: "[[c#3,g#3] [a2,a3], [c#4,e4]]/2", I: "[[d2,f#3,d4] [c#2,e3,c#4], a3]/2", J: "[e2,g#3,b3,e4]",
  K: "d2 c#2, a3", L: "[e2,g#3]", M: "[b2,f#3,b3,d#4]", N: "[c#2,g#3,c#4,e4]", O: "[[a2,a3,c#4] [e2,g#3,b3], e4]/2",
  P: "[[a2,a3,c#4] [g#2,g#3,b3], e4]/2", Q: "[f#2,c#4]@4 ~ b3 ~ g#3, f#4, a3@3 a3, ~ c#4",
  R: "[f#3,a3,d4] [c#2,a3,c#4,e4]", S: "e2", T: "[b3,d4,f#4,b4]", U: "[a2,c#4,e4,a4]",
  V: "[[g#3,b3,e4]@15 ~ [d4,d5,d6]@2 [e4,e5,e6]@4 [f#4,f#5,f#6]@4 [g#4,g#5,g#6]@6, e3]/2", // E D E F# G#
  W: "[[b3,a4] [a2,c#4], [a5,a6]]/2", X: "[e3,g#3,b3,e4]", Y: "[b2,f#3,b3,d#5]", Z: "[c#2,g#3,c#4,e5]",
  AA: "[[a2,a3,c#4] [e2,g#3,b3], e5]/2", AB: "[[a2,a3,c#4] [g#2,g#3,b3], e5]/2", AC: "[f#2,a3,c#4,f#5]",
  AD: "[[d2,f#3,a3,d5]@9 [c#2,a3,c#4,e5]@9 ~ e2@24 ~@5]/3", // D A
})).s("gm_string_ensemble_1").gain(0.36)

// chords · acoustic guitar steel · "Acoustic Guitar"
const acoustic_guitar_steel = note("<~@28 A B@8 ~@15 C@8 ~ D E F G D E F G H@5>".pickRestart({
  A: "~ [a3,d4,f#4]@7 ~ [a3,c#4,e4]@7, [f#2,a2,d3] [e2,a2,e3]", B: "[e2,g#2,e3,g#3,b3,e4]/8",
  C: "[~ [a3,d4,f#4]@7 ~ [a3,c#4,e4]@119, [f#2,a2,d3] [e2,a2,e3]@15]/8", D: "[f#2,b2,d#3,b3,d#4,f#4]!2",
  E: "[e2,c#3,e3,g#3,c#4,e4]!2", F: "[e2,a2,e3,a3,c#4,e4]!2", G: "[e2,g#2,e3,g#3,b3,e4]!2",
  H: "[[f#2,a2,f#3,a3,c#4,f#4]@8 [f#2,a2,f#3,a3,f#4]@8 ~ d4@8 ~@13 [b3,e4]@30 ~@12, ~@4 c#4@9 [e3,a3]@5 e3@15 ~@7, ~@16 [d3,a3]@9 a2@9 ~ [e2,b2]@30 ~@15, ~@17 f#4@21 ~@42, ~@27 [c#4,e4]@10 g#3@30 ~@13]/5", // F#m E5 A5 D5 E5 C#m
})).s("gm_acoustic_guitar_steel").gain(0.51)

// drums · kick
const kick = s("bd").struct(`<
  ~@19 A B A B A B A B C ~@2 A B A B A B A B A B A B A@2 B A B A B A B C ~ A@2 B A B A B A@2 B A B A B A B C ~@4
>`.pickRestart({
  A: "x ~@6 x!2 ~@7", B: "x ~@6 x!2 ~ x ~@5", C: "x",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct("<~@18 A B@8 C ~@2 B@21 C ~ B@16 C ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.36)

// drums · low tom
const low_tom = s("lt").struct("<~@18 A ~@3 A ~@19 A ~@3 A ~@6 A ~@6 A ~@3 A ~@9>".pickRestart({
  A: "~@15 x",
})).gain(0.36)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@19 A B A B A B A B C ~@2 A B A B A B A B A B A B A@2 B A B A B A B C ~ A@2 B A B A B A@2 B A B A B A B C ~@4
>`.pickRestart({
  A: "x ~ x ~@4 x!2 ~ x ~@3 x ~", B: "x ~ x ~@3 x!3 ~ x ~@3 x ~", C: "x!2 ~@6",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@18 A ~@3 A ~@19 A ~@3 A ~@6 A ~@6 A ~@3 A ~@9>".pickRestart({
  A: "~@7 x",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<~@19 A@8 B ~@2 A@21 B ~ A@16 B ~@4>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.36)

// drums · high tom
const high_tom = s("ht").struct("<~@18 A ~@3 A ~@19 A ~@3 A ~@6 A ~@6 A ~@3 A ~@9>".pickRestart({
  A: "~@13 x ~@2",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct("<~@28 A B ~@22 A ~@17 C D ~@2>".pickRestart({
  A: "x!2", B: "x", C: "x ~@8 x ~@6", D: "~@3 x ~@12",
})).gain(0.36)

stack(
  piano, bass, string_ensemble_1, acoustic_guitar_steel, kick, snare, low_tom, pedal_hat, mid_tom, open_hat, high_tom,
  crash
)

More by Robbie Williams