Strudelify
Boombastic cover art

Hot Shot 2020

Boombastic

Shaggy

KeyD majorTempo79 bpm
0:00/0:00
// Boombastic — Shaggy
// 79 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 77 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(79/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · electric bass finger
const bass = note("<~ A@7 B A C A C A@11 D A D A@3 C A@5 E A@5 C A@7 F A@9 C A G C ~ H@7 C A@3 B>".pickRestart({
  A: "d2@2 ~ c2@2 ~@6 d2 d2@2 ~@6 a1 c2 ~ a1", B: "d2@2 ~ c2@2 ~@6 d2 d2@2 ~@10", C: "d2@2 ~ c2@2 ~@19",
  D: "d2@2 ~ c2@2 ~@15 a1 c2 ~ a1", E: "d2@2 ~ c2@2 ~@6 d2@2 ~@8 c2 ~@2", F: "d2@2 ~ c2@2 ~@6 d2 ~@12",
  G: "d2@2 ~ c2@2 ~@6 d2 d2@2 ~@6 a1 c2@3", H: "d2 ~@11",
})).s("gm_electric_bass_finger").gain(0.53)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A@7 B A B A B ~@10 A@3 B A@3 B ~@8 A@3 B A@4 C@3 ~ C@5 ~ A@3 B A@2 B ~@9 A@3 B
>`.pickRestart({
  A: "~@6 [d4,f#4,a4] ~@8 [d4,f#4,a4] ~@5 [d4,f#4,a4] ~@2", B: "~@6 [d4,f#4,a4] ~@17",
  C: "~@15 [d4,f#4,a4] ~@5 [d4,f#4,a4] ~@2", // D
})).s("gm_electric_guitar_clean").gain(0.19)

// other · piano
const piano = note(`<
  ~ A B C D ~ E ~@10 A ~@5 A ~ A ~ A ~ A ~@9 F ~ F ~ F ~ G ~@11 H ~ A ~ F ~ G ~@9 I ~ I ~
>`.pickRestart({
  A: "~@9 d3 ~ d3!2 ~ d3!3 ~ d3 ~@5", B: "~@8 d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~@5", C: "~@9 d3!2 ~ d3!2 ~ d3!2 ~ d3 ~@5",
  D: "~@8 d3!2 ~ d3!2 ~ d3!2 ~ d3 ~@6", E: "~@9 d3 ~ d3!2 ~ d3!2 ~ d3 ~@6", F: "~@6 d3 ~ d3!2 ~ d3!2 ~ d3!3 ~ d3 ~@5",
  G: "~@8 d3!2 ~ d3!2 ~ d3!3 ~ d3 ~@5", H: "~@6 d3 ~ d3!2 ~ d3!2 ~ d3!2 ~@8", I: "~@9 d3 ~ d3!2 ~ d3!2 ~@8",
})).s("gm_piano").gain(0.45).pan(0.4)

// chords · electric guitar clean
const electric_guitar_clean_2 = note(`<
  ~ A@7 B A ~ A ~@4 C ~ C@3 ~@2 A@3 ~ A@3 ~@2 C@3 ~@2 D@2 A@3 ~ A@4 ~@6 E F G ~ A@2 D B D A ~ A ~@3 F ~@4 A@3 ~
>`.pickRestart({
  A: "~@9 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~", B: "~@9 [a3,d4,f#4]@2 ~@13",
  C: "~@15 [a3,d4,f#4]@2 ~@7", D: "~@3 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~",
  E: "~@9 [a3,d4,f#4]@2 ~@10 [a3,d4,f#4]@2 ~", F: "~@3 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~@4 [a3,d4,f#4]@2 ~@7",
  G: "~@3 [a3,d4,f#4]@2 ~@10 [a3,d4,f#4]@2 ~@7", // D
})).s("gm_electric_guitar_clean").gain(0.24).pan(0.6)

// other · bassoon
const bassoon = note(`<
  ~@4 A B C@2 D E F E F G@2 H I J K L M N O E F E P E F E Q R S T U V W X@2 E F E Y E F E Z AA AB AC AD AE AF AG AH AI
  AJ E F E AK E F E AL AM AN AO AP AQ AR AS@2 E F E AT
