Strudelify
Oh Boy cover art

Oh Boy

Mud

KeyC majorTempo80 bpm
0:00/0:00
// Oh Boy — Mud
// 80 bpm, 4/4, key C 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: Full arrangement: all 55 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · alto sax · "SAX MELOD"
const alto_sax = note("<~@30 A B C D E F G H I@2 ~@15>".pickRestart({
  A: "[g3,d4] ~ [g3,d4] [g3,d4]@2 [g3,d4]!3 [g3,b3,e4]@2 [g3,d4]@2 [g3,d4]@4, ~@10 b3 ~@5", // G5 Em G5
  B: "~ c4@2 [e3,c4] [e3,c4]@2 [e3,c4] [g3,e4] ~ [g3,e4] [g3,d4] ~ [g3,c4]@3 [g3,c4], ~ e3 ~@14", // C G5 C5
  C: "a3 [a3,c4]!2 ~ [a3,c4]@2 [a3,c4] [f3,a3,d4]@2 [a3,c4] [a3,c4]@2 [a3,c4]@4, f3@2 ~@8 f3 ~@5", // Am Dm Am
  D: "[g3,d4]!5 ~ [g3,d4]!2 [d4,g4] [g3,d4,g4] [g3,d4]@2 [g3,d4,g4]@2 ~@2, ~@10 g4 ~@5", // G5
  E: "g3 ~ [g3,c4] ~ [g3,e4] ~@2 g4@2 [c4,g4]!3 [g3,e4] [e3,c4]@2 [g3,e4], ~@7 c4 ~@8", // C5 C C5 C
  F: "~ [g3,e4]!4 ~ [g3,e4]!4 [g3,a3,d4] ~ g3@2 g3@2, ~@12 c4 ~ d4 ~", // C Gsus2
  G: "[f3,c4]@2 ~@4 [f3,d4] ~ c4@2 [f3,d4] [f3,c4]@3 [f3,a3] ~, ~@8 f3 ~@7", // F5 Dm F5 F
  H: "[e3,g3] ~@8 [e3,g3] [e3,a3] ~ [e3,g3] ~ [e3,a3] [e3,g3]", // Em A5 Em A5 Em
  I: "[[d3,g3]@5 [d3,g3]!2 [d3,g3,a3] [f3,a3]@4 [a3,c4] a3@2 [g3,c4]@5 [a3,c4]@3 ~ g3@2 ~@6, ~@13 c4 ~@10 c4 ~@7]/2", // G5 Dsus4 F Am C5 Am
})).s("gm_alto_sax").gain(0.4)

