Strudelify
Billie Jean cover art

1982 · Thriller

Billie Jean

Michael Jackson

KeyF♯ minorTempo118 bpm
0:00/0:00
// Billie Jean — Jackson Michael
// 117.6 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 8 "refrain strings" named as a string part, played on string ensemble 1 (its accordion patch is not one)
// note: Full arrangement: all 159 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117.6/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.

// bass · fretless bass · "bass line"
const bass = note(`<
  ~@2 A@16 B C A@2 B C A@6 D E A@2 F@2 G@2 H I J K L@4 M N L@2 O P L@6 O P L@2 O P L@6 O Q L@2 R@2 S@2 T@2 U V L@4 O W
  L@2 X@4 O W Y@2 Z AA Y@2 L@8 AB AC AD@6 AE AF AD@2 AE AG AD@33 ~@2
>`.pickRestart({
  A: "f#2 ~ c#2 ~ e2 ~ f#2 ~ e2 ~ c#2 ~ b1 ~ c#2 ~",
  B: "b2@2 ~@2 f#2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2", C: "b2 ~ f#2 ~ a2 ~ b2 ~@3 f#2 ~ e2 ~ c#2 ~",
  D: "~ b2@2 ~ f#2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2",
  E: "~ b2@2 ~ f#2@2 ~@2 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~@2",
  F: "[~ [d1,d2]@14 ~@2 d1@12 e2@2 f2@2 [f#1,f#2]@14 ~@2 f#1@15, ~@15 d2@14 ~@18 f#2@17]/2", // D F#
  G: "[~ [d1,d2]@14 ~ d2@13 e2@2 f2@2 [f#1,f#2]@31, ~ c1 ~@13 d1@16 ~@33]/2", // D F#
  H: "~ [d1,d2]@14 ~@2 d1@12 ~ f2@2, ~@15 d2@14 [e1,e2]@3", I: "~ [f#1,f#2]@14 ~ f#1@15 ~, ~@15 f#2@17",
  J: "~ [d1,d2]@15 ~ [d1,d2]@14 ~", K: "~ c#1@5 ~@3 [c#1,c#2]@5 ~@2 [c#1,c#2]@5 ~@4 [c#1,c#2]@5 ~@2, c#2@3 ~@13",
  L: "~ f#2@2 ~@2 c#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~@2 b1@2 ~@2 c#2@2 ~",
  M: "~ b2@2 ~ f#2 ~@4 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2 ~",
  N: "~ b2@2 ~ f#2@2 ~@2 a2@2 ~@3 b2@2 ~@6 f#2@2 ~ e2@2 ~@2 c#2@2 ~@2",
  O: "~ b2@2 ~@2 f#2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2 ~",
  P: "~ b2@2 ~ f#2@2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~ e2@2 ~@2 c#2@2 ~@2",
  Q: "~ b2@2 ~@2 f#2@2 ~@2 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~ c#2@2 ~@2",
  R: "[~ [d1,d2]@14 ~@2 d1@12 e2@2 f2@2 [f#1,f#2]@14 ~@2 f#1@15, ~@16 d2@14 ~@17 f#2@17]/2", // D F#
  S: "[~@2 [d1,d2]@14 ~ d2@12 e2@2 f2@3 [f#1,f#2]@30, ~@2 c1 ~@13 d1@16 ~@32]/2", // D F#
  T: "[~ [d1,d2]@15 ~ d1@12 e2@2 f2@2 ~ f#1@14 ~ f#1@15, ~@16 d2@13 e1@4 f#2@13 ~@2 f#2@16]/2", // D
  U: "~ [d1,d2]@15 ~@2 [d1,d2]@14", V: "~ [c#1,c#2]@6 ~@2 [c#1,c#2]@5 ~@3 [c#1,c#2]@5 ~@3 [c#1,c#2]@5 ~@2",
  W: "~ b2@2 ~@2 f#2@2 ~@2 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~",
  X: "[~ f#2@2 ~@2 c#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2 e2@2 ~@3 c#5 ~@2 b1@2 ~@3 c5@2 ~ f#2@2 ~@2 c#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~@2 [b1,b4]@2 a4@2 [c#2,c5]@2 c#5@2 f#2@2 ~@2 c#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~@3 c#5 ~@6 f#2@2 ~@2 c#2@2 ~@2 e2@2 ~@2 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~@2 [b1,b4]@2 ~@2 c#2@2 ~, ~@21 c#2@2 ~@2 c#5 ~@3 c#2@2 ~@58 b1@2 ~@2 [c#2,c5]@2 ~@33, ~@30 c#5@23 b4 ~@31 c#5 ~@8 c#5@23 b4 ~@5 a4@5]/4", // B C#maj7 B C#maj7
  Y: "~ f#2@2 ~@3 c#5 ~@3 c#6@3 ~ c#5 ~@2 e2@2 ~@2 c#2@2 ~@2 b1@2 ~@2 c#2@2 ~, ~@5 c#2@2 ~@2 [e2,c#5]@2 ~@2 f#2@2 ~@17", // C#m
  Z: "~@2 b2@2 ~ f#2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2 ~",
  AA: "~@2 b2@2 ~ f#2@2 ~@2 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~",
  AB: "~@2 b2@2 ~ f#2 ~@3 a2@2 ~@3 b2@2 ~@6 f#2@2 ~ e2@2 ~@2 f#2@2 ~",
  AC: "~@2 b2@2 ~ f#2@2 ~@2 a2@2 ~@3 b2@2 ~@5 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~",
  AD: "~ f#2 ~ c#2 ~ e2 ~ f#2 ~ e2 ~ c#2 ~ b1 ~ c#2",
  AE: "~@2 b2@2 ~ f#2 ~@4 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2",
  AF: "~@2 b2@2 ~ f#2@2 ~@2 a2@2 ~@3 b2@2 ~@6 f#2@2 ~ e2@2 ~@2 c#2@2 ~",
  AG: "~@2 b2@2 ~ f#2@2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~ e2@2 ~@2 c#2@2 ~",
})).s("gm_fretless_bass").gain(0.57)

