Strudelify

Save The Last Dance For Me

The Drifters

KeyE♭ majorTempo122 bpm
0:00/0:00
// Save The Last Dance For Me — The Drifters
// 122 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122/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 · fretless bass · "Bass    (BB)"
const bass = note(`<
  ~ A B A C D C E C F G H I F A J C A@5 C E C J C K L M N O P Q R O S R T O S U Q V W X Y Z U AA AB AC R V L N M O@2 AD
  R O@2 AE AF
>`.pickRestart({
  A: "eb2@5 ~ eb2 ~ eb2@5 ~ eb2 ~", B: "eb2@5 ~ eb2 ~ eb2@6 eb2 ~", C: "bb1@5 ~ bb1 ~ bb1@6 bb1 ~",
  D: "bb1@5 ~ bb1 ~ bb1 ~ bb1@3 ~ bb1 ~", E: "bb1@6 bb1 ~ bb1@5 ~ bb1 ~", F: "eb2@5 ~ eb2 ~ eb2 ~ eb2@3 ~ eb2 ~",
  G: "eb2@5 ~ eb2 ~ bb1@4 eb2@4", H: "ab2@6 ab2 ~ ab2@5 ~ ab2 ~", I: "ab2@5 ~ ab2 ~ ab2@6 ab2 ~",
  J: "bb1@5 ~ bb1 ~ bb1@5 ~ bb1 ~", K: "eb2@5 ~ eb2 ~ eb2@6 d2 ~", L: "eb2@5 ~ eb2@2 bb1@4 eb2@4",
  M: "ab2@5 ~ ab2@2 eb2@5 ~ eb2 ~", N: "ab2@5 ~ ab2 ~ eb2@4 ab2@3 ~", O: "eb2@5 ~ eb2 ~ bb1@4 eb2@3 ~",
  P: "eb2@5 ~ eb2@2 bb1@5 ~ bb1 ~", Q: "bb1@5 ~ bb1@2 f2@5 ~ f2@2", R: "bb1@3 f2 bb1@2 bb1 ~",
  S: "eb2@5 ~ eb2@2 bb1@5 ~ bb1@2", T: "bb1@5 ~ bb1 ~ f1@4 bb1@3 ~", U: "bb1@5 ~ bb1@2 f2@5 ~ f2 ~",
  V: "eb2@5 ~ eb2@2 bb2@5 ~ bb2@2", W: "eb2@5 ~ eb2 ~ bb2@5 ~ bb2 ~", X: "eb2@5 ~ eb2 ~ bb2@5 ~ eb2 ~",
  Y: "eb2@5 ~ eb2@2 bb2@5 ~ bb2 ~", Z: "eb2@5 ~ eb2@2 bb1@6 eb2!2", AA: "bb1@5 ~ bb1@2 f2@4 g1 ~ c2 ~",
  AB: "bb1@5 ~ bb1 ~ f2@8", AC: "bb1@5 ~ bb1@2 f2@4 bb1 ~ bb1 ~", AD: "bb1@6 f1@2 bb1 ~ bb1 ~ bb1@2 f1@2",
  AE: "eb2@5 ~ eb2 ~ eb2 ~ eb2@2 ~@2 eb2 ~", AF: "eb2 ~ bb1 ~ c2 ~@3 eb2@2 ~@6",
})).s("gm_fretless_bass").gain(0.31).pan(0)

