Strudelify

Sober

Tool

KeyD minorTempo156 bpm
0:00/0:00
// Sober — Tool
// 156 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 189 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(156/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 · overdriven guitar
const overdriven_guitar = note(`<
  ~@8 A@2 B@2 C@3 D E@2 F@2 E@2 G@2 H@2 I@2 J@2 K L M@2 N@2 O@2 P@2 Q@2 R@2 S@2 T U V W X Y Z W X AA AB@2 AC@2 AB@2 AC@2
  AB@2 AC@2 AB@2 AC@2 AD@2 AE@2 AF@2 AG@2 O@2 AH@2 O@2 AH@2 AI@2 AJ@2 AK@2 AL AM V W X Y Z W X AA AB@2 AC@2 AB@2 AC@2
  AB@2 AC@2 AB@2 AC@2 AN@2 AO@6 ~@14 AP@2 AQ@2 AR AS AB@2 AC@2 AB@2 AC@2 AB@2 AC@2 AB@2 AC@2 AT AU AV AW AX AY AV AZ BA
  BB BC BD BA BB BC BE BF ~ AR ~ BF ~ AR ~ BF
>`.pickRestart({
  A: "[[g4,a4]!3 [g4,a4]@3 [g4,a4]@2]/2", B: "[[g4,a4]@2 [g4,a4]@2 [g4,a4]@2 [g4,a4]@3 [g4,a4]!7]/2", C: "[g4,a4]!8",
  D: "[g4,a4]!4 [g4,a4]@2 [g4,a4] d3", E: "[[d3,a3,d4]@14 d3!2]/2", F: "[[d3,bb3,d4]@14 d3!2]/2", G: "[d3,bb3,d4]/2",
  H: "[d3@3 [d3,a4]@2 [d3,a4] [d3,a4]@3 [d3,a4]@2 [d3,g4] [d3,g4]@2 [d3,g4]!2]/2", // D5 G5
  I: "[g4 bb4@2 [d3,bb4]@2 [d3,bb4] [d3,bb4]@3 [d3,bb4]@2 [d3,g4] [d3,g4]@2 [d3,g4]!2, d3@3 ~@13]/2", // Gm G5
  J: "[g4 a4@2 [d3,a4]@2 [d3,a4] [d3,a4]@3 [d3,a4]@2 [d3,g4] [d3,g4]@2 [d3,g4]!2, d3@3 ~@13]/2", // D5 G5
  K: "g4 bb4@2 [d3,bb4]@2 [d3,bb4] [d3,bb4]@2, d3@3 ~@5", L: "bb4 c5 [d3,c5]!2 [d3,c5]@2 [d3,c5]@2, d3 ~@3",
  M: "[[d3,a3]@14 a3!2]/2", N: "[[d3,bb3]@14 a3 a2]/2", O: "[d3,a3]/2", P: "[[d3,bb3]@3 [d3,bb3]]/2",
  Q: "[[d3,a3]@3 [d3,a3]@2 [d3,a3] [d3,a3]@3 [d3,a3]@2 [d3,g3] [d3,g3]@2 [d3,g3]!2]/2", // D5 G5
  R: "[a3 bb3@2 [d3,bb3]@2 [d3,bb3] [d3,bb3]@3 [d3,bb3]@2 [d3,g3] [d3,g3]@2 [d3,g3]!2, d3@3 ~@13]/2", // Gm G5
  S: "[g3 a3@2 [d3,a3]@2 [d3,a3] [d3,a3]@3 [d3,a3]@2 [d3,g3] [d3,g3]@2 [d3,g3]!2, d3@3 ~@13]/2", // D5 G5
  T: "a3 bb3@2 [d3,bb3]@2 [d3,bb3] [d3,bb3]@2, d3@3 ~@5", U: "bb3 c4 [d3,c4]!2 [d3,c4]@2 [d3,c4]@2, d3 ~@3",
  V: "d3!6 [a4,d5]@2", W: "d3@2 d3@2 d3@2 d3@2 [a4,d5]@4 d3!4", X: "[bb4,eb5]@2 eb3!4 [bb4,eb5]@2",
  Y: "eb3@2 eb3@2 eb3@2 eb3@2 [bb4,eb5]@4 d3!4", Z: "[a4,d5]@2 d3!4 [a4,d5]@2",
  AA: "[bb4,eb5]@2 [bb4,eb5]@2 [bb4,eb5]@2 [bb4,eb5]@2 [bb4,eb5]!6 [bb4,eb5]@2", AB: "[d2,a2,d3]/2",
  AC: "[~@6 [bb3,eb4]@4 [bb3,eb4]@2 [bb3,eb4]!2 [bb3,eb4]@2, [eb2,bb2,eb3]]/2", AD: "[a3@14 [a3,d4] [a3,e4]]/2",
  AE: "bb3/2", AF: "[a3@6 a4@8 [a3,d4] [a3,e4]]/2", AG: "[bb3@4 bb3 c4 c4@8 d3!2]/2", AH: "[d3,bb3]/2",
  AI: "[[a3,d4]@3 [a3,d4]@2 [a3,d4] [a3,d4]@3 [a3,d4]@2 [g3,c4] [g3,c4]@2 [g3,c4]!2]/2", // D5 C5
  AJ: "[[g3,c4] [bb3,eb4]@2 [bb3,eb4]@2 [bb3,eb4] [bb3,eb4]@3 [bb3,eb4]@2 [g3,c4] [g3,c4]@2 [g3,c4]!2]/2", // C5 Eb5 C5
  AK: "[[g3,c4] [a3,d4]@2 [a3,d4]@2 [a3,d4] [a3,d4]@3 [a3,d4]@2 [g3,c4] [g3,c4]@2 [g3,c4]!2]/2", // C5 D5 C5
  AL: "[g3,c4] [bb3,eb4]@2 [bb3,eb4]@2 [bb3,eb4] [bb3,eb4]@2", AM: "[bb3,eb4] [c4,f4]!3 [c4,f4]@2 [c4,f4]@2",
  AN: "[[d2,a2,d3,a3,d4]@7 [a3,d4]]/2", AO: "[[a4,d5]@23 ~]/6", AP: "[eb3,bb3,eb4]!8", AQ: "[d3,a3,d4]!8",
  AR: "[eb3,bb3,eb4]!2 ~@4 [eb3,bb3,eb4]!2", AS: "~@2 [g5,a5]!4 e2@2", AT: "[d2,a2,d3,a3,d4]",
  AU: "[a3,d4]@2 [a3,d4] [a3,d4]@2 [a3,d4]!2 [bb3,eb4]", AV: "[bb3,eb4]@2 [bb3,eb4]@2 [bb3,eb4] [bb3,eb4]@2 [bb3,eb4]",
  AW: "[bb3,f4]@2 [bb3,f4] [bb3,eb4]@2 [bb3,eb4] g3!2", AX: "[c4,d4]@2 [c4,d4]@2 [c4,d4]@3 [c4,d4]",
  AY: "[a3,d4]@2 [a3,d4] [a3,d4]@2 [a3,d4]!3", AZ: "[bb3,f4]@2 [bb3,f4] [bb3,eb4]@3 a3 g3",
  BA: "[c5,d5]@2 [c5,d5]@2 [c5,d5]@3 [c5,d5]", BB: "[a4,d5]@2 [a4,d5] [a4,d5]@2 [a4,d5]!3",
  BC: "[bb4,eb5]@2 [bb4,eb5]@2 [bb4,eb5] [bb4,eb5]@2 [bb4,eb5]", // Eb5
  BD: "[bb4,f5]@2 [bb4,f5] [bb4,eb5]@2 [bb4,eb5] [g4,d5] [g4,c5]", BE: "[bb4,f5]@2 [bb4,f5] [bb4,eb5]@2 d2!3",
  BF: "[d3,a3,d4]!2 ~@4 [d3,a3,d4]!2", // D5
})).s("gm_overdriven_guitar").gain(0.54)

