Strudelify

You Make Me Feel Like Dancin'

Leo Sayer

KeyG majorTempo106 bpm
0:00/0:00
// You Make Me Feel Like Dancin' — Leo Sayer
// 106 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 67 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(106/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 finger · "Base"
const bass = note(`<
  A B C D E B C B C B C D F G H I H I H I J K L M N B C B C B C D F G H I H I H I J K L M N B C B O G H I H I H I H I H
  P Q P Q P Q R ~
>`.pickRestart({
  A: "~@2 f1@2 f1@5 ~ d1@2 d1@4", B: "~@2 g1@2 g1@3 ~ d1@2 c1@3 ~ d2@2", C: "c2@2 f1@2 f1@5 ~ d1@2 d1@4",
  D: "~@2 g1@2 g1@3 ~ d1@2 c1@3 ~ c1@2", E: "d1@2 f1@2 f1@5 ~ d1@2 d1@4", F: "d1@2 d#1@3 ~ d#1@3 ~ d#1@3 ~ d#1@2",
  G: "~@2 f1@3 ~ f1@3 ~ f1@3 ~ f1@2", H: "~ g1 g2 f#1 f#2 e1 e2 d1", I: "d2@2 a1@3 ~ a1@3 ~ d1@3 ~ d1@2",
  J: "~@2 g1@3 g1@3 f#1@2 g1@3 g1@3", K: "f#1@2 g1@3 ~ g1@3 ~ g1@3 ~ g1@2", L: "~@2 c1@3 c1@3 b0@2 c1@3 c1@3",
  M: "b0@2 c1@3 ~ c1@3 ~ c1@3 ~ d1@2", N: "e1@2 f1@2 f1@5 ~ d1@2 d1@4", O: "c2@2 d#1@3 ~ d#1@3 ~ d#1@3 ~ d#1@2",
  P: "d2 a1 a2 a1 a2 d1 d2 d1", Q: "d2 g1 g2 f#1 f#2 e1 e2 d1", R: "d2 ~@7",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · acoustic guitar nylon · "Acoustic Guitar"
const acoustic_guitar_nylon = note(`<
  A B C B D E C E C E C E F G H I J K J I L M N O P E C E C E C E F G H I J I J I L M N O Q R S R T ~ J I J I J I J I J
  I J I J I J ~@2
>`.pickRestart({
  A: "~@4 [c4,f4,a4]@2 [c4,f4,a4] [c4,f4,a4]@3 ~@2 [c4,f4,a4] ~ [c4,f4,a4]@2", // F
  B: "~@4 [a#3,f4,a4]@2 [a#3,f4,a4] [a#3,f4,g4]@3 ~@2 [a#3,f4,g4]@2 [a#3,f4,a4] ~", // A#maj7 Gm7 A#maj7
  C: "[a#3,f4,g4]@2 ~@2 [c4,f4,a4]@2 [c4,f4,a4] [c4,f4,a4]@3 ~@2 [c4,f4,a4] ~ [c4,f4,a4]@2", // Gm7 F
  D: "[f4,g4,a#4]@2 ~@2 [c4,f4,a4]@2 [c4,f4,a4] [c4,f4,a4]@3 ~@2 [c4,f4,a4] ~ [c4,f4,a4]@2", // Gm7 F
  E: "~@4 [a#3,f4,a4]@2 [a#3,f4,a4] [a#3,f4,g4]@3 ~@2 [a#3,f4,g4]@2 [a#3,f4,a4]@2", // A#maj7 Gm7 A#maj7
  F: "[a#3,f4,g4]@2 [g3,a#3,d#4] [g3,a#3,d#4]@2 [g3,a#3,d#4]!3 [g3,a#3,d#4]@2 [g3,a#3,d#4]!2 [g3,a#3,d#4]@2 [g3,a#3,d#4]@2", // Gm7 D#
  G: "[g3,a#3,d#4]!2 [a3,c4,f4]!2 [a3,c4,f4]@2 [a3,c4,f4] [a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4]!3", // D# F
  H: "[a3,c4,f4]@2 ~@2 [d4,g4,b4]!3 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]@3", // F G
  I: "~@4 [c4,e4,g4,b4]!3 [c4,e4,g4,b4]@2 [c4,e4,g4]@2 [c4,e4,g4]@2 [c4,e4,g4] [c4,e4,g4]@2", // Cmaj7 C
  J: "~@4 [d4,g4,b4]!3 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]@3", // G
  K: "~@4 [e4,g4,b4] [c4,e4,g4,b4] [e4,g4,b4] [c4,e4,g4,b4]@2 [c4,e4,g4]@2 [c4,e4,g4]@2 [c4,e4,g4] [c4,e4,g4]@2", // Em Cmaj7 Em Cmaj7 C
  L: "~@2 [f4,g4,a#4,d5]!14", M: "[f4,g4,a#4,d5]!16", N: "[f4,g4,a#4,d5]!2 [f4,a#4,d5]!14", O: "[f4,a#4,d5]!16",
  P: "[f4,a#4,d5]!2 ~@2 [c4,f4,a4]@2 [c4,f4,a4] [c4,f4,a4]@3 ~@2 [c4,f4,a4] ~ [c4,f4,a4]@2", // A# F
  Q: "[f4,a#4,d5]!2 ~@2 [f4,a4,c5]!4 ~ [f4,a4,c5]@2 [f4,a4,c5] ~ [f4,a4,c5]@3", // A# F
  R: "~@4 [f4,a4,c5]!3 [f4,a4,c5]@2 [f4,a4,c5]@2 [f4,a4,c5]@2 [d4,g4,a#4] [c4,f4,a4] ~", // F Gm F
  S: "[d4,g4,a#4]@2 ~@2 [f4,a4,c5]!4 ~ [f4,a4,c5]@2 [f4,a4,c5] ~ [f4,a4,c5]@3", T: "[d4,g4,a#4] ~@7",
})).s("gm_acoustic_guitar_nylon").gain(0.24)

// chords · piano
const piano = note(`<
  ~@4 A B C D E B C F G H I J I J I J ~@4 A B C D E B C F G H I J I J I J K L M N ~@4 G H I J I J I J I J I J I J I J I
  J ~
>`.pickRestart({
  A: "~@4 [a4,c5]@5 ~ [f4,a4]@5 ~", B: "[a#3,d4]@9 ~@3 [a#3,d4] ~ a#3@2", C: "[a#3,d4]@2 ~@2 [a4,c5]@5 ~ [f4,a4]@5 ~",
  D: "[f4,a#4]@13 ~ f4 g4", E: "[f4,a4,a#4]@2 ~@2 [a4,c5]@5 ~ [f4,a4]@5 ~", F: "[f4,a#4]@3 [a#3,d4,f4]",
  G: "~@2 [g3,a#3,d#4]@7 ~ [a#3,d#4,g4]@3 ~ [d#4,g4,a#4]@2", H: "~@2 [a3,c4,f4]@7 ~ [c4,f4,a4]@3 ~ [f4,a4,c5]@2",
  I: "~@2 [d4,g4,b4]@13 ~", J: "[c4,e4,g4]", K: "~@2 [d4,f4,a#4] a4@2 [a#3,f4,g4]@3 ~@2 [d4,f4,a#4] a4@2 [a#3,f4,g4]@3",
  L: "~@2 f4@2 g4 g4@2 f4 g4@2 ~@2 g4@2 g4 ~", M: "g4@2 a#4 a4@2 g4@3 ~@2 a#4 a4@2 g4@3", N: "c5@7 d5 c5@2 d5 c5@5",
})).s("gm_piano").gain(0.32)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@12 A@8 B@5 ~@7 A@8 C@6 D@2 E@8 F@8 G@3>".pickRestart({
  A: "[~ [d#4,g4,a#4]@8 [f4,a4,c5]@8 d5@8 [c4,e4]@8 d5@8 [c4,e4]@8 d5@8 [c4,e4]@7, ~@17 g4@16 g4@16 g4@15, ~@17 b4@12 ~@4 b4@12 ~@4 b4@12 ~@3]/8", // D# F C
  B: "[~ [f4,g4,a#4,d5]@16 [f4,a#4,d5,f5]@16 ~@7]/5", // Gm7 A#
  C: "[~@2 [f4,g4,a#4,d5]@32 [f4,a#4,d5,f5]@32 [f4,a4,c5]@27 [d4,g4,a#4] [c4,f4,a4]@2]/6", // Gm7 A# F Gm F
  D: "[[d4,g4,a#4]@2 [f4,a4,c5]@27 [d4,g4,a#4] [c4,f4,a4]@2]/2", // Gm F Gm F
  E: "[[d4,g4,a#4] [d#4,g4,a#4]@8 [f4,a4,c5]@8 d5@8 [c4,e4]@8 d5@8 [c4,e4]@8 d5@8 [c4,e4]@7, ~@17 g4@16 g4@16 g4@15, ~@17 b4@12 ~@4 b4@12 ~@4 b4@12 ~@3]/8", // Gm D# F C
  F: "[~ d5@8 [c4,e4]@8 d5@8 [c4,e4]@8 d5@8 [c4,e4]@8 d5@8 [c4,e4]@7, ~ g4@16 g4@16 g4@16 g4@15, ~ b4@12 ~@4 b4@12 ~@4 b4@12 ~@4 b4@12 ~@3]/8", // C
  G: "[~ g4@16 ~@7, ~ b4@12 ~@11, ~ d5@8 ~@15]/3",
})).s("gm_string_ensemble_1").gain(0.48)