// chords · epiano1 · "Piano   (BB)"
const epiano1 = note(`<
  ~ A B C D E F E F G H I J K L M N A O P@2 C Q M N R S T U V W G T X@2 Y Z AA D G AB D Q T A O K L AC@2 AD AE Q G H W
  AF Y C Q D T AG AH AI
>`.pickRestart({
  A: "[g3,bb3,eb4]@4 ~ [g3,bb3,eb4]@2 ~", B: "[g3,bb3,eb4]@10 ~@2 [g3,bb3,eb4] ~@3",
  C: "[g3,bb3,eb4]@6 eb3@2 [g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~@3", // Eb
  D: "[d4,f4,ab4,bb4] ~ [d4,f4,ab4,bb4] ~@3 [d4,f4,ab4,bb4]@6 ~@4", E: "[ab3,bb3,d4,f4]@5 bb2 [ab3,bb3,d4,f4] ~",
  F: "[ab3,bb3,d4,f4]@5 bb3 d4 ~", G: "~@2 [g3,bb3,eb4]@2 ~@2 eb3@2 [g3,bb3,eb4]@2 ~@2 [g3,bb3,eb4] ~@3",
  H: "[g3,bb3,eb4]@7 ~ [d4,f4,ab4,bb4]@4 [bb3,db4,eb4,g4]@4", I: "[ab3,c4,eb4]@5 ab2 [ab3,c4,eb4] ~",
  J: "[ab3,c4,eb4]@5 ab3 c4 ~", K: "[g3,bb3,eb4]@10 eb3@2 [g3,bb3,eb4]@3 ~",
  L: "[g3,bb3,eb4]@2 [g3,bb3,eb4] ~@3 [g3,bb3,eb4]@8 ~@2", M: "[d4,f4,ab4,bb4]@11 ~ [d4,f4,ab4,bb4]@3 ~",
  N: "~ [d4,f4,ab4,bb4] ~@2 [d4,f4,ab4,bb4]@3 ~", O: "[g3,bb3,eb4]@5 ~ [g3,bb3,eb4] ~",
  P: "[[g3,bb3,eb4]@25 ~@3 g4@2 bb4@2, ~@13 eb4@3]/2", Q: "[d4,f4,ab4,bb4]@15 ~",
  R: "[d4,f4,ab4,bb4]@4 ~ [d4,f4,ab4,bb4]@2 ~", S: "[d4,f4,ab4,bb4]@5 ~ [d4,f4,ab4,bb4] ~",
  T: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~@3 [g3,bb3,eb4]@6 ~@4", U: "~ [g3,bb3,eb4]@2 ~ [ab3,bb3,d4,f4]@2 [db4,eb4,g4,bb4]@2",
  V: "[ab3,c4,eb4]@6 ab2@2 [ab3,c4,eb4]@3 ~ [ab3,c4,eb4] ~@3", W: "ab3@8 ab3@2 c4@2 eb4@2 ab4 ~, [c4,eb4]@5 ~@3",
  X: "~@2 [d4,f4,ab4,bb4]@2 ~@2 bb2@2 [d4,f4,ab4,bb4]@2 ~@2 [d4,f4,ab4,bb4] ~@3", Y: "[g3,bb3,eb4]@15 ~",
  Z: "eb4@8 eb4@2 g4@2 bb4@2 eb5 ~, [g3,bb3]@5 ~@3", // Gm
  AA: "[d4,f4,ab4,bb4]@6 bb2@2 [d4,f4,ab4,bb4]@3 ~ [d4,f4,ab4,bb4] ~@3", // Bb7
  AB: "eb4@8 eb4@2 g4@2 bb4@2 eb5 ~, [bb3,g4]@5 ~@3", AC: "[[d4,f4,ab4,bb4]@25 ~@3 d4@2 f4@2, ~@13 bb3@3]/2",
  AD: "~@6 f4 ab4, [ab4,bb4]@7 ~, f4@3 ~, d4@5 d4@2 ~, ~@2 bb3 ~", // Absus2
  AE: "[d4,f4,ab4,bb4] ~ [d4,f4,ab4,bb4] ~@3 [d4,f4,ab4,bb4]@8 ~@2", // Bb7
  AF: "[ab3,c4,eb4] ~ [ab3,c4,eb4] ~@3 [ab3,c4,eb4]@6 ~@4", // Ab
  AG: "[bb3,eb4,g4]@6 eb3@2 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~@3", AH: "[g3,bb3,eb4]@14 eb3 ~",
  AI: "[g3,bb3,eb4]@2 eb3 ~ [ab3,c4,eb4] ~@3 [g3,bb3,eb4]@8", // Eb Ab Eb
})).s("gm_epiano1").gain(0.27).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  ~ 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 C B D B D B D B A B D B D B D B A B D B D B D B D B A B D B D B
  D B D A D E
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!2 ~@2 x", C: "x ~@2 x ~@4", D: "x ~@2 x!3 ~ x", E: "~ x!2 ~ x ~@3",
})).gain(0.31).pan(0.6)

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

// drums · clap
const clap = s("cp").struct("<~@24 [~@2 x!2 ~@4] ~@40>").gain(0.36).pan(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@27 A ~@7 B ~@10 C ~@11 C ~@6>".pickRestart({
  A: "~@13 x!2 ~", B: "~@7 x", C: "~@5 x ~@2",
})).gain(0.36).pan(0.6)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 [~@11 x!2 ~@3] ~@7 [~@3 x ~ x!2 ~] ~@29>").gain(0.36).pan(0.6)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A ~@3 A ~@3 A ~ A ~@3 A ~@3 A B ~@2 C ~@2 A C D ~@4 C ~@4 A ~ A ~@3 A ~ A ~@5 A ~@2 A ~@2
>`.pickRestart({
  A: "~@7 x", B: "~ x ~@2", C: "~@15 x", D: "~@2 x ~@4 x",
})).gain(0.27).pan(0.6)

// drums · high tom
const high_tom = s("ht").struct("<~@27 [~ x] ~@7 [~ x] ~@29>").gain(0.4).pan(0.6)

// drums · crash
const crash = s("cr").struct("<~ A ~@22 B ~@3 A ~@7 A ~@7 A ~@9 A ~@8 A C>".pickRestart({
  A: "x", B: "~@3 x", C: "~ x!2 ~",
})).gain(0.31).pan(0.6)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~@38>".pickRestart({
  A: "~@3 x", B: "~@10 x!3 ~@3",
})).gain(0.4).pan(0.6)

stack(bass, epiano1, kick, snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash, tambourine)

More by The Drifters