Strudelify
Billy Jean cover art

Billy Jean

Michael Jackson

KeyF minorTempo130 bpm
0:00/0:00
// Billy Jean — Jackson Michael
// 130 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 152 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 · pad sweep
const pad_sweep = note(`<
  ~@36 A ~@3 B ~@2 C D E F@2 G ~ H I J@2 K L@2 M@2 N@3 ~ O P Q R L@2 S@2 T@3 ~@2 A ~@3 A ~@2 U V W X Y Z AA ~ AB AC AD
  AE@2 AF AG AH I AI AJ AK K@2 ~@5 AL@2 AM AN ~ W AO AP AQ AR AS AT AU@2 AV AW ~ AX AY ~ AZ BA BB BC BD ~@8 BE BF BG BH
  BI BJ BK BL BM
>`.pickRestart({
  A: "~@6 f5 ~ ab5@2 f5 ~ eb6@2 c6 ~", B: "~@6 f5 ~ ab5 ~ f5 ~ eb6@2 c6 ~",
  C: "~@2 c5 ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,c5,eb5]@3 f4 ~@2 f4 ~", // Fm Cm7
  D: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@2 ~@2 [f4,bb4,c5,eb5]@3 ~@7", // Fm Fsus4
  E: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,bb4,c5,eb5]@2 e4 ~@5", // Fm Fsus4
  F: "[[f4,ab4,c5,f5] ~ ab5 ~@3 [f5,bb5]@4 [f5,ab5]@2 g5@2 [bb4,db5,f5]@4 ~@8 [bb4,db5] ~@3 [bb4,db5,f5] ~, ~@13 f5 ~@2]/2", // Fm Bb5 Fm Bbm
  G: "[f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ [ab4,db5]@3 ~ [f4,ab4,c5]@2, db5 ~@15", // F5 Bbm Db Db5 Fm
  H: "~@2 [f4,ab4,c5,f5] ~ ab5 ~ bb5@4 ab5@2 g5@2 [bb4,db5,f5]@2, ~@6 ab5 ~@9", I: "~@10 [bb4,db5,f5] ~@3 [db5,f5] ~",
  J: "[[db5,f5,c6]@4 [db5,f5,bb5]@3 ~ [db5,f5] ~ [ab4,db5]@3 ~ [f4,ab4,c5]@4 ~@14]/2", K: "~@6 [f5,f6] ~",
  L: "[c5@6 d5 bb4]/2", M: "[c5@6 bb4 ab4]/2", N: "[f4@37 ~@11]/3", O: "~@10 f5 ~@2 f5@2 ~",
  P: "[bb5,db6]@2 ~ [ab5,c6]@2 ~ [f5,ab5]@2 ~ [eb5,g5]@2 [db5,f5]@2 ~ [bb4,db5]@2", Q: "[ab4,c5]@3 ~@5",
  R: "~@12 [f5,f6] ~@3", S: "[c5@23 ~ bb4@4 ab4@4]/2", T: "[f4@17 ~@7]/3",
  U: "~@2 c5 ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,bb4,c5,eb5]@3 ~@3 f4 ~", // Fm Fsus4
  V: "[f4,ab4,c5,f5] ~ [f4,ab4,f5]@2 ~@2 [g4,bb4,c5,eb5]@3 f4 ~@6, ~@2 c5 ~@13", // Fm Cm7
  W: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,c5,eb5]@2 ~@6", // Fm Cm7
  X: "[ab4,f5] ~ [ab4,c5,ab5] ~@3 [ab4,c5,bb5]@3 ~ [ab4,c5,ab5] ~ [ab4,c5] ~ [bb4,db5,f5]@2, c5 ~@5 g5 ~", // Db Ab Bbm
  Y: "~@10 [bb4,db5,f5] ~@3 [bb4,db5,f5] ~", // Bbm
  Z: "[db5,f5,ab5,c6]@3 ~ [f5,bb5]@2 ~@2 [db5,f5] ~ [bb4,db5]@2 ~@2 [f4,ab4,c5]@2", // Dbmaj7 Bb5 Db Bbm Fm
  AA: "~@8 [c6,c7] ~@2 [db5,db6] [c5,c6]@2 ~@2, ~@9 [ab5,ab6]@2 ~@5, ~@5 [f5,f6] ~@2", // C Db C Ab F
  AB: "~@2 [f4,ab4,c5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,eb5]@2 ~@4 c5 ~, ~@8 c5 ~@7", // Fm Eb
  AC: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [f4,bb4,c5,eb5]@3 ~@7", // Fm Fsus4
  AD: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,bb4,c5,eb5]@2 ~@6", // Fm Fsus4
  AE: "[[ab4,c5] ~ ab5@2 ~@2 bb5@4 ab5@2 g5@2 [ab4,db5,f5]@4 ~@8 [ab4,db5,f5] ~@3 [ab4,db5,f5] ~, f5@2 ~@4 ab5 ~@25]/2", // Ab Db
  AF: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ db5@2 ~@2 [f4,ab4,c5]@2", // Dbmaj7 Bbm Db Fm
  AG: "~@2 c5@2 c6 ~@3 [c6,c7] [ab5,ab6] [f5,f6] [db5,db6] [c5,c6]@2 ~@2", // C Ab F Db C
  AH: "~@2 [c5,f5] ~ [c5,f5,ab5] ~ [c5,f5,bb5]@4 [c5,f5,ab5] ~ [c5,f5,g5] ~ [bb4,db5,f5]@2", // F5 Fm Fsus4 Fm Csus4 Bbm
  AI: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ [bb4,db5]@3 ~ c5@2, ~@14 ab4 ~", // Dbmaj7 Bbm Db Bbm
  AJ: "~@2 c5 ~ c6 ~@3 [c6,c7] ab6 ~@2 [c5,c6]@3 ~, ~@9 ab5@2 [db5,db6]@2 ~@3, ~@5 [f5,f6] ~@2", // C Db F
  AK: "~@4 c6 ~@3 bb5 ~@3 ab5 ~@3",
  AL: "[~@2 [c5,f5] ~ [c5,ab5] ~ [f5,bb5]@4 [c5,f5,ab5] ~ [c5,f5,g5] ~ [bb4,db5,f5]@5 ~@7 [bb4,db5,f5] ~@3 f5@2, ~@30 db5 ~]/2", // F5 Fm Bb5 Fm Csus4 Bbm
  AM: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ db5@3 ~ [f4,ab4,c5]@2, ~@10 ab4 ~@5", // Dbmaj7 Bbm Db Fm
  AN: "~@2 c5@2 c6 ~@3 [c6,c7] ~ [f5,db6,f6]@2 [c5,c6]@2 ~@2, ~@9 [ab5,ab6]@2 ~@5, ~@10 db5 ~@5", // C Db C Ab
  AO: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [g4,bb4,c5,eb5]@3 [bb4,c5] ~@6", // Fm Cm7 Bbsus2
  AP: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,eb5] ~@7, ~@4 c5 ~@3", // Fm Eb
  AQ: "[f4,ab4,c5,f5] ~ f5@2 ~@2 [f5,bb5]@4 [f5,ab5] ~ g5 ~ [bb4,db5,f5]@2, ~@2 ab5 ~@13", // Fm Bb5 Fm Bbm
  AR: "~@9 [db5,f5] bb4 ~@3 [db5,f5] ~", AS: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@2 ~@2 [db5,f5] ~ [bb4,db5]@3 ~ c5@2",
  AT: "~@2 c5 ~ c7 ~@3 [c6,c7] ~@2 [db5,db6] [c5,c6]@2 ~@2, ~@9 [ab5,ab6]@2 ~@5, ~@5 [f5,f6] ~@2", // C Db C Ab F
  AU: "[~@2 [c5,f5] ~ [c5,gb5,ab5] ~ [c5,f5,bb5]@3 ~ [c5,f5,ab5] ~ [c5,g5] ~ [bb4,db5,f5]@4 ~@8 [bb4,db5,f5] ~@3 f5@2, ~@30 db5 ~]/2", // F5 Ab7 Fsus4 Fm C5 Bbm
  AV: "[db5,f5,c6]@3 [db5,f5,bb5]@4 ~ [db5,f5] ~ db5@2 ~@2 [f4,ab4,c5]@2", // Dbmaj7 Bbm Db Fm
  AW: "~@2 c5 ~ c6 ~@3 [c6,c7] ab6 ~ [db5,db6] [c5,c6]@3 ~, ~@9 ab5@2 ~@5, ~@5 [f5,f6] ~@2", AX: "[f4,c5,f5] ~@7",
  AY: "~@2 f5 ~ ab5 ~ bb5@4 ab5 ~ g5 ~ [f4,ab4,c5,f5]@2", AZ: "~@2 f5 ~ ab5 ~ bb5@4 ab5 ~ g5@2 [f4,ab4,c5,f5]@2",
  BA: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 [ab4,c5] ~@5", // Fm Ab
  BB: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [ab4,c5,eb5]@4 [ab4,c5] ~@5", // Fm Ab
  BC: "f3 ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 [f4,ab4,c5] ~@5", // Fm Ab Fm
  BD: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@2 ~@2 [ab4,eb5]@4 [f4,ab4,c5] ~@5, ~@6 c5 ~@9", // Fm Ab5 Fm
  BE: "f3@2 [c5,f5] ~ [ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 f4 ~@3 f4 ~, ~@8 f4 ~@7", // F5 Fm Ab
  BF: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [f4,ab4,c5,eb5]@3 c5 ~@6", // Fm Fm7
  BG: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5]@2 ~@4 f4 ~, ~@8 eb5 ~@7", // Fm
  BH: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [g4,bb4,c5,eb5]@3 [g4,c5] ~@6", // Fm Cm7 C5
  BI: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 ~@4 f4 ~, ~@8 f4 ~@7", // Fm Ab
  BJ: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [f4,ab4,c5,eb5]@3 eb5 c5 ~@5", // Fm Fm7
  BK: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,c5,eb5]@2 ~@4 f4 ~", // Fm Cm7
  BL: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@2 ~@2 [c5,eb5]@4 [f4,ab4,c5] ~@5, ~@6 [f4,ab4]@3 ~@7", // Fm Cm Fm
  BM: "[ab5,c6,f6] ~@15, f5 ~@7", // Fm
})).s("gm_pad_sweep").gain(0.36)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@11 A B C D A B C D E F G H I J C K A B A D E F G H L M N O P Q R ~ A B C S T F G U V J C K A B C S E F G U I J C K A
  B C S E F G H W@2 X Y Z@2 AA AB A B C S T AC G U A B A S E F G U V J C K A B A D A B C D T F G H A B A D E F G H V J C
  K A B C S A B C D ~@8 A B C S A B C S AD
