Strudelify

Under The Boardwalk

Drifters

KeyF majorTempo115 bpm
0:00/0:00
// Under The Boardwalk — Drifters
// 115 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 1 "PIANOBASS" piano (copy of ch 5 "BASS" 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): GITMUTE173.
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 · "STRINGS"
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 [a3,c4,c5]@2 [bb3,d4,d5] [c4,f4,f5]@2 [f4,a4,c5,a5]@9]/2", // Am Bb F5 F
  B: "~@6 [a3,a4,c5]@2 [bb3,bb4,d5]@3 [a3,a4,c5]@2 [g3,g4,bb4]@3", // Am Bb Am Gm
  C: "[[f3,f4,a4]@22 [a3,a4,c5]@2 [a3,a4,c5]@3 [bb3,bb4,d5]@2 [a3,a4,c5]@3]/2", D: "[c4,c5,e5]@11 [d4,d5,f5]@5",
  E: "[e4,e5,g5]", F: "[c4,c5,e5]@3 [c4,c5,e5]@2 [c4,c5,e5]@3 [c4,c5,e5]@4 [f4,d5,f5]@4",
  G: "[g4,e5,g5]@3 [g4,f5,a5] [g4,g5,bb5]@2 [a4,a5,c6]@2", H: "[f4,f5,a5]/2",
})).s("gm_string_ensemble_1").gain(0.21).pan(0.3)

// bass · electric bass pick · "BASS"
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: "f1@3 a1@3 c2@2", B: "c2@3 e2@3 g2@2", C: "f1@6 a1@5 ~ c2@4", D: "bb1@3 d2@3 f2@2", E: "f1@6 a1@6 c2@3 ~",
  F: "f1@3 a1@3 c2 db2", G: "d2 ~@5 d2@9 ~", H: "d2 ~@5 d2@5 ~ d2@2 db2@2", I: "c2 ~@5 c2@10",
  J: "c2 ~@5 c2@5 ~ c2 ~ db2 ~", K: "d2 ~@5 d2@5 ~ d2@2 db2 ~", L: "c2 ~@5 c2@9 ~", M: "c2 ~@5 c2@5 ~ c2@2 db2 ~",
  N: "d2@3 ~ d2 ~@7 d2@3 ~", O: "d2 ~@15",
})).s("gm_electric_bass_pick").gain(0.44).pan(0.3)

// chords · electric guitar clean · "ACC.GUIT"
const electric_guitar_clean = 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 [a3,c4,f4] ~@2 [a3,c4,f4] ~ [a3,c4,f4], f2@3 a2@3 c3@2", // F
  B: "~@2 [a3,c4,f4] ~@2 [a3,c4,f4] c3 [a3,c4,f4], f2@3 a2@3 ~@2", C: "c3@2 [g3,c4,e4] e3@2 [g3,c4,e4] g3 [g3,c4,e4]",
  D: "c3@2 [g3,c4,e4] e3@2 [g3,c4,e4] ~ [c4,e4], ~@3 g3", E: "c3@4 [g3,c4,e4]@2 e3@4 [g3,c4,e4]@2 g3 ~ [g3,c4,e4] ~",
  F: "f2@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~ [a3,c4,f4], ~@3 a2@3 c3@2", // F
  G: "~@4 [a3,c4,f4]@2 ~@4 [a3,c4,f4]@2 ~@2 [a3,c4,f4] ~, f2@3 a2@3 c3@2", // F
  H: "bb2@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~ [bb3,d4,f4], ~@3 d3@3 f3@2", // Bb
  I: "~@2 [bb3,d4,f4] d3@2 [bb3,d4,f4] f3 [bb3,d4,f4], bb2@3 ~@5", J: "f2@2 [a3,c4,f4] a2@2 [a3,c4,f4] c3 [a3,c4,f4]",
  K: "c3@2 [g3,c4,e4] e3@2 [g3,c4,e4] g3 [c4,e4]", L: "~@2 [a3,c4,f4] ~@2 [a3,c4,f4] c3 db3, f2@3 a2@3 ~@2",
  M: "[d3,a3,d4,f4] ~@5 [d3,a3,d4,f4]@10", N: "[d3,a3,d4,f4] ~@5 d3@5 ~ d3@2 db3@2, ~@3 [a3,d4,f4]@4 ~",
  O: "[c3,g3,c4,e4] ~@2 [c3,g3,c4,e4]@4 ~", P: "[c3,g3,c4,e4] ~@5 c3@6 c3@2 db3@2, ~@3 [g3,c4,e4]@4 ~",
  Q: "[d3,a3,d4,f4] ~@5 [d3,a3,d4,f4]@9 ~", R: "[c3,g3,c4,e4] ~@5 c3@6 g2@2 a2@2, ~@6 [g3,c4,e4]@9 ~",
  S: "[c3,g3,c4,e4] ~@5 [c3,g3,c4,e4]@5 ~ [c3,g3,c4,e4]@2 db3@2", // C
  T: "[d3,a3,d4,f4]@4 [d3,a3,d4,f4] ~@7 [d3,a3,d4,f4]@3 ~", U: "[d3,a3,d4,f4] ~@15",
})).s("gm_electric_guitar_clean").gain(0.15).pan(0.4)

// chords · steel drums · "STEELDRUM"
const steel_drums = 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 [e4,c5]@2 [e4,c5]@2 [e4,c5]@3 [f4,d5]@2 [gb4,eb5]@3", B: "~ g4 ~ g4 [g4,e5]!3 g4 ~@8",
  C: "~@4 [a4,f5]@2 [a4,f5]@2 [a4,f5]@3 [bb4,g5]@2 [b4,ab5]@3", D: "~ [c5,a5] c5 [c5,a5]!2 a5 [c5,a5] c5 ~@8",
  E: "[d5,f5] ~@5 [d5,f5]@8 ~@2", F: "[c5,e5] ~@5 [c5,e5]@9 ~", G: "[c5,e5] ~@5 [c5,e5]@8 ~@2",
  H: "[d5,f5] ~@5 [d5,f5]@7 ~@3", I: "[d5,f5]@3 ~ [d5,f5] ~@7 [d5,f5]@3 ~", J: "[d5,f5] ~@15",
})).s("gm_steel_drums").gain(0.21)

// chords · steel drums · "STEELDRUM" · soft notes · C F
const steel_drums_soft = note("<~@20 [[g4,e5] e5 [g4,e5] e5 ~@12] ~@3 [[c5,a5] ~ a5 ~@2 c5 ~@10] ~@44>")
  .s("gm_steel_drums").gain(0.13)

// 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.5)

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

// 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.5)

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

// 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.5)

// 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(1.3)

// 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(1.59)

// 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(1.59)

// 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(9.43)

// 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(9.43)

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

stack(
  string_ensemble_1, bass, electric_guitar_clean, steel_drums, steel_drums_soft, kick, rim, snare, clap, crash, bongos,
  congas, congas_2, guiro, guiro_2, claves
)