Strudelify
Liberian Girl cover art

Bad

Liberian Girl

Michael Jackson

KeyG minorTempo103 bpm
0:00/0:00
// Liberian Girl — Jackson Michael
// 103 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 100 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(103/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 · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@3 A B C D A B C E A B C D A B C E F G A H I J K L A B C D A B C E A B C D A B C E F G A H I J K L A B C E A@3 B F G
  A H I J K L A B C D A B C E A B C D A B C E A B C D ~@13
>`.pickRestart({
  A: "g1@2 ~ g1 ~@10 f1@2", B: "g1@2 ~ g1 ~@10 d1@2", C: "c1@2 ~ c1 ~@10 c1@2", D: "d1@2 ~ d1 ~@10 f1@2",
  E: "d1@2 ~ d1 ~@10 d1 ~", F: "eb1@2 ~ eb1 ~@10 d1@2", G: "eb1@2 ~ eb1 ~@10 f1@2", H: "g1@2 ~ g1 ~@10 g1@2",
  I: "a1@2 ~ a1 ~@10 g1@2", J: "a1@2 ~ a1 ~@10 a1@2", K: "d1@2 ~ d1 ~@10 c1@2", L: "d1 ~@15",
})).s("gm_synth_bass_2").gain(0.3)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  A@5 ~@2 B@2 C D E@2 F G H@3 I J@2 K@2 L@2 M@2 E@2 F G E@2 F G E@2 F G H@3 I J@2 K@2 L@2 M@2 N@2 O P Q R S T J@2 K@2
  L@2 M@2 ~@33
>`.pickRestart({
  A: "[g4,a4,d5]/5", B: "[g2@31 ~]/2", C: "c2", D: "d2@13 ~@3", E: "[[f3,a3]@16 g3@15 ~, [bb3,d4]@31 ~]/2",
  F: "[g3,bb3,d4], eb3@7 ~", G: "[a3,c4], f3@7 ~", H: "[a3@16 g3@15 ~ [eb3,g3]@16, [bb3,d4], f3@5 ~@3]/3",
  I: "[f3,a3,c4]@7 ~", J: "[g3@7 ~ g4@16 ~@8, [bb3,eb4]@3 ~]/2", K: "[[bb3,d4,g4]@7 ~]/2", L: "[[g3,a3,c4,eb4]@15 ~]/2",
  M: "[[g3,a3]@14 ~@2 [gb3,c4]@3 ~@13, d4@19 ~@13]/2", N: "[a3@2 ~ f4, [bb3,d4]@31 ~, ~@16 g3@15 ~]/2",
  O: "[bb3,eb4], g3@7 ~", P: "g3@4 gb4@3 ~, [a3,d4]@15 ~", Q: "[bb3,eb4,g4]@7 ~", R: "[c4,f4,a4]@7 ~",
  S: "[eb4,g4,bb4]@7 ~", T: "[f4,a4,c5]@7 ~",
})).s("gm_synth_strings_2").gain(0.1)

// chords · marimba
const marimba = note("<~@3 A ~ B C A ~ D E ~@18 B C A ~ D E ~@16 A ~ D E ~@45>".pickRestart({
  A: "~@7 [g4,bb4] [d5,g5,bb5] ~@2 g4 [bb4,d5,g5] bb5 ~@2", // Gm
  B: "~@2 [bb4,d5] ~ [bb4,d5] ~ [g4,bb4] ~ [g4,bb4] ~ [eb4,g4] ~ g4 ~@3", // Bb Gm Eb
  C: "~@2 [a4,c5] ~ [a4,c5] ~ [f4,a4] ~ [f4,a4] ~ f4 ~ f4 ~@3", // Am F
  D: "~@2 [d5,f5] ~ [d5,f5] ~ [bb4,d5] ~ [bb4,d5] ~ [g4,bb4] ~ [g4,bb4] ~@3", // Dm Bb Gm
  E: "~@2 [a4,c5] ~ [a4,c5] ~ a4 ~ [f4,a4] ~ f4 ~ f4 ~@3", // Am F
})).s("gm_marimba").gain(0.15)