// bass · slap bass 1
const bass = note(`<
  A B A B A B A C A B A B A B D@2 A B A B A B E@2 A B A B A B E@2 F ~ F ~ F ~ G@2 F ~ F ~ F ~ F H I J K L I J K M N O P
  Q N O P Q N O P Q N O R S A B A B A B E@2 F ~ F ~ F ~ G@2 F ~ F ~ F ~ F H I J K L I J K M N O P Q N O P Q N O P Q N O
  R S T@2 U@8 V@2 W@2 X@2 W@2 Y@2 Z@6 AA AB N O P Q N O P Q N O P Q N O R S AC AD AC AE AC AD AC AE AC AD AC AE AC AD AC
  AE A AF A AF A AF AA ~ AG
>`.pickRestart({
  A: "[e1,d2,a2]!2 [e1,a1]!4 [e1,d2,a2]!2", B: "~ [e1,a1] ~ [e1,a1]!2 ~ [e1,a1]!2",
  C: "~ [e1,a1]!3 [e1,d2,a2]@2 [e1,d2,a2]@2", // A5 Dsus2
  D: "[[e1,d2,a2]!2 [e1,a1]!3 [e1,d2,a2]!2 [e1,d2,a2]@2 [eb2,bb2]!4 [c2,g2]!2 [d2,a2]]/2", // Dsus2 A5 Dsus2 Eb5 C5 D5
  E: "[[e1,d2,a2]!2 [e1,a1]!4 [e1,d2,a2] [e1,d2,a2]@5 [e1,d2,a2]@4]/2", F: "[e1,d2,a2]!2 ~@4 [e1,d2,a2]!2",
  G: "[[e1,d2,a2]!2 ~@4 [e1,d2,a2] [e1,d2,a2]@5 [e1,d2,a2]@4]/2", H: "~ [e1,a1]!3 [e1,d2,a2]@2 [e1,d2,a2]!2",
  I: "[d2,a2]@2 d2!6", J: "d2!4 d2@2 d2 a1", K: "f1@2 f1!6", L: "f1 eb2!3 eb2@2 d2!2", M: "f1 eb2!7",
  N: "d1@2 d1!3 d1@2 d1", O: "d1@2 d1!2 d2!4", P: "eb1@2 eb1 eb2@2 eb2!3", Q: "eb1 f1!5 ~ d1",
  R: "eb1@2 eb1 eb2@3 eb2@2", S: "eb1 f1!3 f2!2 d2 a1", T: "d1/2",
  U: "[~@16 [d2,a3]@3 [d2,a3]@3 [d2,a3]@3 [d2,a3]@5 [d2,a3]@2 [d2,bb3]@3 [d2,bb3]@3 [d2,g3]@3 [d2,g3]@3 [d2,bb3]@2 [d2,g3]@2 [d2,a3]@3 [d2,a3]@3 [d2,a3]@3 [d2,a3]@5 [d2,a3]@2, d1]/8", // D5 Gm G5 Gm G5 D5
  V: "[[d2,bb3]@3 [d2,bb3]@3 [d2,c4]@10]/2", W: "[[d2,a3]@3 [d2,a3]@3 [d2,a3]@3 [d2,a3]@5 [d2,a3]@2]/2",
  X: "[[d2,bb3]@3 [d2,bb3]@3 [d2,g3]@3 [d2,g3]@5 [d2,g3]@2]/2", Y: "[[d2,bb3]@3 [d2,bb3]@3 [d2,g3]@10]/2", Z: "d1!8",
  AA: "eb1!2 ~@4 eb1!2", AB: "~@6 eb1!2", AC: "d2@2 d2@2 f2@2 d2!2 d2@2 [a1,a2]@2 d2@2 d2@2",
  AD: "d2 d1!2 f1@2 f1!2 d1", AE: "d2 d1!2 [f1,f2]@2 [f1,f2] [g1,g2]@2", AF: "[e1,a1]!8", AG: "[e1,d2]!2 ~@4 [e1,d2]!2",
})).s("gm_slap_bass_1").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B@2 C D C D C D B E@16 A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B@2 C D C D C D B E@16 ~@20 F@6 A ~ E@16 G H G H G H G H G H G H G H G I A ~ A ~ A ~ A
  ~ A
