Strudelify

Ebeneezer Goode

The Shamen

KeyE minorTempo127 bpm
0:00/0:00
// Ebeneezer Goode — The Shamen
// 127 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(127/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.

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@4 A B A B A B A ~ A B A B A B ~@2 A B A B A B A B A B A B A B ~@2 A B A B A B A B ~@4 A B A B A B A B A B A B A B A
  B A B A B A B A B A B ~@2 A B A B A B A B ~@8 A B A B A B ~@2 A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "e1!3 ~ e1 ~ e1 b1 ~ b1 ~ b1!2 ~ b1!2", B: "a1!3 ~ a1 ~ a1!2 e1!2 ~ e1!2 ~ e1!2",
})).s("gm_synth_bass_1").gain(0.45)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@4 A B A B A B A B A B A B A B A B ~@4 C D C D C D C D C D C D A B A B A B A B ~@4 A B A B A B A B E@20 A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "[e4,b4]!3 ~ [e4,b4] ~ [e4,b4] ~ [e4,b4]!2 ~ [e4,b4] ~ [e4,b4]!2 ~", // E5
  B: "e4!3 ~ e4 ~ e4 ~ [b3,e4]!2 ~ [b3,e4] ~ [b3,e4]!2 ~", // E5
  C: "[b3,e4]!3 ~ [b3,e4] ~ [b3,e4] ~ [b3,e4]!2 ~ [b3,e4] ~ [b3,e4]!2 ~", // E5
  D: "[a3,e4]!3 ~ [a3,e4] ~ [a3,e4] ~ [e4,b4]!2 ~ [e4,b4] ~ [e4,b4]!2 ~", E: "e2!16",
})).s("gm_lead_2_sawtooth").gain(0.2).pan(0.3)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note(`<
  ~@36 A B A C D B A C ~ B ~@30 A B A B A B A B ~ B ~ B A ~ A B ~@8 A ~ A ~ A ~ A B ~ B ~ B A ~ A B ~
>`.pickRestart({
  A: "e5@2 d5 b4 ~@2 e5@2 d5 b4 ~@6", B: "~@5 b4 d5 f#5 e5@2 d5 b4 ~@4", C: "~@5 b4 d5 f#5 e5 ~ d5 b4 ~@4",
  D: "e5 ~ d5 b4 ~@2 e5@2 d5 b4 ~@6",
})).s("gm_synth_brass_1").gain(0.45)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@4 A B A B A B A B A B A B A B A B ~@16 A B A B A B A B ~@4 A B A B A B A B ~@20 A B A B A B A B ~@8 A B A B A B A B
  A B A B A B A B A B A B A B A C@2
>`.pickRestart({
  A: "[g4,b4,e5] [f#4,b4,d5]", B: "[e4,a4,c#5] [e4,g4,b4]", C: "[[e4,a4,c#5]@8 [g4,b4]@17 ~@7, ~ e4 ~@2]/2",
})).s("gm_synth_strings_1").gain(0.25)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@4 A@4 B@4 ~@36 A@4 B@4 ~@36 A@4 B@4 ~@17>".pickRestart({
  A: "[[e3,b3]@31 ~]/4", B: "[[e3,b3]@63 ~]/4",
})).s("gm_overdriven_guitar").gain(0.35).pan(0.3)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@4 A B@3 A B@3 ~@36 A B@3 A B@3 ~@36 A B@3 A B@3 ~@17>".pickRestart({
  A: "e3 d4", B: "[c#4 g3@5]/3",
})).s("gm_distortion_guitar").gain(0.4).pan(0.7)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note("<~@28 A B A B A B A B ~@8 A B A C ~@69>".pickRestart({
  A: "[e4,g4] [d4,f#4], b4", B: "[e4,a4,c#5] [g4,b4,d5]", C: "[e4,a4,c#5]@8 [g4,b4,d5]@3 ~@5",
})).s("gm_synth_strings_2").gain(0.25)

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

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

// drums · clap
const clap = s("cp").struct("<~@56 [~ x ~ x]!19 ~@21 [~ x ~ x]!4 ~@17>").gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@96 [x ~ x ~@4 x ~ x!2 ~@5]!4 ~@17>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@3 B A@34 B ~ A@12 ~@4 A@28 ~@8 A@15 C ~>".pickRestart({
  A: "x!4", B: "x", C: "x ~@3 x ~@3 x ~@3 x ~@2 x",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A@3 ~ A@34 ~@2 A@12 ~@4 A@28 ~@8 A@16 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~ A ~ A ~ A ~ A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~ A ~ A ~ A ~@9 A ~@3 A ~@3 A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A B ~
>`.pickRestart({
  A: "x", B: "~@15 x",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@8 A@3 B A@34 B ~ A@44 C@8 A@16 ~>".pickRestart({
  A: "x!8", B: "x", C: "x!3 ~ x ~ x!7 ~ x ~",
})).gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 A@3 ~ A@34 ~@2 A@12 ~@4 A@28 ~@8 A@16 ~>".pickRestart({
  A: "~ x ~@5 x ~ x ~ x ~@4",
})).gain(0.2)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@92 [x!2 ~ x!3 ~ x]!8 ~@17>").gain(1.51)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@92 [~ x ~ x]!8 ~@17>").gain(1.01)

stack(
  bass, lead_2_sawtooth, synth_brass_1, synth_strings_1, overdriven_guitar, distortion_guitar, synth_strings_2, kick,
  snare, clap, low_tom, hihat, open_hat, crash, ride, tambourine, cabasa, cabasa_soft
)

More by The Shamen