Strudelify

The Rapper

Jaggerz

KeyF♯ minorTempo121 bpm
0:00/0:00
// The Rapper — Jaggerz
// 121 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 18, 4/4 at bar 18, 2/4 at bar 39, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(121/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 · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A@7 B C@3 D ~@3 E ~ F G H I F G H I J K@3 L M@3 N ~@2 O@2 ~ P Q R ~ P Q R S A@3 B C@3 D ~@3 E ~ F G H I F G H I F G H
  I T@8 ~
>`.pickRestart({
  A: "[a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,d4,e4,a4] ~ [a3,c#4,e4,a4]@2", // A Asus4 A
  B: "[a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 ~@2 [a#3,d4,f4,a#4]@2 ~@2", // A A#
  C: "[b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,e4,f#4,b4] ~ [b3,d#4,f#4,b4]@2", // B Bsus4 B
  D: "[b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,e4,f#4,b4] ~ [b3,d#4,f#4,b4] ~", // B Bsus4 B
  E: "[e3,g#3,b3,e4]@2 [e3,g#3,b3,e4]@2 [a3,c#4,e4,a4] ~ [d3,f#3,a3,d4]@6 ~@4", F: "~@8 [f#3,a#3,c#4,f#4]@3 ~@5",
  G: "~@4 [f#3,a#3,c#4,f#4]@2 ~@2 [c#3,e3,g#3,c#4]@3 ~@5", // F# C#m
  H: "[e3,g#3,b3,e4]@2 [e3,g#3,b3]@4 ~@2 [f#3,a#3,c#4,f#4]@3 ~@5, ~ e4 ~@6", I: "~@2 e4 c#4 ~@4",
  J: "[f#3,c#4,f#4]@2 [g3,d4,g4,b4]@2 [c4,d#4,g#4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2", // F#5 G G# A
  K: "[a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,d4,e4,a4] ~ [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2", // A Asus4 A
  L: "[a3,c#4,e4,a4]@2 ~@2 [a#3,d4,f4,a#4]@2 ~@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4]@2", // A A# B
  M: "[b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,e4,f#4,b4] ~ [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4]@2", // B Bsus4 B
  N: "[b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,e4,f#4,b4] ~ [b3,d#4,f#4,b4] ~@9", // B Bsus4 B
  O: "[~@8 [e3,g#3,b3,e4]@2 [e3,g#3,b3,e4]@2 [a3,c#4,e4,a4] ~ [d3,f#3,a3,d4]@6 ~@12]/2", // E A D
  P: "[f#3,a#3,c#4,f#4]@3 ~@9 [f#3,a#3,c#4,f#4]@2 ~@2", // F#
  Q: "[c#3,e3,g#3,c#4]@3 ~@5 [e3,g#3,b3,e4]@2 [e3,g#3,b3]@4 ~@2, ~@5 e4 ~@2", R: "[f#3,a#3,c#4,f#4]@3 ~@9 e4@2 c#4@2",
  S: "~@4 [f#3,c#4,f#4] [g3,d4,g4,b4] [c4,d#4,g#4] [a3,c#4,e4,a4]", // F#5 G G# A
  T: "[~@8 [f#3,a#3,c#4,f#4]@16 [e3,g#3,b3,e4]@17 [a3,c#4,e4,a4]@18 [c#3,f3,g#3,c#4]@20 [f#3,a#3,c#4,f#4]@41 ~@8]/8", // F# E A C# F#
})).s("gm_acoustic_guitar_steel").gain(0.14).pan(0.8)

// bass · electric bass pick
const bass = note(`<
  A@7 B C@3 D E F G H ~ I J K L I J K L M N@3 O P@3 Q R S T@2 ~ U V W X U V W Y A@3 B C@3 D E F G H ~ I J K L I J K L I
  J K L Z@8 ~
