Strudelify
Sabbath Bloody Sabbath cover art

Sabbath Bloody Sabbath

Sabbath Bloody Sabbath

Black Sabbath

KeyB♭ minorTempo148 bpm
0:00/0:00
// Sabbath Bloody Sabbath — Black Sabbath
// 148 bpm, 4/4, key A# minor. 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: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 2 "gTR II" distortion guitar (copy of ch 1 "gTR I" distortion guitar); ch 6 "sOLO" overdriven guitar (copy of ch 5 "sOLO" overdriven guitar)
// note: Full arrangement: all 192 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(148/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 · "gTR I"
const distortion_guitar = note(`<
  A@5 B C D@2 B C D@2 B C D@2 B C D@2 B C D@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 G@2 B C D@2 B C D@2 B C D@2 B C D@2 B C D@2 B
  C D@2 E@2 F@2 E@2 F@2 E@2 F@2 E@2 G@4 H I D@2 H I D@2 H I D@2 H I D@2 H I D@2 H I D@2 J@2 K@2 J@2 L@2 M@2 N O N O N O
  N O N O N O N O N O N O N O P Q R Q P S T@2 N O N O N O N O N O N O N O N O N O N O P Q R Q P S U@12 V@2 W@7
>`.pickRestart({
  A: "[~@15 [ab2,eb3,ab3]@4 [ab2,eb3] ~ [ab2,eb3] ~ [bb2,f3,bb3]@4 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2 [ab2,eb3,ab3]@4 [ab2,eb3] ~ [ab2,eb3] ~ [bb2,f3,bb3]@4 bb2@2 e2@2 [gb2,db3,gb3]@6 [ab2,eb3,ab3]@6 ~ [bb2,f3,bb3]@6 [db3,ab3,db4]@6 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2 [bb2,f3,bb3]@4, ~@43 [f3,bb3]@4 ~@33]/5", // Ab5 Bb5 Ab5 Bb5 Gb5 Ab5 Bb5 Db5 …
  B: "[ab2,eb3,ab3]@4 [ab2,eb3] ~ [ab2,eb3] ~ [bb2,f3,bb3]@4 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2", // Ab5 Bb5
  C: "[ab2,eb3,ab3]@4 [ab2,eb3] ~ [ab2,eb3] ~ [bb2,f3,bb3]@4 bb2@2 e2@2, ~@3 [f3,bb3]", // Ab5 Bb5
  D: "[[gb2,db3,gb3]@3 [ab2,eb3,ab3]@3 [bb2,f3,bb3]@3 [db3,ab3,db4]@3 [bb2,f3,bb3]!2 [bb2,f3,bb3]@2]/2", // Gb5 Ab5 Bb5 Db5 Bb5
  E: "[eb3,bb3]/2", F: "[db3@14 ab2 gb2, ab3]/2",
  G: "[[db3,ab3,db4]@3 [ab2,eb3,ab3]@3 [db3,ab3,db4]@3 [ab2,eb3,ab3]@3 [db3,ab3,db4]@2 [ab2,eb3,ab3]@2]/2", // Db5 Ab5 Db5 Ab5 Db5 Ab5
  H: "[ab2,eb3]@4 [ab2,eb3] ~ [ab2,eb3] ~ [bb2,f3,bb3]@4 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2, ab3 ~", // Ab5 Bb5
  I: "[ab2,eb3]@4 [ab2,eb3] ~ [ab2,eb3] ~ [bb2,f3,bb3]@4 bb2@2 e2@2, ab3@2 ~ [f3,bb3]", // Ab5 Bb5
  J: "[[eb3,bb3,eb4]@6 [eb3,bb3,eb4]@2 ~@2 [db3,ab3,db4]@2 [eb3,bb3,eb4]@6 [eb3,bb3,eb4]@2 ~@2 [db3,ab3,db4]@2 [eb3,bb3,eb4]@4 [eb3,bb3,eb4]@3 ~]/2", // Eb5 Db5 Eb5 Db5 Eb5
  K: "[[db3,ab3,db4]@3 [c3,g3,c4]@3 [bb2,f3,bb3]@3 [c3,g3,c4]@3 [bb2,f3,bb3]@2 [c3,g3,c4]@2]/2", // Db5 C5 Bb5 C5 Bb5 C5
  L: "[[db3,ab3,db4]@3 [c3,g3,c4]@3 [bb2,f3,bb3]@3 [c3,g3,c4]@3 [db3,ab3,db4]@2 [eb3,bb3,eb4]@2]/2", // Db5 C5 Bb5 C5 Db5 Eb5
  M: "[[f2,c3,f3]@28 [a2,bb2,e3,f3] [ab2,eb3] [gb2,g2,db3,d3] [e2,f2,b2,c3]]/2", // F5 Fmaj7 Ab5 Dmaj7 Cmaj7
  N: "[eb2,bb2,eb3]!2 [gb2,bb2,eb3] [eb2,bb2,eb3] [gb2,bb2,eb3] [eb2,bb2,eb3] [gb2,bb2,eb3] [eb2,bb2,eb3]", // Eb5 Ebm Eb5 Ebm Eb5 Ebm Eb5
  O: "~ [eb2,bb2,eb3] [gb2,bb2,eb3] [eb2,bb2,eb3] [gb2,bb2,eb3] [ab2,eb3,ab3]@3", // Eb5 Ebm Eb5 Ebm Ab5
  P: "[bb2,f3]@2 [bb2,f3]!2 [bb2,f3]@2 [ab2,eb3]@2 [bb2,f3]@2 [bb2,f3]!2 [bb2,f3]@2 [bb2,f3,bb3]@2", // Bb5 Ab5 Bb5
  Q: "~ [ab2,eb3,ab3] ~ [gb2,db3,gb3]@3 [gb2,db3,gb3]@2", // Ab5 Gb5
  R: "[bb2,f3]@2 [bb2,f3]!2 [bb2,f3]@2 [ab2,eb3]@2 [bb2,f3]@2 [db3,ab3]!2 [db3,ab3]@2 [bb2,f3,bb3]@2", // Bb5 Ab5 Bb5 Db5 Bb5
  S: "~ [ab2,eb3,ab3] ~ [gb2,db3,gb3] ~ [ab2,eb3,ab3]@3", T: "[f2,c3,f3]/2",
  U: "[f2,c3,f3]@3 [f2,c3,f3]!2 [e2,b2,e3] ~ [e2,b2,e3] [f2,c3,f3]@3 [f2,c3,f3]!2 [e2,b2,e3] ~ [e2,b2,e3]", // F5 E5 F5 E5
  V: "[f2,c3,f3]@3 [f2,c3,f3]@2 [f2,c3,f3]@3 [f2,c3,f3]@3 [f2,c3,f3]@2 [f2,c3,f3]@3", W: "[f2,c3,f3]/7",
})).s("gm_distortion_guitar").gain(0.44).pan(1)