// chords · string ensemble 1 · "pad"
const string_ensemble_1 = note(`<
  ~@10 A B A B A B A B C@2 A B C@2 A B A B A B C@2 A B ~@8 D E F G ~@2 H I ~@2 H I H I H I J@2 H I J@2 H I H I H I J@2 H
  I ~@8 D K L M ~@2 H I N K O P ~@2 H I ~@2 H I Q K Q K Q K R K ~@2 S T R K R K ~@2 S T ~@2 S T R K R K R K R U R U R U
  R U R U R U R U R U R U R V R V R V R ~@2
>`.pickRestart({
  A: "[c#4,f#4] ~@5 [d#4,g#4] ~@9", B: "[e4,a4] ~@5 [d#4,g#4] ~@9", C: "[d4,f#4] ~@5 [d4,f#4] ~@9",
  D: "~ [c#4,f#4]@12 g#4@19", E: "~ e4@12 [d#4,g#4]@19", F: "~ [c#4,f#4]@11 ~ [d#4,g#4]@19",
  G: "~ [e4,a4]@12 [d#4,g#4]@18 ~", H: "~ [c#4,f#4]@2 ~@10 [d#4,g#4]@2 ~@17", I: "~ [e4,a4]@2 ~@10 [d#4,g#4]@2 ~@17",
  J: "~ [d4,f#4]@2 ~@10 [d4,f#4]@2 ~@17", K: "~ e4@6 [d#4,g#4]@9", L: "~ [c#4,f#4]@11 ~@2 d#4@18, ~@13 g#4@18 ~",
  M: "~ e4@6 [d#4,g#4]@9, ~ a4@11 ~@20", N: "~ [c#4,f#4]@12 ~ g#4@18", O: "~@2 c#4@11 ~ [d#4,g#4]@18, ~ f#4@11 ~@20",
  P: "~ [e4,a4]@6 [d#4,g#4]@9", Q: "~ f#4@6 g#4@9, ~ c#4@12 ~@19", R: "~ [c#4,f#4]@6 g#4@9",
  S: "~ [c#4,f#4] ~@5 [d#4,g#4] ~@8", T: "~ [e4,a4] ~@5 [d#4,g#4] ~@8", U: "~@2 e4@12 ~ d#4@17, ~@7 g#4@9",
  V: "~@3 e4@12 [d#4,g#4]@17", // G#5
})).s("gm_string_ensemble_1").gain(0.22)

// chords · string ensemble 1 · "pad" · soft notes
const string_ensemble_1_soft = note(`<
  ~@42 A B ~@2 C@2 ~@2 D@2 ~@30 A B ~@2 E@3 ~ F B ~@2 G@3 ~ H@3 ~ F I F I F I F I H@3 ~ F I F I J@3 ~ J@3 ~ F I F I F I
  F I F I F I F I F I F I F I F I F I F I F I F I F ~@2
>`.pickRestart({
  A: "~@13 d#4@19", B: "~ a4@13 ~@18", C: "[[d4,f#4] [d4,f#4]@63]/2", D: "[~ [d4,f#4]@63]/2",
  E: "[~ [d4,f#4]@64 ~@31]/3", F: "~@7 d#4@9", G: "[~ d4 d4@63 ~@31, ~ f#4@64 ~@31]/3",
  H: "[~@2 d4@63 ~@31, ~ f#4@64 ~@31]/3", I: "~@2 a4@13 ~@17", J: "[~ [d4,f#4]@32 ~@15]/3",
})).s("gm_string_ensemble_1").gain(0.13)