>`.pickRestart({
  A: "a1!5 f#1 g1 g#1", B: "a1!6 a#1!2", C: "b1!5 g#1 a1 a#1", D: "b1!7 d2", E: "d2!5 b1 c2 c#2", F: "d2!6 d#2!2",
  G: "e2!7 ~", H: "e3 d3 b2 d2@2 ~@3", I: "~@2 f#1 ~", J: "~ a#1 b1 c2 c#2@2 ~@2", K: "e1!2 ~@2 f#1@2 ~@2",
  L: "~@2 e1 c#1 f#1@2 ~@2", M: "f#1 g1 g#1 a1!5", N: "a1 f#1 g1 g#1 a1!4", O: "a1!2 a#1!2 b1!4",
  P: "b1 g#1 a1 a#1 b1!4", Q: "b1!3 d2!5", R: "d2 b1 c2 c#2 d2!4", S: "d2!2 d#2!2 e2!4",
  T: "[e2!3 ~ e3 d3 b2 d2@2 ~@7]/2", U: "f#1@2 ~@3 a#1 b1 c2", V: "c#2@2 ~@2 e1!2 ~@2", W: "f#1@2 ~@4 e1 c#1",
  X: "f#1 ~@3", Y: "f#1@2 ~@2 f#1 g1 g#1 a1", Z: "[~@8 f#1@12 f#1@4 e1@13 e1@4 a1@13 a1@5 c#1@15 c#1@5 f#1@41 ~@8]/8",
})).s("gm_electric_bass_pick").gain(0.57)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  A B C D E C D F G H I J K L M ~@5 N ~@3 N O P Q R S T U V W X Y Z ~@4 AA AB ~@2 AA AB E C D F G H I J K L M ~@5 N ~@3
  N ~@3 N ~@9
>`.pickRestart({
  A: "~@6 d4 c4", B: "c#4 a3 ~@4 [d4,f#4]!2", C: "~ c#4@2 ~@7 c#4@2 [d4,f#4]@2 f#3 ~, [c4,e4] ~@7",
  D: "~@2 a3 ~@9 [d4,f#4]@2 [d4,f#4]@2", E: "c4 c#4@2 ~@13", F: "c4 c#4@2 ~@11 a#3@2", G: "b3@2 ~@4 e4 d4",
  H: "d#4 b3 ~@4 [e4,g#4]!2", I: "~ d#4@2 ~@7 d#4@2 [e4,g#4]@2 g#3 ~, [d4,f#4] ~@7", J: "~@2 b3 ~@9 g#4@2 [e3,a3] ~",
  K: "[d3,a3]@2 [d3,a3]@2 [d3,b3] ~@3 [d3,a3]@2 ~@2 [d3,b3] ~ d3 ~", // D5 G D5 G
  L: "[d3,a3]@2 ~@2 [d3,b3] ~@3 [d3,a3]@2 ~@2 [d3,b3] ~ d3 ~", // D5 G D5 G
  M: "~ e4 b3 g#4 e4 b3 g#4 e4 ~@4 [e3,b3] ~@3, g#4@3 ~@13", N: "~@2 c#3!2 e3 ~ c#3 ~ a4 e4 ~@2 f#3 ~@3",
  O: "~@8 c4 c#4@2 ~@5", P: "~@9 c#4@2 ~@5, ~@4 [c4,e4] ~@3", Q: "~@2 c#4@2 [d4,f#4]@2 f#3 ~@3 a3 ~@5",
  R: "~@4 [d4,f#4]@2 [d4,f#4]@2 c4 c#4@2 ~@5", S: "~@3 a#3 b3@2 ~@2", T: "~@2 e4 d4 d#4 b3 ~@2",
  U: "~@4 [e4,g#4]@2 [e4,g#4]@2 ~ d#4@2 ~@5, ~@4 [d4,f#4] ~@3", V: "~@2 d#4@2 [e4,g#4]@2 g#3 ~@3 b3 ~@5",
  W: "~@4 g#4@2 [e3,a3] ~ [d3,a3]@2 [d3,a3]@2 [d3,b3] ~@3", X: "[d3,a3]@2 ~@2 [d3,b3] ~ d3 ~ [d3,a3]@2 ~@2 [d3,b3] ~@3",
  Y: "[d3,a3]@2 ~@2 [d3,b3] ~ d3 ~@2 e4 b3 g#4 e4 b3 g#4 e4, ~@8 g#4@3 ~@5", Z: "~@4 [e3,b3] ~@11",
  AA: "~@10 c#3!2 e3 ~ c#3 ~", AB: "a4 e4 ~@2 f#3 ~@11",
})).s("gm_electric_guitar_muted").gain(0.55).pan(0.3)

