Strudelify

Save the Last Dance for Me

The Platters

KeyE majorTempo142 bpm
0:00/0:00
// Save the Last Dance for Me — The Platters
// 142 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28.
setcpm(142/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 · acoustic bass
const bass = note(`<
  ~ A@7 B@5 A@2 C@2 A@2 B@2 A@5 B@5 A@2 C@2 A@2 B@2 A@2 D@2 E@2 D@2 E@2 A@3 B@5 A@2 C@2 A@2 B@2 A@2 D@2 E@2 D@2 E@2 C@2
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A F
>`.pickRestart({
  A: "e2@2 ~ e3@2 ~ b2@2", B: "b1@2 ~ b2@2 ~ f#2@2", C: "a2@5 ~ e3@4 ~@2 c#3@4", D: "b1@2 ~ d#2@2 ~ f#2@2",
  E: "e2@2 ~ g#2@2 ~ b2@2", F: "e2@4 ~@2 e3@4 ~@2 e2 ~@3",
})).s("gm_acoustic_bass").gain(0.24)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@15 A@2 B@2 C@2 ~@2 D@3 E@5 D@2 A@2 B@2 C@2 ~@2 F@2 G@2 F@2 G@2 D@3 E@5 D@2 A@2 B@2 C@2 ~ H I@2 J@2 K@2 L@2 A@2 B@2
  C@2 ~@2 M N@2 O M N@2 O M N@2 O M N@2 P
>`.pickRestart({
  A: "[c#4,e5,a5]/2", B: "[b3,e5,g#5]/2", C: "[b3,d#4,f#5,a5]/2", D: "~@4 [e2,g#3,b3] ~ [e2,g#3,b3] ~ [e2,g#3,b3] ~@7",
  E: "~@4 [d#2,f#3,b3] ~ [d#2,f#3,b3] ~ [d#2,f#3,b3] ~@7", F: "[f#4,a4,d#5]/2", G: "[[g#4,b4,e5]@7 ~]/2",
  H: "~@4 b4 ~ b4@2 e5 ~ e5@2 c#5 ~ c#5 ~",
  I: "[f#5 ~ b5 c#6 b5 ~@5 c#4@2 d#4@2 f#4@2 ~@2 d#6 e6 f#6 ~ e6 ~ [d#6,e6] d#6 c#6 ~ [b5,c#6] b5 a5 ~, a3, d#4@12 ~@4 a4@13 ~@3, ~@3 f#6@6 ~@7]/2", // Emaj7 Bsus2
  J: "[b5 ~ c#6 b5 [b4,g#5]@5 ~ b3@2 g#5 ~ g#5 ~@3 [b3,g#4]@2 [e4,b4]@2 e5@2 g#5@2 b5 ~ e6 ~ g#6 ~, g#3, e4@3 e4 ~@4, g#4 ~@7]/2", // E E5
  K: "[[d#4,d#6,a6]@6 [c#4,a5,f#6]@3 ~ [d#4,f#5]@2 [f#4,d#5,b5]@4 [a5,f#6]@2 f#5@2 [d#5,b5]@2 [c#5,a5]@2 ~@2 [a4,f#5]@2 d#5@4, a3, ~@10 d#6 ~@7 d#6 ~@9 f#4@2 ~@2]/2", // D#dim F#m D#m B D G#m F#m D
  L: "[[e4,g#4]@10 [e4,b4] ~ [f#4,g4,c#5,d5] [f#4,c#5] [e4,b4] ~ [g#4,e5]@8 ~@2 [d4,b4]@2 [g#4,e5]@2 [d4,g#5]@2, g#3@29 ~@3, e5 ~@3]/2", // E E5 Dmaj7 F#5 E5 C#m G C#m …
  M: "[b2,d#3,a3]@5 ~ [b2,d#3,a3] ~", // B7
  N: "[~@2 g#4@2 a4@2 [b2,d#3,a3]@5 ~ [b2,d#3,a3]@4 [e2,e3,g#3]@3 ~ g#4@2 e4@9 ~, [b2,d#3,a3]@5 ~ b4@14 ~@12]/2", // B7 E B7
  O: "~ c#5 d#5 e5@4 ~", P: "~@2 c#5@2 d#5@2 e5@7 ~@3",
})).s("gm_string_ensemble_1").gain(0.31).pan(0.2)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A@7 B@5 A@2 C@2 A@2 B@2 A@5 B@5 A@2 C@2 A@2 B@2 A@2 B@2 A@2 B@2 A@5 B@5 A@2 C@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 A@2
  B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A D
>`.pickRestart({
  A: "[g#3,b3,e4]@2 [g#3,b3,e4]!2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2", // E
  B: "[f#3,a3,d#4]@2 [f#3,a3,d#4]!2 [f#3,a3,d#4]@2 [f#3,a3,d#4]@2 [f#3,a3,d#4]@2 [f#3,a3,d#4]@2 [f#3,a3,d#4]@2 [f#3,a3,d#4]@2", // D#dim
  C: "[a3,c#4,e4]@2 [a3,c#4,e4]!2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2", // A
  D: "[g#3,b3,e4]@2 [g#3,b3,e4]!2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4]@2 [g#3,b3,e4] ~@3", // E
})).s("gm_acoustic_guitar_steel").gain(0.15).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x ~@2 x ~]!98>").gain(0.35)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!98>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@98>").gain(0.25)

// drums · cowbell
const cowbell = s("cb").struct("<~ [x!8]!97 [x!7 ~]>").gain(0.15)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@4 A ~@17 A ~@17 A ~@7 A ~@17 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A
>`.pickRestart({
  A: "~@3 x!2 ~@11",
})).gain(1.27)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@4 A ~@17 A ~@17 A ~@7 A ~@17 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 B
>`.pickRestart({
  A: "~@5 x!3", B: "~@5 x!2 ~",
})).gain(1.27)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [~@2 x!2 ~@4]!98>").gain(1.01)

// drums · shaker
const shaker = s("sh").struct("<~ [~@6 x!2]!97 [~@3 x]>").gain(0.3)

// drums · triangle
const triangle = s("triangles:30").struct("<~ [~ x!3 ~ x!3]!97 [~ x!3 ~@4]>").gain(1.73)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~ [x!2]!98>").gain(1.73)

stack(
  bass, string_ensemble_1, acoustic_guitar_steel, kick, rim, hihat, cowbell, congas, congas_2, cabasa, shaker, triangle,
  triangle_2
)

More by The Platters