// chords · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<A@8 B@5 ~@11 A@8 ~@35>".pickRestart({
  A: "[~ c4@4 ~@4 [g4,a#4]@4 [a#3,a4]@4 c4@4 ~@4 [g4,a#4]@4 [a#3,a4]@4 c4@4 ~@4 [g4,a#4]@4 [a#3,a4]@4 c4@4 ~@4 [g4,a#4]@4 [a#3,a4]@3, ~ f4@16 f4@16 f4@16 f4@15, ~ a4@8 ~@8 a4@8 ~@8 a4@8 ~@8 a4@8 ~@7, ~@5 d4@8 ~@8 d4@8 ~@8 d4@8 ~@8 d4@8 ~@3]/8", // Gm A#maj7 Gm A#maj7 Gm A#maj7 Gm A#maj7
  B: "[~ c4@4 ~@4 [g4,a#4]@4 [a#3,a4]@4 c4@4 ~@4 [g4,a#4]@4 [a#3,a4]@4 ~@7, ~ f4@16 f4@16 ~@7, ~ a4@8 ~@8 a4@8 ~@15, ~@5 d4@8 ~@8 d4@8 ~@11]/5", // Gm A#maj7 Gm A#maj7
})).s("gm_string_ensemble_1").gain(0.24)

// drums · kick
const kick = s("bd").struct("<[~@2 x ~@6 x!2 ~@5]!65 ~@2>").gain(0.56)

