Strudelify
Angel cover art

Hot Shot 2020

Angel

Shaggy

KeyF♯ majorTempo84 bpm
0:00/0:00
// Angel — Shaggy
// 84 bpm, 2/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 167 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(84/2)

// 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(`<
  ~@2 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D A B C D A B C D ~@4 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B E ~ A B C D A B
  C D A B C D ~@4 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
>`.pickRestart({
  A: "f#1!2 ~@2", B: "b1@2 b1@2 ~@2 c#2 d#2", C: "c#2@2 c#2@2 ~@2 g#1 a#1", D: "b1!4 a#1!2 g#1!2", E: "c#2!2 ~@2",
})).s("gm_electric_bass_finger").gain(0.56)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@2 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B E ~ A B C D
  A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
>`.pickRestart({
  A: "f#2!2 ~@2", B: "b2@2 b2@2 ~@2 c#3 d#3", C: "c#3@2 c#3@2 ~@2 g#2 a#2", D: "b2!4 a#2!2 g#2!2", E: "c#3!2 ~@2",
})).s("gm_electric_guitar_muted").gain(0.56)

// other · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@9 A@2 ~@10 B@2 ~@6 B@2 ~@10 B@2 ~@10 B@2 ~@6 B@2 ~@10 B@2 ~@10 B@2 ~@6 B@2 ~@26 B@2 ~@10 B@2 ~@6 B@2 ~@6 B@2 ~@6 B@2
  ~@6 B@2
>`.pickRestart({
  A: "[~@8 c#3@2 d#3@2 f#3@2 f#3@9 ~@9]/2", B: "[~@4 c#3 d#3 f#3 f#3@8 ~]/2",
})).s("gm_acoustic_guitar_steel").gain(0.72)

// other · electric guitar clean
const electric_guitar_clean = note("<~@2 A B C D E@2 F G H I J K L@2 M N ~@149>".pickRestart({
  A: "c#3@7 ~", B: "d#3@3 f#3@3 g#3@2", C: "f3@11 ~ f#3@2 f3@2", D: "d#3@7 ~ c#3@7 ~", E: "[a#3@5 f#3 g#3 a#3]/2",
  F: "g#3@11 ~ a#3@2 g#3@2", G: "f#3@5 g#3@3", H: "c#4@7 ~", I: "d#4@3 f#4@3 g#4@2", J: "f4@11 ~ f#4@2 f4@2",
  K: "d#4@7 ~ c#4@7 ~", L: "[a#4@5 f#4 g#4 a#4]/2", M: "g#4@11 ~ a#4@2 g#4@2", N: "f#4@5 g#4@3",
})).s("gm_electric_guitar_clean").gain(0.72)

// other · whistle
const whistle = note("<~@5 A B@2 C@2 ~@3 A B@2 C@2 ~@149>".pickRestart({
  A: "~@8 c#5@7 ~", B: "[c#6@23 ~ d#6@2 c#6@2 d#6@4]/2", C: "[c#6@15 ~]/2",
})).s("gm_whistle").gain(0.48)

// chords · drawbar organ
const drawbar_organ = note(`<
  ~@2 A B C D A B C D A B C D A B C D ~@8 A B C D A B C D ~@16 A B C D A B C D A B C D A B C D A ~@15 A B C D A B C D A
  B C D A B C D ~@32 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "[a#4,c#5,f#5]@7 ~", B: "[b4,d#5]@11 ~ g#5@2 a#5@2", C: "[c#5,f5,g#5]@7 ~", D: "[b4,d#5,f#5]@7 ~ [c#5,f5,g#5]@7 ~",
})).s("gm_drawbar_organ").gain(0.48)

// chords · harpsichord
const harpsichord = note(`<
  ~@2 A B C D A B C D A B C D A B C D ~@8 A B C D A B C D ~@16 A B C D A B C D A B C D A B C D ~@16 A B C D A B C D A B
  C D A B C D ~@32 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "[f#3,c#4]@7 ~", B: "[f#3,d#4]@11 ~ f4@2 f#4@2", C: "[g#3,f4]@7 ~", D: "[f#3,d#4]@7 ~ [g#3,f4]@7 ~",
})).s("gm_harpsichord").gain(0.48)

// other · pad choir
const pad_choir = note("<~@98 A B C A@2 B C A@2 B C A@2 B C A@2 ~@52>".pickRestart({
  A: "c#4@7 ~", B: "d#4@11 ~ f#4@4", C: "f4@7 ~",
})).s("gm_pad_choir").gain(0.72)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2 ~@2]!76 ~@4 [x!2 ~@2]!31 ~ [x!2 ~@2]!14 ~@2 [x!2 ~@2]!37>").gain(0.72)

// drums · snare
const snare = s("sd").struct("<~ A B@76 ~@3 A B@31 ~ B@33 ~@2 B@18>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~ [~@4 x!4] ~@79 [~@4 x!4] ~@85>").gain(0.72)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@6 A B ~@6 A ~@11 A B ~@2 A ~@11 A ~@15 A B ~@2 A B ~@10 A ~@8 B ~@3 B ~@2 A B ~@3 B ~@11 B ~@14 A ~@8 B ~@6 A B ~@3
  B ~@10 A B ~@3 B ~@7
>`.pickRestart({
  A: "~ x", B: "~@3 x",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@15 A ~@15 B ~@15 A ~@15 B ~@15 A ~@15 A ~@13 B ~ B ~@15 A ~@36>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.72)

// drums · guiro
const guiro = s("guiro:4").struct("<~@37 A ~@32 A ~@47 A ~@27 A ~@15 A ~@4>".pickRestart({
  A: "~ x",
})).gain(15.21)

stack(
  bass, electric_guitar_muted, acoustic_guitar_steel, electric_guitar_clean, whistle, drawbar_organ, harpsichord,
  pad_choir, kick, snare, low_tom, hihat, open_hat, crash, guiro
)

More by Shaggy