Strudelify

Lady in Black

Uriah Heep

KeyA minorTempo83 bpm
0:00/0:00
// Lady in Black — Uriah Heep
// 83 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 6 electric guitar clean (copy of ch 12 overdriven guitar)
// note: Full arrangement: all 85 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 29.
setcpm(83/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 · overdriven guitar
const overdriven_guitar = note("<~@14 A ~@13 B ~@11 B ~@11 B ~@15 B ~@3 B ~@3 B ~@3 B ~@3 C>".pickRestart({
  A: "~@8 a2 c3 d3 d#3 e3 g2@3", B: "~@9 c3 d3 d#3 ~@4", C: "~@27 c3@4 ~@17",
})).s("gm_overdriven_guitar").gain(0.31).pan(0.4)

// chords · pad warm
const pad_warm = note(`<
  ~@29 A B C D E D F G H I J D A B C D E D F G H I J D A B C D E D F G E D F G H I J D H I J D H I J D H I J D H I J K
>`.pickRestart({
  A: "[a3,c4]@47 ~, e3@7 ~", B: "[e3,c4]@43 ~@5, a3@47 ~", C: "[g3,b3]@47 ~, d3@7 ~", D: "[e3,a3,c4]@7 ~",
  E: "[e3,a3,c4]@43 ~@5", F: "[d3,g3]@3 ~, b3@41 ~@7", G: "[e3,a3,c4]@41 ~@7", H: "[e3,a3,c4]",
  I: "[g3,b3]@4 [e3,a3,c4]@3 ~, d3@3 ~@5", J: "[e3,a3,c4] [d3,g3,b3]", K: "[e3,a3,c4]@3 ~",
})).s("gm_pad_warm").gain(0.16).pan(0.3)

// bass · fretless bass
const bass = note(`<
  ~@10 A B C D@2 E F G H I J K L M N O P Q R G H I J K L M N O P Q R G H I J K L M N O P Q R G H I J G H I J K L M N O P
  Q R O P Q R O P Q R O P Q R O P Q S
>`.pickRestart({
  A: "~ a2@47", B: "g2@12 a2@11 ~", C: "a2@12 g2@11 ~", D: "[a2@3 ~]/2", E: "a1@8 ~@4 a1@7 ~@5 a1@8 ~@4 a1@3 g1@7 ~@2",
  F: "a1@8 ~@4 a1@9 ~@3 a1@9 ~@3 a1@3 g1@7 ~@2", G: "a1@8 ~@4 a1@7 ~@5 a1@9 ~@3 a1@3 g1@9",
  H: "a1@7 ~@5 a1@8 ~@4 a1@9 ~@3 a1@3 g1@5 ~@4", I: "g1@7 ~@5 g1@7 ~@5 g1@8 ~@4 g1@8 ~@4",
  J: "a1@8 ~@4 a1@8 ~@4 a1@8 ~@4 a1@3 g1@6 ~@3", K: "a1@8 ~@4 a1@9 ~@3 a1@11 ~ a1@3 g1@7 ~@2",
  L: "a1@9 ~@3 a1@9 ~@3 a1@10 ~@2 a1@3 g1@5 ~@4", M: "g1@9 ~@3 g1@8 ~@4 g1@8 ~@4 g1@9 ~@3",
  N: "a1@10 ~@2 a1@9 ~@3 a1@8 ~@4 a1@3 g1@6 ~@3", O: "a1@10 ~@2 a1@10 ~@2 a1@11 ~ a1@11 ~",
  P: "g1@10 ~@2 g1@11 ~ a1@11 ~ a1@10 ~@2", Q: "a1@9 ~@3 a1@12 g1@11 ~ g1@10 ~@2",
  R: "a1@10 ~@2 a1@11 ~ a1@10 ~@2 a1@3 g1@6 ~@3", S: "a1@10 ~@2 a1@11 ~ a1@10 ~@14",
})).s("gm_fretless_bass").gain(0.49)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@41 A@3 B@3 C D E F@2 G ~@32>".pickRestart({
  A: "[[c4,a4]@2 [b3,g4]]/3", B: "[c4,a4]/3", C: "[b3,g4]", D: "[c4,a4]@23 ~", E: "[c4,a4]",
  F: "[g4 [c4,a4]@2 [d4,b4], b3@7 ~@25]/2", G: "[c4,a4]@37 ~@11",
})).s("gm_string_ensemble_2").gain(0.27).pan(0.7)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~@15 A B C B D A@2 B D A E F G H C B D A@2 B D A E F G H C B D A@2 B D A E F G H C B D A@2 B D A@2 B D A E F G H E F G
  H E F G H E F G H E F G I
