Strudelify

Here Comes The Hotstepper

Kamoze Ini

KeyB minorTempo102 bpm
0:00/0:00
// Here Comes The Hotstepper — Kamoze Ini
// 102 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 104 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/4)

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

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@10 A B A B A B A B A B A B A B A C A B A B A B A B A B A C A B A B A B A C A B A B A B A B A B A C A B A B ~@4 A B A
  C A B A B A B A C D E D E A B A B ~@4 A B A B A B A B A B A C F ~
>`.pickRestart({
  A: "b1 ~@3 b1 ~@2 b1!3 a1@2 f#1@2 a1@2", B: "d2 ~@3 d2 ~@2 c#2 b1!2 f#1@2 a1@2 b2!2", C: "d2 ~@3 d2 ~@2 c#2 b1 ~@7",
  D: "~@4 b1 ~@2 b1!3 a1@2 f#1@2 ~@2", E: "~@4 d2 ~@2 c#2 b1!2 f#1@2 a1@2 ~@2", F: "b1 ~@15",
})).s("gm_electric_bass_finger").gain(0.32)

// chords · lead 5 charang · "CHARANG"
const lead_5_charang = note("<~@10 A@4 ~@8 A@4 ~@8 A@4 ~@16 A@4 ~@8 A@4 ~@8 A@8 ~@18>".pickRestart({
  A: "~@4 [b2,f#3,b3]@2 ~ [b2,f#3,b3]!2 ~@7", // B5
})).s("gm_lead_5_charang").gain(0.24)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@26 A B C D A B C D ~@11 E F ~@7 A B C D ~@7 E F ~@3 A B C D A B C D G H I J A B C D ~@3 E F ~@7 A B C K F ~
>`.pickRestart({
  A: "b3@2 b3!2 ~@2 b3 ~ [a#3,a#4] [b3,b4] ~ b3!2 ~ b3 a3, b4 ~@3", // A# B
  B: "c#4@2 c#4 [c#4,c#5] ~ c#4 [a3,a4]@2 a3 [a3,a4] ~ a3!2 ~ a3 ~", // C# A
  C: "b3 ~ b3!2 ~@2 [b3,b4] ~ [a#3,a#4] [b3,b4] ~ b3!2 ~ b3 a3, b4 ~@3", // B A# B
  D: "[c#4,c#5]@2 c#4 [c#4,c#5]@2 c#4 [a3,a4]@2 a3 ~@2 a3!4 ~", E: "~@8 d5 c5 a4 g4 f4 d4 a3 b3", F: "b3 ~@15",
  G: "~@6 b3 ~ [a#3,a#4] [b3,b4] ~ b3!2 ~@3", H: "~@5 c#4 [a3,a4]@2 a3 [a3,a4] ~ a3 ~@4",
  I: "~@6 [b3,b4] ~ [a#3,a#4] [b3,b4] ~ b3 ~@4", J: "~@5 c#4 [a3,a4]@2 a3 ~@2 a3 ~@4",
  K: "[c#4,c#5]@2 c#4 [c#4,c#5]@2 c#4 [a3,a4]@2 d5 c5 a4 g4 f4 d4 a3 b3", // C# A
})).s("gm_electric_guitar_muted").gain(0.09)

// chords · synth brass 1 · "SYNBRASS 1" · Bm7
const synth_brass_1 = note(`<
  ~@50
  [[a4,b4,d5,f#5] ~ [a4,b4,d5,f#5] ~ [a4,b4,d5,f#5] ~ [a4,b4,d5,f#5] ~ [a4,b4,d5,f#5] ~@7]
  ~@53
>`).s("gm_synth_brass_1").gain(0.12)

// chords · synth brass 1 · "SYNBRASS 1" · soft notes · Bm7
const synth_brass_1_soft = note("<~@50 [~@10 [a4,b4,d5,f#5] ~ [a4,b4,d5,f#5] ~ [a4,b4,d5,f#5] ~] ~@53>")
  .s("gm_synth_brass_1").gain(0.04)

// drums · kick
const kick = s("bd").struct("<~@2 A@8 B@15 C B@11 D B@7 D B@11 C B@4 A@4 B@3 C B@7 D B@8 A@4 B@11 D E ~>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!3 ~ x", C: "x ~@2 x!2 ~ x!2", D: "x ~@2 x!2 ~@3", E: "x",
})).gain(0.55)

// drums · clap
const clap = s("cp").struct("<~@5 A B@19 C B@11 C B@7 C B@11 C B@11 C B@7 C B@23 C ~@2>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.43)

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

// drums · low tom
const low_tom = s("lt").struct("<~@9 A ~@15 A ~@11 A ~@7 A ~@11 A ~@7 A ~@11 A ~@11 A ~@11 A ~@2>".pickRestart({
  A: "~@14 x!2",
})).gain(0.31)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~@5 A ~@3 A ~ A ~ A
  ~@7 A ~ A ~@5 A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "~@7 x",
})).gain(0.18)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@9 A ~@3 B ~@7 B ~@3 A ~@7 B ~@3 A ~@3 B ~@3 A ~@7 B ~@3 A ~@7 A ~@3 B ~@7 A ~@3 B ~@7 A ~@3 B ~@3 B ~@3 A ~@2
>`.pickRestart({
  A: "~@10 x ~@2 x ~@2", B: "~@7 x",
})).gain(0.37)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [x!16] ~@3 [x!16] ~@94>").gain(0.12)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@18 A ~@11 A ~@19 A ~@11 A ~@41>".pickRestart({
  A: "x",
})).gain(3.59)

stack(
  bass, lead_5_charang, electric_guitar_muted, synth_brass_1, synth_brass_1_soft, kick, clap, snare, low_tom, hihat,
  hihat_soft, mid_tom, china, tambourine, vibraslap
)