Strudelify

Land of 1000 Dances

Cannibal & The Headhunters

KeyE majorTempo156 bpm
0:00/0:00
// Land of 1000 Dances — Cannibal & The Headhunters
// 156 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(156/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 · "ACOU BASS"
const bass = note("<[~@12 b1 ~ a1@2] [e1@3 ~@3 b1@3 ~ b0@2 b1@2 a1 ~]!99 [e1@3 ~@13]>").s("gm_acoustic_bass").gain(0.72)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@12 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@26 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@17 C@2
>`.pickRestart({
  A: "[[g#3,b3,e4] ~ [g#3,b3,e4]@13 ~]/2", B: "[[g#3,b3,e4] ~ [g#3,b3,e4]@14]/2",
  C: "[[g#3,b3,e4] ~ [g#3,b3,e4]@7 ~@7]/2", // E
})).s("gm_acoustic_guitar_steel").gain(0.64)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@12 A B@2 C A B@2 C A B@2 D A B@2 D ~@26 A B@2 D A B@2 D E F G H I J K L M N O P A B@2 C A B@2 C ~@17 Q R
>`.pickRestart({
  A: "[d5,g#5]@2 ~@2 [d5,e5,g#5]@4 ~@4 b4 ~@3, ~@10 [d5,e5]@5 ~", // Ddim E7 Dsus2
  B: "[d5@3 ~ b4 ~ [b4,e5]@4 d5@2 ~@2 d5@2 ~@4 [d5,e5]@4 ~@4 b4@3 ~, b4 ~@11 b4@6 ~@2 b4@6 e5@5 ~]/2", // E5 Dsus2
  C: "[b4,e5]@3 ~ b4@2 [d5,e5]@2 [b4,e5] ~ [b4,d5]@3 ~ [b4,d5,e5]@2, d5@4 ~@6 e5 ~@5", // E5 Dsus2 E5 Bm E7
  D: "[b4,e5]@3 ~ b4@2 [d5,e5]@2 [b4,e5]@2 [b4,d5]@3 ~ [b4,d5,e5]@2, d5@4 ~@6 e5 ~@5", // E5 Dsus2 E5 Bm E7
  E: "[b4,e5] ~@3 [b4,e5] ~@5 [b4,e5] ~@5", F: "[b4,e5] ~@3 [b4,e5] ~@5 [b4,e5]@2 ~@2 e5@2",
  G: "~@4 [b4,e5] ~@5 [b4,e5] ~@5", H: "[b4,e5]@2 ~@4 [b4,d5,e5] ~@3 d5 ~@3 [b4,e5]@2",
  I: "~@4 e5 ~@5 [b4,e5]@2 ~@2 b4 ~", J: "~@6 [d5,e5] ~@5 [b4,d5,e5] ~@3",
  K: "~@2 [b4,e5] ~@5 [b4,d5,e5]@2 ~@4 [b4,e5]@2", L: "~@4 [b4,d5,e5] ~@5 [b4,d5,e5]@2 ~@2 [b4,e5] ~",
  M: "[b4,e5] ~@3 [b4,e5] ~@5 [b4,d5,e5] ~@5", N: "[b4,d5,e5] ~@3 [b4,d5,e5] ~@5 [b4,d5,e5] ~@5",
  O: "[d5,e5] ~@3 [b4,d5,e5] ~@5 [b4,d5,e5] ~@5", P: "[b4,d5,e5] ~@3 [b4,d5,e5] ~@5 [d5,e5] ~@3 [b4,d5,e5] ~",
  Q: "[d5,g#5] ~ [d5,e5,g#5]@2 ~@4", R: "[b4,e5]@3 ~@13",
})).s("gm_electric_guitar_clean").gain(0.53)