>`.pickRestart({
  A: "[a2,e3,a3]@6 ~@6 [a2,e3,a3]@5 ~@7 [a2,e3,a3]@6 ~@6 a2@3 g2@5 ~@4, ~@36 e3@5 ~@7", // A5
  B: "[a2,e3,a3]@5 ~@7 [a2,e3,a3]@5 ~@7 [a2,e3,a3]@7 ~@5 a2@3 g2@7 ~@2, ~@6 [e3,a3] ~", // A5
  C: "[a2,e3,a3]@6 ~@6 [a2,e3,a3]@5 ~@7 [a2,e3,a3]@6 ~@6 a2@3 g2@5 ~@4, ~@36 [e3,a3]@5 ~@7", // A5
  D: "[g2,d3,g3]@6 ~@6 [g2,d3,g3]@5 ~@7 [g2,d3,g3]@6 ~@6 [g2,d3,g3]@5 ~@7", // G5
  E: "[a2,e3,a3]@6 ~@6 [a2,e3,a3]@5 ~@7 [a2,e3,a3]@6 ~@6 [a2,e3,a3]@5 ~@7", // A5
  F: "[g2,d3,g3]@5 ~@7 [g2,d3,g3]@5 ~@7 [a2,e3,a3]@7 ~@5 a2@3 a2@6 ~@3, ~@6 [e3,a3] ~", // G5 A5
  G: "[a2,e3,a3]@6 ~@6 [a2,e3,a3]@5 ~@7 [g2,d3,g3]@6 ~@6 [g2,d3,g3]@5 ~@7", // A5 G5
  H: "[a2,e3,a3]@5 ~@7 [a2,e3,a3]@5 ~@7 [a2,e3,a3]@7 ~@5 a2@3 g2@6 ~@3, ~@6 [e3,a3] ~", // A5
  I: "[a2,e3,a3]@5 ~@7 [a2,e3,a3]@5 ~@7 [a2,e3,a3]@7 ~@17", // A5
})).s("gm_distortion_guitar").gain(0.42).pan(0.7)

// chords · rock organ
const rock_organ = note("<~@52 A@4 B C B D@4 E@3 F G@3 F G@3 F G@3 F G@3 F H ~>".pickRestart({
  A: "[~@47 [a5,c6,e6]@45 ~@3 [a5,c6,e6]@48 [g5,b5,d6]@47 ~@2]/4", B: "[a5,c6,e6]", C: "[a5,c6,e6]@47 ~",
  D: "[[g5,b5,d6]@46 ~@2 a5@46 ~@2 [a5,c6]@47 ~ [a5,c6]@47 ~, ~@47 [c6,e6]@47 ~ e6@47 ~ e6@48 ~]/4", // G Am C
  E: "[[g5,b5,d6]@46 ~ [a5,c6,e6]@47 ~ [a5,c6,e6]@49]/3", F: "[g5,b5,d6]@22 ~ [a5,c6,e6]@24 ~",
  G: "[[a5,c6,e6]@23 ~ [g5,b5,d6]@23 ~ [a5,c6]@47 [a5,c6,e6]@49, ~@47 e6@48 ~@49]/3", // Am G Am
  H: "[a5,c6,e6]@23 ~ [g5,b5,d6]@23 ~", // Am G
})).s("gm_rock_organ").gain(0.03).pan(0.6)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A@4 B A@3 B A@2 C D A@2 E F G H I H J H I H J K L H J H I H J H I H J K L H J H I H J H I H J K L H J H I H J H I H J
  H I H J K L H J K L H J K L H J K L H J K L M
>`.pickRestart({
  A: "[a2,e3,a3,c4,e4]@2 [a2,e3,a3,c4,e4]!6 [a2,e3,a3,c4,e4]@2 [a2,e3,a3,c4,e4]!6", // Am
  B: "[g2,d3,g3,b3,g4]@2 [g2,d3,g3,b3,g4]!6 [g2,d3,g3,b3,g4]@2 [g2,d3,g3,b3,g4]!6", // G
  C: "[g2,d3,g3,b3,g4]@2 [g2,d3,g3,b3,g4]!6 [a2,e3,a3,c4,e4]@2 [a2,e3,a3,c4,e4]!6", // G Am
  D: "[a2,e3,a3,c4,e4]@2 [a2,e3,a3,c4,e4]!6 [g2,d3,g3,b3,g4]@2 [g2,d3,g3,b3,g4]!6", // Am G
  E: "[a2,e3]@6 [a2,e3,a3,c4,e4]@3 [a2,e3,a3,c4,e4]@3 e4@2 ~ [a2,e3,a3,e4]@3 [a2,e3,a3,c4,e4]@3 [a2,a3,e4]@3 [a2,a3]@6 [a2,e3,a3,c4,e4]@3 [a2,e3,a3,c4,e4]@3 e4@3 [a2,e3,a3,e4]@3 [a2,e3,a3,c4,e4]@3 [a2,a3,e4]@3", // A5 Am A5 Am A5 A Am A5 …
  F: "a2@6 [a2,e3,a3,c4,e4]@3 [a2,e3,a3,c4,e4]@3 e4@2 ~ [a2,e3,a3,e4]@3 [a2,e3,a3,c4,e4]@3 [a2,a3,e4]@3 [a2,a3]@6 [a2,e3,a3,c4,e4]@3 [a2,e3,a3,c4,e4]@3 e4@3 [a2,e3,a3,e4]@3 [a2,e3,a3,c4,e4]@3 [a2,a3,e4]@3", // Am A5 Am A5 A Am A5 Am …
  G: "a2@5 ~@2 [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2 ~ a3@5 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2, ~@2 [a2,e3] e4 ~ e4 [a2,e3] e4 a2@2 [a2,e3] e4 ~ e4 [a2,e3] e4", // Am A5 Am A Am A5 Am A …
  H: "[a2,e3]@6 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2 ~ a3@5 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2, ~@2 [a2,e3] e4 ~ e4 [a2,e3] e4 a2@2 [a2,e3] e4 ~ e4 [a2,e3] e4", // A5 Am A5 Am A Am A5 Am …
  I: "g2@6 ~ [g3,b3,g4]@2 ~ [g2,d3,g3,b3]@3 g4@2 ~ [g2,d3,g3]@2 ~ [g3,b3,g4]@2 ~ [g2,g3]@2 ~ g3@5 ~ [g3,b3,g4]@2 ~ [g2,d3,g3,b3]@3 g4@2 ~ [g2,d3,g3]@2 ~ [g3,b3,g4]@2 ~ [g2,g3]@2, ~@2 [g2,d3] g4 ~ g4 [g2,d3] g4 g2@2 [g2,d3] g4 ~ g4 [g2,d3] g4", // G G5 G G5 G G5
  J: "a2@6 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2 ~ a3@5 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2, ~@2 [a2,e3] e4 ~ e4 [a2,e3] e4 a2@2 [a2,e3] e4 ~ e4 [a2,e3] e4", // Am A5 Am A Am A5 Am A …
  K: "g2@6 ~ [g3,b3,g4]@2 ~ [g2,d3,g3,b3]@3 g4@2 ~ [g2,d3,g3]@2 ~ [g3,b3,g4]@2 ~ [g2,g3]@2 a2@6 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2, ~@2 [g2,d3] g4 ~ g4 [g2,d3] g4 ~@2 [a2,e3] e4 ~ e4 [a2,e3] e4", // G G5 G Am A5 Am A G5 …
  L: "~ a3@5 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@2 ~ [a2,a3]@2 g2@6 ~ [g3,b3,g4]@2 ~ [g2,d3,g3,b3]@3 g4@2 ~ [g2,d3,g3]@2 ~ [g3,b3,g4]@2 ~ [g2,g3]@2, a2@2 [a2,e3] e4 ~ e4 [a2,e3] e4 ~@2 [g2,d3] g4 ~ g4 [g2,d3] g4", // Am A5 Am A G G5 G A5 …
  M: "[a2,e3]@6 ~ [a3,c4,e4]@2 ~ [a2,e3,a3,c4]@3 e4@2 ~ [a2,e3,a3]@2 ~ [a3,c4,e4]@3 ~@26, ~@2 [a2,e3] e4 ~ e4 [a2,e3] ~@9", // A5 Am A5 Am A5
})).s("gm_acoustic_guitar_steel").gain(0.17).pan(0.4)

// drums · kick
const kick = s("bd").struct("<[x ~@7 x ~@4 x ~@2]!84 [x!2]>").gain(0.72)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!84 [~ x ~@2]>").gain(0.48)

stack(
  overdriven_guitar, pad_warm, bass, string_ensemble_2, distortion_guitar, rock_organ, acoustic_guitar_steel, kick,
  snare
)

More by Uriah Heep