Strudelify

Rapper's Delight

The Sugarhill Gang

KeyF♯ minorTempo115 bpm
0:00/0:00
// Rapper's Delight — The Sugarhill Gang
// 115 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(115/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 B@3 A C@3 A C@3 A C@3 A B@3 A B@3 A B@3 A B@3 D E F G@2 E F H@2 E F H@2 E F H@2 E F G@2 E F G@2 E F G@2 E F G@2 E F
  G@2 E F H@2 E F H@2 E F H@2 E F G@2 E F G@2 E F G@2 E F I@2
>`.pickRestart({
  A: "e1 ~ e1 ~ e1 ~@3",
  B: "[e1!2 f#1@2 g1@2 a1@2 b1@2 c2@2 d2@2 e2 a1@2 ~@3 a1@2 ~@2 a1@2 ~@5 a1@2 a1 f#2 d2 g2@2 f#2@2 a1@2 ~ a1 b1 a1 g1@2]/3",
  C: "[e1!2 f#1@2 g1@2 a1@2 b1@2 c2@2 d2@2 e2 a1@2 ~@3 a1@2 ~@2 a1@2 ~@5 a1@2 a1 f#2 d2 g2@2 f#2@2 a1@2 ~ a1 ~ a1 b1@2]/3",
  D: "e1@2 ~@3 e1@2 ~@2 e1@2 ~@5", E: "~ e1!2 f#1@2 g1@2 a1@2 b1@2 c2@2 d2@2 e2", F: "a1@2 ~@3 a1@2 ~@2 a1@2 ~@5",
  G: "[a1@2 a1 f#2 d2 g2@2 f#2@2 a1@2 ~ a1 b1 a1 g1@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@5]/2",
  H: "[a1@2 a1 f#2 d2 g2@2 f#2@2 a1@2 ~ a1 ~ a1 b1@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@5]/2",
  I: "[a1@2 a1 f#2 d2 g2@2 f#2@2 a1@2 ~ a1 b1 a1 g1@2 e1@2 ~@13]/2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~@8 A B C D A B C D ~@8 A B C D A B C D ~@8 E F G H E F G H ~@8 E F G H E F G H ~@8 E F G H E F G H ~@8 E F G H E F G
  H ~
>`.pickRestart({
  A: "[g4,b4] ~@3 [g4,b4] ~@3 [g4,b4] ~@2 [g4,b4] ~ b4 ~ a4", // G
  B: "[f#4,a4] ~ [f#4,a4] ~ [f#4,a4] ~ [f#4,a4]!2 ~ [f#4,a4] ~ [f#4,a4]!2 ~ [f#4,a4] ~", // F#m
  C: "g4 ~@3 g4 ~@3 g4 ~@2 g4 ~@4", D: "f#4 ~ f#4 ~ f#4 ~ f#4!2 ~ f#4 ~ f#4!2 ~ f#4 ~",
  E: "~ [g4,b4] ~@3 [g4,b4] ~@3 [g4,b4] ~@2 [g4,b4] ~ b4 ~", // G
  F: "a4 [f#4,a4] ~ [f#4,a4] ~ [f#4,a4] ~ [f#4,a4]!2 ~ [f#4,a4] ~ [f#4,a4]!2 ~ [f#4,a4]", // F#m
  G: "~ g4 ~@3 g4 ~@3 g4 ~@2 g4 ~@3", H: "~ f#4 ~ f#4 ~ f#4 ~ f#4!2 ~ f#4 ~ f#4!2 ~ f#4",
})).s("gm_electric_guitar_muted").gain(0.05)

// chords · piano
const piano = note(`<
  A ~@7 B C D E B C D E ~@8 B C D E B C D E ~@8 F G H I F G H I ~@8 F G H I F G H I J ~@7 F G H I F G H I ~@8 F G H I F
  G H I ~
>`.pickRestart({
  A: "[e4,g4,b4] ~@7", B: "[e4,g4]@8 ~@2 [f#4,a4]@3 e4@3", C: "[f#4,a4]@3 ~", D: "[f#4,a4]@8 ~@2 b3@2 ~ d4@3",
  E: "[c#4,f#4]@3 ~", F: "~ [e4,g4]@8 ~@2 [f#4,a4]@3 e4@2", G: "~ [f#4,a4]@12 ~@3", H: "~ [f#4,a4]@8 ~@2 b3@2 ~ d4@2",
  I: "~ [c#4,f#4]@12 ~@3", J: "~ [e4,g4,b4]@2 ~@13",
})).s("gm_piano").gain(0.23)

// drums · kick
const kick = s("bd").struct("<[x!2]!32 [~ x ~@7 x ~@6]!64 [~ x ~@14]>").gain(0.4)

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

// drums · hihat
const hihat = s("hh").struct("<[x!16]!31 [x!15 ~] [x!2 ~ x!13] [x!16]!31 [~ x!15] [x!16]!31 [x!2 ~@14]>").gain(0.4)

// drums · ride
const ride = s("rd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C D E D E D E D E D E D E D E D E D E D E D E D E D E
  D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D E D F
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~@4 x ~@3 x ~@3 x ~@2", D: "~ x ~@3 x ~@3 x ~@3 x ~ x",
  E: "~ x ~@3 x ~@3 x ~@3 x ~@2", F: "~ x ~@14",
})).gain(0.4)

// drums · splash
const splash = s("cr").struct(`<
  A B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~
  C ~ C ~ C D C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~@15 x", D: "~ x ~@14",
})).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~
  B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~
>`.pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(2.03)

stack(bass, electric_guitar_muted, piano, kick, snare, hihat, ride, splash, cabasa)