Strudelify

Misery

Soul Asylum

KeyC majorTempo116 bpm
0:00/0:00
// Misery — Soul Asylum
// 116 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 5/4 at bar 17, 4/4 at bar 20, 5/4 at bar 49, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 125 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(116/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · "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.

// bass · electric bass finger · "bass"
const bass = note(`<
  ~ A@2 B@2 C D E F C G H I J K L@2 M N O@2 P Q R S T U V W X Y@8 Z@2 AA AB AC L AD AB AC L AE AF AG AH AI AJ AK AL AM
  AN AO AP AQ AR@3 AS AT AU AV AS AT AW@2 AX D E F C G H I J K L@2 J K L@2 J K L AY J K L AY AZ BA BB BC AZ BA BD BE BF
  BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT@2 BU@4 ~
>`.pickRestart({
  A: "[c2@14 ~ g1]/2", B: "[c2@11 e1 g1 a1 g1@2]/2", C: "c2@2 ~ c2@5", D: "b1@2 ~ b1@5", E: "a1@2 ~ a1@5",
  F: "f1@2 ~ f1@5", G: "e1@2 ~ e1@5", H: "a1@5 ~ a1@9 ~", I: "a1@4 ~@2 a1@3 ~ a1@2 b1@4",
  J: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", K: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
  L: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~", M: "f1 ~ f1@2 ~@2 f1@2 ~@2 f1 ~ f1@4",
  N: "c2@4 f1 ~ f1@2 ~@2 f1@2 ~@2 f1@2", O: "[d2@4 c2@3 ~ f2 ~ f2@4 e2@4 c2@2 d2@4 c2@6 b1@2]/2",
  P: "~@2 b1@2 a1@3 ~ g1 ~ g1 ~ g1@2 f1@2", Q: "~@2 f1 ~ f1@2 e1@3 ~ e1 ~ e1@2 g1@2",
  R: "~@2 g1 ~ g1 ~@3 c2 ~ c2@4 g1@2", S: "~@2 g1@4 f1@3 ~ f1@5 ~", T: "f1@2 g1@2 a1@3 ~ c2 ~ c2@4 g1@2",
  U: "~@2 g1 ~ g1@2 a1@3 ~ a1 ~ a1@2 f1@2", V: "~@2 f1 ~ f1@4 c2 ~ c2 ~ c2@2 d2@2",
  W: "~@2 d2 ~ d2@2 e2@3 ~ e2 ~ e2@2 f2@2", X: "~ f2 e2@2 c2@3 g1",
  Y: "[~@3 f1@17 c2@2 ~ c2@5 b1@2 ~ b1@5 a1@2 ~ a1@5 f1@2 ~ f1@5 c2@2 ~ c2@5 e1@2 ~ e1, ~@40 g1 ~@87]/8",
  Z: "[~@8 a1@5 ~ a1@9 ~ a1@4 ~@2 a1@2]/2", AA: "~@2 a1@2 b1@4 c2 ~ c2 ~ c2 ~ c2 ~",
  AB: "c2 ~ c2 ~ c2 ~ c2 ~ g1 ~ g1 ~ g1 ~ g1 ~", AC: "g1 ~ g1 ~ g1 ~ g1 ~ f1 ~ f1 ~ f1 ~ f1 ~",
  AD: "f1 ~ f1 ~ f1 ~ f1 ~ c2 ~ c2 ~ c2 ~ c2 ~", AE: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1@2 ~@2 f1@2",
  AF: "~@2 f1 ~ f1@4 c2@4 f1 ~ f1@2", AG: "~@2 f1@2 ~@2 f1@2 d2@4 c2@3 ~", AH: "f2 ~ f2@4 e2@4 c2@2 d2@4",
  AI: "c2@6 b1@3 ~ b1@2 a1@3 ~", AJ: "g1 ~ g1 ~ g1@2 f1@3 ~ f1 ~ f1@2 e1@2", AK: "~@2 e1 ~ e1@2 g1@3 ~ g1 ~ g1 ~@3",
  AL: "c2 ~ c2@4 g1@3 ~ g1@4 f1@2", AM: "~@2 f1@5 ~ f1@2 g1@2 a1@3 ~", AN: "c2 ~ c2@4 g1@3 ~ g1 ~ g1@2 a1@2",
  AO: "~@2 a1 ~ a1@2 f1@3 ~ f1 ~ f1@4", AP: "c2 ~ c2 ~ c2@2 d2@3 ~ d2 ~ d2@2 e2@2", AQ: "~@2 e2 ~ e2@2 f2@4 f2@2 e2@4",
  AR: "[c2@3 g1@4 f1@17]/3", AS: "a1@4 ~@2 a1@3 ~ a1 ~ a1@4", AT: "e1@4 ~@2 e1@3 ~ e1 ~ e1@4",
  AU: "d2@5 ~ c#2@3 ~ c#2 ~ c#2@4", AV: "b1@5 ~ c#2@3 ~ d2 ~ d2@3 ~", AW: "f#1/2", AX: "c2@2 ~ c2@5, g1 ~@15",
  AY: "f1@2 g1@2 a1 ~ f1 ~ f1@2 g1@2 a1@2 ~@2", AZ: "c2 ~ c2 ~ c2@2 c2@3 ~ c2@2 c2 ~@3",
  BA: "g2@2 g2 ~ g2@2 g2@4 g2@2 g2@2 ~@2", BB: "f2@2 f2@2 ~@2 c2@2 f2@2 f2@2 ~@2 c2 ~", BC: "f2!2 ~ c2 f2@2 e2 ~",
  BD: "f2@2 f2 ~ f2@2 e2@4 e2@2 d2 ~ d2 ~", BE: "f2 ~ f2@2 f2 ~ e2@2 e2@2 e2@2 d2@2 d2@2",
  BF: "c2@2 c2@2 c2@2 c2@3 ~ c2@2 c2@3 ~", BG: "d2 ~ d2@2 d2@2 d2@2 d2 ~ d2@2 d2 ~ d2@2", BH: "f2!5 f2@2 f2",
  BI: "f2 ~ f2@3 ~ e2@2 e2 ~ e2@2 d2@2 d2@2", BJ: "c2 ~ c2 ~ c2 ~ c2@2 c2 ~ c2@2 c2 ~ c2@2",
  BK: "g1@2 g1@2 g1 ~ g1@2 g1 ~ g1@2 g1@2 g1@2", BL: "f2 e2 d2 c2@2 b1@2 a1", BM: "~@2 a1@2 g1@2 f1@3 ~ f1@2 f1 ~ g1@2",
  BN: "c2@2 c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2", BO: "~ g2!2 g2@2 g2!3", BP: "f2@2 f2@2 ~@2 c2 ~ f2@2 f2@2 ~@2 c2@2",
  BQ: "f2@2 f2@2 ~@2 c2 ~ f2 ~ f2@2 e2@3 ~", BR: "c2@2 c2 ~ c2@2 c2@4 c2@2 c2@3 ~",
  BS: "g2@2 g2@2 g2 ~ g2@2 g2 ~ g2@2 g2@2 ~@2", BT: "f2@2 f2@2 f2@2 e2@4 e2@2 d2@2 d2 ~", BU: "c2/4",
})).s("gm_electric_bass_finger").gain(0.27)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@80 [x!7 ~]!6 [~ x ~@6] ~@38>").gain(0.3)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@85 [x!8] [x!2 ~ x!3 ~@2] ~@38>").gain(0.24)

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

