Strudelify

52nd Street

Billy Joel

KeyA minorTempo140 bpm
0:00/0:00
// 52nd Street — Billy Joel
// 140 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 92 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/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 · piano
const piano = note(`<
  A B C D A B C E F G H@2 F G I@2 J K L M N ~ O P Q B R S T B U V W@2 X Y Z AA AB AC Q B R S T B U V W@2 X AD AE AA A B
  C AF A B C AF A B C AF A B C AF A B C AF A B C AF A B C AF A B C AF A B C AF A B
>`.pickRestart({
  A: "e2@3 [f#3,a3,d4]@2 ~ b1@6, e1@2 b2 ~, ~@5 [d3,f#3,a3]@7", // D
  B: "[e1,e2,f#3,a3,d4]@3 [d1,d2,f#3,a3,d4]@3 [d1,d2,f#3,a3,d4]@2 [e1,e2,g3,b3,e4]@4", // D Em
  C: "c2@3 [a#3,d4]@2 ~ c1@6, c1@2 c2 ~, ~@5 [g3,d4]@7", // A# G5
  D: "[c2,a#3,d4]@3 [a#3,d4]@3 [a3,d4]@2 [a#3,d4] [a3,d4]@2 [g3,d4], c1!2, ~@2 c2 ~", // Gm A# D5 A# D5 G5
  E: "[c2,a#3,d4]@3 [a#3,d4]@3 [a#3,d4]@2 [a3,d4] [g3,d4]@3, c1!2, ~@2 c2 ~", F: "[g3,c4,e4]!2, [a1,a2]",
  G: "[a3,d4,f#4]!2, [b1,b2]", // D B
  H: "[[e1,e2,b3,e4]@6 ~@3 [f#3,a3,d4]@2 ~@7 [d3,f#3,a3]@2 ~ [e1,e2]@3, ~@6 [e1,e2]@6 [e1,e2]@5 [e1,e2]@4 ~@3, ~@11 [d3,f#3,a3]@4 [d3,f#3,a3]@3 ~@2 [e3,g3,b3]@4]/2", // E5 D E D Em
  I: "[c3@6 ~@5 [b3,e4,g4]@4 [c2,c3,b3,e4,g4]@3 [b1,b2,a#3,d#4,f#4]@3 [a#1,a#2,a3,d4,f4]@3, c2@5 ~@3, [g3,b3]@8 b3@3 ~@13, ~@2 c3 c3@2 ~@3]/2", // Em Cmaj7 Bmaj7 A#maj7 G
  J: "[a1,a2,g3,c4,e4]!2", K: "[a#1,a#2,c#4,e4]!2", L: "[b1,b2,a3,d4,f#4] [b1,b2,d4,f#4]",
  M: "[a3,c#4,e4]@5 ~@4 [c#2,c#3]@3, [c#2,c#3]@2 [c#2,c#3] ~, ~@5 [a3,c#4,e4]@3 [a3,c#4,e4]@4", // A C# A
  N: "[c2,c3,g3,a#3,c4,e4]@2 [c2,c3,g3,a#3,c4,e4] ~@9", // C7
  O: "~@2 [b2,d#4,a4,d#5] [a#2,d#4,g#4,d#5]@2 ~ [b2,d#4,a4,d#5]@2 ~ [a#2,d#4,g#4,d#5]@2 [b2,d#4,a4,d#5]", // B7 D#sus4 B7 D#sus4 B7
  P: "~@2 [b0,b1]@4 [d1,d2]@3 [d#1,d#2]@3", Q: "e1 b1, e2 ~ b2 ~",
  R: "c2@3 [a#3,d4]@3 d4@2 a3 [g3,d4]@3, c1!2, ~@2 [c2,g3] ~", // A# G5 C5
  S: "[c2,a#3,d4]@3 [a#3,d4]@3 [a3,d4]@2 [g3,d4] ~@3, c1!2, ~@2 c2 ~", T: "[e1,e2] ~ [b1,b2] ~",
  U: "c2@3 [a#3,d4]@2 ~@3 a3 g3@3, c1!2, ~@5 d4@7, ~@5 g3@3 ~@4, ~@2 c2 ~", V: "[c1,c2] [c1,c2]@2 [c1,c2]",
  W: "[[e2,e3]@8 [d#2,d#3,a#3,c#4,f#4]@3 [d2,d3,a3,c4,f4]@6 [g2,f3,b3,d4]@7, [d4,e4] ~@3]/2", // E D#m7 Dm7 G7 Dsus2
  X: "[c2,c3,b3,e4] [b1,b2,a3,c#4,d#4]", Y: "[a#1,a#2,g#3,d4,f#4] [a1,a2,b3,c#4,e4], c4 ~@5",
  Z: "[a1,a2]@3 [a1,a2], [g3,c4,e4]", AA: "[d2,d3,f#3,a3,c4,d4]@2 ~ d5@2 c5@3 a#4 g4@2 g4",
  AB: "[g1,g2]@4 d4@2 [b4,d5]@4 [c5,e5]@2 a#4 a4 g4 d4@4 [d4,d#4] e4@2 g4@2, ~@6 a#4 ~@17", // G Bm C D#maj7
  AC: "b3@2 [b0,b1,b2]@4 [d1,d2,d3]@3 [d#1,d#2,d#3]@3", // B D D#
  AD: "c4@2 g4 a4@2 g4 a4@2 g4 a4@2 g4, [a#1,a#2,g#3,d4,f#4] [a1,a2,b3,c#4,e4]", // A#aug A
  AE: "a4@2 b4@3 b4@3 ~ [a1,a2]@3, [g3,c4,e4], [a1,a2]@3 ~, ~@2 c5", // A C A
  AF: "[c2,a#3,d4]@3 [a#3,d4]@3 [a3,d4]@2 g3@4, c1!2, ~@2 c2 ~", // Gm A# D5
})).s("gm_piano").gain(0.57).pan(0.4)