>`.pickRestart({
  A: "[ab4,c5,f5] ~@5 [bb4,d5,g5] ~@9", B: "[c5,eb5,ab5] ~@5 [bb4,d5,g5] ~@9",
  C: "[ab4,c5,f5] ~@5 [bb4,d5] ~@9, ~@3 g5 ~@4", D: "[c5,eb5,ab5] ~@5 [d5,g5]@2 ~@8, ~@6 bb4 ~@9",
  E: "[bb4,db5] ~@5 [bb4,db5] ~@9, f5 ~@2 f5 ~@4", F: "[bb4,f5] ~@2 [bb4,f5] ~@4, db5 ~@5 db5 ~@9",
  G: "[ab4,c5,f5] ~@2 [d5,g5] ~@4, ~@6 bb4 ~@9", H: "[c5,ab5] ~@2 [bb4,d5,g5] ~@4, eb5 ~@15",
  I: "[db5,f5]@2 ~@4 [bb4,db5,f5] ~@9, bb4 ~@15", J: "[bb4,db5,f5]@15 ~",
  K: "[c5,ab5]@2 ~@4 [bb4,d5] ~@9, eb5 ~@5 g5@2 ~@8", L: "~@10 [f4,ab4]@3 ~@3", M: "c5@15 ~", N: "~@5 [f4,ab4,eb5] ~@2",
  O: "c5@5 ~ c6@3 [g5,bb5] [f5,ab5]@2 ~@4, ~@6 [c5,ab5]@5 ~@5", P: "f4@9 ~ [f4,ab4,eb5]@3 ~@3", Q: "c5@11 ~@2 c5@2 ~",
  R: "[f4,ab4,db5]@8 ~@5 f4 ~@2", S: "[c5,eb5,ab5] ~@5 [bb4,d5] ~@9, ~@3 g5 ~@4",
  T: "[bb4,db5] ~@5 [bb4,db5,f5] ~@9, f5 ~@7", U: "[c5,ab5] ~@2 [d5,g5] ~@4, eb5 ~@5 bb4 ~@9",
  V: "[db5,f5]@2 ~@4 [db5,f5] ~@9, bb4 ~@5 bb4@2 ~@8", W: "[ab4@13 ~@13 g5@3 ab5@3, f5@25 ~@7, db5@9 ~@7 c5@14 ~@2]/2",
  X: "f6", Y: "c5@7 ~", Z: "[[ab4,db5]@10 eb5@3 db5@3 ~@10 g5@3 ab5@3, f5@25 ~@7, ~@8 c5@7 ~]/2",
  AA: "~@10 eb5@3 db5@2 ~, f6", AB: "[c5,g5]@7 ~", AC: "[bb4,f5]@2 ~@4 [db5,f5] ~@9, db5 ~@5 bb4@2 ~@8",
  AD: "[f4,ab5,f6] ~@7", // Fm
})).s("gm_synth_strings_1").gain(0.43)

// chords · synth strings 1 · soft notes
const synth_strings_1_soft = note("<~@35 A B C D E F G H ~@32 I J K L ~ M N O ~@69>".pickRestart({
  A: "[ab4,db5]@10 eb5@3 [f4,ab4,db5]@3, f4@9 ~@7", B: "[f4,ab4]@15 ~", C: "[f4,ab4,db5]@9 ~@4 [f4,ab4,db5]@2 ~",
  D: "[f4,ab4]@5 ~@11", E: "[ab4,db5]@9 ~@4 [f4,ab4,db5]@2 ~", F: "[f4,ab4]@11 ~@2 f4@2 ~, ~@13 ab4 ~@2",
  G: "~@10 [f4,ab4,db5]@2 ~ [ab4,db5] ~@2", H: "[bb4,c5,e5]@13 ~@3", I: "~@10 eb5@3 db5@3", J: "~@12 ab5 ~@3, ab4@7 ~",
  K: "db5@9 ~ eb5@3 db5@3, ab4@3 ~", L: "ab4@13 ~@3", M: "ab4@7 ~", N: "ab4@13 ~@3, db5@9 ~@7", O: "bb4@7 ~",
})).s("gm_synth_strings_1").gain(0.24)

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

// drums · rim
const rim = s("rim").struct(`<
  ~@36 A ~ A ~ A ~ A ~@11 A ~@11 A ~@9 A ~ A ~ A ~ A ~@20 A@2 ~@5 A ~@24 B@8 ~@4 A ~ A ~@2
