Strudelify
KeyE minorTempo105 bpm
0:00/0:00
// Ghosts — Jackson Michael
// 105 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 8 agogo (copy of ch 3 clavinet)
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 · electric bass finger
const bass = note(`<
  ~ A B C D B@2 C D B@2 C D B@2 C D E F C D G F H I@2 J I@2 K B C D B@2 C D L M L M N M L O P ~@3 Q F H I@2 J I@2 K B C
  D L M L M N M L O P ~@4 R S R T R S R U R S R S R S R V R S R S R W X Y ~
>`.pickRestart({
  A: "~@14 b0 ~", B: "e1@2 e1@2 ~@10 b0 ~", C: "e1 ~ e1@2 ~@10 b0 ~", D: "e1@2 e1@3 ~@9 b0 ~",
  E: "e1@2 e1@2 ~@8 a1@3 g1", F: "e1@4 ~@10 b0 ~", G: "e1@2 e1@2 ~@6 b1 ~ a1@3 g1", H: "e1@3 ~@11 b0@2",
  I: "e1@2 ~@5 b0", J: "e1@5 ~@9 b0@2", K: "e1@5 ~@9 b0 ~", L: "e1!2 ~@5 e1", M: "b1!2 ~@5 b1",
  N: "e1@2 e1@2 ~@8 a1@2 ~ e1", O: "c2!2 ~@5 c2", P: "b1 ~@7", Q: "~@7 b0", R: "b1@3 ~@11 b1@2", S: "e1@3 ~@11 a#1@2",
  T: "e1@3 ~@13", U: "e1@3 ~@8 b2 a2@2 g2@2", V: "e1@2 ~@5 a#1", W: "e1@3 ~@11 b1@2", X: "c2@3 ~@11 c2@2", Y: "b1 ~@3",
})).s("gm_electric_bass_finger").gain(0.54)