// other · trombone · "trumpet"
const trombone = note("<~@35 A ~@3 B ~@35 C ~@3 D ~@79>".pickRestart({
  A: "~@13 f#4@2 ~ a4@4 f#4@3 ~ e5@5 c#5@3", B: "~@12 f#4@2 ~@3 a4@4 f#4@2 ~@2 e5@4 c#5@3",
  C: "~@13 f#4@2 ~@2 a4@4 f#4@3 ~ e5@4 c#5@3", D: "~@13 f#4@2 ~@2 a4@4 f#4@2 ~@2 e5@4 c#5@3",
})).s("gm_trombone").gain(0.22)

// other · piano · "elec. piano"
const piano = note("<~@34 A B ~@2 C D ~@34 E F ~@2 G H ~@79>".pickRestart({
  A: "~ [d3,d4]@19 ~ e4@5 ~ d4@5, ~@20 e3@5 ~ d3@4 ~@2", B: "~ [c#3,c#4]@30 ~",
  C: "~ d4@19 ~ [e3,e4]@5 ~@2 d4@4, d3@19 ~@8 d3@4 ~", D: "~ c#4@8 ~@4 [d4,d5]@10 ~@2 [c#4,c#5]@7, ~ c#3@24 ~@7",
  E: "~ [d3,d4]@19 ~@2 e4@5 ~ d4@4, ~@21 e3@5 ~ d3@4 ~", F: "~ c#4@15, ~ c#3@29 ~@2",
  G: "~@2 d4@19 ~ [e3,e4]@5 ~ d4@4, ~ d3@19 ~@7 d3@4 ~", H: "~@2 c#4@8 ~@3 [d4,d5]@10 ~@2 [c#4,c#5]@7, ~ c#3@12 ~@3",
})).s("gm_piano").gain(0.2)

// chords · string ensemble 1 · "refrain strings" · F#m B C# B C# Fm
const string_ensemble_1_2 = note(`<
  ~@40
  [~ [f#6,a6]@31]
  [~ [b5,b6]@16 [c#6,c#7]@15, f6, ~ g#6@31]
  ~@38
  [~ f#6@15, ~ a6@31]
  [~ [b5,b6]@16 [c#6,c#7]@15, ~ [f6,g#6]@31]
  ~@77
>`).s("gm_string_ensemble_1").gain(0.11)

// other · pad halo · "pad"
const pad_halo = note("<~@54 A@2 B@2 C@2 ~@6 A@2 B@2 C@2 ~@87>".pickRestart({
  A: "[~ c#4@48 d#4@8 b3@7]/2", B: "[~ c#4@48 b3@8 a3@7]/2", C: "[~ f#3@62 ~]/2",
})).s("gm_pad_halo").gain(0.24)

// other · string ensemble 1 · "strings 1"
const string_ensemble_1_3 = note(`<
  ~@88 A@2 ~@6 B@2 ~@2 C@2 ~@3 D ~ E ~@4 C@2 ~@6 C@2 ~@2 F@2 ~@3 G ~@3 H ~@3 G ~@3 I ~@3 G ~@3 I ~@3 G ~@5
>`.pickRestart({
  A: "[~@17 c#6@3 ~ f#5@2 d5@3 c#5@2 ~ c#5@29 ~@6, ~@10 a5 ~@3 d5 ~@17]/2",
  B: "[~@18 c#6@2 ~ f#5@2 d5@3 c#5@2 ~ c#5@29 ~@6, ~@10 a5 ~@3 d5 ~@17]/2",
  C: "[~@18 c#6@2 ~ f#5@2 ~ d5@2 c#5@2 ~ c#5@29 ~@6, ~@10 a5 ~@3 d5 ~@17]/2",
  D: "~@21 f#5 f#4 ~@3 [f#4,f#5,f#6]@2 ~@4, ~@21 f#6@2 ~@9", E: "~@21 [f#4,f#5,f#6] ~@4 [f#5,f#6] ~@5, ~@25 f#4@2 ~@5",
  F: "[~@18 c#6@2 a5@2 f#5@2 d5@2 c#5@2 ~ c#5@29 ~@6, ~@14 d5 ~@17]/2",
  G: "~@22 [f#4,f#5] ~@3 [f#4,f#5,f#6]@2 ~@4, ~@11 f#6 ~@4", H: "~@21 [f#4,f#5,f#6]@2 ~@2 f#5 f#4 ~@5, ~@25 f#6@2 ~@5",
  I: "~@21 [f#4,f#5,f#6]@2 ~@3 [f#4,f#5] ~@5, ~@13 f#6 ~@2", // F#
})).s("gm_string_ensemble_1").gain(0.24)

