Strudelify

Gangsta's Paradise

Coolio

KeyC minorTempo81 bpm
0:00/0:00
// Gangsta's Paradise — Coolio
// 81 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 5 "FRETLESS" fretless bass (copy of ch 2 "FRETLESS" fretless bass)
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(81/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 · fretless bass · "FRETLESS"
const bass = note(`<
  A B A B C D C D A B A B A B A B C D C D C D C D A B A ~ A B A B A B A B A B A B C D C D C D C D A B A B A B A B C D C
  D C D C D C D C D C D C D C D C D ~@4
>`.pickRestart({
  A: "ab1@7 g1 f1@8", B: "g1@7 f1 c1@8", C: "ab1@5 eb1 ab1 c2 bb1@4 ab1@4", D: "g1@5 c1 g1 c2 eb2@4 d2@2 c2@2",
})).s("gm_fretless_bass").gain(0.8)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A B C D E F E G E F E G E F E G H I J K J L J M ~@4 E F E N E F E N E F E N H I J L J L J L E F E N E F E N O P Q R Q
  S Q R O P Q R Q S Q R Q S Q T ~@4
>`.pickRestart({
  A: "c6 ~@2 c5 c6 ~@2 [g3,c5] c6 ~@2 c5 c6 ~@2 [eb3,b4], ab3@7 ~ f3@7 ~", // C5 Abm
  B: "b5 ~@2 b4 b5 ~@2 c5 c6 ~@2 g4 g5 ~@2 c5, d3@7 c3@7 f3@2",
  C: "c6 ~@2 c5 c6 ~@2 [g2,g3,c5] c6 ~@2 c5 c6 ~@2 [eb3,b4], [ab2,ab3]@7 ~ [f2,f3]@8", // C5 Abm Ab F
  D: "b5 ~@2 b4 b5 ~@2 [f2,c5] c6 ~@2 g4 g5 ~@3, [g2,d3]@7 c3@7 ~@2, ~ c2", // F5 G5
  E: "c5 ~@2 c4 c5 ~@2 [g3,c4] c5 ~@2 c4 c5 ~@2 [eb3,b3], ab3@7 ~ f3@7 ~", // C5 Abm
  F: "b4 ~@2 b3 b4 ~@2 c4 c5 ~@2 g3 g4 ~@2 c4, d3@7 c3@7 f3@2",
  G: "b4 ~@2 b3 b4 ~@2 c4 c5 ~@2 g3 g4 ~@3, d3@7 c3@7 ~@2", H: "c6@3 c5 c6@3 [g3,c5] c6@3 c5 c6@3 eb3, ab3@7 ~ f3@7 ~",
  I: "b5@3 b4 b5@3 ~ c6@3 ~@3 f3@2, d3@7 c3@7 ~@2, ~@7 c5@2 ~@2 g4@2 ~@3, ~@3 g5",
  J: "c6@3 c5 c6@3 [g3,c5] c6@3 c5 c6@3 [eb3,b4], ab3@7 ~ f3@7 ~", K: "b5@3 b4 b5@3 c5 c6@3 g4 g5@2 ~@2, d3@7 c3@7 ~@2",
  L: "b5@3 b4 b5@3 c5 c6@3 g4 g5@2 f3@2, d3@7 c3@7 ~@2", M: "b5@3 b4 b5@3 c5 c6@3 g4 g5@3 ~, d3@7 c3@7 ~@2",
  N: "b4 ~@2 b3 b4 ~@2 c4 c5 ~@2 g3 g4 ~ f3@2, d3@7 c3@7 ~@2",
  O: "c5@3 c4 c5@3 [g3,c4] c5@3 c4 c5@3 eb3, ab3@7 ~ f3@7 ~", // C5
  P: "b4@3 b3 b4@3 ~ c5@3 ~ g4@4, d3@7 c3@7 ~@2, ~@7 c4@2 ~@2 g3@2 ~@3",
  Q: "c5@3 c4 c5@3 [g3,c4] c5@3 c4 c5@3 [eb3,b3], ab3@7 ~ f3@7 ~", // C5 Abm
  R: "b4@3 b3 b4@3 c4 c5@3 g3 g4@2 f3@2, d3@7 c3@7 ~@2", S: "b4@3 b3 b4@3 c4 c5@3 g3 g4@3 ~, d3@7 c3@7 ~@2",
  T: "b4@3 b3 b4@3 c4 c5@3 g3 g4@3 ~, d3@7 c3@9",
})).s("gm_string_ensemble_1").gain(0.36)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A B A B A B A B A B A B A B A B A B A B A B A B ~@4 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 A
  B A B A B A B A B A B A B A B ~@4
>`.pickRestart({
  A: "~ c5!3 ~ c5!3 ~ c5!3 ~ c5!3", B: "~ b4!3 ~ b4!3 ~ c5!3 ~ g4!3",
})).s("gm_synth_strings_1").gain(0.52)

// drums · kick
const kick = s("bd").struct(`<
  A@4 B@3 C B C B C B C B C B@9 C B C B C B C B C B C A B A@2 B@9 C B C B C B C B@20 ~@4
>`.pickRestart({
  A: "x", B: "x ~@3 x!2 ~@2", C: "x ~@4 x ~@2",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct("<[~ x!3]!4 ~@76>").gain(0.56)

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

// drums · clap
const clap = s("cp").struct("<~@3 A B@3 A B@7 A B@19 A ~@3 A B@11 A B@3 A B@20 ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.8)

// drums · pedal hat
const pedal_hat = s("hh").struct("<[x!8]!3 [x!5 ~ x!2] [x!8]!72 ~@4>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@3 A ~@3 A ~@7 A ~@19 A ~@3 A ~@11 A ~@3 A ~@15 B ~@3 B ~@4>".pickRestart({
  A: "~@5 x ~@2", B: "~@7 x",
})).gain(0.64)

// drums · ride
const ride = s("rd").struct("<[~ x ~ x]!4 ~@76>").gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<[~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!75 [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2] ~@4>")
  .gain(0.64)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!75 [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2] ~@4>")
  .gain(3.24)

// drums · shaker
const shaker = s("sh").struct("<[x!8]!76 ~@4>").gain(0.64)

stack(
  bass, string_ensemble_1, synth_strings_1, kick, rim, snare, clap, pedal_hat, open_hat, ride, tambourine, cabasa,
  shaker
)

More by Coolio