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, A@4 for four bars: edit a riff to change every repeat.

// chords · pad sweep
const pad_sweep = note(`<
  ~@36 A ~@3 A ~@2 B C D E@2 F ~ G H I@2 J K@2 L@2 M@3 ~ N O P Q K@2 L@2 R@3 ~@2 A ~@3 A ~@2 S T U V W X Y ~ Z C AA AB@2
  AC AD AE H AF AG AH J@2 ~@5 AI@2 AJ AK ~ U AL U AM AN AO AP AQ@2 AR AS ~ AT AU ~ AV AW AX AY AZ ~@8 BA BB BC BD BC BE
  BF BG BH
>`.pickRestart({
  A: "~@6 f5 ~ ab5@2 f5 ~ eb6@2 c6 ~", B: "~@2 c5 ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,c5,eb5]@3 f4 ~@2 f4 ~",
  C: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@2 ~@2 [f4,bb4,c5,eb5]@3 ~@7", // Fm Fsus4
  D: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,bb4,c5,eb5]@2 e4 ~@5", // Fm Fsus4
  E: "[[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
  F: "[f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ [ab4,db5]@3 ~ [f4,ab4,c5]@2, db5 ~@15", // F5 Bbm Db Db5 Fm
  G: "~@2 [f4,ab4,c5,f5] ~ ab5 ~ bb5@4 ab5@2 g5@2 [bb4,db5,f5]@2, ~@6 ab5 ~@9", H: "~@10 [bb4,db5,f5] ~@3 [db5,f5] ~",
  I: "[[db5,f5,c6]@4 [db5,f5,bb5]@3 ~ [db5,f5] ~ [ab4,db5]@3 ~ [f4,ab4,c5]@4 ~@14]/2", J: "~@6 [f5,f6] ~",
  K: "[c5@6 d5 bb4]/2", L: "[c5@6 bb4 ab4]/2", M: "[f4@37 ~@11]/3", N: "~@10 f5 ~@2 f5@2 ~",
  O: "[bb5,db6]@2 ~ [ab5,c6]@2 ~ [f5,ab5]@2 ~ [eb5,g5]@2 [db5,f5]@2 ~ [bb4,db5]@2", P: "[ab4,c5]@3 ~@5",
  Q: "~@12 [f5,f6] ~@3", R: "[f4@17 ~@7]/3", S: "~@2 c5 ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,bb4,c5,eb5]@3 ~@3 f4 ~",
  T: "[f4,ab4,c5,f5] ~ [f4,ab4,f5]@2 ~@2 [g4,bb4,c5,eb5]@3 f4 ~@6, ~@2 c5 ~@13", // Fm Cm7
  U: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,c5,eb5]@2 ~@6", // Fm Cm7
  V: "[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
  W: "~@10 [bb4,db5,f5] ~@3 [bb4,db5,f5] ~", // Bbm
  X: "[db5,f5,ab5,c6]@3 ~ [f5,bb5]@2 ~@2 [db5,f5] ~ [bb4,db5]@2 ~@2 [f4,ab4,c5]@2", // Dbmaj7 Bb5 Db Bbm Fm
  Y: "~@8 [c6,c7] ~@2 [db5,db6] [c5,c6]@2 ~@2, ~@9 [ab5,ab6]@2 ~@5, ~@5 [f5,f6] ~@2", // C Db C Ab F
  Z: "~@2 [f4,ab4,c5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,eb5]@2 ~@4 c5 ~, ~@8 c5 ~@7", // Fm Eb
  AA: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,bb4,c5,eb5]@2 ~@6", // Fm Fsus4
  AB: "[[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
  AC: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ db5@2 ~@2 [f4,ab4,c5]@2", // Dbmaj7 Bbm Db Fm
  AD: "~@2 c5@2 c6 ~@3 [c6,c7] [ab5,ab6] [f5,f6] [db5,db6] [c5,c6]@2 ~@2", // C Ab F Db C
  AE: "~@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
  AF: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ [bb4,db5]@3 ~ c5@2, ~@14 ab4 ~", // Dbmaj7 Bbm Db Bbm
  AG: "~@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
  AH: "~@4 c6 ~@3 bb5 ~@3 ab5 ~@3",
  AI: "[~@2 [c5,f5] ~ [c5,ab5] ~ [f5,bb5]@4 [c5,f5,ab5] ~ [c5,f5,g5] ~ [bb4,db5,f5]@5 ~@7 [bb4,db5,f5] ~@3 [db5,f5] ~]/2", // F5 Fm Bb5 Fm Csus4 Bbm Db
  AJ: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@3 ~ [db5,f5] ~ db5@3 ~ [f4,ab4,c5]@2, ~@10 ab4 ~@5", // Dbmaj7 Bbm Db Fm
  AK: "~@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
  AL: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [g4,bb4,c5,eb5]@3 [bb4,c5] ~@6", // Fm Cm7 Bbsus2
  AM: "[f4,ab4,c5,f5] ~ f5@2 ~@2 [f5,bb5]@4 [f5,ab5] ~ g5 ~ [bb4,db5,f5]@2, ~@2 ab5 ~@13", // Fm Bb5 Fm Bbm
  AN: "~@9 [db5,f5] bb4 ~@3 [db5,f5] ~", AO: "[db5,f5,c6]@3 ~ [db5,f5,bb5]@2 ~@2 [db5,f5] ~ [bb4,db5]@3 ~ c5@2",
  AP: "~@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
  AQ: "[~@2 [c5,f5] ~ [c5,gb5,ab5] ~ [c5,f5,bb5]@3 ~ [c5,f5,ab5] ~ [c5,g5] ~ [bb4,db5,f5]@4 ~@8 [bb4,db5,f5] ~@3 [db5,f5] ~]/2", // F5 Ab7 Fsus4 Fm C5 Bbm Db
  AR: "[db5,f5,c6]@3 [db5,f5,bb5]@4 ~ [db5,f5] ~ db5@2 ~@2 [f4,ab4,c5]@2", // Dbmaj7 Bbm Db Fm
  AS: "~@2 c5 ~ c6 ~@3 [c6,c7] ab6 ~ [db5,db6] [c5,c6]@3 ~, ~@9 ab5@2 ~@5, ~@5 [f5,f6] ~@2", AT: "[f4,c5,f5] ~@7",
  AU: "~@2 f5 ~ ab5 ~ bb5@4 ab5 ~ g5 ~ [f4,ab4,c5,f5]@2", AV: "~@2 f5 ~ ab5 ~ bb5@4 ab5 ~ g5@2 [f4,ab4,c5,f5]@2",
  AW: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 [ab4,c5] ~@5", // Fm Ab
  AX: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [ab4,c5,eb5]@4 [ab4,c5] ~@5", // Fm Ab
  AY: "f3 ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 [f4,ab4,c5] ~@5", // Fm Ab Fm
  AZ: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@2 ~@2 [ab4,eb5]@4 [f4,ab4,c5] ~@5, ~@6 c5 ~@9", // Fm Ab5 Fm
  BA: "f3@2 [c5,f5] ~ [ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [ab4,c5,eb5]@2 f4 ~@3 f4 ~, ~@8 f4 ~@7", // F5 Fm Ab
  BB: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [f4,ab4,c5,eb5]@3 c5 ~@6", // Fm Fm7
  BC: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5]@2 ~@4 f4 ~, ~@8 eb5 ~@7", // Fm
  BD: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [g4,bb4,c5,eb5]@3 [g4,c5] ~@6", // Fm Cm7 C5
  BE: "[f4,ab4,c5,f5] ~ [f4,ab4,c5,f5]@3 ~ [f4,ab4,c5,eb5]@3 eb5 c5 ~@5", // Fm Fm7
  BF: "~@2 [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [f4,ab4,c5,f5] ~ [g4,bb4,c5,eb5]@2 ~@4 f4 ~", // Fm Cm7
  BG: "[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
  BH: "[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 A B A B A B C@2 A B C D A B A B A B C@2 A B E F G H I J K ~ A B A B C@2 A B C D A B A B A B C@2 A B C D A B A
  B A B C@2 A B L@2 M N O@2 P Q A B A B C@2 A B A B A B C@2 A B C D A B A B A B A B A B C@2 A B A B A B C@2 A B C D A B
  A B A B A B A B ~@8 A B A B A B A B R
