Strudelify

TSOP (The Sound of Philadelphia)

MFSB

KeyC minorTempo120 bpm
0:00/0:00
// TSOP (The Sound of Philadelphia) — MFSB
// 120 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · brass section · "Brass"
const brass_section = note(`<
  ~@3 A B ~@2 A C ~@2 A D ~@2 A C ~@13 E F G H ~@2 A C ~@2 A C ~@13 E F G I J K J K L@2 M@2 N@8 O P O P ~@7 Q R@3 S R@3
  T
>`.pickRestart({
  A: "[f4,a4,e5] d5 ~ [f4,a4,d5]@2 ~ c5@2 [f4,a4,c5]@2 a4@2 [f4,a4,c5]@2 d5@2", // Fmaj7 Dm F
  B: "[f4,a4,c5,e5]@3 ~ [f4,a4,c5,e5]@3 ~ d5 c5 a4@2 g4@2 a4@2", C: "[f4,a4,c5,e5]@3 ~ [f4,a4,d5]@3 ~ [f4,a4,c5]@3 ~@5",
  D: "[f4,a4,c5,e5]@3 ~ [f4,a4,d5]@3 ~ [f4,a4,c5]@3 ~ [f4,a4]@4", E: "[bb4,eb5,g5]@4 ~ c5 eb5 f5",
  F: "g5@3 ~ f5@2 eb5@2 f5@6 ~@2", G: "[bb4,eb5,g5]@5 ~ c6 bb5 c6@2 bb5@2 g5@2 eb5@2",
  H: "[a4,c5,f5]@5 ~ eb5 f5 [b4,d5,g5]@3 ~@5", I: "[a4,c5,f5]@5 ~ eb5 f5 [b4,d5,g5]@6 ~@2",
  J: "[eb4,g4,c5]@2 c5@2 c5 bb4 c5 eb5@5 ~@2 c5!2", K: "[eb4,g4,c5]@2 c5@2 c5 bb4 c5 eb5@2 ~ c5@2 ~@4",
  L: "[c5@21 ~@5 c5 bb4 c5 eb5@2 ~]/2", M: "[c5@26 c5 bb4 c5 eb5@2 ~]/2",
  N: "~@2 c5 bb4 g4@2 f4 eb4@2 ~ f4@2 eb4@2 f4@2", O: "[eb4,g4,c5]@11 ~@3 c5 bb4",
  P: "[f4,a4,c5] eb5 ~@2 [f4,a4,c5]@10 ~@2", Q: "~@5 c4 eb4 f4", R: "[[eb4,g4]@9 ~@2 g4 f4 eb4 c4 eb4@7 ~@2]/3",
  S: "[a3,eb4] c4 ~@3 c4 eb4 f4", T: "[a3,eb4] c4 ~@3 c4 eb4 ~",
})).s("gm_brass_section").gain(0.72).pan(0.7)

// chords · trombone
const trombone = note(`<
  ~@6 A ~@9 B C@6 D C D C D C D ~ E ~@9 B C@6 D C D C D C D ~ E ~@6 F G F G H I H I H I H I ~@13 J@2 ~@2 J@2 ~
>`.pickRestart({
  A: "[c4,e4]", B: "~@12 [g4,bb4,eb5]@3 ~", C: "[eb4,g4,c5]@2 ~@10 [g4,bb4,eb5]@3 ~", D: "[eb4,g4,c5] ~@7",
  E: "[a4,c5]@3 ~ [b4,d5]@4", F: "[c4,eb4,g4]@2 c4@2 c4 bb3 c4 eb4@5 ~@2 [c4,eb4,g4]!2",
  G: "[c4,eb4,g4]@2 c4@2 c4 bb3 c4 eb4@2 ~ c4@2 ~@4", H: "[c3,eb3,g3]@15 ~", I: "[c3,f3,a3]@15 ~",
  J: "[~@8 a3@5 ~ c4@14 ~@4]/2",
})).s("gm_trombone").gain(0.56).pan(0.3)

