Strudelify

Puppet on a String

Elvis Presley

KeyG majorTempo107 bpm
0:00/0:00
// Puppet on a String — Elvis Presley
// 107 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 11 "Strings" named as a string part, played on string ensemble 1 (its epiano1 patch is not one)
// note: duplicate parts dropped: ch 5 "Melody 1" alto sax (copy of ch 6 "Melody 2" synth strings 1)
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(107/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"
const bass = note(`<
  A B@3 C D E F G C H I J K C L M F G J D I A@2 K C K B K N H M J D I F G B H E B K C H M F O B H M B@2 K A K C K N H I
  C D M F O J L I B C
>`.pickRestart({
  A: "g2@5 ~ g2 ~ g2@6 d2 ~", B: "g2@5 ~ g2 ~ g2@5 ~ g2 ~", C: "g2@5 ~ g2 ~ g2@7 ~", D: "a1@5 ~ a1 ~ a1@7 ~",
  E: "d2@5 ~ d2 ~ d2@6 d2 ~", F: "g2@5 ~ g2 ~ g2@4 g2@4", G: "c2@5 ~ c2 ~ c2@5 ~ c2 ~", H: "a1@5 ~ a1 ~ a1@5 ~ a1 ~",
  I: "d2@5 ~ d2 ~ d2@5 ~ d2 ~", J: "g2@5 ~ g2 ~ g2@6 g2 ~", K: "c2@5 ~ c2 ~ d2@5 ~ d2 ~", L: "a1@5 ~ a1 ~ a1@6 a1 ~",
  M: "d2@5 ~ d2 ~ d2@7 ~", N: "g2@5 ~ g2 ~ e2@5 ~ e2 ~", O: "c2@5 ~ c2 ~ c2@7 ~",
})).s("gm_fretless_bass").gain(0.27)

// chords · piano
const piano = note(`<
  A@2 B@2 C D E F G H D I J K L M N O P L Q E C R K S T J U V W N H M X F G C M X H U L Y E F Z L M N L AA U S K L T AB
  W X H Q X F Z H Y X C J
>`.pickRestart({
  A: "[[g3,b3,d4]@15 ~]/2", B: "[[g3,b3,d4] ~ [g3,b3,d4]@7 ~@4 d4@3, ~@9 g2@7, ~@5 b3@3, ~@11 g4@5]/2",
  C: "[g3,b3,d4]@9 ~ [g3,b3,d4] ~@5", D: "[a3,c4,e4]@15 ~", E: "~@6 [c4,f#4]@9 ~, ~ d3@7, ~ a3@3",
  F: "~ [g3,b3,d4]@3 [g3,b3,d4]@2 [b3,d4,f4,g4]@2", G: "[g3,c4,e4]@9 ~ [g3,c4,e4] ~@5",
  H: "~@2 g3 b3@4 ~, [g4,b4]@7 ~, d4@5 ~@11, ~ g2@6 ~", I: "[a3,c4,d4,f#4]@9 ~ [a3,c4,d4,f#4] ~@5",
  J: "~@6 [d4,g4]@9 ~, ~ g2@7, ~ b3@3", K: "[g3,c4,e4]@4 ~ [c4,d4,f#4,a4]@3", L: "a3 b3 a3 g3@5, [g2,d4]",
  M: "[a3,c4,e4]@9 ~ [a3,c4,e4] ~@5", N: "~@2 f#3 a3@4 ~, [f#4,a4]@7 ~, c4@5 ~@11, ~ d3@6 ~",
  O: "[g3,b3,d4]@2 [g3,b3,d4] [b3,d4,f4,g4]", P: "~@6 [c4,e4]@9 ~, ~ c3@7, ~ g3@3",
  Q: "~@2 c3 e3@4 ~, [c4,e4]@7 ~, a3@5 ~@11, ~ a2@6 ~", R: "[b3,d4,f4,g4]@15 ~", S: "[g3,b3,d4]@15 ~",
  T: "[g3,c4,e4] [c4,d4,f#4,a4]", U: "~ [g3,c4,e4]@3 [c4,d4,f#4,a4]@4", V: "~ [g3,b3,d4]@3 ~ [g3,b3,e4]@3",
  W: "~@2 c#3 e3@4 ~, [c#4,e4]@7 ~, g3@5 ~@11, ~ a2@6 ~", X: "[c4,d4,f#4,a4]@15 ~",
  Y: "~@6 [a3,c4]@9 ~, ~ a2@7, ~ e3@3", Z: "[g3,c4,e4]@15 ~", AA: "~@2 f3 g3@4 ~, [f4,g4]@7 ~, b3@5 ~@11, ~ g2@6 ~",
  AB: "[g3,b3,d4] [g3,b3,e4]", // G Em
})).s("gm_piano").gain(0.14).pan(0.3)

// chords · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note(`<
  A B C D E F G H I J K L E M N O P Q R J K S T U V W X Y Z AA AB AC AD F P Q AE Y AF AC T AG T O AH Q AI Y AJ AK AD AL
  V Y AM Y AN AO AP AC AD O P Q AE Y AQ AK N W
>`.pickRestart({
  A: "[d4,g4] ~ [d4,g4] ~ g2 [d4,g4] ~ [d4,g4]", B: "~@2 [d4,g4]@2 ~@2 b3@2 [d4,g4]@5 ~@3",
  C: "[d4,g4]@2 ~@2 [d4,g4] ~@3 g2 ~ [d4,g4] ~@3 [d4,g4] ~", D: "~@2 [d4,g4] ~@3 g2@2 [d4,g4]@4 ~@4",
  E: "~@2 g2@2 ~@2 [d4,g4]@7 ~@3, ~ b3 ~@2", F: "~@2 [a3,c4]@2 ~@4 [a3,c4]@7 ~",
  G: "~@2 d3@2 ~@2 [c4,f#4]@7 ~@3, ~ a3 ~@2", H: "[d4,g4]@2 ~@2 [d4,g4]@3 ~ [d4,g4]@2 ~@2 [b3,f4]@2 ~@2",
  I: "[c4,e4,g4] ~@3 [c4,e4,g4]@2 ~@10", J: "~@2 [d4,g4] ~@3 g2@2 [d4,g4]@8", K: "a2@4 [a3,c4]@3 ~@3 [a3,c4]@2 ~@4",
  L: "~ d3 a3 [c4,f#4]@4 ~", M: "~ [c4,e4]@3 ~@2 [c4,f#4] ~", N: "[d4,g4,b4] ~@3 [d4,g4,b4]@2 ~@10",
  O: "~@2 [a3,c4] ~@3 a2@2 [a3,c4]@5 ~@3", P: "[c4,f#4] ~ [c4,f#4] ~@5", Q: "~@2 [d4,g4] ~ [d4,g4] ~ [b3,f4] ~",
  R: "c3@4 [c4,e4]@3 ~@3 [c4,e4]@2 ~@4", S: "~@2 [c4,f#4] ~@3 d3 ~ [c4,f#4]@7 ~",
  T: "[d4,g4]@2 ~@2 [d4,g4]@3 ~@3 g2@2 b3 ~@3", U: "~@2 [b3,f4] ~@3 g2@2 [b3,f4]@8",
  V: "~@4 [c4,e4]@2 ~@2 [c4,f#4]@2 ~@2 [c4,f#4]@3 ~", W: "~@2 [d4,g4]@2 ~@4 [d4,g4]@7 ~",
  X: "~@2 [c4,e4]@6 [c4,f#4]@7 ~", Y: "~@2 [d4,g4] ~@3 g2@2 [d4,g4]@5 ~@3", Z: "[c4,e4]@7 ~ [c4,f#4]@7 ~",
  AA: "~@4 [d4,g4]@2 ~@2 [b3,e4]@2 ~@2 [b3,e4]@3 ~", AB: "[g3,c#4]@2 ~@2 [g3,c#4]@3 ~@3 a2@2 e3 ~@3",
  AC: "~@2 [c4,f#4] ~@3 d3@2 [c4,f#4]@5 ~@3", AD: "[d4,g4] ~ [d4,g4] ~@5", AE: "[c4,e4] ~ [c4,e4] ~@5",
  AF: "[a3,c4,e4] ~@3 [a3,c4,e4]@2 ~@10", AG: "[c4,e4]@7 ~ [c4,f#4]@2 ~@2 [c4,f#4]@3 ~",
  AH: "[c4,f#4,a4] ~@3 [c4,f#4,a4]@2 ~@10", AI: "~@2 c3@2 ~@2 [c4,e4]@7 ~@3, ~ g3 ~@2",
  AJ: "[a3,c4]@2 ~@2 [a3,c4]@3 ~@3 a2@2 e3 ~@3", AK: "~@2 [c4,f#4]@2 ~@4 [c4,f#4]@7 ~",
  AL: "~@2 [b3,f4]@2 ~@4 [b3,f4]@7 ~", AM: "~@2 [c4,e4]@6 [c4,f#4]@2 ~@2 [c4,f#4]@3 ~",
  AN: "~@4 [c4,e4]@2 ~@2 [c4,f#4]@7 ~", AO: "[d4,g4]@2 ~@2 [d4,g4]@3 ~@3 [b3,e4]@6",
  AP: "[g3,c#4] ~@3 [g3,c#4]@2 ~@2 a2@2 [g3,c#4]@2 ~@4", AQ: "~@2 a2@2 ~@2 [a3,c4]@7 ~@3, ~ e3 ~@2",
})).s("gm_acoustic_guitar_nylon").gain(0.18).pan(0.6)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  A B A B A C D E F A C D A G A C D E F A C D H I J K J K J L C B A C D E F A C D A G A C D E F A C D H I J K J K J L C
  B A C D E F A C D M N
>`.pickRestart({
  A: "g2 ~ g2 ~", B: "d3 d2 e2 f#2", C: "a2 ~ a2 ~", D: "d3 ~ d2 ~", E: "g2 ~ a2 b2", F: "c3 ~ c2 ~", G: "c2 ~ d2 ~",
  H: "g2 ~ d3 ~", I: "g3 f3 e3 d3", J: "c3 ~ d3 ~", K: "g2 ~ g2 b2", L: "g3 f#3 e3 b2", M: "g2 ~ d2 ~",
  N: "g2 ~ [g1,g2] ~", // G
})).s("gm_electric_bass_finger").gain(0.31).pan(0.7)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  A B A B A C D E F A C D A G A C D E F A C D H I J K J K J L C B A C D E F A C D A G A C D E F A C D H I J K J K J L C
  B A C D E F A C D M N
