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, A@4 for four bars: 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@2 D@4 B C D@2 E@2 F@2 G H I J D@4 K L D@2 K L D@6 K L D@2 K L D@6 K L D@2 M@2 N@2 O@2 P Q D@4 K
  R D@2 S@4 K R T@2 K R T@2 U@8 V W U@6 V W U@2 V X U@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: "~ 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 ~",
  E: "[~ [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#
  F: "[~ [d1,d2]@14 ~ d2@13 e2@2 f2@2 [f#1,f#2]@31, ~ c1 ~@13 d1@16 ~@33]/2", // D F#
  G: "~ [d1,d2]@14 ~@2 d1@12 ~ f2@2, ~@15 d2@14 [e1,e2]@3", H: "~ [f#1,f#2]@14 ~ f#1@15 ~, ~@15 f#2@17",
  I: "~ [d1,d2]@15 ~ [d1,d2]@14 ~", J: "~ 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",
  K: "~ b2@2 ~@2 f#2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2 ~",
  L: "~ b2@2 ~ f#2@2 ~@3 a2@2 ~@2 b2@2 ~@6 f#2@2 ~ e2@2 ~@2 c#2@2 ~@2",
  M: "[~ [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#
  N: "[~@2 [d1,d2]@14 ~ d2@12 e2@2 f2@3 [f#1,f#2]@30, ~@2 c1 ~@13 d1@16 ~@32]/2", // D F#
  O: "[~ [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
  P: "~ [d1,d2]@15 ~@2 [d1,d2]@14", Q: "~ [c#1,c#2]@6 ~@2 [c#1,c#2]@5 ~@3 [c#1,c#2]@5 ~@3 [c#1,c#2]@5 ~@2",
  R: "~ b2@2 ~@2 f#2@2 ~@2 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~",
  S: "[~ 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
  T: "~ 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
  U: "~ f#2 ~ c#2 ~ e2 ~ f#2 ~ e2 ~ c#2 ~ b1 ~ c#2", V: "~@2 b2@2 ~ f#2 ~@4 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 f#2@2",
  W: "~@2 b2@2 ~ f#2@2 ~@2 a2@2 ~@2 b2@2 ~@6 f#2@2 ~@2 e2@2 ~@2 c#2@2 ~",
  X: "~@2 b2@2 ~ f#2@2 ~@2 a2@2 ~@3 b2@2 ~@5 f#2@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 D E D E C@2 D E ~@8 F G H I ~@2 D E ~@2 D E D E D E J@2 D E J@2 D E D E D E J@2 D
  E ~@8 K L H M ~@2 D E K L H M ~@2 D E ~@2 D E N L N L N L N L ~@2 D E N L N L ~@2 D E ~@2 O P N L N L N L N L N L N L
  N L N L N Q N Q N Q N Q N Q N Q N Q N ~@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]@2 ~@10 [d#4,g#4]@2 ~@17", E: "~ [e4,a4]@2 ~@10 [d#4,g#4]@2 ~@17", F: "~ [c#4,f#4]@12 g#4@19",
  G: "~ e4@12 [d#4,g#4]@19", H: "~ [c#4,f#4]@11 ~ [d#4,g#4]@19", I: "~ [e4,a4]@12 [d#4,g#4]@18 ~",
  J: "~ [d4,f#4]@2 ~@10 [d4,f#4]@2 ~@17", K: "~ f#4@6 g#4@9, ~ c#4@12 ~@19", L: "~ e4@6 [d#4,g#4]@9",
  M: "~ e4@6 [d#4,g#4]@9, ~ a4@11 ~@20", N: "~ [c#4,f#4]@6 g#4@9", O: "~ [c#4,f#4] ~@5 [d#4,g#4] ~@8",
  P: "~ [e4,a4] ~@5 [d#4,g#4] ~@8", Q: "~@2 e4@12 ~ d#4@17, ~@7 g#4@9",
})).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 E F ~@2 D@2 ~@2 E F ~@2 G@3 ~ H@3 ~ E F E F E F E F H@3 ~ E F E F H@3 ~ I@3 ~ E F E F E
  F E F E F E F E F E F E F E F E F E F E F E F E F E ~@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: "~@7 d#4@9",
  F: "~@2 a4@13 ~@17", G: "[~ d4 d4@63 ~@31, ~ f#4@64 ~@31]/3", H: "[~@2 d4@63 ~@31, ~ f#4@64 ~@31]/3",
  I: "[~ [d4,f#4]@32 ~@15]/3", // D
})).s("gm_string_ensemble_1").gain(0.13)

