Strudelify

If I Ruled the World

Nas

KeyA minorTempo93 bpm
0:00/0:00
// If I Ruled the World — Nas
// 93 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 5 "Plink-R" marimba (copy of ch 4 "Plink-L" marimba)
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(93/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/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.

// chords · pan flute · "Lauryn"
const pan_flute = note(`<
  A B C D E F G D H ~@7 I J I K I L I M N O@2 P Q R@2 ~@9 S T S U ~@4 V W V X N O@2 P Q R@2 ~@3 Y Z ~@2 Y AA ~@15 AB N
  O@2 P Q R@2 AB N AC@2 P Q AD@2 AB N AE@2 P Q AD@2 AB AF AG ~@9
>`.pickRestart({
  A: "b4 g4 [e4,b4]@2, d5 ~, c5 ~@15", B: "~ b4 ~ e4 b4 g4 e4 ~, g4@4 g4@5 ~@7", C: "a4 f4 [d4,a4]@2, c5 ~",
  D: "~ a4 ~ d4 a4 ~ a4 c5, f4@4 f4@5 ~@7", E: "b4@3 ~ g4@4 [e4,b4]@8, d5 ~, c5 ~@15",
  F: "~@2 b4@2 ~@2 e4@2 b4@2 g4@2 e4@3 ~, g4@2 g4@3 ~@3", G: "a4 f4 [d4,a4]@2, c5 ~, b4 ~@15", H: "b4@3 ~@5",
  I: "~@2 a3@2 b3@2 c4@2 e4@2 d4@2 c4@2 b3 ~, ~@8 d4 ~@7", J: "b3@2 c4 a3@3 ~@2", K: "b3@4 c4 ~ a3 b3 a3@5 ~@3",
  L: "b3@4 c4@2 a3@7 ~@3", M: "b3@4 c4 ~ a3 b3 a3@4 ~@2 [a4,c5] ~",
  N: "[c5,e5]@4 [d5,f5]@2 [c5,e5] [e5,g5]@2 d5@2 ~@5, ~@9 f5 ~@6", // C Dm C Em
  O: "[~@13 [d5,f5] [e5,g5] [f5,a5]@4 ~ [e5,g5]@3 [d5,f5]@2 [c5,e5] [a4,d5]@3 ~@2 e5]/2", // Dm Em F Em Dm C D5
  P: "g5 e5 ~ g5 ~ e5 ~ a5@2 g5@2 f5 e5@3 ~, ~@7 g5 ~@8",
  Q: "[c5,e5] ~ e5@2 [d5,f5]@2 [c5,e5] [e5,g5]@2 [d5,f5] ~@6, ~@2 c5 ~@13", // C Dm C Em Dm
  R: "[~@14 [e5,g5] [f5,a5]@5 [e5,g5] ~ [e5,g5] [d5,f5]@2 [c5,e5] [a4,d5]@5 ~]/2", S: "~@3 e4@2 d4@2 c4 b3@4 a3@4",
  T: "~@3 a3 ~ e3@2 e4 d4@4 c4@4", U: "~@3 a3@2 e3@2 e4 d4@2 c4 d4 c4@4", V: "~@2 a3@2 b3@2 c4@2 e4@2 d4 c4 b3@2 a3@2",
  W: "~@2 a3@2 b3@2 c4@2 e4@2 d4 c4 b3@2 c4@2", X: "~@2 a3@2 b3@2 c4@2 a4@6 [a4,c5] ~",
  Y: "f5 ~ f5!2 ~ f5 a5 ~ g5@4 e5@3 ~",
  Z: "[d5,e5] ~ e5 ~ e5@2 d5 [g4,a4,b4,c5] [g3,a3,b3,c4,d4,e4,f4] [c3,d3,e3,f3,a3] ~@6, ~@4 d5 ~@11", // Dsus2 Cmaj7 G7 Dm7
  AA: "[d5,e5] ~ e5 ~ e5@3 [a4,b4,c5,d5] [b3,c4,d4,e4,f4,g4] [b2,c3,d3,e3,f3,g3,a3,c4] ~@6, ~@4 d5 ~@11", // Dsus2 D7 Cmaj7 Bm7b5
  AB: "~@14 [a4,c5] ~", // Am
  AC: "[~@13 [d5,f5] [e5,g5,b5] [f5,a5,c6]@5 [e5,g5,b5]@3 [d5,f5,a5]@2 [c5,e5,g5] [a4,d5]@3 ~@2 e5, ~@26 f5@5 ~]/2", // Dm Em F Em Dm C D5
  AD: "[~@14 [e5,g5,b5] [f5,a5,c6]@5 [e5,g5,b5] ~ [e5,g5,b5] [d5,f5,a5]@2 [c5,e5,g5] [a4,d5,f5]@5 ~]/2", // Em F Em Dm C Dm
  AE: "[~@13 [d5,f5] [e5,g5,b5] [f5,a5,c6]@5 [e5,g5,b5]@3 [d5,f5,a5]@2 [c5,e5,g5] [a4,d5,f5]@3 ~@2 e5]/2", // Dm Em F Em Dm C Dm
  AF: "[c5,e5]@4 [d5,f5]@2 [c5,e5] [e5,g5]@2 d5@2 [e5,g5]@2 [d5,f5] ~ [e5,g5], ~@9 f5 ~@6", // C Dm C Em Dm Em
  AG: "g5 [d5,e5,f5] ~ g5 ~ e5 ~ a5@2 g5@2 f5 e5@4, ~@7 g5 ~@8", // Dm
})).s("gm_pan_flute").gain(0.22)

// other · pan flute · "Lauryn-R"
const pan_flute_2 = note("<~@59 A B C B D B E B F ~@24 G H I J K H L M ~@19>".pickRestart({
  A: "~@4 g4@3 ~ c5@4 d5@3 ~", B: "b5 ~ b5!2 ~ b5 d6 ~ c6@4 g5@3 ~",
  C: "[g5,a5] ~ a5 ~ a5@3 [e5,f5,g5] [e4,f4,g4,a4,b4,c5,d5] [f3,g3,a3,b3,c4,d4] f3 ~@5, ~@4 g5 ~@11", // Gsus2 Em Em7 Dm7
  D: "[g5,a5] ~ a5 ~ a5@3 [d5,e5,f5,g5] [d4,e4,f4,g4,a4,b4,c5] [e3,f3,g3,a3,b3,c4] ~@6, ~@4 g5 ~@11", // Gsus2 Em7 Dm7 Cmaj7
  E: "[g5,a5] ~ a5 ~ a5@3 [c5,d5,e5,f5,g5] [b3,c4,d4,e4,f4,g4,a4,b4] [d3,e3,f3,g3,a3] ~@6, ~@4 g5 ~@11", // Gsus2 C Bm7b5 Dm
  F: "a5 ~ a5 ~ a5@3 [e5,f5,g5] [d4,e4,f4,g4,a4,b4,c5,d5] [d3,e3,f3,g3,a3,b3,c4] ~@6, ~@4 g5 ~@11", // Em Dm7
  G: "~@7 b5 ~ g5 ~ g5 e5@3 b5", H: "~ g5 ~ g5 e5@8 ~@4", I: "~@7 a5 ~ f5 ~ f5 d5@3 a5", J: "~ f5 ~ f5 d5@9 ~@3",
  K: "~@7 b5 ~ g5 ~ g5 e5@2 ~ b5", L: "~@15 a5", M: "~ f5@2 d5@8 ~@5",
})).s("gm_pan_flute").gain(0.19).pan(0.6)

// other · marimba · "Plink-L"
const marimba = note(`<
  ~@16 A B C D A B C D ~@20 A B C D A B C E ~@16 A B C D A B C ~@25 A B C D A B C ~@12
>`.pickRestart({
  A: "a5 a4 c5 e5 a5 ~ b5 ~ c6 ~ a5 e6 ~ a6 ~ b6", B: "c7 a6 e7 ~ a7 ~ b7 c8 ~ b7 ~ a7 ~ a6 c7 ~",
  C: "a5 f4 e5 ~ a5 ~ b5 c6 f5 f6 ~ a6 ~ c7 e6 ~", D: "e7 ~ a7 b7 c8 b7 ~ a7 ~ f7 f6 ~ a6 c7 b6 a6", E: "e7 ~@15",
})).s("gm_marimba").gain(0.06).pan(0)

// chords · trumpet · "Hornz" · Esus4 Am Esus4 Am
const trumpet = note("<~@40 [[e3,a3,b3] ~ [e3,a3,b3] ~ [e3,a3,c4] ~@3 [e3,a3,b3] ~ [e3,a3,b3] [e3,a3,c4] ~@4]!4 ~@75>")
  .s("gm_trumpet").gain(0.18)

// other · orchestral harp · "Weird"
const orchestral_harp = note("<~@24 A@2 B@2 A@2 C@2 ~@20 A@2 B@2 A@2 C@2 ~@24 A@2 B@2 A@2 C@2 ~@27>".pickRestart({
  A: "[c5@4 b5@5 ~ a4@2 e5@2 a5@12 ~@6]/2", B: "[f4 c5 e5@3 a4 c5 f5@6 ~@3]/2",
  C: "[f4@2 c5@2 e5@6 a4@2 c5@2 ~@10 g5@3 ~ a5@3 ~, ~@7 f5@6 ~@3]/2",
})).s("gm_orchestral_harp").gain(0.15).pan(0.8)

// chords · string ensemble 1 · "Stringz"
const string_ensemble_1 = note(`<
  ~@24 A@2 B@2 C@2 D@2 ~@20 A@2 B@2 C@2 D@2 ~@24 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~@11
>`.pickRestart({
  A: "[e4,b4]/2", B: "[c4,f4]/2", C: "[e4,b4,d5]/2", D: "[[c4,f4,c5]@31 ~]/2",
})).s("gm_string_ensemble_1").gain(0.02).pan(0.3)

// other · lead 4 chiff · "Whodini"
const lead_4_chiff = note("<~@110 A B A C D E F G H>".pickRestart({
  A: "c4 ~@3", B: "b3 ~ b3!3 d4 ~ c4 ~ a3@4 ~@3", C: "b3 ~ b3 ~ b3 ~ d4 c4 ~ a3@3 ~@4", D: "c4@3 ~@13",
  E: "b3 ~ b3!3 d4 ~ c4 ~ a3@3 ~@4", F: "c4@3 ~@12 e3", G: "b3!3 ~ b3 d4 ~ c4 ~ a3 ~@2 a3 ~ e3 ~",
  H: "a4@2 [f4,g4] [f3,g3,a3,b3,c4,d4,e4] [e2,f2,g2,a2,b2,c3,d3,e3,f3,g3] d2 ~@10", // Fsus2 Fmaj7 Em7
})).s("gm_lead_4_chiff").gain(0.36)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~@8 A B C@2 A@2 C@2 A B C@2 A@2 C@2 A B C@2 A@2 C@2 A B C@2 A@2 C@2 A B C@2 A@2 C@2 A B C D A@2 C@2 A B C@2 A@2 C@2 A
  B C ~ A@2 C@2 A B C ~ A@2 C@2 A B C@2 A B C@2 A@2 C@2 A B C@2 A@2 C@2 A B C@2 A@2 C@2 ~@2 A B C@2 A@2 C@2 E
>`.pickRestart({
  A: "a1@2 ~@4 a1!2 ~@8", B: "a1 ~@5 a1!2 ~@8", C: "f1@2 ~@4 f1!2 ~@8", D: "f1 ~@7", E: "a1 ~@7",
})).s("gm_electric_bass_pick").gain(0.32)

// chords · piano · "Mello-D"
const piano = note("<~@110 A@2 B@7>".pickRestart({
  A: "[~@4 a4 c5 d5 e5 [d#5,e5] ~ d5 ~ d5 c5 a4 c5 ~@9 e4 [g4,c5] ~ g4 a4@3, a3@27 ~@5, [c4,e4]@3 ~, ~@4 a4 ~@9 c5@2]/2", // Emaj7 C5 C
  B: "[~@4 a4!2 c5 e5 a5 e5 c5 [e5,a5] ~@11 [b5,c6] b5 a5 g5 [a3,c4] a5 g5 e5 ~ e4@3 ~ d#5 e5 ~ [c5,d5] ~ c5 a4 c4 g4 a4 [g4,c5] ~@2 g4 a4 c5 d5 ~ c5 ~ d5 c5 g4 a4 a3 [d5,d#5] d5 ~@6 a4 c5 e5 a5 e5 c5 [e5,a5] e4@3 ~@2 e5 a5 ~@5 [e5,c6] ~@7 [a3,e4,c5,e5,a5]@3 ~@13, f3@27 ~@5 a3@11 ~@5 [a3,e4]@11 ~@5 f3@21 e5@2 [c4,e4]@3 ~ c4@3 e5@2 ~@16, [a3,c4,e4]@20 e4@7 ~ e4@3 ~@13 [e4,c5]@3 ~@13 e4@3 c5@6 ~@14 c6@5 ~ b5@3 b5@3 c4@4 ~@13, ~@22 c4@3 ~@6 c4@3 ~ c4@7 ~@5 c4@6 ~@2 c4@3 ~ c4@2 ~@3 c4@13 ~@2 c4@7 a5@2 ~@2 a5@2 e5 a5@3 ~@16, ~@64 e4@7 ~@9 e4@3 e5 e4@3 f3@9 ~@16]/7", // A5 Cmaj7 Am Csus2 C5 D#maj7 A5 C …
})).s("gm_piano").gain(0.28)

// chords · piano · "Mello-D" · soft notes
const piano_soft = note("<~@110 A B ~ C D E@2 F ~>".pickRestart({
  A: "~@6 [a4,c5] a4 ~@4 a4 ~@2 a4", B: "~@11 c4 ~@4", C: "~@9 b5 ~@4 a3 ~", D: "~@3 e4@8 ~@5",
  E: "[~@15 c4 ~@10 e4 ~@5, ~@15 a3@15 ~@2]/2", F: "~@6 e4!2",
})).s("gm_piano").gain(0.12)

// drums · kick
const kick = s("bd").struct(`<
  ~@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 C A B A B A B A C A B A B A B A B A B A D A B A B A B A B A
  B A B A B A ~ A B A B A B A ~ 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 ~@2 A B A B A B A B D
>`.pickRestart({
  A: "x ~@5 x!2 ~ x!2 ~@5", B: "x ~ x ~@3 x!2 ~ x!2 ~@5", C: "x!2 ~@6", D: "x",
})).gain(0.49)

// drums · clap
const clap = s("cp").struct("<~@4 A@27 ~ A@7 ~ A@11 ~ A@15 ~ A@7 ~ A@7 B A@23 B ~@2 A@8 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.44)

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

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@7 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@12 B C D E ~@3 A ~@3 A ~@3 A B C D E B C D E ~@3
  A ~@3 F ~@5 A ~@3 A ~
>`.pickRestart({
  A: "~ x ~@6", B: "~@2 x ~@3 x ~@6 x ~@2", C: "~@6 x ~@2 x ~ x ~@4", D: "~@6 x ~@4 x ~ x ~@2", E: "~@2 x ~@6 x ~@6",
  F: "~@2 x ~@8 x ~@4",
})).gain(0.16)

