Strudelify
KeyF majorTempo69 bpm
0:00/0:00
// Ben — Jackson Michael
// 69 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 47 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(69/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 · acoustic bass
const bass = note(`<
  ~ A B A B C D C E C F G H A I C D C E C F J H K L M N M N M O M P C D C E C Q R S@5 T@2
>`.pickRestart({
  A: "f2", B: "a3@8 f3@7 ~, f2@15 ~", C: "f2@3 c2 f2@4", D: "e2@17 c2@6 ~ e2@24", E: "e2@3 c2 e2@4",
  F: "e2@6 d2@2 db2@7 ~", G: "eb2@17 ~ eb2@6 d2@24", H: "db2@17 ~ db2@6 c2@21 ~@3", I: "f2@15 ~, a3 ~",
  J: "eb2@3 eb2 d2@4", K: "f2@23 ~", L: "[f2,a3]", M: "g2@3 f2 e2@4", N: "f2@3 c2 f1@3 ~", O: "f2@6 c2@2 f1@7 ~",
  P: "f2@9 c2@3 f1@5 ~ c2@6", Q: "e2@6 c2@2 e2@7 ~", R: "eb2@3 bb1 d2@4",
  S: "[db2@17 ~ db2@6 c2@30 f2@49 f2@48 ~ [gb1,f2]@48 f2@40]/5", T: "[c3@12 ~@3 f2@37 ~@44]/2",
})).s("gm_acoustic_bass").gain(0.3)

// other · piccolo
const piccolo = note("<~@25 A B C@2 ~@12 D@5 ~>".pickRestart({
  A: "~@3 f5 g5 c6 c6@2", B: "~@24 e5@6 a5@5 ~ a5 ~@11",
  C: "[d5@6 g5@6 g5@29 ~@2 e5 ~ d5@2 c5@36 ~@13, ~@21 g5 ~@26]/2",
  D: "[~@7 c5@23 bb4@25 a4@24 bb4@24 c5@24 ~ bb4@24 a4@24 bb4@31 c5@33]/5",
})).s("gm_piccolo").gain(0.15)

