Strudelify

Woolly Bully

SAM

KeyG majorTempo128 bpm
0:00/0:00
// Woolly Bully — SAM
// 128 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: track names are the Roland MT-32 patch names at their program numbers ("Bass" on 64, "Guitar, rhythm" on 62, "Sax" on 78), so with no bank select the whole file is read through the MT-32 patch table: ch 2 "Organ-GM" Elec Org 4 -> drawbar organ; ch 3 "Bass" Acou Bass 1 -> acoustic bass; ch 4 "Guitar, rhythm" Elec Gtr 2 -> overdriven guitar; ch 5 "Sax" Sax 1 -> soprano sax
// note: Full arrangement: all 79 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/4)

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

// chords · drawbar organ · "Organ-GM"
const drawbar_organ = note(`<
  ~@3 A@4 B@2 A@2 C B A@9 B@2 A@2 C B A D A@7 B@2 A@2 C B A D ~@3 A@4 B@2 A@2 C B A@9 B@2 A@2 C B A D ~@4
>`.pickRestart({
  A: "[g4,b4] ~ [g4,b4] ~ [g4,b4] ~ [g4,b4] ~ [g4,b4] ~ [g4,b4] ~ [g4,b4] ~ [g4,b4] ~", // G
  B: "[g4,a#4] ~ [g4,a#4] ~ [g4,a#4] ~ [g4,a#4] ~ [g4,a#4] ~ [g4,a#4] ~ [g4,a#4] ~ [g4,a#4] ~", // Gm
  C: "[a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~ [a4,c5] ~", // Am
  D: "~ [a4,c5,d5] ~ [a4,c5,d5] ~ [a4,c5,d5]!2 ~", // D7
})).s("gm_drawbar_organ").gain(0.46)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A B C D@4 E F D@2 G H D I D@7 E F D@2 G H D J D@7 E F D@2 G H D J A B K D@4 E F D@2 G H D I D@7 E F D@2 G H D J A B C
  L
>`.pickRestart({
  A: "g2@5 ~@3 g2@5 ~@3", B: "g2 ~ g2 ~ g2 ~ g2 ~", C: "g2@3 ~ g2@2 ~@2 g2@3 ~ g2@3 ~", D: "g2!3 f2 d2!2 f2 f#2",
  E: "c2!2 g2!2 c2!2 g2!2", F: "c2!2 g2!2 c2!2 e2 f2", G: "d2!2 a2!2 d2!2 a2!2", H: "c2!2 g2!2 c2!2 f2 f#2",
  I: "g2@2 g2@2 g2@2 f2@2 d2@2 d2@2 f2@2 f#2 ~", J: "~ d2 ~ d2 ~ d2!2 ~", K: "g2@3 ~ g2@2 ~@2 g2@3 ~ g2@2 ~@2",
  L: "g2 ~@7",
})).s("gm_acoustic_bass").gain(0.8)

// chords · overdriven guitar · "Guitar, rhythm"
const overdriven_guitar = note(`<
  A B@2 C@4 D@2 C@2 E F C@9 D@2 C@2 E F C G C@7 D@2 C@2 E F C G A B@2 C@4 D@2 C@2 E F C@9 D@2 C@2 E F C G A B@2 H
>`.pickRestart({
  A: "[b3,d4,g4]!2", B: "[b3,d4,g4]!4", C: "~ [b3,d4,f4,g4] ~ [b3,d4,f4,g4]", D: "~ [c4,e4,g4,a#4] ~ [c4,e4,g4,a#4]",
  E: "~ [c4,e4,a4] ~ [c4,e4,a4]", F: "~ [a#3,d4,g4] ~ [a#3,d4,g4]", G: "~ [a3,c4,d4] ~ [a3,c4,d4] ~ [a3,c4,d4]!2 ~",
  H: "[b3,d4,g4] ~@3", // G
})).s("gm_overdriven_guitar").gain(0.46)

// drums · kick
const kick = s("bd").struct("<A B@2 C@42 A B@2 C@27 A B@2 D>".pickRestart({
  A: "x!2", B: "x!4", C: "x!2 ~@2 x ~@3", D: "x",
})).gain(0.56)

// drums · rim
const rim = s("rim").struct("<~@3 [x!8]!42 ~@3 [x!8]!27 ~@4>").gain(0.72)

// drums · snare
const snare = s("sd").struct("<~@3 [~ x ~ x]!72 ~@4>").gain(0.56)

// drums · hihat
const hihat = s("hh").struct("<~@3 [~ x ~ x ~ x ~ x]!42 ~@3 [~ x ~ x ~ x ~ x]!27 ~@4>").gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@3 [x!4]!42 ~@3 [x!4]!27 ~@4>").gain(0.56)

// drums · crash
const crash = s("cr").struct("<A B C D ~@41 A B C ~@27 A B@2 ~>".pickRestart({
  A: "x!2", B: "x!4", C: "x!3 ~", D: "x",
})).gain(0.56)

stack(drawbar_organ, bass, overdriven_guitar, kick, rim, snare, hihat, open_hat, crash)