Strudelify
Neon Knights cover art

Heaven & Hell

Neon Knights

Black Sabbath

KeyA majorTempo189 bpm
0:00/0:00
// Neon Knights — Black Sabbath
// 189 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 177 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(189/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 · distortion guitar · "Tony Iommi"
const distortion_guitar = note(`<
  A@4 B@10 C D B@8 C D B@2 E@2 F@2 B@10 C D B@6 C D B@2 G H I@2 G H J K L M N@2 L O P@2 J Q J H R@4 J Q J H S@2 T@2 R@2
  U@4 V@2 ~@36 B@6 C D B@8 C D B@2 E@2 F@2 B@18 C D C D W
>`.pickRestart({
  A: "e2!8", B: "[e2!2 [e3,b3,e4] ~ e2 [e3,b3,e4] ~ [e3,b3,e4]@6 e2 d3 f#3]/2", C: "[d3,a3,d4,f#4] [c#3,a3,d4,f#4]",
  D: "[b2,a3,d4,f#4] [c#3,a3,d4,f#4]", E: "[d3,a3,d4]/2", F: "[[f3,c4,f4]@7 [c3,g3,c4]@5 [c3,g3,c4]@4]/2",
  G: "[a2,e3,a3]", H: "[c3,g3,c4]", I: "[[d3,a3,d4]@7 c3@2 b2 a2 g2 c3 b2 a2 g2]/2", J: "[d3,a3,d4]",
  K: "[g2,d3,g3]@3 [g2,d3,g3]@2 g2 c3!2", L: "[a2,e3,a3]@3 [a2,e3,a3]@5", M: "[c3,g3,c4]@3 [c3,g3,c4]@5",
  N: "[[d3,a3,d4]@3 [d3,a3,d4]@4 c3@2 b2 a2 g2 c3 b2 a2 g2]/2", O: "[g2,d3,g3]@3 [g2,d3,g3]@5",
  P: "[[a2,e3,a3]@3 [a2,e3,a3]@13]/2", Q: "[c3,g3,c4]@3 [b2,g3]@5",
  R: "[[e3,a3]@8 [g3,c4] [f#3,b3]@2 ~@2 a2 c3@2, a2@13 ~@3, ~@11 [e3,a3]@3 ~@2]/2", // A5 C5 B5 A5
  S: "[[f2,c3,f3]@3 [f2,c3,f3]@3 [f2,c3,f3]@3 [f2,c3,f3]@3 [f2,c3,f3]@2 [f2,c3,f3]@2]/2", // F5
  T: "[[g2,d3,g3]@3 [g2,d3,g3]@3 [g2,d3,g3]@3 [g2,d3,g3]@3 [g2,d3,g3]@4]/2", // G5
  U: "[[e3,a3] [e3,a3]@3 [e3,a3]@4 [g3,c4] [f#3,b3]@2 ~@2 a2 c3@2, a2@13 ~@3, ~@11 [e3,a3]@3 ~@2]/2", // A5 C5 B5 A5
  V: "[[e3,a3] [e3,a3]@3 [e3,a3]@4 [g3,c4] [f#3,b3]@2 [e3,a3]@3 ~@2, a2@13 ~@3]/2", W: "[e3,b3,e4] ~@3",
})).s("gm_distortion_guitar").gain(0.4)

// other · distortion guitar · "Tony Iommi (Lead)"
const distortion_guitar_2 = note(`<
  ~@94 A@5 B C D@2 E F@2 G@2 H@2 I J K L M B N@2 O P Q R S T U V W X Y Z ~@47
>`.pickRestart({
  A: "[d5@6 ~ d5@2 b4 a4 a4@2 b4 g4 g4@2 a4 b4 a4@2 g4 e4 e4@2 g4 e4 e4@2 d4 b3 d4@2 e4 g4 e4@5]/5",
  B: "g4 e4 d4 b3 e4 d4 b3 d4", C: "b3@2 g3 a3 b3 a3 g3 a3", D: "[g3 a3 g3 a3 b3 a3 g3 e3@6 d3 e3 f#3]/2",
  E: "g3 a3@2 g3 a3@2 b3 d4", F: "[e4 g4@2 e4@2 f#4 g4 a4@2 g4 f#4 e4@2 g4 a4 b4]/2", G: "a5",
  H: "[a5@3 a5@3 a5@3 a5@3 a5@4]/2", I: "a5@2 f#5 g5 e5@4", J: "d5 e5 g5 e5@5", K: "e5 d5 b4 a4 d5 c#5 a4 b4",
  L: "a#4 a4 g4 e4 a4 g4 e4@2", M: "a4 b4 d5 a4 b4 a4!2 e4", N: "[b3 a#3 a3 g3@2 a3 g3 f#3@2 g3 f#3 e3@2 f#3 d3@2]/2",
  O: "e3 f#3 g3 e3 g3 a3 g3 e3", P: "g3@2 b3@2 d4@2 d4@2 e4 g4@3 b4@2 g5@2", Q: "e5@2 c5@2 e5 c#5@2 a4 c5@3 ~ b4 a4@3",
  R: "g4@2 e4 g4 e4@2 ~ b3 e4@2 a3@6", S: "e3@2 d3 f#3 a3@3 e4", T: "e4@2 g4@3 c#5@3 f#5 e5 f#5 e5@2 g5@3",
  U: "a5 e5 a5 b5 a5 g5 a5@2", V: "a5 g5 a5 b5 a5 g5 a5 ~", W: "a5@2 e5@2 a5@2 e5@2 a5@2 e5@2 f#5@2 d5 e5",
  X: "b4 a4@4 c#5@3 g5@8", Y: "f#5@2 d5@2 f#5@2 d5 e5 c#5@3 b4 c#5@2 a4 b4", Z: "a4@3 a4 a4@2 e4@2 e4@2 b3@2 a3@4",
})).s("gm_distortion_guitar").gain(0.57)