// chords · percussive organ
const percussive_organ = note(`<
  ~@12 A@2 ~@2 B@2 ~@2 C ~@3 C ~@8 D@3 ~@2 E ~@2 F G ~@2 F G ~@8 A@2 ~@2 B@2 ~@2 C ~@3 C ~@3 C H@8 ~
>`.pickRestart({
  A: "[f#4,c5,d5,a5] ~ [f#4,c5,d5,a5]@6", B: "[~@8 g5 a5 ~@6 g#5 g5@3 d5@4 ~@8, ~@5 c6@6 ~@5]/2",
  C: "~@4 e5@2 a5 ~ f#5 f#5@2 ~ f#4 ~@3",
  D: "[~@4 [f#4,c5,d5,a5] ~ [f#4,c5,d5,a5]@6 [f#4,c5,d5,a5] ~ [f#4,c5,d5,a5]@6 ~@4]/3", // D7
  E: "g5 a5 ~@6 g#5 g5@3 d5@4, ~ c6@6 ~", F: "~@12 e5@2 a5 ~", G: "f#5 f#5@2 ~ f#4 ~@11",
  H: "[~@8 [f#4,a#4,c#5,f#5]@16 [e4,g#4,b4,e5]@17 [a4,c#5,e5,a5]@18 [c#5,f5,g#5,c#6]@20 [f#5,a#5,c#6,f#6]@41 ~@8]/8", // F# E A C# F#
})).s("gm_percussive_organ").gain(0.57).pan(1)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@15 A@3 B C D E B C D F ~@11 G@2 H I J K H I J L@2 ~@10 A@3 B C D E B C D E B C D M@8 ~
>`.pickRestart({
  A: "[~@6 [d2,a2] [d2,a2]@10 ~@3 f#2@2 ~@2]/3", B: "~ a#2 b2 c3 c#3@2 ~@2", C: "e2!2 ~@2 f#2 ~@3",
  D: "~@2 e2 c#2 f#2 ~@3", E: "~@2 f#2 ~", F: "f#2 g2 g#2 a2@2 ~@3", G: "[~@2 [d2,a2] [d2,a2]@10 ~@3]/2",
  H: "f#2@2 ~@3 a#2 b2 c3", I: "c#3@2 ~@2 e2!2 ~@2", J: "f#2 ~@5 e2 c#2", K: "f#2 ~@7",
  L: "[f#2 ~@3 f#2 g2 g#2 a2@2 ~@7]/2", M: "[~@8 f#2@12 f#2@4 e2@13 e2@4 a2@13 a2@5 c#2@15 c#2@5 f#1@41 ~@8]/8",
})).s("gm_distortion_guitar").gain(0.5).pan(0)

// other · lead 8 bass lead
const lead_8_bass_lead = note(`<
  ~@15 A@3 B C D E B C D F ~@11 G@2 H I J K H I J L@2 ~@10 A@3 B C D E B C D E B C D ~@9