// bass · electric bass finger · "bAIXO"
const bass = note(`<
  ~@5 A B C D A B C D A B C D A B C D A B C D E F G H E F G H E F G H E F I J A B C D A B C D A B C D A B C D A B C D A
  B C D E F G H E F G H E F G H E F I J I J A B C D A B C D A B C D A B C D A B C D A B C D K@2 L@2 K@2 M@2 N@2 O P O P
  O P O P O P O P O P O P O P O P Q R S R Q T N@2 O P O P O P O P O P O P O P O P O P O P Q R S R Q T U@12 V@2 W@7
>`.pickRestart({
  A: "ab1@2 ab1!2 bb1@2 bb1!2", B: "ab1@2 ab1!2 bb1@2 bb1 e1", C: "gb1 db2 gb2 ab1 eb2 ab2 bb1 db2",
  D: "d2 bb1@3 bb1!2 bb1@2", E: "eb2@2 eb2 ab1 eb2@2 eb2 ab1", F: "eb2@2 eb2 ab1 eb2@2 eb2 db2",
  G: "db2@2 db2 gb1 db2@2 db2 gb1", H: "db2@2 db2 gb1 db2@2 db2 eb2", I: "ab2!3 eb2!3 ab1!2",
  J: "ab1 eb2@2 ab2!3 eb2 ab2", K: "[eb2@6 eb2@2 ~@2 db2@2 eb2@6 eb2@2 ~@2 db2@2 eb2@4 eb2@3 ~]/2",
  L: "[db2@3 c2@3 bb1@3 c2@3 bb1@2 c2@2]/2", M: "[db2@3 c2@3 bb1@3 c2@3 db2@2 eb2@2]/2", N: "f1/2",
  O: "eb1!2 gb1 eb1 gb1 eb1 gb1 eb1", P: "~ eb1 gb1 eb1 gb1 ab1@3",
  Q: "bb1@2 bb1!2 bb1@2 ab1@2 bb1@2 bb1!2 bb1@2 bb1@2", R: "~ ab1 ~ gb1@3 gb1@2",
  S: "bb1@2 bb1!2 bb1@2 ab1@2 bb1@2 ~@4 bb1@2", T: "~ ab1 ~ gb1 ~ ab1@3", U: "f1@3 f1!2 e1 ~ e1 f1@3 f1!2 e1 ~ e1",
  V: "f1@3 f1@2 f1@3 f1@3 f1@2 f1@3", W: "f1/7",
})).s("gm_electric_bass_finger").gain(0.72)