// chords · marimba · soft notes
const marimba_soft = note("<~@3 A B C D A B ~ D ~@18 C D A B ~ D ~@16 A B ~ D ~@45>".pickRestart({
  A: "~@15 g4", B: "[bb4,d5,g5] bb5 ~ g4 [bb4,d5,g5] bb5 ~@10", C: "~@12 eb4 ~@3", D: "~@12 c4 ~@3",
})).s("gm_marimba").gain(0.1)

// other · sitar
const sitar = note("<~@25 A B C ~@21 A B C ~@48>".pickRestart({
  A: "~@14 d5 ~", B: "eb5 ~@2 d5 ~@2 bb4 ~ a4 ~@3 g4 ~@3", C: "d4 ~@15",
})).s("gm_sitar").gain(0.1)

// other · pad metallic · "METAL PAD"
const pad_metallic = note("<A@4 ~@51 B C D E ~@8 F@2 G H F@2 G I J@3 K L@2 D M N@3 O P@2 ~@11>".pickRestart({
  A: "[[g4,a4,d5]@15 ~]/4", B: "g4", C: "a4", D: "bb4", E: "c5@3 ~", F: "d4/2", G: "eb4", H: "d4@15 ~", I: "d4",
  J: "[bb4@31 g4@16 ~]/3", K: "gb4@3 d4", L: "[d5@3 c5]/2", M: "~ a4@15", N: "[d5@2 g5]/3", O: "gb5", P: "d5/2",
})).s("gm_pad_metallic").gain(0.1)

// other · pad metallic · "METAL PAD" · soft notes
const pad_metallic_soft = note("<~@7 A@2 B C ~@89>".pickRestart({
  A: "[~@8 [g3,a3,d4]@23 ~]/2", B: "[g3,d4], [eb3,bb3]@7 ~", C: "[f3,a3,c4]@15 ~",
})).s("gm_pad_metallic").gain(0.06)

// other · epiano2 · "E.PIANO 2"
const epiano2 = note("<~@55 A B C D ~@16 E F G H I J K L E F G M I N ~@11>".pickRestart({
  A: "~@6 bb5!2 a5 ~@2 f5 ~@2 bb5!2, ~@7 d5", B: "a5 ~@2 f5 ~@2 bb5!2 a5 ~ f5 d5 ~@2 bb5!2, ~@6 d5@2 ~@5 f5@2 ~",
  C: "a5 ~ f5 d5 ~@2 bb5!2 a5 ~@2 f5@2 ~ [d5,bb5] bb5, ~@5 f5@2 ~@9", // Gm
  D: "c5@2 bb4 f5@2 ~ d5 ~ c5@2 bb4 c5@5, a5 ~@2 c5@5 ~@8",
  E: "~@6 [bb4,bb5] [bb4,d5,bb5] [a4,a5] ~@2 [f4,f5] ~@2 [g4,g5] ~", // Bb A F G
  F: "~@6 [bb4,bb5]!2 [a4,a5] ~ [f4,f5] [d4,d5] ~ [f4,f5] ~@2", G: "~@6 [bb4,bb5]!2 [a4,a5] ~@2 [f4,f5] ~@2 [d4,d5] ~",
  H: "c5@2 [bb3,bb4] [c4,c5] ~@12", I: "~@6 [bb4,bb5]!2 [a4,a5] ~@2 [f4,f5] ~@2 [g4,g5] ~",
  J: "~@6 [bb4,bb5]!2 [a4,a5] ~ [f4,f5] [d4,d5] ~@2 [g4,g5] ~", // Bb A F D G
  K: "~@6 [bb4,bb5]!2 [c5,c6] ~@2 [a4,a5] ~@2 [bb4,bb5] ~", L: "[d4,d5]@2 [c4,c5] [d4,d5] ~@12",
  M: "[c4,c5]@2 [bb3,bb4] [c4,c5] ~@12", N: "~@6 [bb4,bb5]!2 [a4,a5] ~ [f4,f5] [d4,d5] ~@4",
})).s("gm_epiano2").gain(0.15).pan(0.8)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@48 A B C ~@13 D B C ~@33>".pickRestart({
  A: "~@2 [bb4,bb5] [a4,bb4,a5,bb5]!13", B: "[a4,bb4,a5,bb5]!16", C: "[a4,a5] ~@15",
  D: "~@4 [bb4,bb5] [a4,bb4,a5,bb5]!11", // Bb Bbmaj7
})).s("gm_string_ensemble_2").gain(0.15)

