Strudelify

Rebel Rouser

Eddy Duane

KeyG majorTempo198 bpm
0:00/0:00
// Rebel Rouser — Eddy Duane
// 198 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 120 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(198/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@17 A@4 B@2 A@6 C@2 A@6 B@2 A@6 C@2 A@2 D@4 E@2 D@6 F@2 D@2 G@4 C@2 G@6 H@2 G@2 I@4 F@2 I@6 J@2 I@6 F@2 I@6 J@2 I@6
  F@2 K
>`.pickRestart({
  A: "e2 b1", B: "a1 e2", C: "b1 f#2", D: "f2 c2", E: "a#1 f2", F: "c2 g2", G: "f#2 c#2", H: "c#2 g#2", I: "g2 d2",
  J: "d2 a2", K: "g2@5 ~@11",
})).s("gm_acoustic_bass").gain(0.38)

// other · tenor sax
const tenor_sax = note(`<
  ~@33 A B A B A B A C A C A B A B A B D E D E D E D F D F D E D E D G H@2 I J K@2 L M N O P Q R S@3 ~@16 T U T U T U T
  V T V T U T U T U W X W Y Z X ~
>`.pickRestart({
  A: "~@2 e4@4 c#4 ~", B: "e4@3 ~@13", C: "e4 ~@7", D: "~@2 f4@4 d4 ~", E: "f4@3 ~@13", F: "f4 ~@7", G: "f4@3 ~ f4@4",
  H: "[f#4@3 f#4@8 ~ f4@4]/2", I: "f#4@3 f#4@5", J: "~ f#4!3", K: "[g#4@8 f#4@11 ~ f#4@2 f#4 ~ f#4@2 f#4 ~ f#4@4]/2",
  L: "c#5 f#4", M: "~@4 f#4@2 f#4 ~ f#4@2 f#4 ~ f#4@4", N: "a#4 f#4", O: "~@4 f#4@2 f#4 ~ a#4@4 b4@4",
  P: "a#4 f#4 f#4@2", Q: "~@3 f#4@2 f#4@2 ~ a#4@3 b4@2 c5@2 ~", R: "c5@7 ~",
  S: "[a#4@4 f#4@2 f#4 ~ a#4@12 f#4@2 f#4@5 ~ d#4@2 f#4@9 ~@9]/3", T: "~@2 g4@4 e4 ~", U: "g4@3 ~@13", V: "g4 ~@7",
  W: "~@2 a4@9 ~ g4@3 ~", X: "g4 ~@3", Y: "g4@3 ~@5", Z: "~ g4@2 ~",
})).s("gm_tenor_sax").gain(0.38).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@17 [x!2]!103>").gain(0.59)

// drums · clap
const clap = s("cp").struct("<~@17 [~ x ~ x]!102 [~ x ~@2]>").gain(0.39)

// drums · snare
const snare = s("sd").struct("<~@16 A B@15 C B@15 C B@15 C B@15 C B@15 C B@15 C B@6 D>".pickRestart({
  A: "~@5 x!2 ~", B: "~ x ~ x", C: "~@2 x ~@2 x!2 ~", D: "~ x ~@2",
})).gain(0.59)

// drums · hihat
const hihat = s("hh").struct("<~@17 A@15 B A@15 B A@15 B A@15 B A@15 B A@15 B A@6 B>".pickRestart({
  A: "x!4", B: "x!3 ~",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct("<~@32 A ~@15 A ~@15 A ~@15 A ~@15 A ~@15 A ~@7>".pickRestart({
  A: "~@3 x",
})).gain(0.52)

stack(bass, tenor_sax, kick, clap, snare, hihat, open_hat)