Strudelify

Under the Boardwalk

The Platters

KeyE majorTempo115 bpm
0:00/0:00
// Under the Boardwalk — The Platters
// 115 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 1 piano (copy of ch 5 electric bass pick)
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28.
setcpm(115/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.

// chords · string ensemble 1
const string_ensemble_1 = note("<~@15 A@2 ~@14 A@2 ~@9 B C@2 D E F G H@2 ~@6 A@2 ~@10>".pickRestart({
  A: "[~@2 [g#3,b3,b4]@2 [a3,c#4,c#5] [b3,e4,e5]@2 [e4,g#4,b4,g#5]@9]/2", // G#m A E5 E
  B: "~@6 [g#3,g#4,b4]@2 [a3,a4,c#5]@3 [g#3,g#4,b4]@2 [f#3,f#4,a4]@3", // G#m A G#m F#m
  C: "[[e3,e4,g#4]@22 [g#3,g#4,b4]@2 [g#3,g#4,b4]@3 [a3,a4,c#5]@2 [g#3,g#4,b4]@3]/2", // E G#m A G#m
  D: "[b3,b4,d#5]@11 [c#4,c#5,e5]@5", E: "[d#4,d#5,f#5]",
  F: "[b3,b4,d#5]@3 [b3,b4,d#5]@2 [b3,b4,d#5]@3 [b3,b4,d#5]@4 [e4,c#5,e5]@4", // B C#m
  G: "[f#4,d#5,f#5]@3 [f#4,e5,g#5] [f#4,f#5,a5]@2 [g#4,g#5,b5]@2", H: "[e4,e5,g#5]/2",
})).s("gm_string_ensemble_1").gain(0.21).pan(0.3)

// bass · electric bass pick
const bass = note(`<
  ~ A@2 B@4 A C D@2 A@2 E B A@4 B@4 A C D@2 A@2 E B A F G H I J G K L M N O A@2 B@4 A C D@2 A@2 E B A F G H I J G K L M
  N O
>`.pickRestart({
  A: "e1@3 g#1@3 b1@2", B: "b1@3 d#2@3 f#2@2", C: "e1@6 g#1@5 ~ b1@4", D: "a1@3 c#2@3 e2@2", E: "e1@6 g#1@6 b1@3 ~",
  F: "e1@3 g#1@3 b1 c2", G: "c#2 ~@5 c#2@9 ~", H: "c#2 ~@5 c#2@5 ~ c#2@2 c2@2", I: "b1 ~@5 b1@10",
  J: "b1 ~@5 b1@5 ~ b1 ~ c2 ~", K: "c#2 ~@5 c#2@5 ~ c#2@2 c2 ~", L: "b1 ~@5 b1@9 ~", M: "b1 ~@5 b1@5 ~ b1@2 c2 ~",
  N: "c#2@3 ~ c#2 ~@7 c#2@3 ~", O: "c#2 ~@15",
})).s("gm_electric_bass_pick").gain(0.44).pan(0.3)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A B C D C E F G H I J A B K F@2 A B C D C E F G H I J A B K F L M N O P Q N R S T U A B C D C E F G H I J A B K F L
  M N O P Q N R S T U
>`.pickRestart({
  A: "~@2 [g#3,b3,e4] ~@2 [g#3,b3,e4] ~ [g#3,b3,e4], e2@3 g#2@3 b2@2", // E
  B: "~@2 [g#3,b3,e4] ~@2 [g#3,b3,e4] b2 [g#3,b3,e4], e2@3 g#2@3 ~@2", // E
  C: "b2@2 [f#3,b3,d#4] d#3@2 [f#3,b3,d#4] f#3 [f#3,b3,d#4]", // B
  D: "b2@2 [f#3,b3,d#4] d#3@2 [f#3,b3,d#4] ~ [b3,d#4], ~@3 f#3", // B
  E: "b2@4 [f#3,b3,d#4]@2 d#3@4 [f#3,b3,d#4]@2 f#3 ~ [f#3,b3,d#4] ~", // B
  F: "e2@2 [g#3,b3,e4] ~@2 [g#3,b3,e4] ~ [g#3,b3,e4], ~@3 g#2@3 b2@2", // E
  G: "~@4 [g#3,b3,e4]@2 ~@4 [g#3,b3,e4]@2 ~@2 [g#3,b3,e4] ~, e2@3 g#2@3 b2@2", // E
  H: "a2@2 [a3,c#4,e4] ~@2 [a3,c#4,e4] ~ [a3,c#4,e4], ~@3 c#3@3 e3@2", // A
  I: "~@2 [a3,c#4,e4] c#3@2 [a3,c#4,e4] e3 [a3,c#4,e4], a2@3 ~@5", // A
  J: "e2@2 [g#3,b3,e4] g#2@2 [g#3,b3,e4] b2 [g#3,b3,e4]", K: "b2@2 [f#3,b3,d#4] d#3@2 [f#3,b3,d#4] f#3 [b3,d#4]",
  L: "~@2 [g#3,b3,e4] ~@2 [g#3,b3,e4] b2 c3, e2@3 g#2@3 ~@2", M: "[c#3,g#3,c#4,e4] ~@5 [c#3,g#3,c#4,e4]@10",
  N: "[c#3,g#3,c#4,e4] ~@5 c#3@5 ~ c#3@2 c3@2, ~@3 [g#3,c#4,e4]@4 ~", O: "[b2,f#3,b3,d#4] ~@2 [b2,f#3,b3,d#4]@4 ~",
  P: "[b2,f#3,b3,d#4] ~@5 b2@6 b2@2 c3@2, ~@3 [f#3,b3,d#4]@4 ~", Q: "[c#3,g#3,c#4,e4] ~@5 [c#3,g#3,c#4,e4]@9 ~",
  R: "[b2,f#3,b3,d#4] ~@5 b2@6 f#2@2 g#2@2, ~@6 [f#3,b3,d#4]@9 ~", // B
  S: "[b2,f#3,b3,d#4] ~@5 [b2,f#3,b3,d#4]@5 ~ [b2,f#3,b3,d#4]@2 c3@2", // B
  T: "[c#3,g#3,c#4,e4]@4 [c#3,g#3,c#4,e4] ~@7 [c#3,g#3,c#4,e4]@3 ~", U: "[c#3,g#3,c#4,e4] ~@15",
})).s("gm_acoustic_guitar_steel").gain(0.15).pan(0.4)

// chords · vibraphone
const vibraphone = note("<~@19 A B ~@2 C D ~@8 E@2 F G E H F G I J ~@16 E@2 F G E H F G I J>".pickRestart({
  A: "~@4 [d#4,b4]@2 [d#4,b4]@2 [d#4,b4]@3 [e4,c#5]@2 [f4,d5]@3", B: "~ f#4 ~ f#4 [f#4,d#5]!3 f#4 ~@8",
  C: "~@4 [g#4,e5]@2 [g#4,e5]@2 [g#4,e5]@3 [a4,f#5]@2 [a#4,g5]@3", D: "~ [b4,g#5] b4 [b4,g#5]!2 g#5 [b4,g#5] b4 ~@8",
  E: "[c#5,e5] ~@5 [c#5,e5]@8 ~@2", F: "[b4,d#5] ~@5 [b4,d#5]@9 ~", G: "[b4,d#5] ~@5 [b4,d#5]@8 ~@2",
  H: "[c#5,e5] ~@5 [c#5,e5]@7 ~@3", I: "[c#5,e5]@3 ~ [c#5,e5] ~@7 [c#5,e5]@3 ~", J: "[c#5,e5] ~@15",
})).s("gm_vibraphone").gain(0.21).pan(0.8)

// chords · vibraphone · soft notes · D#m E
const vibraphone_soft = note("<~@20 [[f#4,d#5] d#5 [f#4,d#5] d#5 ~@12] ~@3 [[b4,g#5] ~ g#5 ~@2 b4 ~@10] ~@44>")
  .s("gm_vibraphone").gain(0.13).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x ~@4]!40 [x!2 ~ x] x [x ~@2 x ~@4]!24 [x!2 ~ x] x>").gain(0.24)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!32 ~@10 [~ x ~ x]!16 ~@10>").gain(0.24)

// drums · snare
const snare = s("sd").struct("<~@33 [x ~@2 x ~@4]!8 [x!2 ~ x] x ~@16 [x ~@2 x ~@4]!8 [x!2 ~ x] x>").gain(0.24)

// drums · clap
const clap = s("cp").struct("<~@8 [~@3 x] ~@60>").gain(0.22)

// drums · crash
const crash = s("cr").struct("<~ A ~@15 A ~@15 B@8 C A@2 ~@7 A ~@7 B@8 C A>".pickRestart({
  A: "x", B: "x ~@2 x ~@4", C: "x!2 ~ x",
})).gain(0.24)

// drums · bongos
const bongos = s("bongo:4").struct("<~ A@32 B@8 C D A@16 B@8 C D>".pickRestart({
  A: "x ~ x!5 ~", B: "x ~ x!3 ~ x ~", C: "x!2 ~ x", D: "x",
})).gain(0.64)

// drums · congas
const congas = s("conga:13").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 A B A B A B A B A B A B A B C ~ 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 ~
>`.pickRestart({
  A: "x ~ x!2 ~@6 x ~@5", B: "~@2 x!2 ~@6 x ~@5", C: "x!2 ~@2",
})).gain(0.78)

// drums · congas
const congas_2 = s("conga:33").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 A B A B A B A B A B A B A B C D 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 D
>`.pickRestart({
  A: "~ x ~ x ~@3 x", B: "~@3 x ~@3 x", C: "~@3 x", D: "x",
})).gain(0.78)

// drums · guiro
const guiro = s("guiro:0").struct("<~ A@32 B@8 C D A@16 B@8 C D>".pickRestart({
  A: "x!4", B: "x ~@2 x ~@4", C: "x!2 ~ x", D: "x",
})).gain(4.62)

// drums · guiro
const guiro_2 = s("guiro:4").struct("<~ A@32 B@8 C D A@16 B@8 C D>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "x ~@2 x ~@4", C: "x!2 ~ x", D: "x",
})).gain(4.62)

// drums · claves
const claves = s("clave:2").struct("<~ [x ~@2 x ~@4]!32 ~@10 [x ~@2 x ~@4]!16 ~@10>").gain(1.19)

stack(
  string_ensemble_1, bass, acoustic_guitar_steel, vibraphone, vibraphone_soft, kick, rim, snare, clap, crash, bongos,
  congas, congas_2, guiro, guiro_2, claves
)

More by The Platters