Strudelify

Self Esteem

The Offspring

KeyC majorTempo108 bpm
0:00/0:00
// Self Esteem — The Offspring
// 108 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 "MUTED GTR" electric guitar muted (copy of ch 2 "FINGERDBAS" electric bass finger)
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): OVERDRIVE.
setcpm(108/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@2 A B C B D E F G H I F G J G J G J I F G J G J G J K A B C B A B C B F G J G J G J K A B C B A B C B L M N M L M N
  M L M N M L O D E F G H I F G J G J G J I F G J G J G J K A B C B A B C B L M N M L M N M L M N M L O D E P
>`.pickRestart({
  A: "a1@4 a1 ~ a1@2 f2@2 f2@2 f2@2 f2@2", B: "c2@4 c2@2 c2 ~ c2@2 g1 ~ g1@2 g1@2",
  C: "a1@4 a1@2 a1@2 f2@2 f2 ~ f2@2 f2@2", D: "f1@4 f1@2 f1@2 f1@2 f1 ~ f1 ~ f1 ~",
  E: "f1@2 f1@2 f1@2 f1@2 g1 g1@2 g1 g1@2 g1@2", F: "a2!5 ~@6 f2!5", G: "c2 c3!4 ~@6 g2!5", H: "a1 a2!4 ~@6 f2!5",
  I: "c2 c3!4 ~@3 g1 g2@2 g1 g2@3 ~", J: "g2 a2!4 ~@6 f2!5", K: "c2 c3@2 c2 c3@6 g2@2 g2@2 g2@2",
  L: "d2@4 d2 ~ d2@2 a#1@2 a#1@2 a#1@2 a#1@2", M: "f1@2 f1@2 f1@2 f1 ~ c2@2 c2 ~ c2@2 c2@2",
  N: "d2@4 d2@2 d2@2 a#1@2 a#1 ~ a#1@2 a#1@2", O: "c2@2 c2@2 c2@2 c2 ~ g1@2 g1 ~ g1@2 g1@2", P: "a1@3 ~@13",
})).s("gm_electric_bass_finger").gain(0.52).pan(0.6)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~ A B C B C D E F ~@2 G ~@7 G H I J I J I J K B L B M B L B M ~@3 N J I J K B L B M B L B M O P O Q O P O Q O P O Q O
  R D E F ~@2 G ~@7 G H I J I J I J S B L B M B L B M O P O Q O P O Q O P O Q O R D E F
>`.pickRestart({
  A: "~@7 [e2,a2]", B: "[e2,a2,e3]@2 [e2,a2,e3]@2 [f2,c3,f3]!2 [f2,c3,f3]@2",
  C: "[g2,c3,g3]@2 [g2,c3,g3]@2 [g2,c3,g3] [g2,d3,g3] [g2,d3,g3]@2", // C5 G5
  D: "[f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~", // F5
  E: "[f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [g2,d3,g3] [g2,d3,g3]@2 [g2,d3,g3] [g2,d3,g3]@2 [g2,d3,g3]@2", // F5 G5
  F: "[a2,e3,a3] ~@7", G: "~@6 [g2,d3,g3]@6 [g2,d3,g3]@3 ~",
  H: "a2!3 [a2,e3,a3] [a2,e3,a3]@2 ~@4 f3 [f2,c3,f3]!5, [e3,a3]@3 ~@13", I: "[c3,g3,c4]!5 ~@6 [g2,d3,g3]!5",
  J: "[g2,d3,g3] [a2,e3,a3]!4 ~@6 [f2,c3,f3]!5", K: "[c3,g3] [c3,g3,c4]@2 c3 [c3,g3,c4]@6 [g2,d3]@2 [g2,d3,g3]@4",
  L: "[g2,c3,g3]@2 [g2,c3,g3]@2 [g2,c3,g3] [g2,d3,g3] g2!2, ~@3 [d3,g3]", // C5 G5
  M: "[g2,c3,g3]@4 [g2,c3,g3]@4 [g2,c3,g3]@2 [g2,d3,g3]@2 g2@2 g2!2, ~@3 [d3,g3]", N: "~@14 [g2,d3,g3]!2",
  O: "[d3,a3,d4]@2 [d3,a3,d4]@2 [a#2,f3,a#3]!2 [a#2,f3,a#3]@2", // D5 A#5
  P: "[c3,f3,c4]@2 [c3,f3,c4]@2 [c3,g3,c4]!2 c3!2, ~@3 [g3,c4]", // F5 C5
  Q: "[c3,f3,c4]@4 [c3,f3,c4]@4 ~ c3 ~ c3!5, ~@4 [c3,g3,c4]!2 [g3,c4]@2", // F5 C5
  R: "[c3,g3,c4]@2 [c3,g3,c4]@2 [g2,d3,g3]!2 g2!2, ~@3 [d3,g3]", // C5 G5
  S: "[c3,g3] [c3,g3,c4]@2 c3 [c3,g3,c4]@6 [g2,d3,g3]@2 [g2,d3,g3]@4", // C5 G5
})).s("gm_distortion_guitar").gain(0.52).pan(0.3)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@29 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@37 A ~ A ~ A ~ A ~@17>".pickRestart({
  A: "~ d3",
})).s("gm_overdriven_guitar").gain(0.44).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A B A B C D E@3 F E@7 F E@7 G A B A B A B A B E@7 G A B A B A B A B A B A B A B A B A B A B A B C D E@3 F E@7 F
  E@7 G A B A B A B A B A B A B A B A B A B A B A B C D C
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~@3 x ~@5", B: "x ~@2 x ~@2 x ~@3 x ~@3 x ~", C: "x", D: "~@8 x ~@2 x ~@2 x ~",
  E: "x ~@2 x ~@7 x ~ x ~@2", F: "x ~@2 x ~@4 x ~@2 x ~@2 x ~", G: "x ~@2 x ~@2 x ~ x ~ x ~@3 x ~",
})).gain(0.56)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A@4 ~ B C D@2 E C D C D C D@2 E C D C D C D@2 F G H G I G@3 J C D C D C D@2 F G H G I G@3 I G H G K G H G K G H G
  K G L ~ B C D@2 E C D C D C D@2 M C D C D C D@2 N G H G I G@3 I G H G K G H G K G H G K G L ~ B ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@9 x ~@2 x ~@3", C: "~@4 x ~@7 x ~@2 x", D: "~ x ~@2 x ~@7 x ~@2 x",
  E: "~ x ~@2 x ~@4 x ~@2 x ~@3", F: "~ x ~@2 x ~@7 x ~@3", G: "~@4 x ~@2 x ~ x ~@2 x ~@2 x",
  H: "~@4 x ~@2 x!3 ~@2 x ~@2 x", I: "~@4 x ~@2 x ~ x ~@2 x ~ x!2", J: "~@4 x ~@2 x ~ x ~@2 x!4",
  K: "~@4 x ~@2 x ~ x!7", L: "~@4 x ~@2 x!3 ~@2 x ~ x!2", M: "~ x ~@2 x ~@4 x ~@2 x ~ x!2", N: "~ x ~@2 x ~@7 x ~ x!2",
})).gain(0.56)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@2 A@4 ~@22 B C B D B@3 D ~@8 B C B D B@3 D B C B D B C B D B C B D B ~@23 B C B D B@3 D B C B D B C B D B C B D B
  ~@4
