Strudelify
Rhythm Is a Dancer cover art

1992 · The Madman's Return

Rhythm Is a Dancer

Snap

KeyA minorTempo125 bpm
0:00/0:00
// Rhythm Is a Dancer — Snap
// 125 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 6 "MELO TOM 1" (melodic tom patch on one pitch) is played as the kit's tom
// note: Full arrangement: all 114 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(125/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@16 A B C D A D E F A B C D A D E F A B C D A D E F A B C D A D E F ~@8 G H@3 G H@3 G H@3 G H@3 G H@3 G H@3 A B C D A
  D E F A B C D A D E F A B C D A D E F ~@10
>`.pickRestart({
  A: "a1@2 ~@2 a1@2 ~ f1@2 ~ f1@2 ~@2 f1 ~", B: "g1@2 ~@2 g1 ~@2 a1 ~@2 a1 ~@3 a1 ~",
  C: "a1@2 ~@2 a1 ~@2 f1@2 ~ f1@2 ~@2 f1 ~", D: "g1@2 ~@2 g1@2 ~ a1 ~@2 a1@2 ~@2 a1 ~",
  E: "a1@2 ~@2 a1 ~@2 f1 ~@2 f1@2 ~@2 f1 ~", F: "g1@2 ~@2 g1 ~@2 a1 ~@2 a1@2 ~@2 a1@2",
  G: "a1 ~@3 a1 ~@2 a1 ~@2 a1 ~@3 a#1 ~", H: "a1 ~@3 a1 ~@2 a1 ~@2 a1 ~@3 g1 ~",
})).s("gm_synth_bass_1").gain(0.45)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = 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 A B A B A B A B A B A B A B A B A B ~@24 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 ~@2
>`.pickRestart({
  A: "e5 ~ c5 ~ d5 ~ c5 ~ f3 ~ f4 ~ a4 ~ f4 ~", B: "g3 ~ g4 ~ b4 ~ g4 ~ a3 ~ a4 ~ c5 ~ a4 ~",
})).s("gm_lead_2_sawtooth").gain(0.35).pan(0.3)

// bass · synth bass 1 · "SYN BASS 1"
const bass_2 = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D E F@3
  E F@3 E F@3 E F@3 E F@3 E F@3 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~@2
>`.pickRestart({
  A: "a2!8 f2!8", B: "g2!8 a2!8", C: "a2!8 c3!8", D: "b2!8 a2!8", E: "a2!14 a#2!2", F: "a2!14 g2!2",
})).s("gm_synth_bass_1").gain(0.3)

// other · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@4 A B A C D E@4 F A C D E@6 F D E@6 F G C G C G C G C G C G C G C G C ~@16 H@2 I H@2 J K L H@2 I H@2 J K L G C G C G
  C G C G C G C G C G C G C G C G C G C ~@10
>`.pickRestart({
  A: "a4", B: "g4@3 e4@5", C: "d5@3 e5@5", D: "a3 f3", E: "[g3 a3@2 f3]/2", F: "g3 a3", G: "e5@3 f5@5", H: "e4@7 f4",
  I: "g4@7 f4", J: "e4@7 c4", K: "a3@7 g3", L: "a3",
})).s("gm_synth_strings_2").gain(0.3)

// other · pad new age · "FANTASIA"
const pad_new_age = note("<~@96 A B A B A B A B ~@10>".pickRestart({
  A: "e6 ~@2 e6 ~@2 f6 ~@9", B: "d6 ~@2 d6 ~@2 e6 ~@9",
})).s("gm_pad_new_age").gain(0.3)

// other · piano · "A.PIANO 2"
const piano = note("<~@55 A B@2 C@2 D@2 E@2 ~@50>".pickRestart({
  A: "~@7 g4", B: "[a4@2 d5 a5 e5@2 f5 e5@3 f5 e5@4 ~]/2", C: "[e5@4 d5@3 e5@2 c5 d5 b4 c5@2 a4 g4]/2",
  D: "[a4@4 d5@2 a5@2 e5@4 f5@2 e5@6 f5@2 e5@9 ~]/2", E: "[e5@4 d5@3 e5@2 c5 d5 b4 c5@2 a4@2]/2",
})).s("gm_piano").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@24 [x!4]!24 ~@8 [x!4]!23 ~ [x!4]!16 ~@18>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@32 [~ x ~ x]!16 ~@8 [~ x ~ x]!23 ~ [~ x ~ x]!16 ~@18>").gain(0.45)

// drums · clap
const clap = s("cp").struct("<~@32 [~ x ~ x]!16 ~@8 [~ x ~ x]!23 ~ [~ x ~ x]!16 ~@18>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@24
  [~@3 x ~@3 x ~@3 x ~@3 x]!8
  [x!2 ~ x!3 ~ x!3 ~ x!3 ~ x]!16
  ~@8
  [x!2 ~ x!3 ~ x!3 ~ x!3 ~ x]!48
  ~@10
>`).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@24 [~ x ~ x ~ x ~ x]!24 ~@8 [~ x ~ x ~ x ~ x]!48 ~@10>").gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@34 A B ~@2 A B ~@50 A B ~@2 A B A B>".pickRestart({
  A: "x ~@3 x ~@2 x ~@2 x ~@2 x ~@2", B: "x ~@2 x ~@12",
})).gain(0.3)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@3 A ~@3 A ~@3 A ~@3 A ~@35 A ~@3 A ~@51 A ~@3 A ~ B>".pickRestart({
  A: "~@6 x ~@2 x ~@2 x ~@3", B: "~@6 x ~@2 x ~@6",
})).gain(0.1)

stack(
  bass, lead_2_sawtooth, bass_2, synth_strings_2, pad_new_age, piano, kick, snare, clap, hihat, open_hat, mid_tom,
  mid_tom_soft
)

More by Snap