// chords · electric guitar clean · "CLEAN GTR" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@13 A B C ~ A B C ~ A B C ~ A B C ~@27 A B C ~ A B C D E F G H I J K ~ L M N ~ A B C ~ A B C ~@19
>`.pickRestart({
  A: "~@2 e5 ~@9 e5 ~@3", B: "~@2 [e5,f5] ~@13", C: "~@12 e5 ~@3", D: "~@2 b4 ~@9 b4 ~ b4 ~",
  E: "~@2 b4 ~@3 b4 ~@7 [b4,d5]@2", F: "~@2 b4 ~@3 b4 ~ b4 ~@7", G: "~@4 b4 ~@5 e5 ~@5",
  H: "[b4,e5]@2 b4 ~ b4 ~ b4 ~ b4 ~@7", I: "[b4,d5,e5]@2 ~@2 b4 ~ b4 ~@9", J: "b4 ~@5 b4 ~@3 b4 ~ b4 ~ d5@2",
  K: "~@2 b4 ~@3 b4 ~ b4 ~@5 d5 ~", L: "~@8 b4 ~@7", M: "b4 ~@13 b4 ~", N: "~@8 b4 ~ b4 ~@5",
})).s("gm_electric_guitar_clean").gain(0.3)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@74
  [e3@3 ~ g#3 ~ b3@2 d4@2 c#4 ~ b3 ~ g#3 ~]
  [e3@2 ~@2 g#3@2 b3 ~ d4@2 c#4 ~ b3@2 g#3 ~]
  [e3@2 ~@2 g#3 ~ b3 ~ d4@2 c#4 ~ b3 ~ g#3 ~]
  [e3 ~@3 g#3 ~ b3 ~ d4 ~ c#4 ~ b3 ~ g#3 ~]
  ~@23
>`).s("gm_electric_guitar_muted").gain(0.64)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~@12 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@26 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@17 C@2
>`.pickRestart({
  A: "[[e5,g#5] ~ [e5,g#5]@13 ~]/2", B: "[[e4,g#4]@2 ~@2 [e4,g#4]@27 ~]/2", C: "[[e5,g#5] ~ [e5,g#5]@7 ~@7]/2",
})).s("gm_piano").gain(0.72)

// bass · oboe
const bass_2 = note(`<
  ~@12 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@26 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@17 C@2
>`.pickRestart({
  A: "[e1@2 ~@2 e1@25 ~@3]/2", B: "[e1 ~ e1@14]/2", C: "[e1 ~ e1@7 ~@7]/2",
})).s("gm_electric_bass_finger").gain(0.68)

// other · tremolo strings · "TREMOLOSTR"
const tremolo_strings = note("<~@65 A B C@2 D B C@2 ~@28>".pickRestart({
  A: "g#3@4 b3@4 c#4@3 ~ d#4@4", B: "c#4@3 ~ b3@2 g#3 ~ b3@3 ~ g#3@2 f#3 ~", C: "[g#3@26 g#3 ~@5]/2",
  D: "g#3@4 b3@3 ~ c#4@3 ~ d#4@4",
})).s("gm_tremolo_strings").gain(0.57)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!3 ~ x]!98 [x ~ x ~@2 x ~ x] x>").gain(0.64)

// drums · snare
const snare = s("sd").struct("<A B@10 C B@41 C B@44 D E ~>".pickRestart({
  A: "~@6 x!2", B: "~ x ~ x", C: "~@4 x ~@6 x!2 ~ x ~", D: "~@4 x ~ x!10", E: "~@8 x!2 ~@2 x!2 ~@2",
})).gain(0.71)

// drums · clap
const clap = s("cp").struct("<~ [x!4]!98 [x!2 ~@2] ~>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<[~@6 x!2] [x!8]!98 [x!4 ~@4] ~>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@99 [~@3 x] ~>").gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@6 B ~@3 B ~@3 B ~@3 B ~@3 A ~@3 A ~@8 A ~@5 A ~@6 B ~@3 B ~@3 B ~@5 B ~@3 B ~ B ~@3 B ~@8 A ~@5 A ~@5 B A
>`.pickRestart({
  A: "x", B: "x!2 ~@2",
})).gain(0.64)

stack(
  bass, acoustic_guitar_steel, electric_guitar_clean, electric_guitar_clean_2, electric_guitar_muted, piano, bass_2,
  tremolo_strings, kick, snare, clap, hihat, open_hat, crash
)