Strudelify

Jenny From the Block

Jennifer Lopez

KeyG♯ minorTempo98 bpm
0:00/0:00
// Jenny From the Block — Jennifer Lopez
// 98 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · brass section
const brass_section = note(`<
  A ~@14 B C B C B C B C B C D C B C D C B C D C B C D C B C D C B C D C B C D C B C D C B C D C B C D C B C D C B C D C
  E@7 F B C D C B C D C ~
>`.pickRestart({
  A: "~@4 c-1 ~@11", B: "~@8 [d#5,g#5] ~@7", C: "~@8 [d#5,g#5] ~@3 [d#5,g#5] ~@3", D: "~@12 [d#5,g#5] ~@3",
  E: "[d#5,g#5]@2 ~@8 [d#5,g#5]@2 ~ [d#5,g#5]@2 ~", F: "[d#5,g#5] ~@7",
})).s("gm_brass_section").gain(0.35)

// chords · synth brass 2
const synth_brass_2 = note(`<
  ~ A ~@12 B C D E F C D E G ~@15 B C D E F C D E H ~@15 B C D E F C D E H ~@7 B C D E F C D E G ~
>`.pickRestart({
  A: "c-1 ~@7", B: "~@6 [b3,d#4]!2", C: "[b3,d#4]!3 [c#4,f#4] [d#4,g#4] [b3,d#4] [g#4,b4] [f#4,a#4]",
  D: "[g#4,b4] [f#4,a#4] [d#4,g#4] [c#4,f#4] [a#3,d#4]@2 [d#4,g#4] [f#4,a#4]", // G#m F# G#5 F#5 D#5 G#5 F#
  E: "[g#4,b4]@2 [f#4,a#4]@2 [d#4,g#4]@2 [g#4,b4]@5 ~@3 [g#4,b4]@2", // G#m F# G#5 G#m
  F: "[g#4,b4] [f#4,a#4] [d#4,g#4] [c#4,f#4] g3!2 [b3,d#4]!2", G: "[g#4,b4] [f#4,a#4] [d#4,g#4] [c#4,f#4] ~@4",
  H: "[g#4,b4] [f#4,a#4] [d#4,g#4] [c#4,f#4] g3!2 ~@2", // G#m F# G#5 F#5
})).s("gm_synth_brass_2").gain(0.33)

// other · synth brass 1
const synth_brass_1 = note(`<
  ~ A B C ~@10 D E F G H E F G I ~@15 D E F G H E F G I ~@15 D E F G H E F G I ~@7 D E F G H E F G I ~
>`.pickRestart({
  A: "c-1 ~ g#4 ~ g#4@2 g#4@2 f#4 g#4 ~ f#4 g#4 ~ g#4 ~", B: "f#4@2 g#4 ~ g#4@2 g#4 ~ g#4@2 g#4@2 c#5@2 b4@2",
  C: "f#4 g#4!2 ~ g#4 ~ g#4!2 ~ g#4 ~ f#4@3 g#4 ~", D: "~@12 g#4 ~ g#4 ~",
  E: "g#4 ~ g#4!3 ~ g#4 a#4 b4@2 ~@2 d#5 ~ c#5 ~", F: "d#5@2 c#5 ~ b4!2 a#4!2 g#4 ~@3 b4!2 c#5!2",
  G: "d#5!2 c#5!2 b4 c#5 d#5@2 ~@3 b4 c#5 d#5 c#5 b4", H: "d#5@2 c#5 b4 c#5@2 b4@2 ~@4 g#4 ~ g#4 ~",
  I: "d#5@2 c#5 b4 c#5@2 b4@2 ~@8",
})).s("gm_synth_brass_1").gain(0.42)

// chords · electric guitar jazz · C#m C#m7 A#dim G#m
const electric_guitar_jazz = note(`<
  [c-1 ~@7]
  ~@3
  [[c#4,e4,g#4]@2 ~@2 [b3,c#4,e4]@2 ~@2 [a#3,c#4,e4]@3 ~ [g#3,b3,d#4]@3 ~]!3
  ~@81
>`).s("gm_electric_guitar_jazz").gain(0.24)

// bass · electric bass finger
const bass = note(`<
  A ~@3 B@3 C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D E D C D
  E D C D E D C D E D ~@8 C D E D C D E D F
>`.pickRestart({
  A: "~@4 c-1 ~@3", B: "c#2 ~ b1 ~ a#1 ~ g#1 b1", C: "~@8 g#2!2 ~ g#2 ~ f#2 g#2 ~", D: "~@8 d#2!2 ~ d#2 ~ d#2!2 ~",
  E: "~@8 g#2!2 ~ g#2 ~ g#2!2 ~", F: "g#2 ~@7",
})).s("gm_electric_bass_finger").gain(0.46)

// drums · kick
const kick = s("bd").struct(`<
  ~@7
  [x ~@2 x ~@6 x!2 ~@4]!63
  [x ~@2 x ~@12]
  [x ~@2 x ~@6 x!2 ~@4]!8
  x!4
  [x ~@2 x ~@6 x!2 ~@4]!4
  x
>`).gain(0.45)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!3 ~@84>").gain(0.45)

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

// drums · low tom
const low_tom = s("lt").struct("<~@79 [~@13 x!2 ~] ~ [~@13 x!2 ~] ~@6>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@3 A B C B D@7 E D@55 F D@7 E ~@4 D@4 ~>".pickRestart({
  A: "~@7 x", B: "x ~ x!8 ~ x!5", C: "x!10 ~ x!5", D: "x!2 ~@2 x!9 ~ x!2", E: "x!2 ~@2 x!9 ~@3", F: "x!2 ~@2 x!6 ~@6",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@79 [~@12 x!2 ~@2] [~@6 x!2] [~@12 x!2 ~@2] [~@6 x!2] ~@5>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@3 A B@3 C@63 D C@7 D ~@4 C@4 ~>".pickRestart({
  A: "~@13 x ~ x", B: "~@5 x ~@2", C: "~@2 x ~@10 x ~@2", D: "~ x ~@6",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct("<~@80 [~@11 x ~@4] ~ [~@11 x ~@4] ~@5>").gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@79 x!4 ~@4 x>").gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@7 [x ~ x ~ x ~ x!2]!64 [x!4]!12 [x ~ x ~ x ~ x!2]!4 x>").gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [x!16]!70 ~@12 [x!16]!4 ~>").gain(2.02)

stack(
  brass_section, synth_brass_2, synth_brass_1, electric_guitar_jazz, bass, kick, clap, snare, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, ride, cabasa
)

More by Jennifer Lopez