Strudelify

Send Me An Angel

Real Life

KeyD minorTempo126 bpm
0:00/0:00
// Send Me An Angel — Real Life
// 126 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 125 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(126/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · electric bass finger
const bass = note(`<
  ~@2 A B A B A B C B A B C D@8 E F D@8 E F D@2 G F H I J I K D L D@2 I J I K D@2 M D@8 E F D@2 G F H I J I K D L D@2 I
  J I K D N F@2 D@4 G F I J I K G O G P I J I K D N F Q I J I K D L D@2 I J I K D N F@2 D@3
>`.pickRestart({
  A: "~@10 d1@3 ~ d1 ~", B: "d1 ~@7", C: "~@10 d1@3 ~ d1@2", D: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~",
  E: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1@2", F: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  G: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~", H: "c2 ~@7", I: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
  J: "g1 ~ g1 ~ g1 ~ g1 ~ d2 ~ d2 ~ d2 ~ d2 ~", K: "g1 ~ g1 ~ g1 ~ g1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  L: "d2 ~ d2 ~ d2 ~ d2@2 c2 ~ c2 ~ c2 ~ c2 ~", M: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~@7",
  N: "d2 ~ d2 ~ d2 ~ d2@2 d2 ~ d2 ~ d2 ~ d2@2", O: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  P: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ d2 ~ d2 ~ d2 ~ d2 ~", Q: "c2 ~ c2 ~ c2 ~ c2 ~ d2 ~ d2 ~ d2 ~ d2 ~",
})).s("gm_electric_bass_finger").gain(0.56)

// other · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~ A B A B A B A B A B A B A B A B A B A B C D A B A B A B A B C D A E C F G H@2 I@2 J@2 K@2 H@2 I@2 L@2 M A B A B A B
  A B C D A E C F G H@2 I@2 J@2 K@2 H@2 I@2 N@2 O@2 P Q P R S T U@2 V@2 W@2 H@4 I@2 N@2 X@2 H@2 I@2 J@2 K@2 H@2 I@2 N@2
  O@2 Y@2 Z
>`.pickRestart({
  A: "d3 a3 d4 e4@2 d4@2 a3", B: "f3 c4 f4 f3 c4 e4 d4 c4", C: "bb2 f3 bb3 d4@3 bb3 f3", D: "c3 g3 c4 e4@3 c4@2",
  E: "d3 a3 d4 f3 a3 e4 d4 c4", F: "c3 g3 c4 e4@2 d4 c4 g3", G: "c3@2 ~@6 [a3,d4,f4]@7 ~",
  H: "[[f3,bb3,d4]@23 ~ [a3,d4,f4]@7 ~]/2", I: "[[f3,bb3,d4]@23 ~ [g3,c4,e4]@7 ~]/2",
  J: "[[a3,d4,f4]@23 ~ [g3,c4,e4]@7 ~]/2", K: "[[a3,d4,f4]@22 ~@2 [a3,d4,f4]@7 ~]/2", L: "[[a3,d4,f4]@31 ~]/2",
  M: "[g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~@7", N: "[[a3,d4,f4]@23 ~ [a3,d4,f4]@7 ~]/2",
  O: "[[g3,c4,e4]@15 ~]/2", P: "d3@2 a3@2 d4 ~ d3@2 a3@2 c4@2 d3@2 e3@2", Q: "f3 d3 e3 f3@3 ~@2",
  R: "f3@2 d3@2 e3@2 f3@7 ~@3",
  S: "[d3,f3,bb3,d4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~ [g4,c5,e5] ~", // Bb C
  T: "[g4,c5,e5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [g3,c4,e4] ~ [g3,c4,e4]@3 ~", // C
  U: "[[g3,bb3,d4]@23 ~ [f3,a3,d4]@7 ~]/2", V: "[[d3,g3,bb3,d4]@23 ~ [e3,a3,c4]@7 ~]/2",
  W: "[[f3,bb3,d4]@23 ~ [e3,a3,c4]@7 ~]/2", X: "[[g3,c4,e4]@23 ~ [a3,d4,f4]@7 ~]/2", Y: "d3 a3 d4 d3 a3 c4 d3 e3",
  Z: "d3 a3 d4 d3 a3 c4 a3 d3",
})).s("gm_lead_2_sawtooth").gain(0.24).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@2 A B A C@8 D@24 B D@14 B D@14 B D@16 C E C E C E D@32 F@2 G>".pickRestart({
  A: "~@5 x ~ x", B: "x", C: "x!4", D: "x!2", E: "x ~ x ~ x ~ x!2", F: "x ~ x!2", G: "x ~@3 x ~ x!2",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct(`<
  ~@12 A B@24 C B@7 D B@6 E B@14 C B@7 D B@7 D F G F G B@9 H B@7 D B@7 D B@7 D I@3
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "x", D: "~ x!2 ~@2 x!2 ~", E: "x!5 ~@3", F: "x!4", G: "x ~ x ~ x!4",
  H: "~@2 x ~ x ~@5 x ~ x ~ x!2", I: "~@2 x ~@2 x ~ x",
})).gain(0.72)

// drums · clap
const clap = s("cp").struct(`<
  ~@39 A ~ A ~ A ~ A ~ A ~ A ~@2 B ~@16 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@15 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~@3
>`.pickRestart({
  A: "x", B: "~@2 x!3 ~@3",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@51 [~@15 x] [x!5 ~@3] ~@59 [x!2 ~ x!2 ~ x ~ x!2 ~ x!2 ~ x ~] ~@11 [~@4 x!4]>")
  .gain(0.72)

// drums · hihat
const hihat = s("hh").struct(`<
  A ~@12 B C@3 B C@3 B C@15 ~ C@4 B C@8 D E B C@13 ~ C@4 B C@7 B C@3 B F C F C@2 B C@3 B C@7 B C@7 B C@7 B C@3 G H I
>`.pickRestart({
  A: "x!4", B: "~ x!7", C: "x!8", D: "x!4 ~@4", E: "x!5 ~@3", F: "x!3 ~ x!4", G: "~ x!4 ~ x ~", H: "x!7 ~",
  I: "x!5 ~ x!2",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@122 [~@5 x ~ x]!2 [~@5 x ~@2]>").gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@13 A ~@23 B@2 ~@3 B ~@3 B ~@3 B C B ~@14 B@2 ~@3 B ~@3 B ~@3 B ~@3 B ~@13 B ~@3 B ~@3 B ~@3 B ~@2 B@2 ~@3 B ~@5 D
>`.pickRestart({
  A: "~ x ~@2", B: "x", C: "~@2 x!2", D: "~@7 x",
})).gain(0.56)

stack(bass, lead_2_sawtooth, kick, snare, clap, low_tom, hihat, open_hat, crash)