Strudelify

Swayin' To the Music (Slow Dancin')

Johnny Rivers

KeyF majorTempo96 bpm
0:00/0:00
// Swayin' To the Music (Slow Dancin') — Johnny Rivers
// 96 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: metre changes (4/4 at bar 1, 2/4 at bar 9, 4/4 at bar 10, 2/4 at bar 26, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/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 pick · "Staff-2"
const bass = note("<A@8 B C@2 D E@3 D F@8 G@6 H I J@3 K@2 D E@3 D F@8 L@8 ~@5>".pickRestart({
  A: "[~@6 g2@3 g2 a2@3 a2 b2@3 b2 c3@3 d3 g2@3 g2 a2@3 a2 b2@3 b2 c3@3 d3 g2@3 g2 a2@3 a2 b2@3 b2 c3@3 d3 g2@3 g2 a2@3 a2 b2@2]/8",
  B: "~ b2 c3@4 c2@2", C: "[c2@2 g2@3 g2 gb2@3 gb2 e2@3 d2 c2@2]/2", D: "b1 a1 g1@3 g2@2 gb2",
  E: "[e2@2 d2@3 d2 d2@3 d2 g2@3 g2 gb2@3 gb2 e2@3 d2 c2@2]/3",
  F: "[e2@2 d2@3 d2 d2@3 d2 g2@3 g2 a2@3 a2 b2@3 b2 c3@3 d3 g2@3 g2 a2@3 a2 b2@3 b2 c3@3 d3 g2@3 g2 a2@3 a2 b2@3 b2 c3@3 d3 g2@3 g2 a2@2]/8",
  G: "[~ a2 b2@3 b2 c3@4 c2@2 c2@2 d2@8 g2@4 a2 a2@3 b2@4 d2@7 d2!2 d3 d2@4]/6", H: "d3 b2 a2@2 e2@4 e2@4 e2@4",
  I: "e2 b2!3", J: "[b2@2 c3@3 c3 c3@3 c3 d3@3 d3 d3@4 d2@2 d2!2 d2@2]/3", K: "[d2@2 g2@3 g2 gb2@3 gb2 e2@3 d2 c2@2]/2",
  L: "[~@2 a2@2 b2@6 b2@2 c3@8 c2@4 c2@4 d2@16 g2@8 a2@2 a2@6 b2@9 d2@16 d2@2 ~ d2@2 d3@2 ~ d2@14 d2@19 ~@2]/8",
})).s("gm_electric_bass_pick").gain(0.48)