>`.pickRestart({
  A: "[ab4,c5,f5] ~@5 [bb4,d5,g5] ~@9", B: "[c5,eb5,ab5] ~@5 [bb4,d5,g5] ~@9",
  C: "[bb4,f5] ~@2 [bb4,f5] ~@4, db5 ~@5 db5 ~@9", D: "[bb4,db5,f5]@15 ~", E: "~@10 [f4,ab4]@3 ~@3", F: "c5@15 ~",
  G: "~@5 [f4,ab4,eb5] ~@2", H: "c5@5 ~ c6@3 [g5,bb5] [f5,ab5]@2 ~@4, ~@6 [c5,ab5]@5 ~@5",
  I: "f4@9 ~ [f4,ab4,eb5]@3 ~@3", J: "c5@11 ~@2 c5@2 ~", K: "[f4,ab4,db5]@8 ~@5 f4 ~@2",
  L: "[ab4@13 ~@13 g5@3 ab5@3, f5@25 ~@7, db5@9 ~@7 c5@14 ~@2]/2", M: "f6", N: "c5@7 ~",
  O: "[[ab4,db5]@10 eb5@3 db5@3 ~@10 g5@3 ab5@3, f5@25 ~@7, ~@8 c5@7 ~]/2", P: "~@10 eb5@3 db5@2 ~, f6",
  Q: "[c5,g5]@7 ~", R: "[f4,ab5,f6] ~@7",
})).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 ~ L M N ~@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@13 ~@3, db5@9 ~@7", N: "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