// drums · snare
const snare = s("sd").struct("<A@13 B C A@18 B C A@14 B C A@8 B C D E A@2 ~@2>".pickRestart({
  A: "~@3 x ~@3 x", B: "~@6 x ~@7 x!2", C: "x ~@2 x ~@3 x", D: "~@4 x ~ x ~@5 x!3 ~", E: "x!2 ~@4 x ~@7 x ~",
})).gain(0.56)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A B A B A B C@2 A@6 C@4 A B A B A B A B C@2 A@6 C@4 A@4 C@2 A@15 ~@2
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@2 x ~@3 x ~@3 x ~@3 x!2", C: "~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<~@13 A B ~@8 C B ~@6 A D A B ~@14 A B ~@16>".pickRestart({
  A: "~@15 x", B: "x", C: "~@8 x ~ x ~@3 x!2", D: "x!2 ~@14",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<[x!4]!65 x ~>").gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<~@13 A ~@9 B ~@7 A ~ A ~@15 A ~@17>".pickRestart({
  A: "~@7 x", B: "~@3 x!2 ~@3",
})).gain(0.56)

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

stack(
  bass, acoustic_guitar_nylon, piano, string_ensemble_1, string_ensemble_1_soft, kick, snare, hihat, mid_tom, open_hat,
  high_tom, crash
)

More by Leo Sayer