// chords · epiano2 · "Staff-3"
const epiano2 = note("<A@4 B@7 C@2 D@2 C@2 E@7 F@3 G H I J K@3 L M@2 C@2 D@2 C@2 E@7 F@3 G N@5 ~@4>".pickRestart({
  A: "[~@6 d4 b3 d4@2 a4 g4@2 [g4,b4]@2 a4 g4 d4 e4@2 d4@2 d4 b3 d4@2 a4 g4@2 d4 g4!2, ~@3 b4@2 ~@6 b4@2 ~@3, ~@6 g4@2 ~@2 [c4,e4]@3 d4@4 ~ [g3,c4]@4 g4@2 ~@2 [c4,e4]@3 ~ d4@2]/4", // G C C5 C
  B: "[g4 [d4,g4] e4@2 d4@2 d4 b3 d4@2 a4 g4@2 [g4,b4]@2 a4 g4 d4 e4@2 d4@2 [d3,g3]@2 d4@2 [c4,e4]@2 g3@2 [g3,d4] [a3,d4,g4]@3 [c4,e4]@3 [c4,e4]@5 [g3,b3]@2 [d4,g4,b4]@2 b4@2 a4@2 [b3,e4]@2 [c4,e4]@3 g3, ~ b4@2 ~@3 b4@4 ~@46, ~@2 [g3,c4]@4 g4@2 ~@2 [c4,e4]@3 d4@4 ~ [g3,c4]@4 b3@4 ~@20 d4@4 ~@6]/7", // G5 G G5 C G5 Dsus4 C G …
  C: "[c4@2 [g3,b3]@2 [d4,g4]@2 [d4,g4]@4 [d4,gb4]@3 [c4,e4]@2 [b3,d4]]/2", // G G5 D C Bm
  D: "[[a3,c4]@2 [g3,b3]@2 [d4,g4,b4]@2 b4@2 a4@2 [b3,e4]@2 [c4,e4]@3 g3, ~@3 d4@2 ~@3]/2", // Am G E5 C
  E: "[[a3,c4]@2 d4 b3 d4@2 a4 g4@2 [g4,b4]@2 a4 g4 d4 e4@2 d4@2 d4 b3 d4@2 a4 g4@2 d4 g4!3 [d4,g4] e4@2 d4@2 d4 b3 d4@2 a4 g4@2 [g4,b4]@2 a4 g4 d4 e4@2 d4@2 [d3,g3]@2 d4@2 [c4,e4]@2, ~@2 b4@4 ~@12 b4@4 ~@7 b4@2 ~@3 b4@4 ~@18, ~@2 g4@2 ~@2 [c4,e4]@3 d4@4 ~ [g3,c4]@4 g4@2 ~@2 [c4,e4]@3 ~ d4@2 ~@2 [g3,c4]@4 g4@2 ~@2 [c4,e4]@3 d4@4 ~ [g3,c4]@4 b3@4 ~@2]/7", // Am G G5 G G5 C C5 C …
  F: "[g3@2 [g3,d4] [a3,d4,g4]@3 [c4,e4]@3 [c4,e4]@5 [c4,e4,g4]@3 ~ [c4,e4]@4 d4@2]/3", // G5 Dsus4 C
  G: "[d4,g4,b4]@2 [c4,e4,a4] [c4,e4,g4]@2 [d4,g4,b4]@2 [c4,e4,a4]", // G Am C G Am
  H: "[c4,e4,a4] [b3,d4,g4] [d4,g4,b4] [c4,e4,a4]@2 [d4,g4,b4] [c4,e4,a4]@2", I: "[d4,g4,b4] [c4,e4,a4]@7",
  J: "d4 b3 a3@2 [g4,b4]@8 [g4,b4]@4", K: "[g4@2 [gb4,a4]@4 d4@4 [c4,e4] g4 c5@2 g4@4 [d4,g4]@2 [d4,g4]@2 [d4,g4]@2]/3",
  L: "[d4,g4]@2 [d4,gb4,a4]@4 ~ [c4,e4]", // G5 D C
  M: "[[b3,d4] [a3,c4] [g3,b3]@2 [d4,g4,b4]@2 b4@2 a4@2 [b3,e4]@2 [c4,e4]@3 g3, ~@3 d4@2 ~@3]/2", // Bm Am G E5 C
  N: "[[c4,e4,a4]@2 [b3,d4,g4]@2 ~ [d4,g4,b4]@2 [c4,e4,a4]@5 [d4,g4,b4]@2 [c4,e4,a4]@5 [d4,g4,b4]@2 [c4,e4,a4]@22 [c4,e4,g4]@10 [g3,b3,d4]@19 ~@8]/5", // Am G Am G Am G Am C …
})).s("gm_epiano2").gain(0.48)

// other · lead 1 square · "Staff-4"
const lead_1_square = note("<~ A B@2 C A D E@3 ~@20 F G@2 H@3 ~@27>".pickRestart({
  A: "b4 a4!2 g4@2 b4@2 a4", B: "[g4 d4 e4@2 g4@2 ~ b4@2 a4!2 g4 d4@2 g4@2]/2", C: "b4@4 b4@3 a4 g4@4 ~@4",
  D: "g4 d4 e4@2 g4@2 ~@2", E: "[d4 g4 c5 b4 g4 e4 d4 a4@3 a4 g4@7 ~@6]/3", F: "~@2 e5@3 d5 d5@2",
  G: "[b4@2 d5@2 e5@6 d5@2 b4 a4 g4@6 ~@6 e5@2 e5@2 d5@2]/2", H: "[d5@2 b4@2 b4@14 c5 b4 a4@16 ~@12]/3",
})).s("gm_lead_1_square").gain(0.56)