// chords · epiano1 · "Piano"
const epiano1 = note(`<
  ~ A B@2 C A D E F@2 D C G H I J K L M N M O P Q@3 R P S T U V W X@2 I C G Y Z AA AB S P AC@2 M AC L P L AC M AC AD U
  AE U AF AG AH@2 T AI@2 AJ AK AL AM AL AN AJ AN AD AO AD AO AP AN AJ AN AJ AQ T AR AL AM AJ AM AD AO AG AM AP AS
>`.pickRestart({
  A: "~ e4 g4 [g3,c4,e4] ~@2 [g3,c4,e4]@9 ~, c4 ~@7", B: "[[a3,c4,e4]@13 a2 ~ [c4,e4,g4,a4]@14 ~ e4 a4]/2",
  C: "[c4,e4,g4,a4]@13 g2 [c4,e4,g4,a4] ~", D: "[a3,c4,e4]@13 a2 [a3,c4,e4] ~",
  E: "[c4,e4,g4,a4]@3 [c4,e4,g4,a4] ~@2 [c4,e4,g4,a4]@7 g2 [c4,e4,g4,a4] ~", // Am7
  F: "[[c4,e4,g4,a4]@13 ~@2 [g3,c4,e4]@13 ~@2 e4 g4, ~@29 c4@3]/2", G: "[c4,e4,g4,a4]@15 ~",
  H: "[g3,c4,e4]@13 c3 [g3,c4,e4] ~", I: "[a3,c4,e4]@2 ~ [a3,c4,e4] ~ a2 [a3,c4,e4]@9 ~",
  J: "[c4,e4,g4,a4]@12 ~@2 a4 c5, ~@13 e4@3", K: "[c4,e4,g4,a4]@5 e4 a4 c5 [c4,e4,g4,a4]@4 ~@4",
  L: "[g3,c4,eb4]@5 c4 eb4 g4 [g3,c4,eb4]@4 [bb3,eb4,g4]@4", M: "[g3,c4,eb4]@5 c4 eb4 g4 [g3,c4,eb4]@4 [g3,bb3,eb4]@4",
  N: "[g3,c4,eb4]@5 c4 eb4 g4 [g3,c4,eb4]@3 [g3,bb3,eb4]@5", O: "[g3,c4,eb4]@5 c4 ~ [g3,c4,eb4]@5 [bb3,eb4,g4]@4",
  P: "[g3,c4,eb4]@7 [g3,c4,eb4]@5 [g3,bb3,eb4]@4", // Cm Eb
  Q: "[[g3,c4,eb4]@5 c4 eb4 g4 [g3,c4,eb4]@4 [bb3,eb4,g4]@3 [g3,c4,eb4]@9 [g3,c4,eb4]@4 [bb3,eb4,g4]@3 [g3,c4,eb4]@6 c4 eb4 g4 [g3,c4,eb4]@4 [g3,bb3,eb4]@4]/3", // Cm Eb Cm Eb Cm Eb
  R: "[g3,c4,eb4]@5 c4 ~ [g3,c4,eb4]@5 [g3,bb3,eb4]@4", S: "[g3,c4,eb4]@2 [g3,c4,eb4] [bb3,eb4,g4]",
  T: "[g3,c4,eb4]@12 ~@2 eb4 g4, ~@13 c4@3", U: "[g3,bb3,eb4]@7 [g3,bb3,eb4] ~ eb3 [g3,bb3,eb4]@5 ~",
  V: "[a3,c4,f4]@5 f4 a4 c5 [g3,b3,d4]@5 g3 b3 d4", W: "[g3,bb3,eb4]@12 ~@2 g4 bb4, ~@13 eb4@3",
  X: "[[a3,c4,f4]@8 [g3,b3,d4]@5 g3 ~ [g3,c4,e4]@13 g4 e4 c4 ~]/2", Y: "[g3,c4,e4]@7 [g3,c4,e4] ~ c3 [g3,c4,e4]@5 ~",
  Z: "~ c4 e4 [a3,c4,e4] ~@2 [a3,c4,e4]@9 ~, a3 ~@7", AA: "[c4,e4,g4,a4]@12 c5 a4 f4 e4",
  AB: "[c4,e4,g4,a4]@8 [c4,e4,g4,a4]@3 [g3,bb3,eb4]@5", AC: "[g3,c4,eb4]@2 [g3,c4,eb4] [g3,bb3,eb4]",
  AD: "[g3,c4,eb4]@12 g4 eb4 c4 ~", AE: "[a3,c4,f4]@8 [g3,b3,d4]@5 g3 b3 d4", AF: "[a3,c4,f4] [g3,b3,d4]",
  AG: "[g3,c4,eb4]@9 c4@2 eb4 g4 c5 g4 eb4", // Cm
  AH: "[~ eb4 g4 [g3,c4,eb4] ~@2 [g3,c4,eb4]@9 [g3,c4,eb4]@3 ~ [g3,c4,eb4] ~ c3 [g3,c4,eb4]@9 ~, c4 ~@15]/2", // Cm
  AI: "[[g3,c4,eb4]@25 ~@4 c5 eb5 c5, ~@25 c4@5 ~@2, ~@27 eb4@4 ~, ~@28 g4@3 ~]/2", // Cm
  AJ: "[g3,c4,eb4]@13 c3 [g3,c4,eb4] ~", AK: "[g3,c4,eb4]@15 ~", AL: "[g3,c4,eb4]@2 ~ [g3,c4,eb4] ~ c3 [g3,c4,eb4]@9 ~",
  AM: "[a3,c4,f4]@12 ~@2 a4 c5, ~@13 f4@3", AN: "[a3,c4,f4]@12 c5 a4 f4 ~",
  AO: "[a3,c4,f4]@7 [a3,c4,f4] ~ f3 [a3,c4,f4]@5 ~", AP: "[g3,c4,eb4]@7 [g3,c4,eb4] ~ c3 [g3,c4,eb4]@5 ~",
  AQ: "[a3,c4,f4]@2 ~ [a3,c4,f4] ~ f3 [a3,c4,f4]@9 ~", AR: "~ a4 c5 [a3,c4,f4] ~@2 [a3,c4,f4]@9 ~, f4 ~@7",
  AS: "[a3,c4,f4]@13 ~@3", // F
})).s("gm_epiano1").gain(0.33).pan(0.9)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@17 A B@2 A B A B A B A@3 C@2 D C D E F G@2 E H I J ~@21 K@2 L@2 C M C M C M C M ~@20
>`.pickRestart({
  A: "~ g5 [g5,eb6]!2, eb6 ~", B: "[g5,eb6]@2 [g5,eb6]!2", C: "[g5,eb6]", D: "~ a5 [b5,g6]@2, f6 ~", E: "[g5,e6]",
  F: "e5@2 ~ e6, c6, ~ a5", G: "[~@16 g6@15 ~, [a5,e6]@31 ~]/2", H: "[e5,c6]", I: "[a5,e6]",
  J: "[a5,e6]@2 [a5,e6] [g5,eb6]", K: "[~@24 g6@7 ~, [g5,eb6]@31 ~]/2",
  L: "[~@28 g5@3 ~, g6@31 ~, g5@15 ~ c6@15 ~, ~@8 eb6@23 ~]/2", M: "[a5,f6]",
})).s("gm_string_ensemble_1").gain(0.36).pan(1)

// chords · synth brass 2
const synth_brass_2 = note("<A B C ~@2 B D ~ A B C ~@2 E F ~@18 A G@2 ~ A G@2 ~@55>".pickRestart({
  A: "~@12 e4@3 ~", B: "[c4,e4,g4]@10 ~@2 [c4,e4,a4]@3 ~", C: "[a3,c4,e4]@13 ~@3", D: "b4@3 ~ a4@3 ~ g4@3 ~ e4@3 ~",
  E: "~@4 [c4,e4,g4]@3 ~ [e4,g4,c5]@3 ~ d5@3 ~", F: "[e4,a4,c5,e5]@13 ~@3",
  G: "[[c4,e4,g4]@10 ~@2 [c4,e4,a4]@3 ~ [a3,c4,e4]@13 ~@3, ~@11 g4@2 ~@2 d4@2 ~@15]/2", // C Am
})).s("gm_synth_brass_2").gain(0.42).pan(0.1)

// chords · alto sax · "Sax"
const alto_sax = note("<~@16 A B C B C B C B C B@4 D ~@11 A B C B C B C B C B@4 D ~@40>".pickRestart({
  A: "~@12 [g4,bb4,eb5]@3 ~", B: "[eb4,g4,c5]@2 c5@2 c5 bb4 c5 eb5@4 ~ [g4,bb4,eb5]@3 ~",
  C: "[eb4,g4,c5]@2 c5@2 c5 bb4 c5 eb5@2 ~ c5@2 [g4,bb4,eb5]@3 ~", D: "[eb4,g4,c5]@2 c5@2 c5 bb4 c5 eb5@2 ~ c5@5 ~",
})).s("gm_alto_sax").gain(0.72).pan(0.8)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B C D A B C D A B C D A B C E F@13 G H G I A B C D A B C E F@13 G H G J K@8 F@9 L F L F L F L F M F N F O F O F O
  F P
>`.pickRestart({
  A: "c2@2 c2@2 c2@2 g1@2 c2@2 c2@3 ~ b1@2", B: "a1@2 a1@2 a1@2 e1@2 a1@2 a1@3 ~ a1@2",
  C: "g1@3 ~ g1@3 ~ g1@3 ~ g1@2 d2@2", D: "g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~", E: "g2@3 ~ g2@3 ~ g2@3 ~@5",
  F: "c3@3 ~ bb2@3 ~ g2@3 ~ bb2@3 ~", G: "eb2@2 eb2@2 eb2@2 bb1@2 eb2@2 eb2@3 ~ eb2@2",
  H: "f2@2 f2@2 f2@2 c2@2 g2@2 g2@3 ~ f2@2", I: "f2@2 f2@2 f2@2 c2@2 g2@2 g2@5 ~",
  J: "f2@2 f2@2 f2@2 c2@2 g2@2 g2@3 ~ g2@2", K: "c2@3 ~ bb1@3 ~ g1@3 ~ bb1@3 ~",
  L: "f2@3 ~ c3@3 ~ f3 eb3 c3@2 c3@2 f2@2", M: "f2@2 ~ c3@2 ~ f3@2 ~ eb3 c3@2 c3@2 f2@2",
  N: "f2@2 ~ c3@2 ~ f3@5 ~ f2@3 ~", O: "f2@3 ~ c3@3 ~ f3@3 ~ f2@3 ~", P: "f2@3 ~ c3@3 ~ f3@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.72).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A C A B A B A B A C A D A B A D A B A D A B A B A B E A D A D A B A C A B A F A B A B A B A B A B A C A
  B A D B A D A D A D A E A B A B A B A G A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "x ~@6 x!2 ~@7", B: "x ~@6 x ~ x!2 ~@5", C: "x ~@6 x ~ x ~@6", D: "x ~@6 x ~@2 x ~@5", E: "x ~@4 x!2 ~@2 x!2 ~@5",
  F: "x ~@6 x ~@2 x ~@4 x", G: "x ~@2 x ~@7 x ~@4",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<~ A@7 B A@7 C A@7 D A@8 E A@7 B A@7 F A@7 B A@4 D A@7 G A@7 H A@7 F A@7 I>".pickRestart({
  A: "~ x ~ x", B: "~@3 x!2 ~@6 x!2 ~@2 x", C: "~@3 x!2 ~@6 x ~@4", D: "~@4 x ~@7 x!4", E: "~@4 x ~@7 x ~@2 x",
  F: "~@4 x ~@7 x ~ x!2", G: "~@4 x ~@7 x!2 ~ x", H: "x ~@11 x ~ x!2", I: "~@4 x ~@7 x!2 ~@2",
})).gain(0.72)

