Strudelify
After Forever cover art

Master of Reality

After Forever

Black Sabbath

KeyG majorTempo95 bpm
0:00/0:00
// After Forever — Black Sabbath
// 95 bpm, 4/4, key G major. 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: duplicate parts dropped: ch 11 "gUITARRA #1 bIS" overdriven guitar (copy of ch 4 "gUITARRA #1" overdriven guitar)
// note: Full arrangement: all 129 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): gUITARRA #1, gUITARRA #3.
setcpm(95/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.

// other · pad warm · "aTMOSFERA #1"
const pad_warm = note("<A@5 ~@119 B@5>".pickRestart({
  A: "[~@3 g1@14 ~@3]/5", B: "[g1@17 ~@3]/5",
})).s("gm_pad_warm").gain(0.8).pan(1)

// other · pad poly · "aTMOSFERA #1"
const pad_poly = note("<~@92 A@3 ~@34>".pickRestart({
  A: "[g4@5 ~]/3",
})).s("gm_pad_poly").gain(0.32).pan(1)

// bass · electric bass pick · "bAIXO"
const bass = note(`<
  ~ A B@2 C D E D@3 F D G H I H I H I H I H I H J K L K L K L K M H I H I H I H I H I H N O P O P O P O Q R S R S R S R
  T K L K L K L K M H I H I H I H I H I H U@8 V@4 W K L K L K L K M H I H I H I H I H I H J K L K L K L K X Y@2 Z AA@3
  AB AC
>`.pickRestart({
  A: "~@6 g1@3 g1@7", B: "[g1@3 g1@7 g1@3 g1@6 g1@3 ~ g1@6 g1@3]/2", C: "~ g1@3 g2@12", D: "c1 d1 f1@2 g1@12",
  E: "d1 e1 g1@2 g2@12", F: "d1 e1 g1@2 g1@12", G: "c1 d1 f1@2 d1!4 d1@3 d1 f1!4", H: "f1@3 d1!5 d1@3 d1 f1!2 f1@2",
  I: "e1!2 e1@2 d1!4 d1@3 d1 f1!4", J: "e1!2 e1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2",
  K: "c1 d1 f1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2", L: "c1 e1 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2",
  M: "c1 e1 g1@2 d1!4 d1@3 d1 f1!4", N: "e1!2 e1@2 c2@2 ~@2 c2@2 ~ c2 d2@4", O: "c2@2 ~@2 a#1@2 ~@2 a#1@2 ~ a#1 c2@4",
  P: "a#1@2 ~@2 c2@2 ~@2 c2@2 ~ c2 d2@4", Q: "a#1@2 ~@2 d2@2 ~@2 d2@2 ~ d2 e2@4", R: "d2@2 ~@2 c2@2 ~@2 c2@2 ~ c2 d2@4",
  S: "c2@2 ~@2 d2@2 ~@2 d2@2 ~ d2 e2@4", T: "c2@2 ~@2 g1 ~ g1@2 g1@2 g1@2 g1@2 g1@2",
  U: "[e1 ~ f1 f#1 ~ g1 ~ g1 g2 ~@2 g2 c2 d2 c2@4 d2@2 g1@2 ~ g1 g2 ~@2 g2 c2 d2 c2@4 d2 ~ g1@2 ~ g1 g2 ~@2 g2 c2 d2 c2@4 d2@2 g1@2 ~ g1 g2 ~@2 g2 c2 d2 c2@4 d2 ~ a1@2 a1!2 a1@2 a1 a1@2 a1!2 a1@2 e1 g1 g#1 a1@2 a1!2 a1@2 a1 a1@2 a1!2 a1@2 e1 g1 g#1 a1@2 a1!2 a1@2 a1 a1@2 a1!2 a1@2 e1 g1 g#1 a1@2 a1!2 a1@2 a1 a1@2 a1!3]/8",
  V: "[~ e1 g1 g#1 a1@2 a1!2 a1@2 a1 a1@2 a1!2 a1@2 e1 g1 g#1 a1@2 a1!2 a1@2 a1 a1@2 a1!2 a1@2 e1 g1 g#1 a1@2 a1!2 a1@2 a1 a1@2 a1!2 a1@2 e1 g1 g#1 a1@2 a1!2 ~ d2 e2 g2 a2 g2 f2 e2]/4",
  W: "d2 a#1 g1 f1 g1 ~ g1@2 g1@2 g1@2 g1@2 g1@2", X: "c1 d1 f1@2 g1@2 g1!2 g1@2 g1!2 g1@2 g1!2",
  Y: "g1@2 g1!2 g1@2 g1!2 g1@2 g1!2 g1@2 g1!2", Z: "g1@2 g1!2 g2!12",
  AA: "[g2!4 g1@8 g1@4 g1@8 g1@4 g1@8 g1@4 g1@8, ~ g2@7 ~@4]/3", AB: "g1 g1@2 g1", AC: "g1 ~@3",
})).s("gm_electric_bass_pick").gain(0.8)

// chords · overdriven guitar · "gUITARRA #1"
const overdriven_guitar = note(`<
  ~@2 A@4 B C B C B C D ~@11 E C F C F C F C D ~@11 G H G H ~@12 E C F C F C F C D ~@15 I J K L@2 M@2 N O C F C F C F C
  D ~@11 E C F C F C F C P ~@8
>`.pickRestart({
  A: "[[g2,d3,g3,d4,g4,d5,g5]@36 b3@3 a3@3 g3@3 f3@3 c3 d3 f3@2 ~@3 c3@3 d3@3 c3@3, ~@9 g2@4 ~@3]/4", // G5
  B: "c3 d3 f3@2 b3@3 a3@3 g3@3 f3@3", C: "c3 d3 f3@2 ~@3 c3@3 d3@3 c3@3", D: "c3 d3 f3@2 ~@12",
  E: "~@4 b3@3 a3@3 ~@3 f3@3", F: "c3 d3 f3@2 b3@3 a3@3 ~@3 f3@3", G: "~@3 c3", H: "~@3 a#2",
  I: "~@5 d4 e4@2 g4 a4@2 a4@2 a4 g4@2", J: "a4@4 ~ d4 e4@2 g4 a4@2 a#4@2 a4 g4@2",
  K: "a4@4 ~ d4 e4@2 g4 a4@2 g4@2 a4 g4@2", L: "[a4@4 c5@3 c5@3 g5@10 g5!12]/2", M: "g5!16", N: "g5!12 ~ g5!2 d#5",
  O: "g4@4 b3@3 a3@3 ~@3 f3@3", P: "c3 ~@15",
})).s("gm_overdriven_guitar").gain(0.2).pan(0)

// chords · distortion guitar · "gUITARRA #2"
const distortion_guitar = note(`<
  ~@5 A@7 B C D C D C D C D C D C E@8 F C D C D C D C D C D C G H I H J K L K M N O N P N O N Q@8 F C D C D C D C D C D
  C R@4 S@8 T@8 F C D C D C D C D C D C E@8 U V@2 W X@2 ~@3
>`.pickRestart({
  A: "~@4 [g2,d3,g3] ~@11", B: "~@4 [d2,a2]!4 [d2,a2]@3 [d2,a2] [f2,c3]!4",
  C: "[f2,c3]@3 [d2,a2]!5 [d2,a2]@3 [d2,a2] [f2,c3]!2 [f2,c3]@2", // F5 D5 F5
  D: "[e2,b2]!2 [e2,b2]@2 [d2,a2]!4 [d2,a2]@3 [d2,a2] [f2,c3]!4", // E5 D5 F5
  E: "[[e2,b2]!2 [e2,b2]@2 g2!12 g2!16 g2!16 g2!16 g2!16 g2!16 g2!16 g2!16, ~ [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@3]/8", // E5 G5
  F: "g2!4 [d2,a2]!4 [d2,a2]@3 [d2,a2] [f2,c3]!4", G: "[e2,b2]!2 [e2,b2]@2 [c3,g3]@2 ~@2 [c3,g3]@2 ~ [c3,g3] [d3,a3]@4",
  H: "[c3,g3]@4 [a#2,f3]@2 ~@2 [a#2,f3]@2 ~ [a#2,f3] [c3,g3]@4", // C5 A#5 C5
  I: "[a#2,f3]@4 [c3,g3]@2 ~@2 [c3,g3]@2 ~ [c3,g3] [d3,a3]@4", // A#5 C5 D5
  J: "[a#2,f3]@2 ~@2 [c3,g3]@2 ~@2 [c3,g3]@2 ~ [c3,g3] [c3,a3]@4", // A#5 C5 F
  K: "[c3,g3]@4 [a#2,f3]@2 ~@2 [a#2,f3]@2 ~ [a#2,f3] [a#2,g3]@4", // C5 A#5 D#
  L: "[a#2,f3]@4 [c3,g3]@2 ~@2 [c3,g3]@2 ~ [c3,g3] [c3,a3]@4", // A#5 C5 F
  M: "[a#2,f3]@2 ~@2 [d3,a3]@2 ~@2 [d3,a3]@2 ~ [d3,a3] [d3,b3]@4", // A#5 D5 G
  N: "[d3,a3]@4 [c3,g3]@2 ~@2 [c3,g3]@2 ~ [c3,g3] [c3,a3]@4", // D5 C5 F
  O: "[c3,g3]@4 [d3,a3]@2 ~@2 [d3,a3]@2 ~ [d3,a3] [d3,b3]@4", // C5 D5 G
  P: "[c3,g3]@2 ~@2 [d3,a3]@2 ~@2 [d3,a3]@2 ~ [d3,a3] [d3,b3]@4", // C5 D5 G
  Q: "[[c3,g3]@2 ~@2 g2!12 g2!16 g2!16 g2!16 g2!16 g2!16 g2!16 g2!16, ~ [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@3]/8", // C5 G5
  R: "[[e2,b2] ~ [f2,c3] [f#2,c#3] ~ [g2,d3] ~ [g2,d3] g3 ~@2 g3 c3 d3 c3@4 d3@2 [g2,d3] ~@2 [g2,d3] g3 ~@2 g3 c3 d3 c3@4 d3@2 [g2,d3] ~@2 [g2,d3] g3 ~@2 g3 c3 d3 c3@4 d3@2 [g2,d3] ~@2 [g2,d3] g3 ~@2 g3 c3 d3 c3@2]/4", // E5 F5 F#5 G5
  S: "[~@2 d3 ~ [a2,e3]@16 [a2,e3]@16 [a2,e3]@16 [a2,e3]@16 a2!12 a2!16 a2!16 a2!16, ~@17 [e3,a3]@4 [e3,a3]@4 [e3,a3]@4 [e3,a3]@3]/8", // A5
  T: "[a2!4 g2!12 g2!16 g2!16 g2!16 g2!16 g2!16 g2!16 g2!16, ~ [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@4 [d3,g3]@3]/8", // G5
  U: "g2!4 g2@2 g2!2 g2@2 g2!2 g2@2 g2!2, ~ g3!3", V: "g2@2 g2!2 g2@2 g2!2 g2@2 g2!2 g2@2 g2!2, g3!4",
  W: "g2@2 g2!2 [g2,g3]!12, g3 ~@3", X: "[[g2,g3]!4 [g2,g3]@27 ~]/2",
})).s("gm_distortion_guitar").gain(0.29).pan(1)

// chords · distortion guitar · "gUITARRA #3"
const distortion_guitar_2 = note("<~@4 A@2 ~@42 B C B C D B D B D B D B ~@69>".pickRestart({
  A: "[~ [g3,d4]@4 ~@3]/2", B: "~@3 d4", C: "~@3 c4", D: "~@3 e4",
})).s("gm_distortion_guitar").gain(0.24).pan(0)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@12 [~@3 x ~@12] ~@116>").gain(0.64)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@4 [~@3 x ~ x ~ x] [~ x ~ x ~ x ~ x]!2 [~ x ~@6] ~@121>").gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 [~@2 x!2 ~@12] ~@2 [~@15 x] [x!3 ~@13] ~@116>").gain(0.64)

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

// drums · high tom
const high_tom = s("ht").struct("<~@8 [x!2 ~@14] ~@120>").gain(0.48)

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

// drums · cowbell
const cowbell = s("cb").struct("<~@4 [~@2 x!2] [x ~ x!2]!2 x ~@121>").gain(0.48)

stack(
  pad_warm, pad_poly, bass, overdriven_guitar, distortion_guitar, distortion_guitar_2, kick, snare, low_tom, pedal_hat,
  mid_tom, open_hat, high_tom, crash, cowbell
)

More by Black Sabbath