Strudelify

The Safety Dance

Men Without Hats

KeyC majorTempo203 bpm
0:00/0:00
// The Safety Dance — Men Without Hats
// 203 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 229 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(203/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 · slap bass 2 · "BassGtr"
const bass = note(`<
  A@32 B@5 C@3 D E F G H C@3 I J K@2 L A@16 M@4 C@3 D E F G H C@3 N J K@2 O J K@2 L M@4 C@3 D E F G H C@3 I J K@2 O J
  K@2 P J Q@3 J R@3 S T@2 U S T@2 V A@40 M@4 C@3 D E F G H C@3 I J K@2 O J K@2 P J Q@3 J R@3 S T@2 U S T@2 U S T@2 U W@3
  V X@8
>`.pickRestart({
  A: "[~@3 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2]/8",
  B: "[~@3 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ a#1 ~ a#1@2 ~@2 a#1 ~ a#1@2 ~@2 a#1 ~ a#1 ~ f1 ~ f1@2 ~@2 f1 ~ f1@2 ~@3 f1!2 ~ f1 ~ f1 ~@3 f1 ~ f1]/5",
  C: "[~@3 f1 ~ f1 ~ a#1 ~ a#1@2 ~@2 a#1 ~ a#1@2 ~ a#1 ~ a#1 ~@2 c2!2 ~@4 c2 ~ c2@2 ~ c2 ~ c2 ~ g1 ~ g1@2 ~@2 g1 ~ g1@2]/3",
  D: "~@2 g1 ~ g1 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2", E: "~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2",
  F: "~@2 c2 ~ c2 ~ a#1 ~ a#1@2 ~@2 a#1 ~ a#1@2", G: "~@2 a#1 ~ a#1 ~ f1 ~ f1@2 ~@2 f1 ~ f1@2",
  H: "~@4 f1!2 ~ f1 ~ f1 ~@3 f1 ~ f1", I: "~@2 g1 ~ g1 ~ f1 ~ f1@2 ~@3 f1 f1@2",
  J: "~@2 f1 ~ f1 ~@2 a#1 a#1@2 ~@2 a#1 ~ a#1@2",
  K: "[~@3 a#1!2 ~@2 d#2 ~ d#2@2 ~@2 d#2 ~ d#2@2 ~@2 d#2!2 ~@2 g#1 ~ g#1 ~@3 g#1 ~ g#1]/2",
  L: "~@3 g#1!2 ~@2 c2 c2@2 ~@3 c2 c2@2",
  M: "[~@3 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ a#1 ~ a#1@2 ~@2 a#1 ~ a#1@2 ~@2 a#1 ~ a#1 ~ f1 ~ f1@2 ~@2 f1 ~ f1@2 ~@3 f1!2 ~ f1 ~ f1 ~@3 f1 ~ f1]/4",
  N: "~@2 g1 ~ g1 ~ f1 ~ f1@2 ~@3 f1!2 ~", O: "~@3 g#1!2 ~ f1 ~ f1@2 ~@3 f1 f1@2",
  P: "~@3 g#1!2 ~ f1 ~ f1@2 ~@3 f1!2 ~",
  Q: "[~@3 a#1!2 ~@2 d#2 ~ d#2@2 ~@2 d#2 ~ d#2@2 ~@2 d#2!2 ~@2 g#1 ~ g#1 ~@3 g#1 ~ g#1@2 ~@2 g#1!2 ~ f1 ~ f1@2 ~@3 f1!2 ~]/3",
  R: "[~@3 a#1!2 ~@2 d#2 ~ d#2@2 ~@2 d#2 ~ d#2@2 ~@2 d#2!2 ~@2 g#1 ~ g#1 ~@3 g#1 ~ g#1@2 ~@2 g#1!2 ~@2 c2 ~ c2@2 ~ c2 ~ c2 ~]/3",
  S: "~@2 c2 ~ c2 ~@2 g1 ~ g1@2 ~@2 g1 ~ g1",
  T: "[~@3 g1 ~ g1 ~ d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2 ~ a1 ~ a1@2 ~@2 a1 ~ a1]/2",
  U: "~@3 a1!2 ~@2 c2 ~ c2@2 ~ c2 ~ c2 ~", V: "~@2 a1 ~ a1 ~@2 c2 c2@2 ~@3 c2 c2@2",
  W: "[~@2 c2 ~ c2 ~@2 g1@2 g1@2 ~@2 g1 ~ g1@2 ~@2 g1 ~ g1 ~ d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2 ~ a1 ~ a1@2 ~@2 a1 ~ a1]/3",
  X: "[~@3 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2 ~ c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@15]/8",
})).s("gm_slap_bass_2").gain(0.36)

// other · lead 8 bass lead · "Gliss"
const lead_8_bass_lead = note("<~@170 A@5 ~@45 B@6 C@3>".pickRestart({
  A: "[~@3 c3@30 ~@7]/5", B: "[~@6 c3@30 ~@3 c4@29 ~@3 c5@25]/6", C: "[~ c6@5 ~@2]/3",
})).s("gm_lead_8_bass_lead").gain(0.31)

