Strudelify

Black Sunshine

White Zombie

KeyE minorTempo165 bpm
0:00/0:00
// Black Sunshine — White Zombie
// 165 bpm, 6/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (6/4 at bar 1, 4/4 at bar 44, 6/4 at bar 82, 2/2 at bar 98) are rendered on a constant 6/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 3 "Guitar" distortion guitar (copy of ch 2 "Guitar" distortion guitar)
// note: Full arrangement: all 115 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(165/6)

// 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 · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@16 A@4 B ~@7 C@3 D B ~@6 E C@3 D F G H I F J@3 K@2 L@2 M@4 N ~ O ~ P@2 ~ Q ~@2 R@2 S@4 T@2 O ~ U@2 V@3 W X@7 Y Z AA
  AB AC@6 ~@11 AD
>`.pickRestart({
  A: "a3 c4 d4 a3 d4 d#4 a3 d4 d#4 e4 g4 e4", B: "[a2,e3,a3]", C: "a2 c3 d3 a2 d3 d#3 a2 d3 d#3 e3 g3 e3",
  D: "a2 c3 d3 a2 d3 d#3 a2 d3 d#3 e3 g3 d#3", E: "[e3,g#3,d4,g4]", F: "g2 f#2 e2 g2 f#2 e2 g2 f#2 e2 g2 f#2 e2",
  G: "[f2,c3,f3] [f#2,c#3,f#3] [g2,d3,g3] [g#2,d#3,g#3] g2 f#2 e2 g2 f#2 e2 g2 f#2", // F5 F#5 G5 G#5
  H: "e2 g2 f#2 e2 [f2,c3,f3] [f#2,c#3,f#3] [g2,d3,g3] [g#2,d#3,g#3] g2 f#2 e2 g2", // F5 F#5 G5 G#5
  I: "f#2 e2 g2 f#2 e2 g2 f#2 e2 [f2,c3,f3] [f#2,c#3,f#3] [g2,d3,g3] [g#2,d#3,g#3]", // F5 F#5 G5 G#5
  J: "[[f2,c3,f3]@2 [f#2,c#3,f#3]@2 [g2,d3,g3]@2 [g#2,d#3,g#3]@2 [c3,c#3,d3] e3@30 f3 g3@31 g#3, ~@9 d#3 ~@30 f#3 ~@31]/3", // F5 F#5 G5 G#5
  K: "[a#3@2 c#4, a3 ~@47]/2", L: "[e5@16 [c4,c#4,d4] e4@29 [f4,f#4] g4, ~@17 d#4 ~@30]/2",
  M: "[g4@30 [g#4,a4] ~ a#4@28 ~@4 c#5@14 ~ [a4,a#4,b4,c5] e5@16, ~@80 g#4 ~@15]/4", N: "e5@2 ~",
  O: "[b4,e5]@2 ~ [b4,e5]@2 ~ [b4,e5]@2 ~@4", P: "[~@8 [b4,e5]@2 ~ [b4,e5]@2 ~ [b4,e5]@2 ~@8]/2",
  Q: "~@4 [b4,e5]@2 ~ [b4,e5]@2 ~ [b4,e5]@2", R: "[[b4,e5]@2 ~ [b4,e5]@2 ~ [b4,e5]@2 e4@16]/2",
  S: "[g4@14 g4 a4 a4@14 ~@2 b4@7 ~ c5@8]/4", T: "[b4@28 ~@2 g#4 f4 g#4@4 f4@8 ~@4]/2",
  U: "[~@8 [b4,e5]@2 ~ [b4,e5]@2 ~ [b4,e5]@2 a3 c4 d4 a3 c4 d4 a3 c4]/2", V: "d4 a3 d4@2 a3 c4 d4 a3 c4 d4 a3 c4",
  W: "d4 a3 d4@2 e3 g3 a3 e3 g3 a3 e3 g3", X: "a3 e3 a#3 a3 e3 g3 a3 e3 g3 a3 e3 g3", Y: "a3 e3 a#3 a3 [d#4,a4,c5]!8",
  Z: "[d#4,a4,c5]!4 [f#4,a4,d#5]!8", AA: "[f#4,a4,d#5]!4 [a4,c5,g5]!8", AB: "[a4,c5,g5]!4 [d#4,a4,c5]!8",
  AC: "[[d#4,a4,c5]!4 e3@64 ~@4]/6", AD: "e3 f4 b3 e3 f4 a#3 e3 f3 [e2,b2,e3]@2 ~@2",
})).s("gm_distortion_guitar").gain(0.41)

// bass · electric bass pick · "Bass"
const bass = note(`<
  A@16 B@4 A@8 B@4 A@8 B@3 C D E F G H I J K L@2 M N O@2 P Q R S T U V W X Y R S T Z AA@2 AB AC R S T U V AD AE@3 AF
  AG@7 AH AE@3 AI@3 AJ@3 AK@2 AL AM AN R AO AP AK AQ@2 AR
