Strudelify

Sweet Leaf

Black Sabbath

KeyA minorTempo70 bpm
0:00/0:00
// Sweet Leaf — Black Sabbath
// 70 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: Full arrangement: all 92 bars on a 32-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): guitar 2.
setcpm(70/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · "Tony"
const overdriven_guitar = note(`<
  A@14 B C B C B C B C A@16 B C B C B C B C D E F@5 G H I J@8 K@8 L@8 K@8 M@4
>`.pickRestart({
  A: "[a3,e4]@2 [a3,e4]@2 g4!2 [d4,a4] [c#4,g#4] [c4,g4]@3 a3 [c4,g4]@2 [d4,a4]@2", // A5 D5 C#5 C5 D5
  B: "[a3,e4]@14 ~@2 [g3,d4]@7 ~ [c4,g4]@7 ~", C: "[e4,b4]@3 [a3,e4]@12 ~",
  D: "[a3,e4]@7 ~ [a3,e4]@7 ~ [a3,e4]@7 ~ [a3,e4]@5 ~ [b3,f#4,b4,d#5]@2", // A5 B
  E: "[b3,f#4,b4,d#5]@13 ~ [b3,f#4,b4,d#5]@2 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5] ~@3", // B
  F: "[[b3,f#4,b4,d#5]@2 [c#4,g#4,c#5,f5]@3 ~ [c#4,g#4,c#5,f5]@23 [b3,f#4,b4,d#5]@2 [b3,f#4,b4,d#5]@13 ~ [b3,f#4,b4,d#5]@2 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5] ~@3 [b3,f#4,b4,d#5]@2 [c#4,g#4,c#5,f5]@3 ~ [c#4,g#4,c#5,f5]@23 ~ f5@2 f#5@2 f5 [f5,f#5] c#5@2 f5@2 f#5@2 [f5,f#5] f5 c#5@2 f5@2 f#5@2 g#5@26 e5 ~@3 c#6@3 c#6@3 c#6 b5 ~ g#5 f#5 e5 f#5 e5 c#5 e5 ~]/5", // B C# B C# F#maj7
  G: "g#5 ~ g#5 ~ c#6 ~ b5 ~ c#6 ~ c#6@3 ~ c#6@3 ~ c#6@3 ~ c#6 b5 g#5 ~ f#5 e5 f#5 ~ e5 ~",
  H: "c#5 ~ c#5 b4 g#4 ~ f#4 ~ e4 ~ c#4 ~ e4 ~ c#6@3 ~ c#6@3 ~ c#6 ~ c#6 ~ b5 g#5 f#5 ~ f#5 e5",
  I: "c#5 ~ e5 ~ f#5 ~ g#5 ~ c#6 ~ c#6@3 ~ c#6@3 ~ c#6@3 ~ c#6 b5 g#5 ~ f#5 e5 c#5 ~ c#5 b4",
  J: "[c#5 ~ c#5 b4 g#4 ~ f#4 ~ e4 ~ c#4 ~ e4 ~ [c#4,g#4]@3 ~ [a3,e4] ~ [g#3,d#4] ~ [g3,d4]@16 ~@7 [c#4,g#4]@3 ~ [a3,e4] ~ [g#3,d#4] ~ [g3,d4]@16 ~@8 [c#4,g#4]@3 ~ [a3,e4] ~ [g#3,d#4] ~ [g3,d4]@16 ~@8 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@3]/8", // C#5 A5 G#5 G5 C#5 A5 G#5 G5 …
  K: "[~@3 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@3]/8", // C5 D5 A5 D5 C#5 C5 D5 A5 …
  L: "[~@3 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@14 ~@2 [g3,d4]@7 ~ [c4,g4]@7 ~ [e4,b4]@6 [a3,e4]@24 ~@2 [a3,e4]@14 ~@2 [g3,d4]@7 ~ [c4,g4]@7 ~ [e4,b4]@6 [a3,e4]@24 ~@2 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@3]/8", // C5 D5 A5 D5 C#5 C5 D5 A5 …
  M: "[~@3 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 [a3,e4]@4 [a3,e4]@4 g4@2 g4@2 [d4,a4]@2 [c#4,g#4]@2 [c4,g4]@6 a3@2 [c4,g4]@4 [d4,a4]@4 ~@19]/4", // C5 D5 A5 D5 C#5 C5 D5 A5 …
})).s("gm_overdriven_guitar").gain(0.72)

// other · lead 8 bass lead · "Ozzy"
const lead_8_bass_lead = note(`<
  ~ A ~ B ~ C D E@2 F G H I J ~@11 K ~ L ~ M D F N O@2 H P Q ~@23 R ~ S ~ T U V W X Y Z AA AB ~@3 AC@3 AD AE AF AG AH AI
  AJ ~@5
>`.pickRestart({
  A: "~@5 a4 b4 a4", B: "~@10 g4 e4 g4 a4@3", C: "~@10 e4 e4@3 g4@2", D: "a4@2 c5@2 ~@6 g4 e4 g4 a4@3",
  E: "[d4 c4@3 ~@6 e4@2 e4@2 g4 a4@3 c5@2 ~@6 g4@2 g4@2 a4@2]/2", F: "e4 d4 c4@2 ~@6 e4@2 e4@2 g4@2",
  G: "a#4@2 a4@2 ~@8 g4 a4@3", H: "d#4 d4 c4@2 ~@6 d#4@2 d#4 g4@3", I: "a4@2 a4@2 ~@5 g4@3 g4@2 a4@2",
  J: "d#4@2 d4@2 c4@4 ~@4 a4@11 ~ g4@7 ~", K: "~@5 a4 c5 a4", L: "~@9 g4@2 g4 g4@2 a4@2", M: "~@5 e4!2 g4",
  N: "a4!2 ~@3 g4!2 a4", O: "[d#4 d4 c4@2 ~@6 d#4@2 d#4 g4@2 b4@3 a4@2 ~@6 g4 g4@3 a4@2]/2",
  P: "b4 a4 a4@2 ~@6 g4 g4@3 a4@2", Q: "d#4@2 d4@2 c4@4 ~@4 a4@11 ~ a4@4 g4@4", R: "~ a4 ~ c5@4 ~@2 a4@3 ~@20",
  S: "~ g4 ~ e4 ~ g4@3 ~ a4@3 ~@20", T: "~ e4@3 ~ e4 ~ g4@4 ~@2 a4@3 ~ c5@3 ~@12",
  U: "~ a4@3 ~ a4@3 ~ g4@3 ~ e4 ~ d4 ~ c4@4 ~@11", V: "~ e4@3 ~ e4 ~ g4@3 ~ a4@4 ~@2 a4@3 ~@12",
  W: "~ g4@3 ~ g4 ~ a4@4 ~@2 d#4 ~ d4 ~ c4@4 ~@11", X: "~ d#4@3 ~ d#4@3 ~ g4 ~ a4@4 ~@2 g4 ~ a4@3 ~@10",
  Y: "~ g4@3 ~ g4@3 ~ a4@3 ~ e4 ~ d4 ~ c4 ~ d4 ~ c4 ~@10", Z: "~ e4@3 ~ e4 ~ g4@4 ~@2 a4 ~ g4 ~ a4@3 ~@12",
  AA: "~ g4@3 ~ g4 ~ a4@4 ~@2 e4@3 ~ d4 ~ c4 ~@5 a4@5 ~@2", AB: "~ a4@3 ~ a4@3 ~ f#4 ~ e4 ~@20",
  AC: "[~ a4 ~ c5@4 ~@2 a4@8 ~@14 g4@3 ~ e4 ~ g4 ~ a4@4 ~@6 g4 ~ g4 ~ g4@3 ~ g4 ~ a4@8 ~@4 g4@4 ~@2 a4@4 ~@2 g4@3 ~@10]/3",
  AD: "~ g4@4 f4 ~ e4 ~ d4@5 ~ e4@4 ~@12 g4", AE: "~ g4 ~ e4 ~ g4@3 ~ g4 ~ a4@4 ~@2 a4@4 ~@4 g4@7",
  AF: "~@5 f4 ~ e4 ~ d4 ~ e4 ~ e4@3 ~@7 g4@8 ~", AG: "~@5 g4 ~ f#4 ~ e4@3 ~ d4 ~ f4@4 ~@6 d4 ~ f4@4 ~",
  AH: "~@5 d4 ~ f4@4 ~@2 e4@11 ~ e4@5 ~@2", AI: "~ g4@3 ~ e4@3 ~ g4@3 ~ d4@3 ~ c4@3 ~@12",
  AJ: "~ d4@3 ~ d4 ~ c4@4 ~@2 d4@3 ~ e4@3 ~ e4@5 ~@6",
})).s("gm_lead_8_bass_lead").gain(0.8)

// bass · electric bass finger · "Geezer"
const bass = note(`<
  A@14 B C B D B E B C A@16 B C B D B E B C F G H I J K L M N O P Q@2 R S@13 T@5 S@13 U
>`.pickRestart({
  A: "c2@3 ~ c2@3 ~@5 f2 ~ e2 ~ e2@4 ~@2 e2 ~ e2@3 ~ f2@3 ~", B: "c2@11 ~@5 b1@5 ~@3 e2@5 ~@3",
  C: "g2@4 ~@2 c2@3 ~ c3 ~ c3 ~ c3@3 ~ c3@3 ~ c3 ~ c3 ~ b2 ~ g2@3 ~",
  D: "g2@4 ~@2 c2@3 ~ g3@3 ~ f3@3 ~ e3@4 c3 ~ b2 ~ g2 ~ f2 ~ e2 ~",
  E: "g2@4 ~@2 c2@3 ~ c3 ~ c3 ~ c3@3 ~ c3@3 ~ c3 ~ c3 ~ b2 ~ g2 ~ f2 ~",
  F: "c2@5 ~@3 c2@5 ~@3 c2@5 ~@3 c2@4 ~@2 d2 a#2", G: "d3 d2!5 ~ d2 a#2 d3 a#2 d2 a#2 d3 a#2 d2 f2 c3 f3!12 d2 a#2",
  H: "d3 d2!6 a#2 d3 a#2 d2 a#2 d3 a#2 d2 f2 c3 f3 f#3 ~ f3 d3 c3 d3 f3 d3 c3 d2 a#2 d3 d2!2",
  I: "d2!4 ~ d2 a#2 d3 a#2 d2 a#2 d3 a#2 d2 f2 f3!17", J: "f2!12 ~ d2 f2 ~@8 d2 f2 ~@6 d2", K: "f2 ~@6 d2 f2 ~@23",
  L: "~@15 f2 d3 c3 [g2,a#2] a#2 c3 a#2 d3 c3 a#2 g2 f2 g2 f2 d2 f2 d3", // Gm
  M: "c3 a#2 c3 d3 f3 d3 c3 a#2 c3 a#2 g2 f2 g2 f2 d3 c3 a#2 g2 a#2 c3 a#2 d3 c3 a#2 g2 f2 g2 f2 d2 f2 d3 c3",
  N: "a#2 c3 d3 f3 d3 c3 a#2 c3 a#2 g2 f2 g2 f2!2 d3 c3 a#2 g2 a#2 c3 a#2 d3 c3 a#2 g2 f2 g2 f2 d2 f2 d3 c3",
  O: "a#2 g2 a#2 c3 a#2 d3 c3 a#2 g2 f2 g2 f2 d2 f2 d3 c3 a#2 g2 a#2 c3 a#2 d3 c3 a#2 g2 f2 g2 f2 d2 g2 f2 d3",
  P: "c3 a#2 g2 a#2 c3 a#2 d3 c3 a#2 g2 f2 g2 f2 d2 f2@3 ~ c2 ~ c2 ~ b1@10", Q: "~@13 f2@3 ~ c2 ~ c2 ~ b1@11",
  R: "~@13 c2@3 ~ c2@3 ~@5 f2 ~ e2 ~ e2@3", S: "~@3 e2 ~ e2@3 ~ f2@3 ~ c2@3 ~ c2@3 ~@5 f2 ~ e2 ~ e2@3",
  T: "[~@3 e2 ~ e2@3 ~ f2@3 ~ c2@11 ~@5 b1@5 ~@3 e2@5 ~@3 g2@4 ~@2 c2@3 ~ c3 ~ c3 ~ c3@3 ~ c3@3 ~ c3 ~ c3 ~ b2 ~ g2@3 ~ c2@11 ~@5 b1@5 ~@3 e2@5 ~@3 g2@4 ~@2 c2@3 ~ g3@3 ~ f3@3 ~ e3@4 c3 ~ b2 ~ g2 ~ f2 ~ e2 ~ c2@3 ~ c2@3 ~@5 f2 ~ e2 ~ e2@3]/5",
  U: "~@3 e2 ~ e2@3 ~ f2@3 ~@20",
})).s("gm_electric_bass_finger").gain(0.31)

stack(overdriven_guitar, lead_8_bass_lead, bass)

More by Black Sabbath