Strudelify

Novocaine for the Soul

Eels

KeyC majorTempo82 bpm
0:00/0:00
// Novocaine for the Soul — Eels
// 82 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: ch 5 "strings" named as a string part, played on string ensemble 1 (its pad warm patch is not one)
// note: Full arrangement: all 67 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(82/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 · string ensemble 2 · "strings"
const string_ensemble_2 = note("<~@4 A B@2 ~@17 C@2 D E ~ F G F G F H@3 ~@8 I@4 J@12 K@3 ~@3>".pickRestart({
  A: "~@7 [d3,d4]", B: "[[d#3,d#4] [d3,d4] [b2,b3]@6]/2",
  C: "[~@6 [e3,e4]@6 [f3,f4]@6 [e3,e4]@5 ~ a#2@13 ~@11, ~@23 a#3@13 ~@12]/2", D: "~@2 [f3,f4] [e3,e4]",
  E: "[a#2,a#3]@13 ~@11", F: "[d#3,d#4] [d3,d4]", G: "[f3,f4] [e3,e4]", H: "[[f3,f4]@11 [e3,e4]@12 [d#3,d#4]@48 ~]/3",
  I: "[c2,e3,g3] [f2,f3,g#3], c4", J: "[[a#3,d4]@11 ~ a3@12 [g3,e4]@23 ~, f4@23 ~@25, ~@12 c4@35 ~]/2",
  K: "[[a#3,d4]@11 ~ a3@12 [g3,e4]@25 ~@23, f4@23 ~@49, ~@12 c4@37 ~@23]/3", // A# C
})).s("gm_string_ensemble_2").gain(0.26)

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@11 A B C D C E F@6 G D G D H ~ I J I J I J K@2 F@8 ~@4 G D G D G D G D G D G D G L M ~@3
>`.pickRestart({
  A: "c2 ~@2 c2@6 ~@2 c2 f2 ~@2 f2@8 g1", B: "c2 ~@2 c2@7 ~ c2 f2 ~@2 f2@8 g1", C: "a#1 ~@2 a#1@7 ~ a#1 f2 ~@2 f2@8 g1",
  D: "c2 ~@2 c2@7 ~ g1 c2 ~@2 c2@8 g1", E: "c2 ~@2 c2@9 ~@12", F: "c2 ~@2 c2@6 ~@2 c2 f2 ~@2 f2@4 ~@2 g1@2 ~",
  G: "[g1,a#1] ~@2 a#1@7 ~ a#1 f2 ~@2 f2@8 g1", H: "[g1,a#1] ~@2 a#1@7 ~ a#1 f2 ~@2 f2@8 ~", I: "d#2 a#1", J: "f2 e2",
  K: "[d#2@9 ~@2 d#2@2 ~ d#2 d#2@18 ~@2 d#2@2 ~ d#2 d#2@8 ~]/2", L: "c2 ~@2 c2@8 g1 c2 ~@2 c2@9", M: "~ g1 ~@22",
})).s("gm_electric_bass_finger").gain(0.31)

// other · string ensemble 1 · "strings"
const string_ensemble_1 = note("<~@49 A B A B A B A B A B A B A C D@3 ~>".pickRestart({
  A: "a#2@11 ~ f2@12", B: "c2@23 ~", C: "c2", D: "[~@2 a#2@14 f2@17 c2@39]/3",
})).s("gm_string_ensemble_1").gain(0.41)

// other · string ensemble 2 · "strings"
const string_ensemble_2_2 = note("<~@50 A B A B A C ~ D@2 E F@2 G ~@4>".pickRestart({
  A: "~@2 f4 e4", B: "a#3 ~", C: "a#3@11 ~@13", D: "[a#3@12 a3@11 g3@24 ~]/2", E: "a#3 a3",
  F: "[g3@23 a#3@12 ~ a3@12]/2", G: "g3",
})).s("gm_string_ensemble_2").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~@11 A@5 B A@11 ~ A@16 ~@4 A@13 C ~@4>".pickRestart({
  A: "x!2 ~@2 x!2 ~ x", B: "x!2 ~@6", C: "x ~@2 x ~@8 x ~@2 x ~@6 x ~",
})).gain(0.41)

// drums · rim
const rim = s("rim").struct("<~@17 A@10 B ~ A@16 ~@4 A@13 C ~@4>".pickRestart({
  A: "~ x ~ x", B: "~@6 x ~@16 x", C: "~@6 x ~@12 x ~@4",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct("<A B@10 C@5 D C@11 ~ C@16 ~@4 C@13 E F ~@3>".pickRestart({
  A: "~@20 x!2 ~ x", B: "x ~@4 x!2 ~@4 x!2 ~@4 x!2 ~ x ~@2 x", C: "~@6 x ~@4 x ~@2 x!2 ~@2 x ~@4 x",
  D: "~@6 x ~@4 x ~@12", E: "~@6 x ~@4 x ~@2 x!2 ~@3 x ~@4", F: "~ x ~@22",
})).gain(0.26)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~ [~ x ~ x ~ x ~ x]!10 ~@56>").gain(0.15)

// drums · hihat
const hihat = s("hh").struct("<~@11 A B@4 C A B@10 D A B@7 A B@3 A B@3 ~@4 B@13 E ~@4>".pickRestart({
  A: "~ x!4 ~ x ~", B: "x!5 ~ x ~", C: "x!4 ~@4", D: "x!4", E: "x ~@2 x ~@2 x ~@2 x ~@2 x ~@6 x ~@4",
})).gain(0.31)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@11 A@5 ~ A@11 ~ A@16 ~@4 A@14 ~@4>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.15)

// drums · open hat
const open_hat = s("oh").struct("<~@11 A@5 ~ A@11 ~ A@16 ~@4 A@13 B ~@4>".pickRestart({
  A: "~@7 x", B: "~@11 x",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@11 x ~@55>").gain(0.36)

// drums · ride
const ride = s("rd").struct("<~ [x ~@2 x ~ x!2 ~@2 x ~ x!2 ~@2 x ~ x!2 ~ x!2 ~ x]!10 ~@56>").gain(0.2)

stack(
  string_ensemble_2, bass, string_ensemble_1, string_ensemble_2_2, kick, rim, snare, snare_soft, hihat, hihat_soft,
  open_hat, crash, ride
)

More by Eels