// other · trombone · "trumpet"
const trombone = note("<~@35 A ~@3 B ~@35 C ~@3 C ~@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",
})).s("gm_trombone").gain(0.22)

// other · piano · "elec. piano"
const piano = note("<~@34 A B ~@2 C D ~@34 E F ~@2 G D ~@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 ~", // E
})).s("gm_piano").gain(0.2)

// chords · string ensemble 1 · "refrain strings" · F#m B C# B C#
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 A@2 ~@2 A@2 ~@3 B ~ B ~@4 A@2 ~@6 A@2 ~@2 A@2 ~@3 B ~@3 C ~@3 B ~@3 C ~@3 B ~@3 C ~@3 B ~@5
>`.pickRestart({
  A: "[~@18 c#6@2 ~ f#5@2 ~ d5@2 c#5@2 ~ c#5@29 ~@6, ~@10 a5 ~@3 d5 ~@17]/2",
  B: "~@22 [f#4,f#5] ~@3 [f#4,f#5,f#6]@2 ~@4, ~@11 f#6 ~@4", C: "~@21 [f#4,f#5,f#6]@2 ~@3 [f#4,f#5] ~@5, ~@13 f#6 ~@2",
})).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@3 D ~@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@4 f#5@31]/3",
  D: "~ f5@31",
})).s("gm_string_ensemble_1").gain(0.12)

// chords · pad sweep · "sweep"
const pad_sweep = note("<~@23 A ~@7 B ~@15 B ~@3 B ~@35 B ~@2 C@2 D@2 ~ B ~@3 B ~@11 B ~@7 B ~@3 E ~@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,f#4]@9",
})).s("gm_pad_sweep").gain(0.52)

// drums · kick
const kick = s("bd").struct("<[x!2]!26 [~ x ~@15 x ~@14]!96 [~ x ~@7 x ~@6]!35 ~@2>").gain(0.39)

// drums · snare
const snare = s("sd").struct(`<
  [~ x ~ x]!25
  [~@9 x ~@15 x ~@6]!8
  [~@8 x ~@15 x ~@6 x]
  [~@9 x ~@15 x ~@6]!40
  [x ~@8 x ~@15 x ~@6]
  [~@9 x ~@15 x ~@6]!47
  [~@5 x ~@7 x ~@2]!35
  ~@2
>`).gain(0.52)

// drums · clap
const clap = s("cp").struct("<~@42 A@12 ~@28 A B A@4 C B A B A@2 B@2 C A C B@58 ~@2>".pickRestart({
  A: "~@9 x ~@15 x ~@6", B: "~@5 x ~@7 x ~@2", C: "~@9 x ~@16 x ~@5",
})).gain(0.66)

// drums · hihat
const hihat = s("hh").struct(`<
  [x!8]!26
  [~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2]!14
  [~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@6]
  [~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2]!39
  [~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@6]
  [~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2]!40
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!36
  ~@2
>`).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@2 ~@11 A ~@19 A ~ A ~ A ~ A B C ~@27 D ~@3 D ~@3 D ~@7 D ~@33
>`.pickRestart({
  A: "~@29 x ~@2", B: "~@13 x ~@15 x ~@2", C: "~@5 x ~@7 x ~@8 x ~@6 x ~@2", D: "~@15 x",
})).gain(0.66)

// drums · china
const china = s("cr").struct("<~@35 A ~ B ~ B ~ B ~@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@24 B@95 C@19 D ~ C@14 D ~@2>".pickRestart({
  A: "x!8", B: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2", C: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", D: "~ 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