// chords · distortion guitar · "DIST E GI"
const distortion_guitar = note("<~@14 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ~@15>".pickRestart({
  A: "[g2,d3,g3]@2 ~ [d3,g3] [d3,g3]@3 [f2,f3]@2 [g2,g3] [b2,b3] [d3,d4] [f3,f4]@4", // G5 F G B D F
  B: "[c3,g3,c4] ~ c3 [c3,g3] [c3,g3,c4]@2 ~ [c3,g3,c4]@2 [c3,c4] [c3,g3,c4] c3 [c3,g3]!2 [c3,g3,c4] c3", // C5 C C5
  C: "[f2,f3]@2 ~ [c3,f3] [f2,c3,f3]@2 ~ [f2,c3,f3] ~ [f2,c3,f3] [c3,f3] [f2,c3] [f2,c3,f3] c3 [f2,c3,f3] [f2,c3], ~ f2 ~@6", // F F5
  D: "[g2,d3,g3]@2 ~ [g2,d3,g3] [g2,d3,g3]@2 ~ [g2,d3,g3] ~ [g2,d3]!2 [d3,g3] [g2,d3,g3] d3 [g2,d3,g3]@2", // G5
  E: "[c3,g3,c4]@2 ~ [c3,g3] [c3,g3,c4]@2 ~ [c3,g3,c4] ~ [c3,g3,c4] [c3,g3]!2 [c3,g3,c4] ~@3", // C5
  F: "[c3,g3,c4] ~ [c3,g3]!2 [c3,g3,c4]@2 ~ [c3,g3] ~ [c3,g3,c4]!2 c3 [c3,g3,c4] ~ [c3,g3,c4] ~", // C5
  G: "[f2,c3,f3] ~ [f2,c3] c3 [c3,f3]@2 ~ [f2,c3,f3] ~ [c3,f3] [f2,c3]!2 [c3,f3] ~ [c3,f3]!2", // F5
  H: "[c3,g3]@2 [c3,g3]!2 [c3,g3,c4] ~ c3 [c3,g3,c4] ~ [c3,g3,c4] [c3,g3]!2 [c3,g3,c4] c3 [c3,g3,c4] [c3,g3]", // C5
  I: "[g2,d3,g3] ~ g2 [g2,g3] [g2,d3,g3] ~ [g2,d3] [g2,d3,g3] [f2,c3,f3] ~ [c3,f3]!2 [f2,c3,f3] ~ [f2,c3,f3] [f2,f3]", // G5 G G5 F5 F
  J: "[c3,g3] ~ [c3,g3]!3 ~ [c3,g3]!2 ~ g3 c4@2 a3 g3 [d3,e3] d3", // C5 Dsus2
  K: "[c3,g3] ~@3 [c3,g3]!2 ~ c3 ~@2 [c3,g3] ~ [c3,g3] ~ g2 a2", // C5
  L: "[c3,g3]@2 [c3,g3]@2 [c3,g3]!2 ~ [c3,g3] ~ c3 [c3,g3] ~ [c3,g3] ~ a2 g2", M: "[c3,f3]@15 ~, f2 ~@15",
  N: "[c3,g3]@15 ~", O: "[d3,g3] [c3,f3]", P: "[c3,g3]",
  Q: "[g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2 ~ [g2,d3]!2 d3 [g2,d3] ~ [g2,d3]!2, ~@7 [g3,d4]@9", // G5
  R: "[c3,g3] ~ [c3,g3]!2 [c3,d3,g3] ~ [c3,g3] c3@2 [c3,g3]!3 [c3,g3]@2 [c3,g3]!2, ~@7 [c4,g4]@9, ~@7 g3 ~@8", // C5 Csus2 C5
  S: "[f2,c3] ~ c3 [f2,c3]!2 ~ c3 [f2,c3] ~ c3 [f2,c3]!2 [f2,c3]@2 [f2,c3]!2, ~@7 [f3,c4,f4]@9", // F5
  T: "[g2,d3] ~ g2 [g2,d3]!2 ~ [g2,d3]!2 ~ [g2,d3]!7, ~@7 [g3,d4,g4]@9", // G5
  U: "[g2,c3,f3,g3] ~ [g2,c3,a3] [g2,c3] [g2,c3,g3] ~ [g2,c3,a3] [g2,c3,g3] ~ [g2,c3,g3] [g2,c3,a3] [g2,c3] [g2,c3,g3] [g2,c3] [g2,c3,g3,a3] [g2,c3]", // Csus4 Am7 C5 Am7 C5 Am7 C5 Am7 …
  V: "[g2,c3,g3]@2 [g2,c3,a3] [g2,c3] [g2,c3,g3]@2 a3 [g2,c3,g3] [g2,c3] [g2,c3,g3] [g2,c3,a3] [g2,c3] [g2,c3,g3] [g2,c3] [g2,c3,a3] [g2,c3,g3]", // C5 Am7 C5 Am7 C5 Am7 C5
  W: "[f2,c3,f3]@2 [f2,d3] [f2,c3] [f2,c3,f3] ~ [f2,d3] [f2,c3,f3] ~ [f2,c3,f3] [f2,d3] [f2,c3] [f2,c3,f3] [f2,c3] ~ g3, ~@7 [d3,a3]", // F5 Dm F5 Dm F5 Dm F5 D5
  X: "[g2,c3,g3]@2 d3 [g2,c3] [g2,c3,g3]@2 [g2,c3,a3] [g2,c3,g3] ~ [g2,c3,g3] [g2,c3,a3] c3 [g2,c3,g3]!2 [d#3,e3]@2", // C5 Am7 C5 Am7 C5 Emaj7
  Y: "[g2,d3,g3]@2 [g2,d3]!3 ~ [g2,d3] [f2,c3,f3] ~ [f2,c3,f3] d3 c3 [f2,c3] f2 d3 c3, ~@2 g3 ~@3 f3@2", // G5 F5
  Z: "[g2,c3,d3,g3]@2 [g2,c3,a3] [g2,c3] [g2,c3,g3] ~ [g2,c3,a3] [g2,c3,g3] ~ [g2,d3,g3]!7", // Gsus4 Am7 C5 Am7 C5 G5
})).s("gm_distortion_guitar").gain(0.28).pan(1)

