Strudelify

Tubthumping

Chumbawamba

KeyD majorTempo105 bpm
0:00/0:00
// Tubthumping — Chumbawamba
// 105 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 9 "vocals" voice oohs (copy of ch 8 "vocals" synth choir)
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar.
setcpm(105/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.

// other · electric guitar clean · "guitar" · D B5 A
const electric_guitar_clean = note(`<
  [[d3,f#3,d4]@4 [d3,f#3,d4]@2 [f#3,b3]@4 [f#3,b3]@2 [f#3,b3]!4, a3, ~@3 b2@5]!3
  [[c#3,e3,a3]!5 ~@3, a2@5 ~@3]
  ~@12
  [~@3 [a3,a4] [a3,a4,a5]@2 ~@5 [a3,a4] [a3,a4,a5]@2 ~@2]!4
  ~@16
  [~@3 [a3,a4] [a3,a4,a5]@2 ~@5 [a3,a4] [a3,a4,a5]@2 ~@2]!4
  ~@50
>`).s("gm_electric_guitar_clean").gain(0.42)

// chords · distortion guitar · "guitar"
const distortion_guitar = note(`<
  ~@4 A@3 B A@3 B ~@12 A@3 B A@3 B ~@12 A@3 B A@3 B ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~@4
>`.pickRestart({
  A: "[d2,a2,d3]@3 [g1,g2,d3]@5", B: "[e2,a2,e3]",
})).s("gm_distortion_guitar").gain(0.61)

// chords · distortion guitar · "guitar" · soft notes · D5 G5 A5 D5 G5 D5 G
const distortion_guitar_soft = note(`<
  ~@86
  [[d2,a2,d3]@3 [g1,g2,d3]@5]
  [[e2,a2,e3]]
  [[d2,a2,d3]@3 [g1,g2,d3]@5]
  [[d2,a2,d3]@3 [g1,g2]@4 ~, ~@3 d3@3 ~@2]
>`).s("gm_distortion_guitar").gain(0.2)

// bass · synth bass 2 · "bass"
const bass = note(`<
  ~@4 A@3 B A@3 B ~@12 A@3 B A@3 B ~@12 A@3 B A@3 B ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~@4
>`.pickRestart({
  A: "d1@3 g1@5", B: "a1",
})).s("gm_synth_bass_2").gain(0.72)

// bass · synth bass 2 · "bass" · soft notes
const bass_soft = note("<~@86 [d1@3 g1@5] a1 [d1@3 g1@5] [d1@3 g1@4 ~]>").s("gm_synth_bass_2").gain(0.24)

// other · trumpet
const trumpet = note("<~@52 A@2 B@2 C@3 D ~@16 E F G H E F G H E I ~@4>".pickRestart({
  A: "[~ d5@2 c#5@2 a4@2 f#4@8 ~]/2", B: "[~@2 d5 c#5@2 a4@2 a5@8 ~]/2", C: "~@4 f#4!2 ~ a4!2 ~ d5!2 ~ d4 ~@2",
  D: "e5@5 ~@3", E: "d5 e5", F: "f#5@3 g5 f#5@2 e5@2", G: "d5@2 e5@2 f#5@2 e5 d5", H: "e5", I: "f#5@3 g5 f#5@2 ~@2",
})).s("gm_trumpet").gain(0.42).pan(0.2)

// other · trumpet · soft notes
const trumpet_soft = note("<~@85 [~@3 e5] [d5@2 e5@2 f#5@2 e5 d5] e5 [d5 e5] [f#5@3 g5 f#5@2 e5 ~]>")
  .s("gm_trumpet").gain(0.19).pan(0.2)

// other · trumpet
const trumpet_2 = note("<~@52 A@2 B@2 C@3 D ~@16 E F G H E F G H I J ~@4>".pickRestart({
  A: "[~ d4@2 c#4@2 a3@2 f#3@8 ~]/2", B: "[~@2 d4 c#4@2 a3@2 a4@8 ~]/2", C: "~@4 f#3!2 ~ a3!2 ~ d4!2 ~ d3 ~@2",
  D: "e4@5 ~@3", E: "d4 e4", F: "f#4@3 g4 f#4@2 e4@2", G: "d4@2 e4@2 f#4@2 e4 d4", H: "a4", I: "d5 e5",
  J: "f#5@3 g5 f#5@2 ~@2",
})).s("gm_trumpet").gain(0.42).pan(0.8)

// other · trumpet · soft notes
const trumpet_soft_2 = note("<~@85 [~@3 e5] [d5@2 e5@2 f#5@2 e5 d5] e5 [d5 e5] [f#5@3 g5 f#5@2 e5 ~]>")
  .s("gm_trumpet").gain(0.19).pan(0.8)

// chords · synth strings 1 · "synth"
const synth_strings_1 = note("<~@12 A B A B C@3 D E@3 F ~@8 A B A B C@3 D E@3 F ~@8 A B A B C@3 D ~@30>".pickRestart({
  A: "[e3,e4,g4]@3 [d3,d4,g4]@5", B: "[b2,b3,f#4]@3 [a2,a3,e4]@5", C: "[a2,a3,f#4]@3 [d3,d4,g4]@5", D: "[a2,c#4,e4]",
  E: "[d3,d4,f#4]@3 [g2,b3,g4]@5", F: "[a2,a3,e4]",
})).s("gm_synth_strings_1").gain(0.64)

// chords · synth strings 1 · "synth" · soft notes
const synth_strings_1_soft = note(`<
  ~@12 A B A B C@3 D E@3 D ~@8 A B A B C@3 D E@3 D ~@8 A B A B F@3 D ~@30
>`.pickRestart({
  A: "e2@3 d2@5", B: "b1@3 a1@5", C: "a1@3 d2@5", D: "a1", E: "d2@3 g1@5", F: "d2@3 d2@5",
})).s("gm_synth_strings_1").gain(0.4)

// chords · piano · F#m A5 D5 A5
const piano = note(`<
  ~@56
  [~@2 [f#4,a4,f#5]!2 ~@2 [a4,e5,a5]!2 ~@2 [a4,d5,a5]!2 ~@2 [a4,d5,a5]!2]!3
  [[a4,e5,a5] ~@7]
  ~@30
>`).s("gm_piano").gain(0.42)

// drums · kick
const kick = s("bd").struct("<~@4 [x!2 ~@3 x ~ x]!86>").gain(0.61)

// drums · snare
const snare = s("sd").struct("<~@4 A@7 B A@3 B A@7 B A@7 B A@11 B A@7 B A@7 B A@23 B A@2 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x!2 ~@2",
})).gain(0.61)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@23 [~@7 x] ~@19 [~@7 x] ~@15 [~@7 x] ~@26 [~ x ~ x]!4>").gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~@4 [x!16]!85 [x!14 ~@2]>").gain(0.61)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@4 [x!8]!85 [x!7 ~]>").gain(0.61)

stack(
  electric_guitar_clean, distortion_guitar, distortion_guitar_soft, bass, bass_soft, trumpet, trumpet_soft, trumpet_2,
  trumpet_soft_2, synth_strings_1, synth_strings_1_soft, piano, kick, snare, snare_soft, hihat, open_hat, tambourine
)