>`.pickRestart({
  A: "~@18 c3@2 d3!2 ~ c3", B: "d3 ~ a2 ~@15 c3 ~ d3!2 ~ c3", C: "d3 ~ a2@2 ~@14 c3 ~ d3!2 ~ c3",
  D: "d3 ~ a2 ~@11 a2!2 ~ a2 c3 ~ d3 c3@3", E: "d3@3 a2@2 ~ c3 ~ d3 c3@3 d3@3 f#3@2 ~ c3 ~ d3!2 ~ c3",
  F: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@12 ~@3",
  G: "[d3@9 ~@3 c3@2 d3@3 c3 d3@3 a2 ~ d3@3 ~ d3@3 d3 ~ d3!2 ~ d3!2 ~ d3@2 ~ d3 a2@2 ~ d3 ~ d3]/2",
  H: "d3 ~ d3!2 ~ f#3@2 ~ f#3@3 d3!2 ~ d3!2 ~ d3 a2@2 ~ d3 ~ d3", I: "d3 ~ d3!2 ~ a2@3 ~@3 d3!2 ~ d3 d3@3 a2@3 d3@3",
  J: "a2@3 d3@3 a2@3 d3@3 a2 ~ d3@3 d3 d3@3 ~@2 d3", K: "d3 ~ d3@3 d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ a2@3 ~ d3 ~ d3",
  L: "d3 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ a2@2 ~@2 d3 ~ d3",
  M: "d3 ~ d3@3 d3@3 d3@2 ~ d3!2 ~ d3!2 ~ a2@2 ~@2 d3 ~ d3", N: "d3 ~ d3!2 ~ a2@3 ~ d3 ~ d3 d3@3 d3@3 d3 ~ d3!2 ~ d3",
  O: "d3 ~ d3!2 ~ d3@3 d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ a2 c3@3", P: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@3 d3@3 d3@3 d3@3 d3@3",
  Q: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@5 ~ d3@5 ~@4", R: "d3@6 d3@6 d3@3 d3@2 d3@3 ~ d3 ~ d3",
  S: "d3@2 d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3@2 ~ a2@3 ~ d3 ~ d3", T: "d3 ~ d3@3 a3@3 d3 d3@2 d3!2 ~ d3!2 ~ a2@3 d3!2 ~ d3",
  U: "d3 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3@3 a2@3 ~ d3 ~ d3", V: "d3@2 d3!2 ~ d3!2 ~ d3@3 ~ d3@3 d3 ~ a2@3 ~ d3@2 d3",
  W: "d3 ~ d3@3 d3!2 ~ d3!2 ~ d3!2 ~ d3@3 a2@3 ~ b2 ~ c#3",
  X: "[d3@3 d3@2 d3 d3@3 d3@2 d3!2 ~ d3!2 ~ f#3@2 ~ a2 b2 ~ c#3@3 f#3 d3 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3@2 ~ d3 c3@3]/2",
  Y: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@3 d3@3 d3@9", Z: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@6 d3@4 ~ d3!2 ~ d3",
  AA: "d3 d3@2 e3 ~ d3@3 ~ d3 ~ d3 e3@2 e3 d3@3 ~@2 f#3@2 ~ d3",
  AB: "d3 ~ d3 e3 ~ d3@3 ~ d3 ~ d3 e3 ~ e3@2 ~ d3@2 ~ f#3@2 ~ d3",
  AC: "d3 d3@2 e3 ~ d3@2 ~ f#3@3 d3 e3 ~ e3@3 d3@2 ~ f#3@2 ~ d3", AD: "d3 ~ d3 e3 ~ d3@3 d3@3 d3 e3@3 e3 ~ d3@3 ~@4",
  AE: "d3@6 d3@3 a2@2 ~ d3 ~ d3@3 d3 d3@3 a2@2 ~", AF: "d3@3 d3@3 d3 ~ d3!2 ~ d3!2 ~ d3@3 d3 d3@3 a2@2 ~",
  AG: "d3@3 d3@3 d3@3 a3 ~@2 d3 ~ d3!2 ~ d3 d3@3 a2 ~ d3", AH: "d3 ~ d3!2 ~ d3@3 ~ d3 ~ d3!2 ~ d3!2 ~ d3 d3@3 ~@3",
  AI: "d3 ~ d3!2 ~ d3 d3@3 a2 ~@2 d3 ~ d3!2 ~ d3 d3@2 ~@3 e3",
  AJ: "d3 ~ d3!2 ~ d3@3 ~ d3 ~ d3!2 ~ d3!2 ~ d3!2 ~ d3!2 ~ c3", AK: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@6 d3@9",
  AL: "d3 ~ d3!2 ~ c3 d3 ~ d3 c3@3 d3@3 a2@3 ~@6", AM: "d3@2 d3!2 ~ d3!2 ~ d3!2 ~ d3 d3@2 d3!2 ~ d3 ~@2 a3@3 ~",
  AN: "d3 ~ d3 d3@2 d3 d3@2 d3!2 ~ d3 d3@2 d3@3 d3@2 ~ a3@2 ~ d3",
  AO: "d3 ~ d3!2 ~ a2@3 ~ d3 ~ d3!2 ~ d3!2 ~ d3 a2@2 ~ d3 ~ d3",
  AP: "d3 ~ a2 d3 ~ d3!2 ~ d3!2 ~ d3 d3@3 d3 ~ a2@3 ~ d3 ~ d3",
  AQ: "d3 ~ d3 d3@2 d3@3 ~ d3 ~ d3!2 ~ d3!2 ~ d3 a2@3 d3@2 d3", AR: "d3 ~ d3!5 ~ d3!2 ~ d3!2 ~ d3!2 ~ a2@3 ~ d3 ~ d3",
  AS: "[d3 ~ d3!2 ~ d3@3 d3!2 ~ d3!2 ~ d3!2 ~ a2@3 d3!2 ~ d3@2 ~@7 d3!2 ~ d3!2 ~ d3!2 ~ a2@3 d3 c3@3]/2",
  AT: "d3 ~ d3!2 ~ c3 d3 ~ d3 d3@3 d3@3 d3@3 ~@6",
})).s("gm_bassoon").gain(0.55)

// drums · kick
const kick = s("bd").struct(`<
  ~ A ~@3 B@3 ~ C D C D C@11 D C E C@3 F C@5 G C@3 H C I C@7 J C@11 B ~ K L@6 M ~ C@3 N