>`.pickRestart({
  A: "g3 ~ g3 ~", B: "d4 d3 e3 f#3", C: "a3 ~ a3 ~", D: "d4 ~ d3 ~", E: "g3 ~ a3 b3", F: "c4 ~ c3 ~", G: "c3 ~ d3 ~",
  H: "g3 ~ d4 ~", I: "g4 f4 e4 d4", J: "c4 ~ d4 ~", K: "g3 ~ g3 b3", L: "g4 f#4 e4 b3", M: "g3 ~ d3 ~",
  N: "g3 ~ [g2,g3] ~", // G
})).s("gm_string_ensemble_1").gain(0.27)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@2 x]!31 [x ~@2 x!2 ~@3] [x ~@2 x!2 ~@2 x]!37 [x ~@2 x!2 ~@3]>").gain(0.19)

// drums · rim
const rim = s("rim").struct("<[~ x ~ x]!31 [~ x ~@2] [~ x ~ x]!27 ~ [~ x ~ x]!9 [~ x ~@2]>").gain(0.25)

// drums · snare
const snare = s("sd").struct("<~@31 [~@5 x!2 ~] ~@27 [~@3 x] ~@9 [~@10 x!3 ~@3]>").gain(0.22)

// drums · clap
const clap = s("cp").struct("<~@31 [~@3 x] ~@27 [~ x ~ x] ~@9 [~@3 x]>").gain(0.16)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A ~ B ~ C ~ D@2 A D C D B D E F D@2 A D A ~ A D A D A ~ A D A G A ~ A D A D A H A ~ D ~ A ~ A D I ~ A D A ~ H D A D A
  F A ~ A ~ A D A ~ A G
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@5 x ~ x", C: "~@3 x ~ x ~ x", D: "~ x ~ x ~ x ~@2", E: "~@3 x ~ x ~@2", F: "~ x ~@6",
  G: "~ x ~ x ~@4", H: "~ x ~@3 x ~@2", I: "~ x ~@3 x ~ x",
})).gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@59 [~@3 x ~ x ~@2] ~@10>").gain(0.19)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@2 A ~ A ~@5 A ~ A ~ A B ~@54>".pickRestart({
  A: "~ x ~@6", B: "~@5 x ~@2",
})).gain(0.13)

// drums · high tom
const high_tom = s("ht").struct("<~@59 [~ x ~@2] ~@10>").gain(0.22)

// drums · crash
const crash = s("cr").struct("<~@59 [~@7 x] ~@10>").gain(0.16)

// drums · ride
const ride = s("rd").struct("<x ~@31 x ~@27 x ~@9>").gain(0.19)

// drums · tambourine
const tambourine = s("tb").struct("<~@31 [x!4] ~@27 [x!4] ~@9 [x!4]>").gain(0.19)

// drums · cabasa
const cabasa = s("cabasa:4").struct("~ x!2 ~@2 x!2 ~").gain(0.97)

// drums · shaker
const shaker = s("sh").struct("x!4").gain(0.13)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<[~ x ~ x ~ x ~ x]!69 [~ x ~ x ~ x ~@2]>").gain(0.03)

stack(
  bass, piano, acoustic_guitar_nylon, bass_2, string_ensemble_1, kick, rim, snare, clap, hihat, hihat_soft, mid_tom,
  open_hat, open_hat_soft, high_tom, crash, ride, tambourine, cabasa, shaker, shaker_soft
)

More by Elvis Presley