// drums · low tom
const low_tom = s("lt").struct("<~@4 A ~@25 B ~ C ~@28 D ~ A ~@7 A ~@53>".pickRestart({
  A: "~@5 x!2 ~", B: "~ x ~@2", C: "~ x!2 ~@5", D: "~@3 x",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@29 A B ~ C ~@28 D ~ E ~@7 E ~@53>".pickRestart({
  A: "~@7 x", B: "x!2 ~@6", C: "~ x!2 ~@5", D: "~@3 x!3 ~@2", E: "~@5 x!2 ~",
})).gain(0.48)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@12 A ~@3 A ~ B C ~@9 D E ~@9 C ~@3 C ~@3 C D A ~@10 F ~@2 B@3 G B@3 ~@8 A ~@8 B@6 H I B@6 H I B@6 H I B@6 H I B ~@4
>`.pickRestart({
  A: "~@3 x", B: "x", C: "~ x ~@2", D: "~ x", E: "~@3 x ~@4", F: "x ~@6 x", G: "~@3 x ~@2 x ~", H: "x ~@2 x ~@2 x ~",
  I: "~ x ~@2 x ~@3",
})).gain(0.42)

stack(bass, kick, kick_soft, snare, snare_soft, hihat, low_tom, mid_tom, open_hat, crash)

More by Soul Asylum