// bass · slap bass 2
const bass = note(`<
  A B C@2 A B C@2 D E F G D E H@2 I J K L M ~ N O A B C@2 P B C Q R@2 S T U V W O A B C@2 P B C Q R@2 S T U V A B C@2 A
  B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B
>`.pickRestart({
  A: "e1 b1", B: "e1@3 d1@3 d1@2 e1@4", C: "c1!2", D: "a1", E: "b1", F: "e1!2", G: "e1@5 e1@4 e1@3",
  H: "[c2@5 c2 b1 a#1]/2", I: "a1!2", J: "a#1!2", K: "b1!2", L: "c#2@2 c#2!2", M: "c2@2 c2 ~@9",
  N: "~@2 b1 a#1@2 ~ b1@2 ~ a#1@2 b1", O: "~@2 b0@4 d1@3 d#1@3", P: "e1 ~ b1 ~", Q: "c1 c1@2 c1",
  R: "[e2@8 d#2@3 d2@6 g2@7]/2", S: "c2 b1", T: "a#1 a1", U: "a1@3 a1", V: "d2 ~@5", W: "g1 ~@5",
})).s("gm_slap_bass_2").gain(0.4)

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

// drums · snare
const snare = s("sd").struct("<A@19 B C ~ D E A@12 F ~@2 E A@12 F ~ A@38>".pickRestart({
  A: "~ x", B: "~@12 x ~@8 x!3", C: "x!2 ~@4", D: "~@4 x ~ x ~@5 x ~@3 x!3 ~@3 x ~", E: "~@2 x", F: "~@5 x ~@2 x ~@3",
})).gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@3 A ~@3 A ~@19 A ~@3 A ~@11 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "~@5 x",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~@11 x] ~@83>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@3 A ~@3 A ~@19 A ~@3 A ~@11 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "~@2 x",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  A B ~ C A B ~ C A ~ D B A@2 E F A ~ A G H ~ I J A B ~ C A B ~ C K L M@2 G A@2 J A B ~ C A B ~ C K L M@2 G A@2 B ~ C A
  B ~ C A B ~ C A B ~ C A B ~ C A B ~ C A B ~ C A B ~ C A B ~ C A B
>`.pickRestart({
  A: "x", B: "~@2 x", C: "~ x", D: "~@11 x", E: "x ~@10 x", F: "~ x!3", G: "x ~@4 x ~@2 x ~@3", H: "x!2 ~@4",
  I: "~@2 x!2 ~@2 x ~@2 x ~ x", J: "~@2 x ~@3 x ~@2 x ~@2", K: "x ~@7 x ~@2 x", L: "~@5 x ~@6", M: "x!2",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@3 A ~@3 A ~@19 A ~@3 A ~@11 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "~@9 x!3 ~@12",
})).gain(0.4)

stack(piano, bass, kick, snare, hihat, low_tom, open_hat, mid_tom, crash, high_tom)

More by Billy Joel