Strudelify

She Wants to Dance With Me

Rick Astley

KeyF♯ majorTempo118 bpm
0:00/0:00
// She Wants to Dance With Me — Rick Astley
// 118 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// 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(`<
  ~@8 A B C D A B C D E F G F E F G F H I J K A B C D A B C D E F G F E F G F H I J K A B C D A B C D ~@8 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 L
>`.pickRestart({
  A: "f#1@2 ~@2 f#1@2 ~ f#1 d#1@2 f#1@3 ~ f#1 ~", B: "f#2@2 f2 ~ d#2 ~ c#2@3 ~ c#2 ~ d#2 c#2 d#2 c#2",
  C: "b1@2 ~@2 b1@2 ~ b1 f#1 ~ b1@3 f#1 b1 f#1", D: "g#1 ~ a#1 ~ b1 ~ c#2@3 g#1 c#2 ~ c#2 g#1 c#2 g#1",
  E: "g#1 ~@3 g#1 ~@2 d#1 g#1 ~ g#1 ~ g#1 d#1 f#1 d#1", F: "g#1 ~ g#1 ~ g#1 ~ c#2@3 d#1 c#2 ~ c#2 d#1 c#2 d#1",
  G: "g#1 ~@3 g#1@2 ~ d#1 g#1 ~ g#1 ~ g#1 d#1 f#1 d#1", H: "b1@2 ~@2 b1@2 ~ f#1!2 ~ f#1 ~ a#1 g#1 a#1 g#1",
  I: "c#2@2 ~@2 c#2@2 ~ g#1 d#2 ~ d#2 ~ d#2 a#1 d#2 a#1", J: "b1@2 ~@2 b1@2 ~@2 b1 ~ b1 ~ b1 f#1 b1 f#1",
  K: "c#2@2 ~@2 c#2@2 ~ g#1 c#2 ~ c#2 ~ c#2 g#1 c#2 g#1", L: "c#2@3 ~ f#1 ~ f#1@2 ~@8",
})).s("gm_acoustic_bass").gain(0.64)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B C D A B C D A B C D A B C D E F G F E H E H I J K L A M C N A M C N E F G F E H E H I J K L A M C N A M C N A M C
  N A M C N A M C N A M C N A M C N A M C N A M C N A M C N A M C N A M C N O
>`.pickRestart({
  A: "[c#4,f#4,a#4]@15 ~", B: "f#5@2 ~@2 d#5@2 c#5@9 ~, [c#4,f4,g#4]@15 ~", C: "[d#4,f#4,a#4]@15 ~",
  D: "g#4@2 a#4@2 b4@2 c#5@9 ~, [c#3,f#4]@15 ~", E: "[g#3,b3,d#4,f#4,a#4]@3 ~",
  F: "[b3,c#4,d#4,f#4] ~@2 [b3,c#4,d#4,f#4] ~@2 [g#3,a#3,c#4,f4]@9 ~", G: "[g#3,d#4,f#4,a#4]@3 ~",
  H: "[b3,c#4,d#4,f#4] ~@2 [b3,c#4,d#4,f#4] ~@2 [g#3,a#3,c#4,f4]@8 ~@2", I: "[b3,d#4,f#4]@13 ~@3",
  J: "[a#3,c#4,f4] ~@2 [a#3,c#4,f4] ~@6 d#5@2 f#5@2 c#6@2, ~@3 [a#3,d#4,f#4]@3 ~@2", K: "[b3,d#4,f#4]@3 ~",
  L: "[b3,d#4,f#4,d#6] ~@2 [b3,d#4,f#4,d#6] ~@2 [g#3,c#4,f4,c#6]@7 ~@3", // B C#
  M: "[f#5,f#6]@2 f6@2 [d#5,d#6]@2 [c#5,c#6]@9 ~, [c#4,f4,g#4]@15 ~", // F# D# C#
  N: "[g#4,g#5]@2 [a#4,a#5]@2 [b4,b5]@2 [c#5,c#6]@9 ~, [c#3,f#4]@15 ~", // G# A# B C# F#5
  O: "[c#3,b3,d#4,g#4]@3 ~ [f#2,a#3,c#4,f#4] ~ [f#2,a#3,f#4]@2 ~@8, ~@6 c#4 ~@9", // G#m F#
})).s("gm_epiano2").gain(0.52)