>`.pickRestart({
  A: "~@3 x", B: "x!2 ~@14",
})).gain(0.55)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!134 ~@8 [~ x ~ x]!8 x>").gain(0.55)

// drums · clap
const clap = s("cp").struct(`<
  [~ x ~ x]!138
  [~@4 x ~@7 x!4]
  [~ x ~ x]
  [~@4 x ~@7 x!4]
  [~ x ~ x]
  [~@4 x ~@7 x!4]
  [~ x ~ x]!8
  x
>`).gain(0.37)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@44 A ~@39 A ~@5 A ~ A ~@9 A ~@11 A ~ A ~@9 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@3 x",
})).gain(0.61)

// drums · hihat
const hihat = s("hh").struct("<[x ~@3 x ~@3 x ~@3 x!4] [x!8]!150 ~>").gain(0.37)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@36 A ~ A ~ A ~ A ~@11 A ~@11 A ~@9 A ~ A ~ A ~ A ~@20 A@2 ~@5 A ~@36 A ~ A ~ B
>`.pickRestart({
  A: "~@3 x", B: "x",
})).gain(0.61)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@6 A B ~@19 B ~@46 A ~@24 A ~@6 A B ~@3 B ~@11 B ~@28>".pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.06)

// drums · crash
const crash = s("cr").struct(`<
  ~@35 A B ~ B ~ B ~ B A ~@10 B ~@11 B ~@8 A B ~ B ~ B ~ B A ~@7 A ~@11 B@2 ~@5 B ~@4 A ~@11 A ~@15 A ~ A ~ B ~ B ~ A
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.18)

// drums · agogo bells
const agogo_bells = s("agogo:4").struct("<~@135 [~@3 x ~@3 x]!8 ~@9>").gain(3.9)

stack(
  pad_sweep, synth_strings_1, synth_strings_1_soft, kick, rim, snare, clap, low_tom, hihat, open_hat, open_hat_soft,
  crash, agogo_bells
)

More by Michael Jackson