// bass · electric bass pick · "Geezer Butler"
const bass = note(`<
  A@5 B A B A B A B A B C D A B A B A B A B C D A B E@2 F@2 A B A B A B A B A B C D A B A B A B C D A B G H I@2 G H E J
  G H I@2 G K G@2 E L E M G@4 E L E N O@2 P@2 Q@4 ~@4 A R@2 S A G E M A R@2 S A G E S A R@2 S A G E S A R@2 S A G E S
  R@2 T@2 A B A B A B C D A B A B A B A B C D A B E@2 F@2 A B A B A B A B A B A B A B A B A B C U C D V
>`.pickRestart({
  A: "e2!8", B: "e2!6 d2 f#2", C: "d2 c#2", D: "b1@2 c#2 f#2", E: "d2!8", F: "[f2!7 c2@2 c2!7]/2", G: "a1!8",
  H: "c2!6 d2 e2", I: "[d2!7 c2@2 b1 a1 g1 c2 b1 a1 g1]/2", J: "g1@3 g1@2 g1 c2!2", K: "g1!8", L: "c2!3 b1!3 c2 e2",
  M: "c2!8", N: "d3 c3 a2 g2 f2 e2 d2 c2", O: "[f1@3 f1@3 f1@3 f1@3 f2 d2 c#2 b1]/2", P: "[g1@3 g1@3 g1@3 g1@3 g1@4]/2",
  Q: "a1/4", R: "b1!8", S: "c2!6 d2!2", T: "[b2@3 a2@3 g2@3 f#2@3 e2@2 d2@2]/2", U: "b1 c#2", V: "e2 ~@3",
})).s("gm_electric_bass_pick").gain(0.57)

// drums · kick
const kick = s("bd").struct("<A@52 B A@33 C ~@3 D ~ D ~ A@35 C A@46 C>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2", B: "x ~@3 x!2 ~@2", C: "x", D: "~@3 x ~ x ~@2 x ~@7",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  A@3 B A B A B A B A B A B A B A B A B A B A B C@2 A B A@3 B A B A B A B A B A B A B A B A B A B C@2 A B A@3 B A@3 B
  A@3 B A@3 B A B A B A B A B A B A B A B A B ~@4 D ~ D E A B A B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 ~ A B A
  B A B A B A B A B A B A B C@2 A B A@3 B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "~@2 x!2 ~@2 x!2", D: "x", E: "x!3 ~@5",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct(`<
  A@3 B C B A B A B A B A B A B A B A B A B A B A B A B A@3 B A B C B A B A B A B A B A B A B A B A B A B C A@2 B C A@2
  B C A@2 B C A@2 B C B C B C B A B C B C B C B C B ~@44 A B A B A B A B A B A B A B A B A B A B A@3 B A B C B C B C B C
  B C B C B C B C B A B A B ~
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "~ x!3",
})).gain(0.41)

// drums · low tom
const low_tom = s("lt").struct("<~@129 [~@5 x!3] ~@47>").gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@93 [~@3 x!4 ~] ~@35 [~ x!4 ~@3] ~@47>").gain(0.41)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@29 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~@9 A ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@29 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A
>`.pickRestart({
  A: "x",
})).gain(0.41)

// drums · ride
const ride = s("rd").struct("<~@94 A@2 B A B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@2 C ~@47>".pickRestart({
  A: "x!4", B: "~ x!3", C: "x",
})).gain(0.41)

stack(distortion_guitar, distortion_guitar_2, bass, kick, snare, hihat, low_tom, mid_tom, crash, ride)

More by Black Sabbath