>`.pickRestart({
  A: "~@7 x!3 ~@4 x!2", B: "~@4 x ~@2 x", C: "~@7 x", D: "~ x",
})).gain(0.24)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@3 B A@7 B A@7 C ~@8 A@7 D ~@24 A@3 B A@7 B A@7 C ~@25>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~@2 x ~@4", C: "x ~@2 x ~@4 x ~ x ~@3 x ~", D: "x ~@2 x ~@12",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@6 A B ~@58 C B ~@42 C B ~>".pickRestart({
  A: "~@5 x!3", B: "x!5 ~@3", C: "~@4 x!4",
})).gain(0.48)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@6 [~@2 x!3 ~@3] ~@59 [~@2 x!2 ~@4] ~@43 [~@2 x!2 ~@4] ~@2>").gain(0.24)

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

// drums · high tom
const high_tom = s("ht").struct("<~@6 A B ~@58 C B ~@42 C B ~>".pickRestart({
  A: "~@5 x!3", B: "x!5 ~@3", C: "~@4 x!4",
})).gain(0.48)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@6 [~@2 x!3 ~@3] ~@59 [~@2 x!2 ~@4] ~@43 [~@2 x!2 ~@4] ~@2>").gain(0.24)

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

// drums · ride
const ride = s("rd").struct("<~@52 A B A C A B A C A B A C A B ~@30 A B A C A B A C ~@9>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!5 ~@3",
})).gain(0.48)

stack(
  bass, distortion_guitar, overdriven_guitar, kick, snare, snare_soft, hihat, mid_tom, mid_tom_soft, open_hat, high_tom,
  high_tom_soft, crash, ride
)

More by The Offspring