// drums · clap
const clap = s("cp").struct("<~ [~@3 x]!15 ~ [~@3 x]!78>").gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@24 [~@9 x ~@6] ~@37 [~@9 x ~@6] ~@15 [~@9 x ~@6] ~@15 [~@9 x ~@6]>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@2 B C B D B E A@4 B C F E A@3 D A@2 C D A D A D A@2 G H I A D A D A D A E A D B H J A J D A@2 B A F D A E A@3 H D
  A D A@4 C I A D A D A D K L A D J A M D A@3 D A@2 N A J F
>`.pickRestart({
  A: "x!16", B: "x!15 ~", C: "x!13 ~ x!2", D: "x!3 ~ x!12", E: "~@4 x!2 ~@2", F: "x!14 ~@2", G: "x!7 ~ x!3 ~ x ~ x ~",
  H: "x!7 ~ x!2 ~@2 x!4", I: "x!3 ~ x ~@11", J: "x!13 ~ x ~", K: "x!9 ~ x!5 ~", L: "x!4 ~@12", M: "x!9 ~ x!3 ~ x ~",
  N: "x!3 ~ x!9 ~ x ~",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 [~@3 x ~@4] ~@37 [~@3 x ~@4] ~@15 [~@3 x ~@4] ~@15 [~@3 x ~@4]>").gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A B A C A D ~@4 A B E D ~@3 C ~@2 B C ~ C ~ C ~@2 F G H ~ C ~ C ~ C ~ D ~ C A G I ~ I C ~@2 A ~ E C ~ D ~@3 G C ~
  C ~@4 B H ~ C ~ C ~ C J ~@2 C I ~ K C ~@3 C ~@2 L ~ I ~
>`.pickRestart({
  A: "~@15 x", B: "~@13 x ~@2", C: "~@3 x ~@12", D: "~@7 x ~ x ~@6", E: "~@14 x!2", F: "~@7 x ~@3 x ~ x ~ x",
  G: "~@7 x ~@2 x ~@5", H: "~@3 x ~@2 x ~@3 x ~@5", I: "~@13 x ~ x", J: "~@9 x ~@5 x", K: "~@9 x ~@3 x ~ x",
  L: "~@3 x ~@9 x ~ x",
})).gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<~@24 [x ~@2 x ~@12] ~@37 [x ~@2 x ~@12] ~@15 [~ x ~@2] ~@15 [x ~@2 x ~@12]>")
  .gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A ~@7 A ~@7 A ~@7 B A ~@7 A ~@7 A ~@7 A ~@4 A ~@6 B A ~@7 A ~@7 A ~@7