>`.pickRestart({
  A: "[~@6 [d3,a3] [d3,a3]@10 ~@3 f#2@2 ~@2]/3", B: "~ a#2 b2 c3 c#3@2 ~@2", C: "e2!2 ~@2 f#2 ~@3",
  D: "~@2 e2 c#2 f#2 ~@3", E: "~@2 f#2 ~", F: "f#2 g2 g#2 a2@2 ~@3", G: "[~@2 [d3,a3] [d3,a3]@10 ~@3]/2",
  H: "f#2@2 ~@3 a#2 b2 c3", I: "c#3@2 ~@2 e2!2 ~@2", J: "f#2 ~@5 e2 c#2", K: "f#2 ~@7",
  L: "[f#2 ~@3 f#2 g2 g#2 a2@2 ~@7]/2",
})).s("gm_lead_8_bass_lead").gain(0.5).pan(0.7)

// other · whistle
const whistle = note("<~@77 [~@9 e7@3 ~ e7@3] [~@4 d7@3 ~@2 d7@3 ~@4] ~@2>").s("gm_whistle").gain(0.11)

// other · electric guitar clean
const electric_guitar_clean = note("<~@72 A B C D@2 E@2 ~@2>".pickRestart({
  A: "~@10 f#3 a3 c4 c#4 a3@2", B: "b3 a3 e3 f#3 ~@4 e3 d#3 ~@2 e3@2 g#3@2", C: "b3@2 ~ d#4@2 e4@4 g#3 ~ a3 ~ d#3 ~@2",
  D: "[e3 ~@12 f5@5 ~ f#4@2 g#4@3 f#4@2 f4@5 ~, ~ e4@5 [c#4,a4]@5 ~@21, ~@2 c#5@5 ~@4 g#4@5 ~@16, ~@4 [d4,b4]@5 a3@5 ~@18]/2", // F#m G
  E: "[~@4 f#3@3 g#3@2 a#3@3 g#3@3 f#3@5 ~@12, ~@9 f#3@5 ~@18]/2",
})).s("gm_electric_guitar_clean").gain(0.32)

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

// drums · snare
const snare = s("sd").struct(`<
  A@15 B A C A@3 D A@15 E F A@3 G A@15 B A C A@3 D A@3 D A@3 H I J K L ~@2 M ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "~ x!2 ~@3 x ~", D: "x!3 ~@3 x ~", E: "~@2 x!2 ~@2 x ~", F: "~@2 x ~@2 x!2 ~",
  G: "~@2 x ~ x!3 ~", H: "x!3 ~ x ~@3", I: "~ x!2 ~", J: "~@9 x ~@6", K: "~@3 x ~@4", L: "~@10 x!2 ~@4", M: "~ x",
})).gain(0.51)

// drums · clap
const clap = s("cp").struct("<~@17 A B@7 C ~@13 B@8 ~@13 A B@11 C ~@8>".pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x!4 ~@4",
})).gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<A@17 B C@7 D A@12 E C@8 A@13 B C@11 F ~@8>".pickRestart({
  A: "x!8", B: "~@2 x!2", C: "x!4", D: "x ~ x ~ x!4", E: "x!4 ~@4", F: "x!2 ~@2",
})).gain(0.51)

// drums · crash
const crash = s("cr").struct("<~@72 [~ x]!2 [~@9 x ~@6] [~@11 x ~@4] [~@15 x] ~@4>").gain(0.41)

// drums · cowbell
const cowbell = s("cb").struct("<~@17 A B@7 C ~@13 D@8 ~@13 A B@11 C ~@8>".pickRestart({
  A: "~@2 x!2", B: "x!2 ~@2 x ~@3 x ~@3 x ~@3", C: "x!2 ~@2 x ~@11", D: "x ~@3 x ~@3 x!2 ~@2 x ~@3",
})).gain(0.51)

stack(
  acoustic_guitar_steel, bass, electric_guitar_muted, percussive_organ, distortion_guitar, lead_8_bass_lead, whistle,
  electric_guitar_clean, kick, snare, clap, hihat, crash, cowbell
)