// other · overdriven guitar · "sOLO"
const overdriven_guitar = note("<~@83 A B C@2 D E F G H@2 I@2 J@2 K G L@2 K G M N@3 ~@85>".pickRestart({
  A: "f5@3 eb5 db5@2 bb4@2", B: "f5@3 eb5 db5@2 bb4!2", C: "[c5 bb4 ab4 eb5 c5 ab4 bb4@10]/2",
  D: "f5@3 db5 eb5@2 bb4@2", E: "eb5@3 db5 eb5@2 bb4@2", F: "ab5!2 f5 eb5 f5 eb5 db5 bb4", G: "bb4",
  H: "[[f4,ab4] [eb4,g4] [db4,f4] [f4,ab4]@2 eb4 db4 bb3@9]/2", I: "[c4 bb3 ab3 eb4 c4 ab3 bb3@10]/2",
  J: "f5@2 db5 eb5 bb4@4", K: "bb5@2 ab5 f5 f5@2 db5 bb4", L: "f5@2 f5@2 f5 db5 db5@2", M: "eb6@2 eb6@2 eb6 bb5@3",
  N: "[eb6@2 eb6@2 eb6!2 bb5@18]/3",
})).s("gm_overdriven_guitar").gain(0.72).pan(0)

// chords · electric guitar jazz · "gTR s/D"
const electric_guitar_jazz = note("<~@25 A B@4 C@8 D@3 ~@151>".pickRestart({
  A: "ab5", B: "[~@3 ab5, gb5@4 gb5@13 bb4@4 f5 ab5 f5@9, ~ ab5@6 f5@3 eb5@6, ~@3 eb5@2 eb5@4 db5@7, ~ db5 ab4@2]/4",
  C: "[~@23 ab5 ~@16 ab5@6 ~@10 ab5@8, gb5@2 gb5@7 db5@7 gb5@2 gb5@7 f5@7, ~ ab5@7 bb4@4 ab5@5 ab5@3 ~@3 ab5@4 db5@5, ~@12 eb5@28 eb5 f5 ab5@2 eb5@32 eb5@20 eb5@8 eb5@24, ~@16 ab4@29 f5@32 ~@17 bb5@32 ~@2]/8",
  D: "[~@3 eb5@8 ~, gb5 gb5@4 ~, ~ ab5@8 ~@3]/3",
})).s("gm_electric_guitar_jazz").gain(0.35).pan(0)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@28 A ~@7 A ~@31 A ~@7 A ~@33 A ~@3 A B C ~@54 D@12 ~@9>".pickRestart({
  A: "~@7 x", B: "~@15 x", C: "~@6 x!3 ~ x ~@3 x ~", D: "~@3 x!3 ~ x ~@3 x!3 ~@2",
})).gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@28 A ~@7 A ~@31 A ~@7 A ~@33 A ~@3 A B C ~@20 D ~@3 D ~@2 E ~@20 D ~@3 D ~@22
>`.pickRestart({
  A: "~@10 x!3 ~@3", B: "~@7 x", C: "x!2 ~@6", D: "~@3 x", E: "~@6 x!2",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A B C@2 A B C@2 A B C@2 A B C@2 A B C D E C E D E C E D E C E D E C F G A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A
  B C D E C E D E C E D E C E D E C F G F G A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C D E H ~@2 E I ~@4 J K L K J K
  L K J K L K J K L K J K L K ~@8 J K L K J K L K J K L K J K L K J K L K ~@27
>`.pickRestart({
  A: "~@2 x!2 ~@2 x!2", B: "x!4 ~@2 x!2", C: "x!8", D: "x!4 ~@4", E: "~@2 x!2 ~ x!3", F: "~@2 x ~@2 x ~@2",
  G: "x ~ x!2 ~@4", H: "x!4 ~ x!3", I: "x!4 ~ x ~@2", J: "~ x!3", K: "x!3 ~", L: "x!4",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<~@137 A ~@3 A ~ B C ~@20 A ~@3 A ~@22>".pickRestart({
  A: "~@5 x ~@2", B: "~@7 x", C: "~ x ~ x!3 ~@2",
})).gain(0.72)

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

stack(
  distortion_guitar, bass, overdriven_guitar, electric_guitar_jazz, kick, snare, low_tom, mid_tom, open_hat, high_tom,
  crash
)

More by Black Sabbath