>`.pickRestart({
  A: "x", B: "~@15 x",
})).gain(0.64)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x!16]!15 [x!12 ~@4] [x!16]!77 [x!14 ~@2]>").gain(0.32)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@17 A B A C A B D ~ A B A C E B D F ~ A B G B E C H ~@22 A B E B A B D ~@25
>`.pickRestart({
  A: "~@4 x ~ x ~@2 x ~ x ~@4", B: "~ x ~@2 x ~ x!2 ~ x ~@2 x ~ x!2", C: "~ x ~ x ~ x ~ x ~@3 x ~@2 x ~",
  D: "~@3 x ~ x ~ x ~@2 x ~ x!2 ~@2", E: "~@7 x ~@3 x ~@3 x", F: "x!2 ~@3 x ~@2 x!2 ~@6", G: "~@9 x ~@6",
  H: "~ x ~@7 x ~@6",
})).gain(1.28)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@17 A B A C A B D ~ A B A C E B D F ~ A B G B E C H ~@22 A B E B A B D ~@25
>`.pickRestart({
  A: "~ x!3 ~@3 x!2 ~@4 x ~ x", B: "x ~ x!2 ~ x ~@2 x ~ x!2 ~ x ~@2", C: "x ~@8 x!2 ~@5", D: "x!3 ~@6 x ~ x ~@2 x ~",
  E: "x ~@2 x!4 ~@2 x!2 ~@2 x!2 ~", F: "~@2 x ~@7 x ~ x!2 ~ x", G: "x!2 ~ x!6 ~@2 x!5", H: "x ~@2 x!6 ~@2 x!5",
})).gain(1.28)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@15 B A@6 C A@7 C A@14 C A C A@20 C A@11 C A C A@7 C A C D>".pickRestart({
  A: "~ x!3 ~ x!3 ~ x!3 ~ x!3", B: "~ x!3 ~ x!3 ~ x!3 ~@4", C: "~ x ~@3 x!3 ~ x!3 ~ x!3",
  D: "~ x!3 ~ x!3 ~ x!3 ~ x ~@2",
})).gain(2.03)

// drums · shaker
const shaker = s("sh").struct("<~ A@15 B A@6 C A@7 C A@14 C A C A@20 C A@11 C A C A@7 C A C A>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~ x!3 ~@3 x ~@3 x ~@3",
})).gain(0.48)

stack(
  brass_section, trombone, epiano1, string_ensemble_1, synth_brass_2, alto_sax, bass, kick, snare, clap, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash, tambourine, congas, congas_2, cabasa, shaker
)