Strudelify

Love Letters in the Sand

Pat Boone

KeyE♭ majorTempo89 bpm
0:00/0:00
// Love Letters in the Sand — Pat Boone
// 89 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 "TRUMPET" trumpet (copy of ch 8 "SOPRAN SAX" soprano sax)
// note: Full arrangement: all 49 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(89/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.

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A@2 B C D E F G A@2 B C D E H I J@2 K@2 C@2 L D A@2 B C D E M N J@2 K@2 C@2 L D A@2 B C D E A O
>`.pickRestart({
  A: "[eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~", // Eb
  B: "[c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~ [c5,eb5,ab5] ~", // Ab
  C: "[c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~", // F
  D: "[d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~", // Bb
  E: "[c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~", // F Bb
  F: "[eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~", // Eb Cm
  G: "[c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~ [d5,f5,bb5] ~", // Fm Bb
  H: "[eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~", // Eb Cdim
  I: "[eb5,g5,ab5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~", // Eb
  J: "[b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~", // G
  K: "[c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~ [c5,eb5,g5] ~", // Cm
  L: "[c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~ [c5,f5,ab5] ~", // Fm
  M: "[eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [c5,eb5,gb5] ~ [eb5,gb5] ~", // Eb Cdim Ebm
  N: "[eb5,g5,bb5] ~@23", O: "eb5@3 ~ bb4@2 d5@4 eb5@2 ~@6 [g4,bb4]@2 ~@4, ~@18 eb5 ~@5",
})).s("gm_piano").gain(0.12).pan(0)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A@2 B C D E F G A H B C D E I J K@2 L M C@2 N O A H B C P E Q R S T U V W@2 X Y A@2 B C D E Z AA
>`.pickRestart({
  A: "eb2@5 g2 bb2@3 g2@2 bb2", B: "ab2@5 c3 eb3@3 c3@2 eb3", C: "f2@5 a2 c3@3 a2@2 c3", D: "bb2@5 d2 f2@3 d2@2 f2",
  E: "f1@3 a1@3 bb1@3 d2@2 f2", F: "eb2@9 ~@2 eb2@2 c2@8 ~ c2@2", G: "~ f1@8 ~ f1@2 ~ bb1@5 d2@4 f2@2",
  H: "eb2@10 g2@2 bb2@5 ~ g2@4 bb2@2", I: "eb2@4 ~@2 eb2@6 ab1@9 ~ ab1@2", J: "eb2@5 ~ eb2@6 bb2@6 eb3@5 ~",
  K: "g2@5 b2 d3@3 b2@2 d3", L: "c3@5 eb2 g2@3 eb2@2 g2", M: "c2@5 eb2 g2@3 eb2@2 g2", N: "f2@5 ab2 c3@3 ab2@2 c3",
  O: "~ bb2@9 d2@2 f2@5 d2@5 f2@2", P: "bb2@9 ~ d2@2 f2@6 d2@4 f2@2", Q: "eb2@5 ~ eb2@6 ab1@5 ~ ab1@6", R: "eb2 ~@7",
  S: "g2@5 ~ g2@6 d3@6 b2@3 d3@2 ~", T: "g2@5 ~ g2@6 d3@6 b2@4 d3@2", U: "c3@5 ~ c3@6 g2@6 eb2@4 g2@2",
  V: "c2@5 ~ c2@6 g2@6 eb2@4 g2@2", W: "f2@5 ~ f2@6 c3@6 a2@4 c3@2", X: "f2@2 ~ f2@2 ab2 c3@3 ab2@2 c3",
  Y: "~ bb2@5 bb2@4 d2@2 f2@6 d2@4 f2@2", Z: "eb2@5 ~ eb2@5 ~ bb1@5 ~ bb1@4 bb1@2",
  AA: "eb2@3 ~ bb1@2 d2@3 eb2@3 ~@6 eb2@2 ~@4",
})).s("gm_acoustic_bass").gain(0.41)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~ A B C D E F G H A B C D E F I ~ J K L M N D O E A B C D E F I ~ P@2 Q@2 R@2 S E A B C D E F T U
>`.pickRestart({
  A: "eb3@9 ~ g3@2 bb3@6 g3@4 bb3@2", B: "eb3@5 g3 bb3@3 g3@2 bb3", C: "ab3@5 c3 eb3@3 c3@2 eb3",
  D: "f2@5 a2 c3@3 a2@2 c3", E: "bb2@5 d3 f3@3 d3@2 f3", F: "f2@3 a2@3 bb2@3 d3@2 f3", G: "eb3@9 ~ eb3@2 c3@10 c3@2",
  H: "f2@9 ~ f2@2 bb2@6 d3@3 ~ f3@2", I: "eb3 ~@3", J: "g2@9 ~ b2@2 d3@6 b2@4 d3@2", K: "g2@5 b2 d3@3 b2@2 d3",
  L: "c3@9 ~ eb3@2 g3@6 eb3@4 g3@2", M: "c3@5 eb3 g3@3 eb3@2 g3", N: "f3@5 a2 c3@3 a2@2 c3",
  O: "f2@5 ab2 c3@3 ab2@2 c3", P: "g2@3 g3@2 b2 d3@3 b2@2 d3", Q: "c3@3 c4@2 eb3 g3@3 eb3@2 g3",
  R: "f2@3 f3@2 a2 c3@3 a2@2 c3", S: "f3@5 ab3 c4@3 f3@2 ab3", T: "eb3@3 eb3@3 bb2@3 bb2@2 bb2",
  U: "eb3@2 bb2 d3@2 eb3 ~@3 eb3 ~@2",
})).s("gm_electric_guitar_muted").gain(0.42).pan(0)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note("<~@33 A B C D E F G H ~@8>".pickRestart({
  A: "~@4 [g3,b3,d4] ~@5 [g3,b3,d4] ~@5 [g3,b3,d4] ~@7", B: "~@4 [g3,b3,d4] ~@11 [g3,b3,d4] ~@7",
  C: "~@4 [g3,c4,eb4] ~@19", D: "~@4 [g3,c4,eb4] ~@5 [g3,c4,eb4] ~@5 [g3,c4,eb4] ~@7",
  E: "~@6 [a3,c4,eb4] ~@3 [a3,c4,eb4] ~@13", F: "~@4 [a3,c4,eb4] ~@19",
  G: "~@4 [ab3,c4,eb4] ~@5 [ab3,c4,eb4] ~@5 [ab3,c4,eb4] ~@7", H: "~@4 [f3,bb3,d4] ~@5 [f3,bb3,d4] ~@5 [f3,bb3,d4] ~@7",
})).s("gm_acoustic_guitar_nylon").gain(0.15).pan(1)

// other · whistle
const whistle = note("<~@32 A B C D E F G H I ~@8>".pickRestart({
  A: "~@6 eb6@2 ~@4 f6@3 ~@3 gb6@2 ~@4", B: "g6@12 ~@3 ab6@5 ~ ab6@2 ~", C: "ab6@3 ab6@3 f6@7 ~@2 f6@5 g6@2 ab6@2",
  D: "g6@2 c6@6 ~ c6 d6 eb6", E: "g6@6 ~@2 g6@3 ab6", F: "a6@12 ~@3 c7@4 ~ c7 ~ c7 ~",
  G: "c7@4 g6@9 ~@2 f6@5 g6@2 f6@2", H: "e6@2 f6@2 ab6@2 c6@7 ~@2 g6@5 bb6@2 g6@2", I: "f6@11 ~@13",
})).s("gm_whistle").gain(0.4)

// other · soprano sax · "SOPRAN SAX"
const soprano_sax = note("<~@7 A B ~@6 A C ~@14 D C ~@14 A E>".pickRestart({
  A: "~@3 bb3 c4 eb4 gb4@2 g4 eb4@2 c4", B: "eb4@2 ~@4 eb4@4 c4@7 ~@7", C: "eb4 ~@11",
  D: "~@2 eb4 c4@2 bb3 eb4@3 c4@2 bb3", E: "eb4@3 ~ bb3@2 d4@4 eb4@2 ~@6 eb4@2 ~@4",
})).s("gm_soprano_sax").gain(0.47).pan(0)

// other · baritone sax · "BARITONSAX"
const baritone_sax = note("<~@7 A B ~@6 A C ~@14 D C ~@14 A E>".pickRestart({
  A: "~@3 bb2 c3 eb3 gb3@2 g3 eb3@2 c3", B: "eb3@2 ~@4 eb3@4 c3@7 ~@7", C: "eb3 ~@11",
  D: "~@2 eb3 c3@2 bb2 eb3@3 c3@2 bb2", E: "eb3@3 ~ bb2@2 d3@4 eb3@2 ~@6 eb2 ~@5",
})).s("gm_baritone_sax").gain(0.5).pan(0)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!31 x [x!2]!15 [x ~@4 x ~@3 x ~@2]>").gain(0.24).pan(0)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!31 ~ [~ x ~ x]!15 ~>").gain(0.28).pan(0)

// drums · ride
const ride = s("rd").struct("<~ [x ~ x ~@2 x!2 ~ x ~@2 x]!31 x [x ~ x ~@2 x!2 ~ x ~@2 x]!15 [x ~ x!2 ~ x ~@6]>")
  .gain(0.24).pan(0)

// drums · crash
const crash = s("cr").struct("<~ [x ~ x!2 ~ x!2 ~ x!2 ~ x]!31 ~ [x ~ x!2 ~ x!2 ~ x!2 ~ x]!15 [x ~ x!2 ~ x ~@6]>")
  .gain(0.12).pan(0)

stack(
  piano, bass, electric_guitar_muted, acoustic_guitar_nylon, whistle, soprano_sax, baritone_sax, kick, snare, ride,
  crash
)

More by Pat Boone