// bass · synth brass 1
const bass_2 = note("<~ [f1@7 ~] ~ [f1@13 ~@3] ~@39 [~ f1@5] ~@3>").s("gm_electric_bass_finger").gain(0.3)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A@4 B C D@2 E F G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q R S@2 T U V@2 W@2 X@6
>`.pickRestart({
  A: "[~@18 a3@5 ~@19 bb3@5 ~@19 a3@5 ~@19 bb3@5 ~, a3@17 ~@7 bb3@17 ~@7 a3@17 ~@7 bb3@17 ~@7, ~@6 c4@17 ~@7 d4@11 ~@19 f4@23 ~ c4@11 ~, ~@12 f4@23 ~ c4@17 ~ c4@17 ~@7 d4@12 ~@6]/2",
  B: "~@3 f3 ~@3 f3, a3@17 ~@7 a3@17 ~@7, ~@6 c4@11 ~@13 c4@11 ~@7, ~@12 f4@23 ~ f4@11 ~",
  C: "~@42 c3@5 ~, g3@23 ~ g3@23 ~, ~@6 bb3@11 ~ c3@10 ~@8 c4@11 ~, ~@12 c4@17 ~ bb3@11 ~@7",
  D: "[a3@6 g3@6 ~@12 a3@6 g3@6 ~@6 f3@5 ~@19 f3@5 ~@19 c3@5 ~, f3@17 ~ f3@22 ~@8 g3@17 ~@7 g3@23 ~, ~@6 c4@20 ~@4 c4@24 bb3@12 ~@12 bb3@11 ~@7, ~@12 f4@17 ~@7 f4@11 ~@13 c4@14 ~@10 c4@11 ~]/2",
  E: "~@42 c4@5 ~, a3@20 ~@4 a3@17 ~@7, ~@6 e4@11 ~ c4@11 ~ e4@11 ~@7, ~@12 a4@11 ~@13 a4@11 ~",
  F: "~@18 d4@5 ~@19 db4@5 ~, [a3,d4]@17 ~ bb3@12 ~@6 a4@11 ~, ~@6 e4@11 ~@7 a3@23 ~, ~@12 a4@18 e4@17 ~, ~@24 db4@17 ~@7", // D5
  G: "[~@18 a3@5 ~ a3@5 ~ c4@6 ~@6 c4@6 ~@6 b3@6 ~@6 g3@6 ~@18 [g3,c4]@6, g3@28 ~@2 gb3@17 ~ g3@17 ~@7 e3@23 ~, a3@17 ~@49 b3@11 ~ c4@11 ~@7, ~@6 db4@11 ~ db4@11 ~@67, ~@12 g4@20 ~@4 gb4@20 ~@4 f4@20 ~@4 e4@11 ~]/2", // C5
  H: "[~@18 a3@5 ~@19 bb3@5 ~@19 a3@5 ~@19 bb3@5 ~, [f3,a3]@17 ~@13 d4@12 ~@18 f4@29 ~@7, ~@6 c4@17 ~ bb3@17 ~@7 a3@17 ~@7 bb3@17 ~@7, ~@12 f4@23 ~ c4@17 ~ c4@17 ~@7 d4@11 ~@7, ~@84 c4@11 ~]/2", // F
  I: "[~@18 ab3@5 ~@43 c3@6 ~@18 c3@5 ~, ab3@17 ~@7 ab3@17 ~ f3@10 ~@2 bb3@11 ~@13 bb3@10 ~@8, ~@6 c4@11 ~@13 [c4,g4]@11 ~@7 g3@23 ~ g3@23 ~, ~@12 f4@17 ~@7 f4@19 ~@5 c4@17 ~@7 c4@11 ~]/2", // C5
  J: "[~@18 ab3@5 ~@67 c3@5 ~, ab3@12 f4@17 ~ [c4,g4]@11 ~@7 g3@23 ~ g3@23 ~, ~@6 c4@12 ~@6 ab3@17 ~ f3@11 ~ bb3@11 ~ c3@11 ~@7 c4@11 ~, ~@36 f4@17 ~@7 c4@17 ~ bb3@11 ~@7]/2", // C5
  K: "[~@66 [bb3,d4]@6 ~@18 db4@5 ~, a3@22 ~@2 a3@17 ~ c4@11 ~ e4@11 ~@7 db4@17 ~@7, ~@6 e4@11 ~ c4@11 ~ e4@11 ~@7 [a3,d4]@17 ~@7 a3@23 ~, ~@12 a4@11 ~@13 a4@11 ~@13 a4@18 e4@17 ~, ~@84 a4@11 ~]/2", // Bb D5
  L: "[~ db4 ~ db4 a3 c4 ~ c4 ~ b3 ~ [g3,b3] ~ bb3 ~ bb3, [g3,a3]@17 ~ a3@5 ~@7 gb3@17 ~ g3@17 ~@7 e3@23 ~, ~@12 g4@20 ~@4 gb4@20 ~@4 f4@20 ~@4 e4@11 ~]/2", // G Gsus2
  M: "[~@18 a3@5 ~@19 bb3@5 ~@19 a3@5 ~@19 f4@5 ~, a3@17 ~@7 bb3@17 ~@7 a3@17 ~@7 bb3@17 ~@7, ~@6 c4@17 ~@7 d4@11 ~@19 f4@23 ~ c4@11 ~, ~@12 f4@23 ~ c4@17 ~ c4@17 ~@7 d4@11 ~@7]/2",
  N: "[g3@3 d4@3 c4@3 d4@3 ~@6 c4@3 ~@9 a3@5 ~@4 c4@3 ~@3 c4@2 ~, ~@8 bb3@5 ~@3 f3@16, ~@12 e4@5 ~@13 e4@9 ~@9, ~@30 [d4,f4]@12 d4@11 ~ c4@15 ~@3 a3@12 [bb3,e4]@11 ~]/2", // Dm Bbdim
  O: "[d4@4 ~@2 d4@6 ~@6 d4@5 ~@7 d4@6 ~@18 c4@6 a3@6 c4@4 ~@2 c4@19 ~@5, bb3@11 ~ g4@29 ~ d4@13 ~@41, ~@6 c4@6 bb3@6 c4@6 a3@5 ~@19, ~@17 f3@5 ~@2 e3@17 ~@7 f3@17 ~@5 [f3,a3]@17 ~@9]/2", // F
  P: "[~@3 d4@3 ~@15 d4@3 ~@6 a3@5 ~@10 c4@3, g3@23 ~@19 bb3@11 ~ c4@20 ~@4 c4@10 ~@8, ~@12 c4@12 [bb3,e4]@12 [c4,e4]@11 ~ f3@12 ~@12 a3@11 ~ [a3,e4]@11 ~, ~@18 d4@10 ~@2 [d4,f4]@10 ~@20 e4@21 ~@15]/2", // Bbdim C A5 Dm
  Q: "d4@2 ~@13 d4@3 c4@3 d4@3, bb3@12 g4@29 ~@7, ~@6 d4@10 ~ f3@5 ~@2 e3@24, ~@12 c4@10 ~@2 bb3@15 ~@9, ~@9 d4@5 ~@10",
  R: "~@6 f4@5 ~@7 a3@5 ~@7 d4@6 ~@6 bb3@5 ~, a3@17 ~@7 bb3@17 ~@7, ~@6 c4@21 ~@9 c4@11 ~, ~@12 f4@23 ~@13",
  S: "[~@6 c4@5 ~@19 c4@6 ~@54 c3@5 ~, a3@17 ~ f3@15 ~@9 f3@11 ~ bb3@10 ~@2 c3@11 ~@7 c4@11 ~, ~@12 f4@23 ~ f4@11 ~@13 c4@17 ~ bb3@10 ~@8, ~@24 a3@17 ~@7 g3@23 ~ g3@23 ~]/2",
  T: "a3@5 ~@19 a3@6 ~@12 f3@5 ~, f3@17 ~ f3@23 ~@7, ~@6 c4@20 ~@4 c4@17 ~, ~@6 g3@11 ~@13 g3@11 ~@7, ~@12 f4@17 ~@7 f4@11 ~",
  U: "~@6 bb3@5 ~@7 f3@5 ~@7 bb3@6 ~@6 c3@5 ~, g3@17 ~@7 g3@23 ~, ~@12 c4@14 ~@10 c4@11 ~",
  V: "[~@48 c4@6 ~@18 c4@5 ~@7 e4@9 ~@3, a3@11 ~ f4@18 c4@17 ~@7 c4@16 ~@26, ~@6 [f3,c4]@23 ~ f3@23 ~ g3@22 ~@2 [g3,c4]@15 ~@3, ~@24 a3@11 ~ f4@23 ~ e4@20 ~@16]/2", // F5 C5
  W: "[~@17 g3@5 ~@20 gb3@5 ~@13 [db4,f4]@11 ~ e4@24, g3@16 ~@8 gb3@18 ~@6 f3@23 ~@25, ~@6 bb3@22 ~@2 a3@21 ~@3 ab3@17 ~@25, ~@12 eb4@15 ~@9 d4@16 ~@19 c4@25]/2", // Db
  X: "[~@24 a3@6 ~@19 bb3@6 ~@18 a3@6 ~@18 bb3@6 ~@19 a3@6 ~@18 bb3@6 ~@18 a3@6 ~@16 c4@7 bb3@7 ~@3 a3@35 ~@44, ~@6 a3@18 ~@6 bb3@18 ~@7 a3@18 ~@6 bb3@18 ~@7 a3@18 ~@6 bb3@18 ~@6 a3@18 ~@7 bb3@22 ~@8 [c3,f3]@37 ~@44, ~@12 c4@18 ~@7 d4@12 ~@18 f4@24 c4@12 ~@7 c4@18 ~@6 d4@11 ~@19 f4@27 ~@97, ~@18 f4@24 ~ c4@18 c4@18 ~@6 d4@12 ~@19 f4@24 c4@18 c4@18 ~@8 d4@13 ~@91]/6", // F5
})).s("gm_acoustic_guitar_steel").gain(0.21)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@15 A@4 B@2 C@2 D@2 E@2 F G H I J K L@3 M N@2 O P@7>".pickRestart({
  A: "[c6@93 ~@2 c6@96 ~]/4", B: "[a5@17 bb5@6 c6@24 d6@17 ~ g6@7 e6@22 ~@2]/2", C: "[f6@24 gb6@23 g6@36 ~@13]/2",
  D: "[c6@24 bb5@23 ~ a5@24 g5@11 f5@12 ~, f6@95 ~]/2", E: "[d4@47 c4@49]/2", F: "bb3", G: "a3@37 ~@11",
  H: "d6@3 c6 bb5@4", I: "c6@18 bb5@6 a5@23 ~", J: "bb5@3 a5 g5@4, [bb4,d5]",
  K: "a5@17 ~ g5@6 f5@12 e5@6 d5@6, [a4,c5] ~", L: "[a4@47 g4@48 ~ a4@48, c5]/3", M: "[g4,bb4]@23 ~", N: "c6/2",
  O: "db6@23 ~ d6@24",
  P: "[f6@24 e6@30 ~@2 a4@22 g4@24 f4@25 g4@24 ~@24 g4@25 f4@24 g4@30 ~ c6@38 ~@43, ~@54 f6@97 a4@3 ~@100 f4@39 ~@43, ~@152 f6@141 ~@43]/7",
})).s("gm_string_ensemble_2").gain(0.15).pan(0.1)

// other · string ensemble 2
const string_ensemble_2_2 = note("<~@15 A B A B C@2 D@2 E@2 F G H@2 I J K L M@4 N O P Q@3 R@2 S@2>".pickRestart({
  A: "g5 f5 g5 f5", B: "d5@11 e5@12 d5@13 e5@12", C: "a3!2",
  D: "[[a3,f5]@24 ~@12 d5@6 c5@5 ~ [g3,b4]@23 ~ bb4@24, ~@24 [gb3,gb5]@23 g5@24 g3@24 ~]/2", // Dm G Gb
  E: "[a4@24 g4@23 f4@24 ~ bb4@11 a4@7 g4@5 ~]/2", F: "g4", G: "a4", H: "[g4@46 ~ f4@29 ~@20]/2",
  I: "~@3 d4@7 f4@2 e4@2 d4@2", J: "c4@29 e4@6 d4@6 c4@6 ~", K: "f4@3 e4 d4@4, bb3, d4 ~@3", L: "[a3,c4,e4]@7 ~@9",
  M: "[c4@11 ~ a4@18 ~@5 f4@6 d4@6 c4@6 ~@54 a4@18 ~@6 f4@6 d4@6 c4@7 ~@42, ~@95 c4@18 ~@79]/4", N: "f4 e4 d4 c4",
  O: "g4@2 f4 e4", P: "eb4 d4", Q: "[db4@24 c4@30 ~ f4@72 ~@17]/3", R: "[~@7 f4@73 ~@16]/2", S: "[~@15 f4@37 ~@44]/2",
})).s("gm_string_ensemble_2").gain(0.22).pan(0.8)

// other · flute
const flute = note("<~@15 A@2 B@2 C@3 D E@2 F G H I ~@8 J@3 K@7>".pickRestart({
  A: "c5/2", B: "[c5@6 d5 e5]/2", C: "[c5@48 d5@24 e5@11 db5@7 a4@24 ~@18 d5@6 c5@6, a4@11 ~@13]/3", D: "b4@4 bb4@3 ~",
  E: "[c5@15 ~]/2", F: "[bb4,d5]", G: "[a4,c5]", H: "[g4,bb4]", I: "a4@13 ~@3, f4@7 ~@5",
  J: "[g5@12 f5@12 g5@12 f5@24 e5@12 f5@12 e5@11 eb5@24 ~ d5@24]/3",
  K: "[~ db5@24 c5@29 a5@24 g5@24 ~ a5@24 g5@24 ~ a5@24 g5@24 a5@24 ~ g5@29 ~ a5@38 ~@43]/7",
})).s("gm_flute").gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<A B@39 C D E F G H ~>".pickRestart({
  A: "x!4", B: "~ x ~ x", C: "~ x ~@2", D: "~@18 x ~@24 x ~@4", E: "~@19 x ~@23 x ~@4", F: "~@5 x ~@5 x",
  G: "~@5 x ~@6", H: "x",
})).gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~ A@39 B C D E F G ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@18 x ~@24 x ~@4", D: "~@19 x ~@23 x ~@4", E: "~@5 x ~@5 x", F: "~@7 x ~@8", G: "x",
})).gain(0.15)

stack(bass, piccolo, bass_2, acoustic_guitar_steel, string_ensemble_2, string_ensemble_2_2, flute, hihat, tambourine)

More by Michael Jackson