// other · string ensemble 2 · "SLOWSTRING" · soft notes · Bbmaj7 A Bbmaj7 A
const string_ensemble_2_soft = note(`<
  ~@48
  [[a4,bb4,a5,bb5]!2 [a4,a5] ~@13]
  ~@15
  [[a4,bb4,a5,bb5]!4 [a4,a5] ~@11]
  ~@35
>`).s("gm_string_ensemble_2").gain(0.1)

// drums · kick
const kick = s("bd").struct("<~@3 A@23 B A@23 B A@15 B A@21 C ~@11>".pickRestart({
  A: "x ~@2 x ~@10 x ~", B: "x ~@6 x", C: "x ~@2 x ~@12",
})).gain(0.3)

// drums · rim
const rim = s("rim").struct("<~@3 A@16 ~@3 B ~ B ~ A@17 ~@3 B ~ B ~ A@5 ~@3 B ~@3 B ~ B ~ A@23 ~@11>".pickRestart({
  A: "~@3 x", B: "~@5 x ~@2",
})).gain(0.35)

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

// drums · low tom
const low_tom = s("lt").struct("<~@10 A ~@7 A ~@15 A ~@7 A ~@11 A ~@11 A ~@7 A ~@7 A ~@17>".pickRestart({
  A: "~@7 x",
})).gain(0.25)

// drums · hihat
const hihat = s("hh").struct("<~@3 [x!8]!85 [x!7 ~] ~@11>").gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct("<~@10 A ~@7 A ~@15 A ~@7 A ~@11 A ~@11 A ~@7 A ~@7 A ~@17>".pickRestart({
  A: "~@3 x",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@10 A ~@7 A ~@15 A ~@7 A ~@11 A ~@11 A ~@7 A ~@7 A ~@17>".pickRestart({
  A: "~@9 x ~ x ~@4",
})).gain(0.15)

// drums · ride
const ride = s("rd").struct("<~@55 [x!4]!4 ~@41>").gain(0.15)

// drums · congas
const congas = s("conga:13").struct("<~@3 A@23 ~ A@23 ~ A@15 ~ A@22 ~@11>".pickRestart({
  A: "~ x",
})).gain(0.48)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@3 A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C A B@2 A@2 B@2 A@2
  B@2 A@2 B@2 C A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B ~@11
>`.pickRestart({
  A: "x!2 ~@2", B: "x ~@2 x!2 ~@11", C: "x",
})).gain(0.48)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct(`<
  ~@3 A ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@3 A ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@3 A ~@2 A@2 ~@2 A@2 ~@2
  A@2 ~@3 A ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@12
>`.pickRestart({
  A: "~@3 x ~@12",
})).gain(0.32)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@3 A ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A ~ A ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A ~ A ~ A@3 ~ A@3 ~ A@3 ~ A ~ A ~ A@3 ~
  A@3 ~ A@3 ~ A@3 ~ A@3 ~@12
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.48)

// drums · congas · soft notes
const congas_soft_2 = s("conga:33").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@11
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.32)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@3 A@23 ~ A@23 ~ A@15 ~ A@22 ~@11>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.5)

stack(
  bass, synth_strings_2, marimba, marimba_soft, sitar, pad_metallic, pad_metallic_soft, epiano2, string_ensemble_2,
  string_ensemble_2_soft, kick, rim, snare, low_tom, hihat, mid_tom, high_tom, ride, congas, congas_2, congas_soft,
  congas_3, congas_soft_2, cabasa
)

More by Michael Jackson