Strudelify

Smooth Criminal

Alien Ant Farm

KeyA minorTempo127 bpm
0:00/0:00
// Smooth Criminal — Alien Ant Farm
// 127 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 distortion guitar (copy of ch 4 distortion guitar); ch 6 electric guitar muted (copy of ch 5 electric guitar muted)
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28.
setcpm(127/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 B C B C B C B C B C B C B D@2 E@6 F G H G I G H G J@2 E@4 K L M B C B C B C B D@2 E@6 F G H G I G H G J@2 K L M
  B C B C B C B C B C B C B C B N@2 H G I G H G I G H G I G H G I B C B C O I B P
>`.pickRestart({
  A: "~@7 a1", B: "~@2 a1!4 g1 a1 b1@2 b1@2 ~@2 a1 b1", C: "c2@2 c2@2 ~@2 c2!2 b1@2 g1@3 ~ a1@2",
  D: "[c2@2 c2@2 ~@2 c2!2 b1@2 g1@3 ~ f1@4 f1@2 f1!4 f1@2 f2@2 ~@2 f1!2]/2",
  E: "[f1@2 f2@2 ~@2 f1@2 g1@2 g2@2 e1@2 f1@4 f1@2 f1!4 f1@2 f2@2 ~@2 f1!2]/2", F: "e1!4 g1 e1 g1 a1",
  G: "~@2 a1!6 g1@2 g1@2 ~@2 g1!2", H: "f1@2 f1@2 ~@2 f1!2 g1@2 e1@2 g1@2 a1@2",
  I: "f1@2 f1@2 ~@2 f1!2 e1@2 e1@2 g1@2 a1@2",
  J: "[f1@2 f1@2 ~@2 f1!2 e1@2 e1@2 g1@2 f1@4 f1@2 f1!4 f1@2 f2@2 ~@2 f1!2]/2", K: "f1 f2 ~ f1 g1!3 f1",
  L: "e1@3 ~@5 e1@2 e1@3 ~@3", M: "~@4 e1@3 ~@7 a1 ~",
  N: "[c2@2 c2@2 ~@2 c2!2 b1@2 g1@3 ~ a1@4 a1!6 g1@2 g1@2 ~@2 g1!2]/2", O: "~@2 a1!4 g1 a1 g1@2 g1@2 ~@2 g1!2",
  P: "c2@2 c2@2 ~@2 c2!2 b1@2 g1@3 ~@3",
})).s("gm_electric_bass_finger").gain(0.3)

// chords · distortion guitar
const distortion_guitar = note(`<
  A B C B C B C B C B C B C B C B D@8 E F G F H F G F I@7 J K B C B C B C B D@8 E F G F H F G F L@3 J K B C B C B C B C
  B C B C B C B M@2 G F H F G F H F G F H F G F H B C B C B C B N
>`.pickRestart({
  A: "~@7 [a2,e3,a3]", B: "~@2 a2!4 g2 a2 b2 ~ b2 ~@3 a2 b2", C: "c3 ~ c3 ~@3 c3!2 b2 ~ g2 ~@3 a2 ~",
  D: "[c3 ~ c3 ~@3 c3!2 b2 ~ g2 ~@3 [f2,c3,f3]@25 ~ [g2,d3,g3]@2 [g2,d3,g3]@2 e2 ~ [f2,c3,f3]@25 ~ [g2,d3,g3]@2 [g2,d3,g3]@2 e2 ~ [f2,c3,f3]@25 ~ [g2,d3] ~ [g2,d3] ~ e2 ~ [f2,c3,f3]@17 ~]/8", // F5 G5 F5 G5 F5 G5 F5
  E: "[e2,b2,e3]@7 ~ [g2,d3,g3]@2 [e2,b2,e3]@2 [g2,d3,g3]@2 [a2,e3,a3]@2", // E5 G5 E5 G5 A5
  F: "~@2 [a2,e3,a3]!6 [g2,d3,g3]@2 [g2,d3,g3]@2 ~@2 [g2,d3,g3]!2", // A5 G5
  G: "[f2,c3,f3]@2 [f2,c3,f3]@2 ~@2 [f2,c3,f3]!2 [g2,d3,g3]@2 [e2,b2,e3]@2 [g2,d3,g3]@2 [a2,e3,a3]@2", // F5 G5 E5 G5 A5
  H: "[f2,c3,f3]@2 [f2,c3,f3]@2 ~@2 [f2,c3,f3]!2 [e2,b2,e3]@2 [e2,b2,e3]@2 [g2,d3,g3]@2 [a2,e3,a3]@2", // F5 E5 G5 A5
  I: "[[f2,c3,f3]@2 [f2,c3,f3]@2 ~@2 [f2,c3,f3]!2 [e2,b2,e3]@2 [e2,b2,e3]@2 [g2,d3,g3]@2 [f2,c3,f3]@25 ~ [g2,d3,g3]@2 [g2,d3,g3]@2 e2 ~ [f2,c3,f3]@25 ~ [g2,d3,g3]@2 [g2,d3,g3]@2 e2 ~ [f2,c3,f3]@25 ~ [g2,d3,g3]@2 [g2,d3,g3]@2 [g2,d3,g3]@2 [f2,c3,f3]@2]/7", // F5 E5 G5 F5 G5 F5 G5 F5 …
  J: "[e2,b2,e3] ~@3 [e2,b2,e3]!2 ~@2", K: "~@4 [e2,b2,e3]@2 ~@8 a2 ~",
  L: "[[f2,c3,f3]@2 [f2,c3,f3]@2 ~@2 [f2,c3,f3]!2 [e2,b2,e3]@2 [e2,b2,e3]@2 [g2,d3,g3]@2 [f2,c3,f3]@25 ~ [g2,d3,g3]@2 [g2,d3,g3]@2 [g2,d3,g3]@2 [f2,c3,f3]@2]/3", // F5 E5 G5 F5 G5 F5
  M: "[c3 ~ c3 ~@3 c3!2 b2 ~ g2 ~@3 [a2,e3,a3]@4 [a2,e3,a3]!6 [g2,d3,g3]@2 [g2,d3,g3]@2 ~@2 [g2,d3,g3]!2]/2", // A5 G5
  N: "c3 ~ c3 ~@3 c3!2 b2 ~ g2 ~@5",
})).s("gm_distortion_guitar").gain(0.35).pan(1)

// other · distortion guitar
const distortion_guitar_2 = note("<~@93 A B C D A E A F ~@8>".pickRestart({
  A: "~@2 [a2,a3]!6 [b2,b3]!8", B: "[c3,c4]!8 [d3,d4]!4 [e3,e4]!4", C: "[e3,e4]!8 [b2,b3]!8",
  D: "[c3,c4]!8 [b2,b3]!7 ~", E: "[c3,c4]@2 [d3,d4]!2 [d3,d4]@2 [e3,e4]!2 [f#3,f#4]@2 [g3,g4]!2 [g3,g4]@2 [a3,a4] ~",
  F: "[c3,c4]@2 [d3,d4] [d3,d4]@2 [e3,e4] [f#3,f#4]@2 [g3,g4] [g3,g4]@2 [a3,a4]!4 ~", // C D E F# G A
})).s("gm_distortion_guitar").gain(0.11).pan(1)

// other · overdriven guitar
const overdriven_guitar = note("<~@72 A@6 B C B C B C D ~@24>".pickRestart({
  A: "[~@14 [a2,e3,a3]@67 c4 b3 a3 b3 a3 g3 d3 g3 a3!3 g3 a3!3]/6", B: "a3 c4 b3 a3 b3 a3 g3 d3 g3 a3!3 g3 a3!3",
  C: "~ c4 b3 a3 b3 a3 g3 d3 g3 a3!3 g3 a3!3", D: "a3 c4 b3 a3 b3 a3 g3 d3 g3 a3!5 ~@2",
})).s("gm_overdriven_guitar").gain(0.28)

// chords · overdriven guitar · C5 C#5 D5 D#5 E5 F5 F#5 G5 …
const overdriven_guitar_2 = note(`<
  ~@75
  [[g3,c4] [g#3,c#4]!4 [a3,d4]!4 [a#3,d#4]!4 [b3,e4]!3]
  [[b3,e4] [c4,f4]!4 [c#4,f#4]!4 [d4,g4]!4 [d#4,g#4] [e4,a4] ~, ~@10 d6@5 ~]
  ~@32
>`).s("gm_overdriven_guitar").gain(0.13)

// other · pad choir
const pad_choir = note("<~@8 A ~@68 B@7 C D@8 ~@16>".pickRestart({
  A: "~ d5@2 d5@2 ~@3", B: "~@2 g5 ~ g5!2 ~ d5 g5 ~ g5 ~ a#5@4", C: "~@2 g5 ~ g5!2 ~ d5 g5 ~ g5 ~@5",
  D: "[~@5 d5@2 d5@2 ~@4 d5@2 d5@2 ~@4 d5@2 d5@2 ~@4 d5@2 d5@2 ~@4 d5@2 d5@2 ~@3 d5@3 d5@2 ~@4 d5@2 d5@2 ~@7]/8",
})).s("gm_pad_choir").gain(0.45)

// other · pan flute
const pan_flute = note("<~@25 A B C D E B F B ~@24 A B C D E B F B ~@20 A B C D E B F B ~@16>".pickRestart({
  A: "~@4 e4!4 d4@2 b3@2 ~@2 d4!2", B: "c4@2 a3@2 ~@2 c4!2 d4@2 b3@2 ~@4", C: "~ e4!3 e4@2 e4!2 d4@2 b3@2 ~@2 d4!2",
  D: "c4@2 a3@2 ~@2 c4!2 d4@2 b3@2 d4@2 e4@2", E: "~ e4!3 e4@2 e4@2 d4@2 b3@2 ~@2 d4!2", F: "~ e4!7 d4@2 b3@2 ~@2 d4!2",
})).s("gm_pan_flute").gain(0.56).pan(0.1)

// other · pan flute
const pan_flute_2 = note(`<
  ~@25 A B C D E B F B ~@18 G H G H I ~ A B C D E B F B ~@20 A B C D E B F B ~@16
>`.pickRestart({
  A: "~@4 c6!4 b5@2 g5@2 ~@2 b5!2", B: "a5@2 f5@2 ~@2 a5!2 b5@2 g5@2 ~@4", C: "~ c6!3 c6@2 c6!2 b5@2 g5@2 ~@2 b5!2",
  D: "a5@2 f5@2 ~@2 a5!2 b5@2 g5@2 b5@2 c6@2", E: "~ c6!3 c6@2 c6@2 b5@2 g5@2 ~@2 b5!2", F: "~ c6!7 b5@2 g5@2 ~@2 b5!2",
  G: "~@11 e5 g5 ~ e5@2", H: "~@3 e5 g5 ~ e5@2 ~@8", I: "~@11 e5 g5@2 e5 ~",
})).s("gm_pan_flute").gain(0.48).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  A B C B C B C B D B C B C B C B E B C B C B C B D F G F G F G F E B C B C B C H I B C B J K L B A B C B C B C B D F G
  F G F G M N B C H I B C B N B H B N O P O P O P Q A F R S G S G T U F G M G F R M U V L W J V D V H
>`.pickRestart({
  A: "~@7 x", B: "~@2 x ~@2 x ~@2 x ~ x ~@3 x ~", C: "x!2 ~@2 x!2 ~ x", D: "x!2 ~@2 x ~@2 x", E: "x ~@6 x",
  F: "~@2 x ~@2 x ~@2 x ~@7", G: "x ~@7 x ~@2 x ~@2 x ~", H: "x!2 ~@2 x!2 ~@2", I: "~ x ~@5 x", J: "x ~@2 x ~ x ~ x",
  K: "~ x ~ x!3 ~@2", L: "x!2 ~ x!3 ~ x", M: "~@2 x!2 ~@2 x ~ x ~@7", N: "x ~@5 x!2",
  O: "~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x!2", P: "~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~", Q: "~@5 x ~@10",
  R: "x ~@7 x ~ x!2 ~@2 x ~", S: "~@2 x!2 ~@2 x ~ x ~ x ~@5", T: "~@2 x ~@2 x ~@2 x ~@2 x ~@4",
  U: "x ~@2 x ~@2 x ~@2 x ~@2 x ~ x ~", V: "~@2 x ~@2 x ~@2 x ~ x ~@5", W: "~ x ~ x!3 ~ x",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  A B@7 C B@7 D E B E B E B@2 F E B E B E B E G B@11 H B@3 ~ E B@5 I F E B E B E B E J B I B@5 K B L E M B@6 N O E B E B
  E B P Q E B E B E B E R E B@2 H E B E S
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x", C: "~@4 x ~@5 x!4 ~@2", D: "~@4 x!3 ~@3 x!4 ~@2", E: "~ x ~@2 x ~@7 x ~@3",
  F: "~@4 x!2 ~@4 x!4 ~@2", G: "~@2 x ~ x ~@2 x ~@2 x!2 ~@4", H: "~@2 x!4 ~@2 x!2 ~@2 x!2 ~@2", I: "~@4 x ~@7 x ~@2 x",
  J: "~@2 x ~ x ~@2 x ~@2 x!4 ~@2", K: "~@2 x ~ x ~@2 x ~@2 x!2 ~ x ~@2", L: "~@2 x ~@3 x!2",
  M: "~@2 x ~ x!2 ~ x ~@2 x!2 ~ x ~@2", N: "~@11 x ~@4", O: "x ~@2 x ~ x!2 ~", P: "~ x ~@2 x ~@7 x ~ x!2",
  Q: "~@2 x ~@2 x ~@2 x ~ x!2 ~ x ~@2", R: "~@13 x ~@2", S: "~ x ~@2",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@32
  [~@8 x ~@3 x!2 ~@2]
  ~@34
  [~@4 x!2 ~@2]
  ~@24
  [x!2 ~ x!2 ~ x!2 ~@8]
  ~@15
  [~@6 x!3 ~ x ~@5]
>`).gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A B C B D E F G A G A G A G ~@24 H I A B ~ G A G ~@20 H J A B ~@5 K@4 L@2 M N ~@17 A B ~ B ~ B O
>`.pickRestart({
  A: "~@3 x", B: "~@3 x ~@4", C: "~@10 x!2 ~@4", D: "~@6 x!5 ~@5", E: "x!2 ~@4 x ~@7 x!2", F: "x!3 ~@13",
  G: "~@2 x!2 ~@4", H: "x!3 ~", I: "~ x!3 ~@4", J: "~ x ~@2", K: "x ~ x!3 ~ x!3 ~@3 x!3 ~",
  L: "x ~@2 x!2 ~ x!3 ~@3 x!3 ~", M: "x ~@5 x!2 ~@4 x!2 ~@2", N: "x ~ x!2 ~@2 x ~ x ~@7", O: "~ x ~@14",
})).gain(0.4)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B C D C E F G A B A B A B A ~@25 H B F ~ A B G ~@21 H B I ~@29 A B F ~ F B F ~
>`.pickRestart({
  A: "~@5 x ~@3 x ~@3 x ~@2", B: "~ x ~@3 x ~@3 x ~@6", C: "x ~@3 x ~@4 x ~@3 x ~@2", D: "~ x ~@3 x ~@3 x ~@2 x ~@3",
  E: "~ x ~@3 x ~@6 x ~@3", F: "~@4 x ~@4 x ~@3 x ~@2", G: "~@5 x ~@10", H: "~@9 x ~@3 x ~@2", I: "~ x ~@2",
})).gain(0.05)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A ~@15 B ~@15 C ~@15 D ~@7 D ~@3 E ~@4 F@2 G H ~@15 I ~@5 J ~@2>".pickRestart({
  A: "~ x ~@2 x ~@3", B: "~@5 x ~@10", C: "x!14 ~@2", D: "~@5 x ~@2 x ~@7", E: "~ x", F: "~ x ~@6",
  G: "~@2 x!3 ~@3 x!3 ~@3 x ~", H: "~ x ~@2 x ~@2 x ~@8", I: "~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@4", J: "~@10 x!2 ~@4",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A B C B C D C E C B C B C B C F G H I H I H I ~@9 G H I H I H J K L B C M L B C ~ N H I H I H I ~@9 N O J K C P Q R
  ~@3 R S@6 T U ~@16 A B C V C P C W
>`.pickRestart({
  A: "~ x!3", B: "x ~ x ~ x ~@2 x", C: "~ x ~@2 x ~ x ~", D: "x ~ x ~@4 x", E: "~@4 x ~@3 x ~@5 x!2", F: "x",
  G: "~@3 x ~ x ~ x", H: "~ x ~ x ~ x ~@2", I: "~ x ~ x ~ x ~ x", J: "~ x ~ x", K: "~ x ~@6", L: "~@2 x!2",
  M: "x ~@5 x ~@3 x ~@3 x!2", N: "~@2 x!2 ~ x ~ x", O: "~ x ~ x ~ x!3", P: "x!3 ~", Q: "~@2 x ~@5 x!2 ~@2 x ~@3",
  R: "x ~@13 x!2", S: "~ x ~@3 x ~@4 x ~@4 x", T: "~ x ~@3 x ~@10", U: "~@5 x ~@10", V: "x ~@2 x ~@4", W: "x!2 ~@2",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  A B ~@14 A C A ~ A ~ A ~ D ~ A ~ A ~ A ~ A C A ~ A ~ A E A ~@4 F ~@2 A F A ~ A ~ A ~ D ~ A ~ A ~ A ~ A F ~ E A ~ A ~@2
  G@3 ~@8 A ~ A ~ A ~ A ~ A ~ A H I ~ A ~ J F ~@2 K ~ A ~@2
>`.pickRestart({
  A: "~@7 x", B: "x!2 ~@6", C: "~ x!2 ~@5", D: "x ~@2 x!2 ~@2 x", E: "x", F: "~ x ~@6", G: "~ x ~ x ~ x ~ x",
  H: "~@3 x", I: "~@2 x ~ x ~ x!2", J: "x ~@2 x ~@2 x ~@2 x ~@2 x ~ x ~", K: "~@5 x ~ x",
})).gain(0.4)

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~@25 A B A B A B A ~@19 C ~ C ~ C ~ A B A B A B A ~@21 A B A B A B A ~ A B A D A B A ~@9
>`.pickRestart({
  A: "~@2 x ~ x ~ x!3 ~ x!3 ~ x!2", B: "x ~ x!3 ~ x!3 ~ x!3 ~@3", C: "~ x ~@6", D: "x ~ x!2 ~@12",
})).gain(0.4)

// drums · ht
const ht = s("ht").struct("<~@108 [~@5 x ~@2]>").gain(0.4)

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

// drums · guiro
const guiro = s("guiro:0").struct("<~@3 [~@5 x ~@2] ~@105>").gain(7.34)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@6 [~@5 x ~@2] ~@102>").gain(0.5)

stack(
  bass, distortion_guitar, distortion_guitar_2, overdriven_guitar, overdriven_guitar_2, pad_choir, pan_flute,
  pan_flute_2, kick, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat, crash, ride_bell, ht, cabasa, guiro,
  woodblocks
)