// chords · epiano2 · "E.PIANO 2" · soft notes
const epiano2_soft = note(`<
  ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@2 C ~@10 A ~ B ~ A ~ B ~@2 C ~@10 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A
  ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~
>`.pickRestart({
  A: "~ f5 ~@6", B: "[b3,d#4]@15 ~", C: "b3@3 ~",
})).s("gm_epiano2").gain(0.3)

// other · clavinet
const clavinet = note(`<
  A B C D C B C D E B C D A B C D F G H I J I K L M N O P E B C D A B C D F G H I J I K L M N O P E B C D A B C D ~@8 E
  B C D A B C D E B C D A B C D E B C D A B C D E B C D A B C D Q
>`.pickRestart({
  A: "~@3 [a#5,c#6,f#6]@3 ~@2", B: "f#5 f5 d#5 c#5@5", C: "~@3 [a#5,c#6,f#6]@4 ~", D: "g#4 a#4 b4 c#5@5",
  E: "~@6 [a#5,c#6,f#6]@7 ~@3", F: "a#4 ~ d#4 f#4 ~ d#4 f#4 d#4 a#4 d#4 f#4 d#4 ~ d#4 f#4 d#4",
  G: "f#4 ~ f#4 d#4 ~ d#4 a#4 d#4 f#4 d#4 f#4 ~ f#4 d#4 f#4 d#4",
  H: "a#4 ~ f#4 d#4 ~ d#4 f#4 ~ f#4 d#4 f#4 d#4 a#4 d#4 f#4 d#4",
  I: "f#4 ~ f#4 d#4 ~ d#4 a#4 d#4 ~ d#4 f#4 ~ f#4 d#4 f#4 d#4",
  J: "a#4 ~ d#4 f#4 ~ d#4 f#4 d#4 f#4 d#4 f#4 ~ a#4 d#4 f#4 d#4",
  K: "a#4 ~ f#4 d#4 ~ d#4 f#4 d#4 f#4 d#4 a#4 d#4 f#4 d#4 f#4 d#4",
  L: "a#4 ~ f#4 d#4 ~ d#4 f#4 d#4 a#4 d#4 f#4 ~ f#4 d#4 a#4 d#4", M: "[b4,d#5,f#5]@13 ~@3",
  N: "[a#4,c#5,f5] ~@2 [a#4,c#5,f5] ~@6 d#6@2 f#6@2 c#7@2, ~@3 [a#4,d#5,f#5]@3 ~@2", O: "[b4,d#5,f#5]@3 ~",
  P: "[b4,d#5,f#5,d#7] ~@2 [b4,d#5,f#5,d#7] ~@2 [g#4,c#5,f5,c#7]@7 ~@3", // B C#
  Q: "[c#4,b4,d#5,g#5]@3 ~ [f#3,a#4,c#5,f#5] ~ [f#3,a#4,f#5]@2 ~@8, ~@6 c#5 ~@9", // G#m F#
})).s("gm_clavinet").gain(0.48)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@27 A ~@19 A ~@7 B ~@7 C ~@7 B ~@15 B ~@7 D E>".pickRestart({
  A: "~@8 x!2 ~@6", B: "~@8 x!3 ~ x!2 ~@2", C: "~@4 x!2 ~ x!3 ~@2 x!2 ~@2", D: "~@4 x!2 ~ x!3 ~ x!3 ~@2",
  E: "~@4 x!2 ~@10",
})).gain(0.18)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!16 ~@12 [~ x ~ x]!8 ~@12 [~ x ~ x]!48 ~>").gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@8 A@8 ~@12 A@8 ~@12 A@7 B ~@8 A@7 B A@15 B A@8 C>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "x ~ x!2 ~@4",
})).gain(0.6)

// drums · hihat
const hihat = s("hh").struct(`<
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!27
  [x ~ x!3 ~ x!3 ~@5 x!2]
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!19
  [x ~ x!3 ~ x!3 ~@5 x!2]
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!48
  ~
>`).gain(0.18)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@4
>`.pickRestart({
  A: "x",
})).gain(0.6)

stack(bass, epiano2, epiano2_soft, clavinet, kick, snare, snare_soft, clap, low_tom, hihat, crash)

More by Rick Astley