Strudelify

(She Sells) Sanctuary

The Cult

KeyG majorTempo140 bpm
0:00/0:00
// (She Sells) Sanctuary — The Cult
// 140 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 137 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 27, guitar program 25, guitar program 27.
setcpm(140/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 · electric guitar clean
const electric_guitar_clean = note(`<
  A@6 B@3 C D E F C D E F ~@8 G H I J G H I J ~@16 C D E F C D E F ~@8 G H I J G H I J ~@32 K@4 L@4 G H I J G H I J G H
  I J G H I J M@8
>`.pickRestart({
  A: "[~@30 a3@9 ~@7 b4@2, ~@7 d3@3 d3@3 d3@3 d3@3 d3@2 d3@2 d3@3 d3@3 d3@10 d3@3 d3@3 d3@3, ~@8 a4@3 g4@3 f#4@3 d4@3 c4@2 d4@2 c4@3 d4@3 ~@10 a4@3 g4@3 ~@2]/6",
  B: "[~@14 d5@9 ~, d3@3 d3@2 d3@2 d3@3 d3@3 d3@10 ~, ~ a4@3 g4@2 a4@2 g4@3 a4@3 ~@10]/3", C: "a4!3 g4!3 f#4!2",
  D: "f#4 ~@3 c4!2 ~@2", E: "~@6 a3!2", F: "~ f#4 ~ d3 ~@3 a3", G: "a4@2 a4!6", H: "b4@2 a4@2 a4!4",
  I: "g4@2 g4!3 f#4 g4 f#4", J: "~ f#4 ~ d3 ~@3 c4",
  K: "[~@22 a3@9 ~, a4@3 g4@3 f#4@3 d4@3 c4@2 d4@2 c4@3 d4@3 ~@10, ~@2 d3@3 d3@3 d3@3 d3@2 d3@2 d3@3 d3@3 d3@10 ~]/4",
  L: "[~@22 d5@9 ~, a4@3 g4@3 b4@3 a4@3 g4@2 a4@2 g4@3 a4@3 ~@10, ~@2 d3@3 d3@3 d3@3 d3@2 d3@2 d3@3 d3@3 d3@10 ~]/4",
  M: "[~@22 a3@9 ~@23 d5@9 ~, a4@3 g4@3 f#4@3 d4@3 c4@2 d4@2 c4@3 d4@3 ~@10 a4@3 g4@3 b4@3 a4@3 g4@2 a4@2 g4@3 a4@3 ~@10, ~@2 d3@3 d3@3 d3@3 d3@2 d3@2 d3@3 d3@3 d3@10 d3@3 d3@3 d3@3 d3@3 d3@2 d3@2 d3@3 d3@3 d3@10 ~]/8",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.6)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@9 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@3 C ~@3 C A@2 B C A@2 B C A@2 B C
  A@2 B C ~@8
>`.pickRestart({
  A: "[d3,d4]!8", B: "[d3,c4]!8", C: "[g2,b2,d3,g3,b3,g4]!2 [g2,b2,d3,g3,b3,g4]@2 [g2,b2,d3,g3,b3,g4]!4",
})).s("gm_overdriven_guitar").gain(0.25)

// bass · fretless bass
const bass = note(`<
  ~@9 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B
  C A@2 B C ~@8
>`.pickRestart({
  A: "d2@2 d2!6", B: "c2!8", C: "g1!8",
})).s("gm_fretless_bass").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@8 [~@5 x ~@2] [x!2]!96 [x!4]!7 [x ~ x ~ x!2 ~@2] [x!2]!16 ~@8>").gain(0.48)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3
  C B@3 C B@3 C B@3 C B@3 C B@3 C ~@7 A B@16 ~@8
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@7 x ~ x!2",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@9 [~ x ~ x ~ x ~ x]!120 ~@8>").gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@13 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@11
>`.pickRestart({
  A: "x",
})).gain(0.48)

stack(electric_guitar_clean, overdriven_guitar, bass, kick, snare, hihat, crash)

More by The Cult