// other · string ensemble 1 · "strings 1" · soft notes
const string_ensemble_1_soft_2 = note("<~@74 A@3 B C@2 D E ~@77>".pickRestart({
  A: "[~ f#5@52 g#5@4 a5@4 c#6@4 f#5@20 e5@6 d5@5]/3", B: "~ c#5@30 ~", C: "[~ f#5@52 g#5@4 a5@4 c#6@3]/2",
  D: "~ f#5@31", E: "~ f5@31",
})).s("gm_string_ensemble_1").gain(0.12)

// chords · pad sweep · "sweep"
const pad_sweep = note("<~@23 A ~@7 A ~@15 B ~@3 B ~@35 B ~@2 C@2 D@2 ~ B ~@3 B ~@11 E ~@7 F ~@3 F ~@35>".pickRestart({
  A: "~@3 [d4,f#4]@5", B: "~@13 [d4,f#4]@19", C: "[~@21 c#5@2 ~@2 c#5 ~@3 c#5@26 ~@9]/2",
  D: "[~@22 c#5 ~@2 c#5 ~@4 c#5@26 ~@8]/2", E: "~@7 d4@9, ~@13 f#4@19", F: "~@7 [d4,f#4]@9",
})).s("gm_pad_sweep").gain(0.52)

// drums · kick
const kick = s("bd").struct("<[x!2]!37 [~ x ~@15 x ~@14]!73 [~ x ~@16 x ~@13] [~ x ~@7 x ~@6]!46 ~@2>").gain(0.39)

// drums · snare
const snare = s("sd").struct("<A@33 B A@3 C@37 D C@35 E F@46 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@8 x ~@15 x ~@6 x", C: "~@9 x ~@15 x ~@6", D: "x ~@8 x ~@15 x ~@6", E: "~@9 x ~@16 x ~@5",
  F: "~@5 x ~@7 x ~@2",
})).gain(0.52)

// drums · clap
const clap = s("cp").struct(`<
  ~@42 A@7 B A@4 ~@28 C A@5 D C D A@5 D A D@3 E A D E C A E@40 F E@3 F E@3 F E ~@2
>`.pickRestart({
  A: "~@9 x ~@15 x ~@6", B: "~@9 x ~@14 x ~@7", C: "~@10 x ~@14 x ~@6", D: "~@9 x ~@16 x ~@5", E: "~@5 x ~@7 x ~@2",
  F: "~@10 x ~@16 x ~@4",
})).gain(0.66)

// drums · hihat
const hihat = s("hh").struct("<A@36 B C@3 D C@39 D C@29 E F@46 ~@2>".pickRestart({
  A: "x!8", B: "x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~@2",
  C: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2", D: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@6",
  E: "~ x ~@3 x ~@3 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~", F: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
})).gain(0.52)

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 A ~@39 B ~@5 B ~@11 B ~@11 B ~ B ~@9 B ~@33>".pickRestart({
  A: "~@23 x ~@8", B: "~@3 x",
})).gain(0.59)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@33 A ~ A ~ A ~ A B C ~@11 A ~@19 A ~ A ~ A ~ A C D ~@27 E ~@3 E ~@3 E ~@7 E ~@33
>`.pickRestart({
  A: "~@29 x ~@2", B: "~@13 x ~@14 x ~@3", C: "~@13 x ~@15 x ~@2", D: "~@5 x ~@7 x ~@8 x ~@6 x ~@2", E: "~@15 x",
})).gain(0.66)

// drums · china
const china = s("cr").struct("<~@35 A ~ A ~ B ~ A ~@33 B ~ B ~ B ~ B ~@77>".pickRestart({
  A: "~@3 x", B: "~@25 x ~@6",
})).gain(0.52)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@5 [~@6 x!2] [x!2 ~@6] ~@152>").gain(2.66)

// drums · shaker
const shaker = s("sh").struct("<~@2 A@34 B C@73 D E@29 F ~ E@14 F ~@2>".pickRestart({
  A: "x!8", B: "x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~@2",
  C: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2", D: "~ x ~@3 x ~@3 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~",
  E: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", F: "~ x ~@14",
})).gain(0.52)

stack(
  bass, string_ensemble_1, string_ensemble_1_soft, trombone, piano, string_ensemble_1_2, pad_halo, string_ensemble_1_3,
  string_ensemble_1_soft_2, pad_sweep, kick, snare, clap, hihat, mid_tom, open_hat, china, cabasa, shaker
)

More by Michael Jackson