// drums · low tom
const low_tom = s("lt").struct("<~@109 [~@15 x] ~@9>").gain(0.49)

// drums · mid tom
const mid_tom = s("mt").struct("<~@109 [~@13 x!2 ~] ~@9>").gain(0.55)

// drums · open hat
const open_hat = s("oh").struct("<~@4 A@27 ~ A@7 ~ A@11 ~ A@15 ~ A@7 ~ A@7 ~ A@23 ~@3 A@8 ~>".pickRestart({
  A: "~@7 x",
})).gain(0.44)

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

// drums · tambourine
const tambourine = s("tb").struct("<A@51 ~ A@15 ~ A@7 ~@5 A@3 ~ A@8 ~@8 A@7 ~@3 A@8 ~>".pickRestart({
  A: "~@7 x",
})).gain(0.49)

// drums · cabasa
const cabasa = s("cabasa:4").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 A B A B A B A B A B A B A B A B A B A ~ A B A B A B A
  B A B A B A B A ~ A B A B A B A ~@5 A B A C A B A B A B A B ~@8 A B A B A B A D ~@2 A B A B A B A B ~
>`.pickRestart({
  A: "~@2 x ~@3 x ~ x!2 ~ x!2 ~ x ~", B: "~@2 x ~@3 x ~ x!5 ~ x ~", C: "~@2 x ~@3 x ~ x!3 ~@5", D: "~ x ~ x ~@4",
})).gain(1.66)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(1.43)

stack(
  pan_flute, pan_flute_2, marimba, trumpet, orchestral_harp, string_ensemble_1, lead_4_chiff, bass, piano, piano_soft,
  kick, clap, snare, hihat, hihat_soft, low_tom, mid_tom, open_hat, crash, tambourine, cabasa, triangle
)