>`.pickRestart({
  A: "e1 g1 a1 e1 g1 a1 e1 g1 a1 e1 a#1 a1", B: "a1 c2 d2 a1 d2 d#2 a1 d#2 e2 f2 g2 e2",
  C: "a1 c2 d2 a1 d2 d#2 a1 d#2 e2 f2 g2 e1", D: "e1 ~@5", E: "f1 f#1 g1 g#1 g1 ~@7", F: "~@4 f1 f#1 g1 g#1 g1 ~@3",
  G: "~@8 f1 f#1 g1 g#1", H: "g1 ~@11", I: "f1@2 f#1@2 g1@2 g#1@2 e2@2 e2@2 e2@2 e2!4 e2@2 e2@2 e2@2",
  J: "d2@2 e1@2 e1@2 e1@2 e1@2 e1@2 a#1@2 b1@2 e2@2 e2@2 d2@2 e2!2",
  K: "e2!2 e2@2 e2@2 e2@2 d2@2 e2@2 e2@2 e2@4 e1@2 f#1@2 g1@2",
  L: "[e2@2 e2@2 d2@2 e2!4 e2@2 e2@2 e2@2 d2@2 e2@2 e2@2 e2@4 e2@2 a#1@2 b1@2 e2@2 e2@2 d2@2 e2@2 e2@2 e2@2 e2@2 e2@2]/2",
  M: "d2@2 e2@2 e2@2 e2@4 e1@2 f#1@2 g1@2 e2@2 e2@2 d2@2 e2!2",
  N: "e2@2 e2!2 e2@2 e2@2 d2@2 e2@2 e2@2 e2@4 e2@2 a#1@2 b1@2",
  O: "[e2@2 e2@2 d2@2 e2!2 e2@2 e2!2 e1@2 e1@2 e1@2 e1@2 e1@2 e1@4 e1@2 f#1@2 g1@2 e2@2 e2@2 d2@2 e2!2 e2@2 e2!2 e2@2 e2@2]/2",
  P: "d2@2 e2@2 e2@2 e2@4 e2@2 a#1@2 b1@2 e2@2 e2@2 d2@2 e2!2",
  Q: "e2@2 e2!2 e2@2 e2@2 d2@2 e2@2 e2@2 e2@4 e1@2 f#1@2 g1@2", R: "e1!12", S: "e1!3 a#1 e1!8",
  T: "a#1 e1 ~ a#1 e1!2 a#1 ~ e1!4", U: "e1!11 a#1", V: "e1!8 a#1 e1 ~ a#1", W: "e1!2 a#1 ~ e1!8", X: "e1!7 a#1 e1!4",
  Y: "e1!4 a#1 e1 ~ a#1 e1!2 a#1 ~", Z: "e2!4 e2@4 d2@2 e1@2 e1@2 e1@4 e1@2 a#1@2 b1@2",
  AA: "[e2@2 e2@2 d2@2 e2!6 e2@4 d2@2 e2@2 e2@2 e2@4 e1@2 f#1@2 g1@2 e2@2 e2@2 d2@2 e2!6 e2@4]/2",
  AB: "d2@2 e1@2 e1@2 e1@4 e1@2 a#1@2 b1@2 e2@2 e2@2 d2@2 d2!2",
  AC: "d2!2 d2@2 d2@2 d2@2 d2@2 e2@2 e2@2 e2@4 e1@2 f#1@2 g1@2", AD: "e1!2 a#1 ~ a1 c2 d2 a1 d2 d#2 a1 d2",
  AE: "d#2 e2 g2 d#2 a1 c2 d2 a1 d2 d#2 a1 d2", AF: "d#2 e2 g2 d#2 e1 g1 a1 e1 g1 a1 e1 g1",
  AG: "a1 e1 a#1 a1 e1 g1 a1 e1 g1 a1 e1 g1", AH: "a1 e1 a#1 a1!2 c2 d2 a1 d2 d#2 a1 d2",
  AI: "[d#2 e2 g2 d#2 e1@14 f2@2 e2@14 f1@2]/3", AJ: "[e1@14 f2@2 e2@16 e1!4]/3", AK: "e1!9 f1 b1 f1",
  AL: "f#1 c2 g1 c#2 e1!8", AM: "e1!5 f1 b1 f1 e1!4", AN: "e1!5 f1 b1 f1 f#1 c2 g1 c#2", AO: "e1 f1 b1 f1 e1!8",
  AP: "~@8 e1!4", AQ: "[e1!8 c2@14 f1@2]/2", AR: "e1 f2 b1 e1 f2 a#1 e1 f1 e1@2 ~@2",
})).s("gm_electric_bass_pick").gain(0.41)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@11 B A@11 B A@11 B A@4 ~ C D E ~ F G H I J K L M F G N O P Q R Q S T S O P U L M F G N O P Q R Q J F@3 V@8 F@4 W
  X Y Z AA AB Y Z AA X Y Z AA X Y Z AC ~
>`.pickRestart({
  A: "x!4 ~ x!2 ~ x!4", B: "x ~ x ~ x ~ x ~@3 x ~ x ~@3 x!8", C: "x!4 ~@8", D: "~@4 x!4 ~@4", E: "~@8 x!4",
  F: "x!8 ~ x!2 ~", G: "x!3 ~ x!3 ~ x!4", H: "~ x!2 ~ x!2 ~ x!5", I: "x!4 ~ x!2 ~ x!3 ~", J: "x!3 ~ x!4 ~ x!2 ~",
  K: "x ~ x ~@3 x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~", L: "~ x!2 ~ x!3 ~ x!3 ~", M: "x!4 ~ x!2 ~ x!2 ~ x",
  N: "~@2 x ~ x ~@3 x ~ x ~@3 x ~ x ~ x ~ x!3 ~", O: "x ~ x ~ x!3 ~ x!3 ~", P: "x!4 ~@4 x ~@3 x ~@3 x ~ x ~ x ~@3",
  Q: "x ~ x ~ x!3 ~ x ~ x ~", R: "x ~ x ~ x ~@3 x ~ x ~ x ~@3 x!4 ~@4", S: "x!3 ~ x ~ x ~ x!3 ~",
  T: "x ~ x ~ x ~@3 x!4 ~@4 x ~@3 x ~@3", U: "x ~ x ~ x!3 ~ x!4", V: "x!12", W: "x!9 ~@7 x ~@7", X: "x!3 ~ x ~",
  Y: "x ~ x!3 ~", Z: "x ~ x ~ x!2", AA: "x!3", AB: "x ~@3 x ~@3 x!9 ~@7", AC: "x ~@7 x!16",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A B A B A B A B A B A C A B A B A B A B A B A C A B A B A B A B A B A C A B A B ~@5 D A E A@2 F A G A@2 H A I J K
  A D L C A I J A G A@2 H A I J K A D A M A M A M A M A M A M A M A N ~ O P N ~ O P N ~ O P N ~ O P Q ~
>`.pickRestart({
  A: "~ x ~ x ~ x", B: "~@2 x ~@3 x ~@3 x!2", C: "~ x ~ x ~@2", D: "~@3 x ~ x", E: "~@2 x ~@2 x ~@4 x ~",
  F: "~ x ~@8 x ~", G: "~@2 x ~@3 x ~@2 x ~@2", H: "~@2 x ~@2 x ~@6", I: "x!4 ~@8 x ~@7 x ~@3", J: "~ x ~@3 x",
  K: "~@4 x ~@7 x ~@3 x!4 ~@4", L: "~@4 x ~@3 x!4 ~@8 x ~@3", M: "~@2 x!2 ~@2 x ~@3 x ~", N: "~@2 x", O: "x",
  P: "~ x ~", Q: "~@15 x ~@7 x",
})).gain(0.41)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@11 A ~@11 A ~@14 B ~@4 C ~@15 C ~@21 D ~@4 E ~@10 F ~>".pickRestart({
  A: "~@16 x!8", B: "~@12 x!2 ~@10", C: "~@20 x!2 ~@2", D: "x!8 ~@16", E: "~@8 x!8 ~@8", F: "~@8 x!7 ~ x!7 ~",
})).gain(0.41)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B C D A E ~ F ~@2 G ~@2 H ~ F ~ I
  J K ~ I J K ~ I J ~@2 H ~ F ~ I J K ~ L ~ M ~ M ~ M ~ M ~ M ~ M ~ M ~ M N O A P O@2 A P N O A P N O A@2 O
>`.pickRestart({
  A: "x", B: "x!5 ~@7", C: "~@4 x!5 ~@3", D: "~@8 x!4", E: "x!4 ~@8", F: "~@11 x", G: "~@7 x ~@4", H: "~ x ~@2",
  I: "~ x ~@4", J: "~ x", K: "~@5 x", L: "~ x!2 ~@3", M: "~ x ~", N: "~ x!2", O: "~@2 x", P: "x!2 ~",
})).gain(0.51)

stack(distortion_guitar, bass, kick, snare, hihat, mid_tom, crash)

More by White Zombie