// chords · distortion guitar · "DIST E GI" · soft notes
const distortion_guitar_soft = note("<~@14 A B C D E F G ~ H ~ I J ~@4 K L M N O ~@2 K P ~@16>".pickRestart({
  A: "~@3 g2 g2@3 ~@9", B: "~@2 g3 c4 ~@5 g3 ~ [g3,c4] c4 ~@3", C: "~@10 f2 ~@2 f2 ~@2", D: "~@11 g2 ~ g2 ~@2",
  E: "~@14 c3 ~", F: "~@11 g3 ~@3 g3", G: "~@3 f2 ~@12", H: "~@2 [d3,g3] ~@3 g3 ~@4 f2 ~@4",
  I: "~ [c3,g3] c3 [c3,g3] ~@2 [c3,g3] g3 ~ c3 ~@6", J: "~@3 c3 ~@2 [c3,g3] ~@9", K: "~@11 g2 ~@4", L: "c#3 ~@15",
  M: "~@2 f2 ~@3 f2 ~@2 f2 ~@6", N: "~@2 d3 ~@13", O: "~@11 g3 ~@4", P: "~@10 f2!2 ~ c3 f2 ~",
})).s("gm_distortion_guitar").gain(0.16).pan(1)

// chords · electric guitar clean · "CLEAN E G"
const electric_guitar_clean = note("<~@8 A B C D E F ~@26 A B C G E H I ~@8>".pickRestart({
  A: "~ e3 g3 c4@3 c3!3 ~@2 e3 ~ g3 e3 c3, c3@3 ~@7 c3@2 c4@3 ~",
  B: "g2@2 ~@2 c4@3 c3!2 ~@3 g3 ~ c3!2, ~@2 c3@2 ~@6 c3@3 ~@3, ~@3 e3@4 ~@4 e3@2 c4@2 ~",
  C: "~@3 a3@3 a2 c3 [e2,f2] ~ f2 ~@2 f3 c3 f2, f2@2 f3@3 ~@7 a3@3 ~, ~ c3@5 ~@5 c3@2 ~@3", // Fmaj7
  D: "c3 ~@2 c4@3 ~ e3 g2 ~@2 c3 ~ c3 g2 e3, ~ e3@5 c3@2 ~@2 [g2,a2]@2 ~@4, ~@2 g3@4 ~@6 g3@3 ~", // Gsus2
  E: "~@2 d3 ~@3 g2 d3 f2 ~@2 a2 ~@2 f2 a2, g2@3 ~@7 f2@2 ~ c3@2 ~, ~ b2@2 g3@5 ~@4 f3@3 ~",
  F: "~@3 g3 ~ f3 ~ f3 ~ e3 g3 e3 ~ d3 g3 d3, g2 e3 ~ a3 ~@4, ~ c3@2 ~ c3@2 ~@2 c3@2 ~@2 g2@4",
  G: "~@3 c4@3 ~ e3 g2 ~@2 c3 ~ c3 g2 e3, ~ e3@5 c3@2 ~@2 [g2,a2]@2 ~@4, ~@2 g3@4 ~@6 g3@3 ~", // Gsus2
  H: "~ c3@2 ~ g3 c3@2 f3 ~ f3 ~ c3 e3 g3 ~ e3, g2@3 e3@3 ~@2 a3@3 ~@5", I: "~ d3 ~ g3 d3 ~@11, g2@5 ~@11",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.7)

// bass · electric bass finger · "FINGBASS"
const bass = note(`<
  ~@8 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF A B C D E AG AH ~@8
>`.pickRestart({
  A: "c2@5 ~@2 c2 c2@7 ~", B: "c2@6 ~ c2 c2@4 e1@4", C: "f1@4 ~@3 f1!2 ~ f1@4 f1@2, ~@14 g1 ~",
  D: "c2@4 ~@3 c2!2 ~ c2@4 a1@2", E: "g1@4 ~@3 g1 f1 ~ f1@4 f1@2", F: "c2@4 ~@3 c2!2 ~ c2@2 g1@2 a1@2",
  G: "g1@2 ~ g1 g1@2 ~ g1 ~ g1 ~ g1 c2 d2 [g1,g2] g2", H: "c2@2 ~ c2 c2@2 ~ c2 ~ c2 ~ c2 g1 a1 c2 d2",
  I: "f1@2 ~ f1 f1@2 ~ f1 ~ f1@2 d1 f1 d1 f1 f#1", J: "g1@2 ~ g1 g1@2 ~ g1 ~ g1 g2 g1 ~ g1 b1 g1",
  K: "c2@2 ~ c2!2 ~@3 c2@2 ~ c2 c2@3 ~", L: "c2@2 ~ c2 c2@2 g1 a1 c2 ~ c2 ~ c2 d2 g1 a1",
  M: "f1@4 ~@3 f1!2 ~ f1@2 f1!2 g1 a1", N: "c2@2 ~ c2!2 ~@3 c2 ~ c2@3 ~ a1@2",
  O: "g1@3 g1 g1@2 ~@2 f1 ~ f1@2 a1@2 c2 a1", P: "c2@4 d2@3 c2!2 ~ c2@2 g1 ~ g1@2",
  Q: "c2@2 ~ c2 c2@3 c2 ~ c2!2 ~ c2 ~ g1 a1", R: "c2@2 ~ c2!2 ~ c2!2 ~ c2!2 ~ c2 ~ a1 g1",
  S: "f1@2 ~ f1 f1@2 ~ f1 ~ f1 ~ f1 c2 d2 f2 a1", T: "c2@2 ~ c2 c2@3 c2@2 c2 ~ c2 g1 a1 c2 d2",
  U: "g1@2 ~ g1 g1@3 f1 ~ f1 ~ f1!2 g1 f1 g1", V: "c2@2 ~ c2 c2@2 ~ c2 ~ c2 e2 d2 c2 a1 c2 d2",
  W: "g1@2 ~ g1 g1@2 ~ g1 ~ g1 ~ g1!2 ~ g1 a1", X: "c2@2 ~ c2!2 ~@2 c2 ~ c2 ~ c2 e2 ~ c2 a1, ~@13 d2@2 ~",
  Y: "f1@2 ~ f1 f1@2 ~ f1 ~ f1 ~ f1!2 d1 f1 f#1", Z: "g1@2 ~ g1 g1@2 ~ g1 ~ g1 c2 d2 g2 d2 c2 g1",
  AA: "c2 ~@2 c2!2 ~@3 c2@2 ~ c2!2 ~ [g1,a1] a1", AB: "c2@2 ~@2 c2@4 a2 g2 e2 d2 c2 a1 g1 a1",
  AC: "f1@2 ~ f1!2 ~@2 f1 ~ f1 ~ f1 f1@2 a1@2", AD: "c2@2 ~ c2 c2@2 ~ c2 ~ c2 ~ c2!2 ~ d2 e2",
  AE: "g1@2 ~ g1 g1@2 ~ g1 f1!2 ~ f1!2 ~ f1!2", AF: "c2@2 ~ c2!2 ~ c2 c2@2 g1!7", AG: "c2@5 ~@4 c2 ~ c2 ~ c2@3",
  AH: "g1@3 a1@3 ~@10",
})).s("gm_electric_bass_finger").gain(0.35)

// drums · kick
const kick = s("bd").struct("<A@10 B A@3 C@3 D E@2 C F G H I J B K C H L@3 M N K C O C N A@2 B A@2 P ~@9>".pickRestart({
  A: "x!2", B: "x ~@3 x!2 ~@2", C: "x ~@6 x!2 ~ x ~@5", D: "x ~@4 x ~@2", E: "x ~@2 x ~@4 x ~ x ~@5",
  F: "x ~@6 x!2 ~ x!2 ~@4", G: "x ~@6 x!2 ~ x ~@4 x", H: "x ~@2 x ~@3 x ~@2 x ~@5", I: "x ~@6 x!2 ~@7",
  J: "x ~@3 x!3 ~", K: "x ~@2 x ~@3 x!2 ~ x ~@5", L: "x ~@6 x ~@2 x ~@5", M: "x ~@6 x ~ x ~@6",
  N: "x ~@2 x ~@4 x ~@2 x ~@4", O: "x ~@2 x ~@3 x!2 ~@4 x ~@2", P: "x ~@10 x ~@4",
})).gain(0.71)

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

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

// drums · hihat
const hihat = s("hh").struct("<~@8 A B@4 C ~@4 D E F G H I J K G L G M G N G O P@3 Q R S A B@4 T ~@9>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!6 ~@2", D: "~ x!7 ~ x!5 ~ x", E: "x!15 ~", F: "~@2 x!2 ~ x!9 ~ x", G: "~ x!13 ~ x",
  H: "~@2 x!12 ~ x", I: "~@2 x!4 ~ x ~@6 x ~", J: "~ x!9 ~@4 x ~", K: "~ x!5 ~ x!3 ~@4 x ~", L: "x!14 ~ x",
  M: "x!2 ~ x!7 ~ x!2 ~@3", N: "~ x!13 ~@2", O: "~ x!11 ~ x ~@2", P: "~@2 x!3 ~ x!8 ~@2", Q: "x ~ x!3 ~ x!9 ~",
  R: "~@2 x!3 ~ x!3 ~ x ~ x!2 ~@2", S: "x ~ x!3 ~ x!2 ~@8", T: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2",
})).gain(0.57)

// drums · mid tom
const mid_tom = s("mt").struct("<[~ x ~ x]!8 ~@21 [~@15 x] ~@25>").gain(0.71)

// drums · open hat
const open_hat = s("oh").struct("<~@13 A B@4 C ~ C@3 D E F C@3 E C G C A C@3 ~ C H ~@6 I ~@8>".pickRestart({
  A: "~@6 x!2", B: "~ x!15", C: "~@7 x", D: "~@7 x ~@4 x ~@3", E: "~@5 x!2 ~", F: "~@6 x ~@3 x ~ x ~@2 x",
  G: "~@14 x!2", H: "~@4 x!4", I: "x ~@2 x ~@12",
})).gain(0.43)

// drums · high tom
const high_tom = s("ht").struct("<~@29 [~@7 x] ~@25>").gain(0.71)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@5 A@4 B ~ A@3 C A@3 ~ A ~ A@7 ~ A ~ A ~@14>".pickRestart({
  A: "x", B: "x!2", C: "x ~@4 x ~@2",
})).gain(0.57)

stack(
  alto_sax, distortion_guitar, distortion_guitar_soft, electric_guitar_clean, bass, kick, snare, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash
)