// chords · brass section · "Synth2"
const brass_section = note("<~@72 A@5 ~@3 A@5 ~@11 A@5 ~@3 B@5 ~@15 C@8 ~@44 A@5 ~@3 A@5 ~@15 C@16 ~@9>".pickRestart({
  A: "[~@7 [f2,f3]@14 ~ [a#2,a#3]@15 ~ [c3,c4]@16 ~ [g2,g3]@13 ~@12]/5", // F A# C G
  B: "[~@7 [f2,f3]@14 ~ [a#2,a#3]@15 ~ [c3,c4]@16 ~ [g2,g3]@15 ~@10]/5", // F A# C G
  C: "[~@7 e4@11 ~@5 b3@11 ~@5 [d4,f#4,a4]@12 ~@3 [a3,c#4,e4]@10, ~@6 [c4,g4]@11 ~@5 [g3,d4]@11 ~@31]/4", // D A C5 G5
})).s("gm_brass_section").gain(0.26)

// chords · lead 2 sawtooth · "Synth 1"
const lead_2_sawtooth = note("<~@60 A@7 B@2 ~@95 A@7 B@2 ~@56>".pickRestart({
  A: "[~@7 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@4 f4@2 e4@2 f4@2 g4@3 ~@3 [c4,e4,g4]@4 f4@2 ~ f4 ~@4 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@4 f4@2 e4@2 f4@2 g4@3 ~@3 [c4,e4,g4]@4 f4@2 ~ f4 ~@4 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@4 f4@2 e4@2 f4@2 g4@3 ~@3 [c4,e4,g4]@4 f4@2 ~ f4 ~@4 [c4,e4,g4]@2 ~@2 [c4,e4,g4], ~@23 e4@4 ~@10 e4@3 ~@15 e4@4 ~@10 e4@3 ~@15 e4@4 ~@10 e4@3 ~@8]/7", // C
  B: "[~@3 f4@2 e4@2 f4@2 g4@3 ~@3 [c4,e4,g4]@4 f4@2 ~ f4 ~@9, ~@7 e4@4 ~@10 e4@3 ~@8]/2", // C
})).s("gm_lead_2_sawtooth").gain(0.2)

// chords · lead 2 sawtooth · "Synth 1" · soft notes
const lead_2_sawtooth_soft = note("<~@61 A ~ A ~ A ~ A ~@97 A ~ A ~ A ~ A ~@57>".pickRestart({
  A: "~@4 e4 ~@4 c4@2 ~@5",
})).s("gm_lead_2_sawtooth").gain(0.15)

// other · lead 2 sawtooth · "Sawtooth"
const lead_2_sawtooth_2 = note(`<
  ~@24 A B C D@3 C E@2 ~@19 F@2 C B C D@3 G ~@79 A D@3 C B C E@2 ~@7 A D@3 C D@3 G ~@64
>`.pickRestart({
  A: "~@7 c6 ~@3 c6@2 ~@2 c7", B: "~@3 c7 ~ c6 ~@4 c6 ~@3 c6 c7", C: "~ c6@2 c7@2 ~@2 c6 ~@3 c6@2 ~@2 c7",
  D: "[~@3 c7 ~ c6 ~@4 c6 ~@3 c6 c7@2 c6@2 c7@2 ~@2 c6 ~@3 c6@2 ~@2 c7@2 ~@2 c7 ~ c6 ~@4 c6 ~@3 c6 c7]/3",
  E: "[~@3 c7 ~ c6 ~@4 c6 ~@3 c6 c7@2 c6@2 c7@2 ~@11]/2",
  F: "[~@7 c6 ~@3 c6@2 ~@2 c7@2 ~@2 c7 ~ c6 ~@4 c6 ~@3 c6 c7]/2", G: "~ c6@2 c7@2 ~@11",
})).s("gm_lead_2_sawtooth").gain(0.36)

// drums · kick
const kick = s("bd").struct(`<
  A@4 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A
  B A@5 B@3 A B A@5 B@3 A B A@5 B@3 A B A@5 B A@3 B@3 A B A@5 B@3 A B A@5 B A@3 B@3 A B A@5 B@3 A B A@5 B A@3 B@3 A B
  A@5 B@3 A B A@5 B A@3 B@3 A B A@5 B@3 A B A@3 ~
>`.pickRestart({
  A: "~@7 x ~@8", B: "~ x",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct("<A@51 B A@35 B A@3 C A@19 B A@3 B A@3 B A@3 B A@104 ~>".pickRestart({
  A: "~@15 x", B: "~@13 x ~ x", C: "~@12 x ~ x!2",
})).gain(0.26)

// drums · clap
const clap = s("cp").struct(`<
  A@3 ~ B@4 C A@4 ~ B@4 C A@4 ~ B@4 C A@4 ~ B@4 C A@4 ~ B@4 C A@2 D A ~ B@4 C A@4 ~ B@4 C A@4 ~ B@4 C A@4 ~ B@3 E A@3 F
  ~@16 C A@2 G A ~ B E ~ B C G A@3 G ~ B@3 C A@4 ~ B C A ~ B@4 C A@4 ~ B@4 C A@4 ~ B C A ~ B@4 C A@4 ~ B ~@16 B C A@4 ~
  B@4 C A@4 ~ B C A ~ B@4 C A@4 ~ B@4 C A@2 H I
>`.pickRestart({
  A: "~@15 x", B: "x", C: "x ~@14 x", D: "~@13 x ~ x", E: "x ~@12 x ~ x", F: "~@13 x!2 ~", G: "~@13 x ~@2",
  H: "~@6 x!2", I: "x ~ x ~ x!2 ~ x ~ x ~@6",
})).gain(0.31)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!228 ~>").gain(0.26)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@7 x",
})).gain(0.41)

stack(
  bass, lead_8_bass_lead, brass_section, lead_2_sawtooth, lead_2_sawtooth_soft, lead_2_sawtooth_2, kick, snare, clap,
  hihat, open_hat
)