// chords · string ensemble 2 · "Staff-5"
const string_ensemble_2 = note("<A@8 B@8 C@7 D@8 E@5 ~@6 C@7 F@4 G@6 H@3 ~>".pickRestart({
  A: "[~@3 [d4,g4,b4]@2 [a4,c5]@2 b4@2 c5@2 [g4,b4,d5]@2 [a4,c5,e5]@2 [b4,d5]@2 [c5,e5]@2 [g4,b4]@2 [a4,c5]@2 b4@2 c5@2 [g4,b4,d5,g5]@2 [a4,c5,e5,a5]@2 [g4,b4], ~@7 g4@4 ~@4 g4@4 ~@4 g4@4 ~@5]/8", // G Am G Am Bm C G Am …
  B: "[~@2 [g4,c5,e5]@8 [g3,b3]@4 [b3,d4]@4 [b3,e4]@3 [c4,e4]@5 [g3,b3,g4]@4 [d4,g4]@4 d5@4 [d5,gb5]@4 [g3,b3,g5]@4 [b3,d4]@4 [b3,e4]@3 [c4,e4]@5 [g3,b3]@4 [d4,g4]@2, ~@17 [d4,gb4]@4 ~@11]/8", // C G Bm E5 C G G5 D …
  C: "[~@4 d5 [d4,g4,b4]@2 [a4,c5]@2 b4@2 c5@2 [g4,b4,d5]@2 [a4,c5,e5]@2 [b4,d5]@2 [c5,e5]@2 [g4,b4]@2 [a4,c5]@2 b4@2 c5, ~ [d4,gb4]@4 ~@23, ~@2 a4@3 ~@4 g4@4 ~@4 g4@4 ~@4 g4@3, ~@3 b4@2 ~@23]/7", // G Am G Am Bm C G Am …
  D: "[~ [g4,b4,d5,g5]@2 [a4,c5,e5,a5]@2 [g4,b4]@2 [g4,c5,e5]@4 [e4,g4,c5]@4 [d4,g4,b4]@2 [e4,a4,c5]@2 [g4,b4,d5]@2 [c5,e5,g5]@4 [a4,d5,gb5]@4 [g4,b4]@3]/8", // G Am G C G Am G C …
  E: "[~ [gb4,a4]@4 [c4,e4]@4 [d4,g4]@4 [d4,gb4,a4]@4 ~@3]/5", // Gbm C G5 D
  F: "[~ [g4,b4,d5,g5]@2 [a4,c5,e5,a5]@2 [g4,b4]@2 [g4,c5,e5]@4 [e4,g4,c5]@4 [d4,g4,b4]]/4", // G Am G C G
  G: "[~@4 [e4,a4,c5]@8 [g4,b4,d5]@9 [c5,e5,g5]@19 [a4,d5,gb5]@19 [g4,b4]@19 ~ [gb4,a4]@17]/6", // Am G C D G Gbm
  H: "[~@2 [c4,e4]@19 [d4,g4]@19 ~@8]/3", // C G5
})).s("gm_string_ensemble_2").gain(0.32)

// drums · kick
const kick = s("bd").struct(`<
  A B C B C B C@2 D C E C E C E C F C E C E C E C G H B C I E@6 C E C E C E C E C E C E C E C E B C B J K L M ~@5
>`.pickRestart({
  A: "~@3 x", B: "~ x!2 ~@2 x ~ x", C: "~ x!2 ~@2 x!2 ~", D: "~@2 x ~@2 x!3", E: "~ x ~ x ~ x!2 ~", F: "~ x ~ x ~ x!3",
  G: "~ x!2 ~@3 x ~", H: "~ x!3 ~ x!2 ~", I: "~@3 x ~ x!2 ~", J: "~@2 x ~@2 x ~@3 x ~@2 x ~@3",
  K: "~@3 x ~ x ~@2 x ~@6 x", L: "~ x ~@7 x ~@6", M: "~@5 x ~@10",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct("<~ A@7 B C D@6 E D@8 F A@2 G D H D H D H@2 D@15 A@3 I J ~@7>".pickRestart({
  A: "x", B: "x ~@3 x ~ x!2", C: "~ x ~@2 x ~@3", D: "~ x", E: "~@8 x ~@3 x!3 ~", F: "x ~ x!2 ~ x ~@2", G: "x!2",
  H: "x!3 ~@5 x ~@7", I: "x ~@6 x ~@8", J: "~@13 x ~@2",
})).gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<~@2 A ~ B ~@40 C ~ D ~ C ~@2 A ~@2 E ~@7>".pickRestart({
  A: "~@4 x!2 ~@2", B: "~@5 x ~@2", C: "x!2 ~@6", D: "~ x ~@6", E: "~@3 x ~@12",
})).gain(0.48)

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

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

// drums · open hat
const open_hat = s("oh").struct("<A@7 B C D E@7 F E@6 G H A B C E C E C E C@2 E@14 I A@3 J K D ~@6>".pickRestart({
  A: "~@4 x ~@2 x", B: "~@2 x!2", C: "~ x ~ x ~@4", D: "~@3 x ~@4", E: "x ~@2 x ~@4", F: "x!2 ~ x ~@4",
  G: "x ~ x ~@2 x ~ x", H: "~@7 x", I: "x ~@2 x ~@3 x", J: "~@5 x ~@10", K: "x ~@4 x ~@2",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@2 A ~ B ~@29 C D ~@8 E ~ F ~ E ~ F ~ A ~ G H I ~@6>".pickRestart({
  A: "~ x ~@2", B: "x!2 ~@6", C: "~@5 x ~@2", D: "~ x ~@14", E: "~@3 x", F: "~@4 x!2 ~@2", G: "x ~ x ~@4 x ~ x ~@6",
  H: "~@5 x ~@10", I: "~@7 x",
})).gain(0.48)

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

stack(bass, epiano2, lead_1_square, string_ensemble_2, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash)

More by Johnny Rivers