>`.pickRestart({
  A: "x!2 ~@4 x!2", B: "x!2 ~@2 x!2 ~@2", C: "x!4 ~@2 x!2", D: "~@2 x!4 ~@2", E: "x!2 ~ x!2 ~@3", F: "x!8",
  G: "x!2 ~ x!2 ~ x!2", H: "~ x!2 ~ x!2 ~@2", I: "~ x!2 ~ x ~@3",
})).gain(0.8)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 [x ~@2 x ~@2 x ~] ~@71 [x ~@2 x ~@2 x ~] ~@109>").gain(0.8)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A@39 B@9 C A@3 C A@3 C A@3 C A@10 ~ A@15 B@9 C A@3 C A@3 C A@3 C A@3 B@5 ~@23 C A@3 C A@3 C A@3 C A@3 B@16 A@6 ~@3
>`.pickRestart({
  A: "x!4", B: "x!8", C: "~ x!3",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~@16 A ~@6 B A ~@6 B ~@7 B ~@8 A ~@7 A ~@3 A ~@3 A ~@3 A ~@2 C ~@8 A ~@6 B ~@8 A ~@7 A ~@3 A ~@3 A ~@3 A ~@2 C ~@28 A
  ~@3 A ~@3 A ~@3 A ~@2 C ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@11
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@7 x",
})).gain(0.8)

// drums · ride
const ride = s("rd").struct("<~@15 [~@3 x] ~@173>").gain(0.8)

stack(overdriven_guitar, bass, kick, snare, mid_tom, open_hat, crash, ride)

More by Tool