// other · clavinet
const clavinet = note(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@8 A B A B A B A B A B A B A B A B ~@8 A
  B A B ~@25
>`.pickRestart({
  A: "e4 ~ b4@2 a4 ~ e4 ~ b4@2 a4 ~ e4 ~ b4 ~", B: "e4 ~ b4@2 a4 ~ e4 ~ b4@2 a4 ~ e4 ~@3",
})).s("gm_clavinet").gain(0.4).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@10 A@3 B C@4 D@8 E@3 B C@8 F@4 G@3 H D@8 E@3 B C@4 F@4 G@3 H D@4 F@20 G@3 ~@2
>`.pickRestart({
  A: "[[g3,b3] [a3,c#4] [g3,b3], e3]/3", B: "[e4,g4,a4,c#5]", C: "[[g3,b3] [a3,c#4] [g3,b3] [a3,c#4], e3]/4",
  D: "[[g3,b3] [a3,c#4] [g3,b3,d4] [a3,c#4], e3]/4", E: "[[g3,b3] [a3,c#4] [g3,b3,d4], e3]/3",
  F: "[~ d#6 [e4,g4,e6]@2 ~ d#6 [e4,g4,e6]@2, b3, b5 b5, [d#4,f#4] ~ [d#4,f#4] ~]/4", // Em D#m
  G: "[~ d#6 e6@2 [c4,a5]@2, [b3,b5]@2 ~, [d#4,f#4] [e4,g4]@2]/3", H: "b5 a5 g5 f#5",
})).s("gm_synth_strings_1").gain(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A B C@5 D@3 C A C A D C D@8 C B D C A C A@2 C@2 A D@3 ~@8 A C D@2 C D@3 C D@2 C@5 ~@8 C A@2 C ~@25
>`.pickRestart({
  A: "~@6 [e4,b4] ~@5 [e4,b4] ~@3", B: "~@6 [e4,b4] ~@3 b4 ~ [e4,b4] ~@3", C: "~@6 [e4,b4] ~@3 [e4,b4] ~ [e4,b4] ~@3",
  D: "~@6 [e4,b4] ~@3 e4 ~ [e4,b4] ~@3", // E5
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.4)

// chords · electric guitar clean · soft notes
const electric_guitar_clean_2 = note(`<
  A B C@5 D@3 C A C A D C D@8 C B D C A C A@2 C@2 A D@3 ~@8 A C D@2 C D@3 C D@2 C@5 ~@8 C A@2 C ~@25
>`.pickRestart({
  A: "~@4 [e4,b4] ~@5 [e4,b4] ~@5", B: "~@4 [e4,b4] ~@5 e4 ~@5", C: "~@4 [e4,b4] ~@11", D: "~@4 [e4,b4] ~@5 b4 ~@5",
})).s("gm_electric_guitar_clean").gain(0.25).pan(0.4)

// other · percussive organ
const percussive_organ = note(`<
  ~@5 A B C D E F G H I@2 J@2 ~@4 A K L M E N O P Q@4 ~@2 R ~ S T U T V T W X Y Z AA AB A AC AD K AE AF AD AG AH@2 AI@2
  S T U T V T W X Y Z AJ AB ~@9 T U T V T U T V T U T V T W AK AL AM
>`.pickRestart({
  A: "~@14 b3!2", B: "d4@2 d4@4 d4@3 ~@5 d4!2", C: "c#4@2 c#4!2 ~ c#4 c#4@3 ~@5 c#4@2", D: "d4 ~ d4@3 ~ d4@4 ~@4 d4!2",
  E: "c#4@2 c#4 c#4@2 c#4 c#4@4 ~@4 c#4!2", F: "d4@2 d4 d4@2 b3 d4@4 ~@4 d4!2", G: "c#4@2 c#4 c#4@2 ~ c#4@5 ~@3 c#4!2",
  H: "d4@3 d4@3 d4@5 ~@3 d4!2", I: "[c#4@3 e4@3 g4@2 ~ g4 b4@2 a4@2 g4 a4@3 g4 ~@11 g4@2]/2",
  J: "[~ f#4 e4 ~@7 b4 ~ a4@2 g4 a4@3 b4 ~@13]/2", K: "d4 ~ d4 d4@2 d4 d4@3 ~@5 d4!2",
  L: "c#4 ~ c#4 c#4@3 c#4@4 ~@4 c#4!2", M: "d4@2 d4@4 d4@4 ~@4 d4!2", N: "d4@3 d4@2 d4 d4@4 ~@4 d4!2",
  O: "c#4@3 c#4@2 c#4 c#4@3 ~@5 c#4!2", P: "d4@2 d4@2 d4@2 d4 d4@3 ~@4 d4@2",
  Q: "[c#4 ~ c#4@2 e4@2 g4@2 ~ g4 b4@2 a4@2 g4 a4@3 g4@3 ~@9 g4@5 ~@7 b4@2 a4@2 g4 a4@3 b4@2 ~@12]/4",
  R: "~@10 g4 ~ g4@2 ~@2", S: "~@14 b3 ~", T: "f#4 ~ f#4 ~ f#4 ~ f#4 ~ f#4 ~ f#4 ~ e4@2 f#4@2",
  U: "g4@3 f#4@3 e4@5 ~@3 b3 ~", V: "g4@3 f#4 ~@2 e4@2 g4@3 f#4@2 ~ b3 ~", W: "g4@3 f#4@3 e4@5 ~@2 e4!2 g4",
  X: "b4 a4 b4 ~ a4 ~ e4 g4 b4 a4 b4@2 a4@2 ~@2", Y: "~@2 e4@2 e4@2 g4 ~ b4@2 b4@2 a4@2 g4@2", Z: "a4 e4!2 ~@5",
  AA: "~@10 g4 ~ a4 ~ g4@2", AB: "a4@2 e4@2 e4@3 ~@9", AC: "d4@2 d4 d4@2 ~ d4@3 ~@5 d4!2",
  AD: "c#4@2 c#4 c#4@2 c#4 c#4@3 ~@5 c#4!2", AE: "c#4 ~ c#4 c#4@2 b3 a3@4 ~@4 c#4!2",
  AF: "d4@2 d4 d4@2 d4 d4@3 ~@5 d4!2", AG: "d4@2 d4 d4@2 d4 d4@2 ~@6 d4 ~",
  AH: "[c#4!2 e4 ~ g4@2 ~@4 b4@2 a4@2 g4 a4@3 g4@4 ~@8 b4@2]/2", AI: "[a4@3 ~@7 b4@2 a4@2 g4 a4@3 b4@3 ~@11]/2",
  AJ: "~@6 e4 ~ g4@2 g4@2 a4@2 g4@2", AK: "b4 a4 b4@2 a4@2 e4 g4 b4 a4 b4@2 a4@2 ~@2",
  AL: "~@2 e4 ~ e4@2 g4@2 b4@2 b4@2 a4@2 g4@2", AM: "a4 e4 e4@2 ~@4",
})).s("gm_percussive_organ").gain(0.52).pan(0.3)

// other · rock organ
const rock_organ = note(`<
  ~@37 A B C B D B E F G H ~@14 A B C B D B E F G H I J ~@9 B C B D B C B D B C B D B E K L M
>`.pickRestart({
  A: "~@14 b3 ~", B: "f#4 ~ f#4 ~ f#4 ~ f#4 ~ f#4 ~ f#4 ~ e4@2 f#4@2", C: "g4@3 f#4@3 e4@5 ~@3 b3 ~",
  D: "g4@3 f#4 ~@2 e4@2 g4@3 f#4@2 ~ b3 ~", E: "g4@3 f#4@3 e4@5 ~@2 e4!2 g4",
  F: "b4 a4 b4 ~ a4 ~ e4 g4 b4 a4 b4@2 a4@2 ~@2", G: "~@2 e4@2 e4@2 g4 ~ b4@2 b4@2 a4@2 g4@2", H: "a4 e4!2 ~@5",
  I: "~@6 e4 ~ g4@2 g4@2 a4@2 g4@2", J: "a4@2 e4@2 e4@3 ~@9", K: "b4 a4 b4@2 a4@2 e4 g4 b4 a4 b4@2 a4@2 ~@2",
  L: "~@2 e4 ~ e4@2 g4@2 b4@2 b4@2 a4@2 g4@2", M: "a4 e4 e4@2 ~@4",
})).s("gm_rock_organ").gain(0.58)

// drums · kick
const kick = s("bd").struct("<A B C@15 D C@27 E ~@3 F C@19 E ~@3 B C@23 E ~>".pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "x ~@2 x ~@2 x!2", C: "x ~ x ~@5 x ~@2 x ~@2 x ~", D: "x!2 ~ x!2 ~@3", E: "x", F: "~@7 x",
})).gain(0.45)

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

// drums · hihat
const hihat = s("hh").struct("<A@2 B@43 C ~@3 D B@19 C ~@3 A B@23 C ~>".pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "x!5 ~ x!2", C: "x", D: "x ~ x ~@2 x ~ x",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@49 [x ~@2 x ~@2 x ~] ~@49>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~
  [~@5 x ~@2]!44
  ~@4
  [~@2 x ~@2 x!2 ~ x ~@3 x ~@3]
  [~@5 x ~@2]!19
  ~@4
  [~@5 x ~@2]!24
  ~@2
>`).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 A@43 B ~@4 A@19 B ~@3 C A@23 B ~>".pickRestart({
  A: "x!16", B: "x", C: "~@12 x!4",
})).gain(1.01)

stack(
  bass, clavinet, synth_strings_1, electric_guitar_clean, electric_guitar_clean_2, percussive_organ, rock_organ, kick,
  snare, hihat, low_tom, open_hat, cabasa
)

More by Michael Jackson