>`.pickRestart({
  A: "x", B: "x!2 ~@6", C: "x ~@2 x ~@7 x!2 ~@2 x ~@5 x ~@2", D: "x!2 ~@5 x", E: "x!2 ~ x!5", F: "x!2 ~ x ~ x ~ x",
  G: "x ~@2 x ~@7 x ~@9 x ~@2", H: "x ~@2 x ~@6 x ~ x ~@2 x ~@8", I: "x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~ x",
  J: "x ~@2 x ~@7 x ~@12", K: "~@3 x", L: "x ~@2 x ~@7 x!2 ~@2 x ~@2 x ~@5", M: "x!2 ~@4 x ~",
  N: "x ~@2 x ~@7 x!2 ~@2 x ~@8",
})).gain(0.66)

// drums · rim
const rim = s("rim").struct("<~ A@7 B A B A B A@13 B A@9 B A@5 B A@7 B A@12 B C A@7 ~ A@4>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@3 x",
})).gain(0.44)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@9 [~ x ~@10]!54 ~@2 [~ x ~@10]!7 ~ [~ x ~@10]!4>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~ A@7 B C D C E C@13 E C@3 D C@5 F C@5 E C@7 G C@11 A H I C@6 J K C@3 L>".pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x!3", D: "x ~@2 x ~@2 x ~@11 x ~@2 x!3",
  E: "x ~@2 x ~@2 x ~@16 x", F: "x!4 ~@3 x", G: "x!4 ~@4", H: "x!3 ~@5", I: "~@3 x", J: "x!3 ~@3 x ~", K: "~@21 x!3",
  L: "x!7 ~",
})).gain(0.37)

// drums · ht
const ht = s("ht").struct("<[~@9 x!2 ~@2 x!5 ~@6] ~@76>").gain(0.44)

stack(bass, electric_guitar_clean, piano, electric_guitar_clean_2, bassoon, kick, rim, snare, snare_soft, hihat, ht)

More by Shaggy