Strudelify

The Mexican Connection

Billy Joel

KeyD majorTempo125 bpm
0:00/0:00
// The Mexican Connection — Billy Joel
// 125 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(125/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 · "Piano 1"
const piano = note(`<
  A B C D C E C F G E C D C E C F G H I@2 J K I L J M N O P Q R C D C E C F G H S T U V W X Y Z I L J AA W AB Y AC N O P
  Q AD AE AF D C E C AG G AH@5
>`.pickRestart({
  A: "d2@3 a2 ~ a2 a1@2 d2@3 a2 ~ a2 a1@2", B: "d2@3 a2 ~ a2 a1@2 d2@2 d4@2 f#4@2 a4@2",
  C: "[b2,d4,f#4,b4]@3 [a2,c#4,e4,a4]@5 [e2,f#3,b3,d4,f#4]@4 [a2,a3,c#4,e4]@4", // Bm A Bm A
  D: "d2@3 a2 ~ a2 a1@2 d2@2 d4@2 f#4@2 a4@2, [a3,d4,f#4] ~", // D
  E: "d2@3 a2 ~ a2 a1@2 d2@2 d4@2 f#4@2 a4@2, [f#3,a3,d4] ~", // D
  F: "[b3,c4,e4]@3 [b3,c4,e4]@2 [b3,c4,e4]@3 [b3,d4]@2 g4@2 a4@2 [d4,g4,b4]@2, g4@5 [b3,d4]@2 ~, c2 b1", // Cmaj7 Bm G Bm
  G: "[c#4,e4]@2 a3 c#4@2 ~@5 b4@2 g4@2 e4@2, a1@2 [b1,d4] [c#2,a3], a4@5 e4@3 ~@8, ~@3 a4@2 ~@3", // C#m Bm F#m
  H: "d2@3 a2 ~ a2 a1@2 d2@8, [f#3,a3,d4]", // D
  I: "[g1,b4,d5,g5]@2 [g2,d5,g5,b5]@2 [a1,c#5,e5,a5] [e2,e5]@2 d2@2 a2 d3@6, ~@7 [a4,d5,f#5]@9", // G A E D
  J: "[g1,b4,d5,g5]@2 [g2,d5,g5,b5]@2 [a1,c#5,e5,a5] [e2,e5]@2 d2@2 a2 ~ [a4,f#5]@2 ~@2 [a4,c5,f#5], ~@7 [a4,d5,f#5]@3 d3@4 f#2@2, ~@11 d5 ~ [c5,f#5,a5]@2 ~", // G A E D F#dim D F#dim
  K: "[g1,b4,d5,g5]@2 g2@2 [a4,c#5,g5] e5 c#5 d2@2 d2 f#2 a2 c3!2 b2 a2, ~@4 a1@3 [f#4,a4,d5]@5 ~@4", // G A7 D
  L: "[g1,b4,d5,g5]@2 [g2,d5,g5,b5]@2 [c#5,e5,a5] e5@2 d2@2 d2 f#2 a2 c3!2 b2 a2, ~@4 a1@3 [a4,d5,f#5]@9", // G A D
  M: "[g1,b4,d5,g5]@2 g2@2 [a1,a4,c#5,g5] [c#2,e5] [e2,c#5] [f#4,a4,d5]@3 [e4,a4] f#4 [e4,a4] [f#4,a4] [e4,a4] d4, ~@7 d2@9", // G A7 C#m D A5 F#m A5
  N: "b3 d4 g4 [d4,g4,a4]@2 [d4,g4,b4]@2 g4 b3 d4 g4 [d4,g4,a4]@2 [d4,g4,b4]@2 a4, g1", // Dsus4 G Dsus4 G
  O: "[d4,f#4,b4] a4 f#4 d4@2 d4 [d4,f#4,b4] a4 f#4 d4@2 d4 [d4,f#4,b4] a4 f#4 d4, d2@3 c2", // Bm
  P: "d4 f4 a#4 [f4,a#4,c5]@2 [f4,a#4,d5]@2 d4!2 f4 a#4 ~@2 [f4,a#4,d5]@2 f4, a#1@8 a#1@3 [f4,a#4,c5]@2 ~@3, ~@3 c2", // Fsus4 A# Fsus4
  Q: "[f4,a4,d5] c5 a4 f4@2 f4 [f4,a4,d5] c#5 a4 e4@2 e4 [e4,a4,d5] c#5 a4 e4, f1 a1", // Dm Dsus2
  R: "f#4 d5 f#4 [b3,d4,g4]@2 d5 e4@2 [d2,a3,d4,f#4]@2 d4@2 f#4@2 a4@2, d2 ~", // G D
  S: "~ [g2,d4,g4,b4]!3 [g2,d4,g4,b4]@2 [d2,d4,f#4,a4]!3 [g2,d4,g4,b4]@2 [g2,d4,g4,b4]@3 [e2,e4,g4,c5]!2", // G D G C
  T: "[e2,e4,g4,c5] [f2,c4,f4,a4]@2 [f2,c4,f4,a4]@3 [c2,c4,e4,g4]!3 [c2,e4,g4,c5]@2 [c2,c4,f4,a4] [c2,e4,g4,c5]@4", // C F C F C
  U: "~ [g2,d5,g5,b5]!3 [g2,d5,g5,b5]@2 [d2,d5,f#5,a5]!3 [g2,d5,g5,b5]@2 [g2,d5,g5,b5]@3 [e2,e5,g5,c6]!2", // G D G C
  V: "[e2,e5,g5,c6] [f2,c5,f5,a5]@2 [f2,c5,f5,a5]@3 [c2,c5,e5,g5]!3 [c2,c5,e5,g5]@2 [c2,c5,f5,a5] [c2,c5,e5,g5]@4", // C F C F C
  W: "~ [c2,e5] [d2,c5] [e2,g4] d5 b4 g4 c5@2 [b4,c5] [a4,b4] g4 b4 g4 c4@2, ~@4 g2@3 a2@5 e2@4", // C D7 Em Cmaj7 Asus2
  X: "[f2,a4] [c2,f4] [f2,c4] [c4,e4,g4]@2 e4 c4 [f2,a3,c4,e4] [f2,a3,c4,e4]@2 [g2,g3,b3,d4]@2 c3@2 c2@2, ~@3 e2@4 ~@5 [e3,g3,c4]@4", // F F5 C Fmaj7 G C
  Y: "~ [c2,e6] [d2,c6] [e2,g5] d6 b5 g5 c6@2 [b5,c6] [a5,b5] g5 b5 g5 c5@2, ~@4 g2@3 a2@5 e2@4", // C D7 Em Cmaj7 Asus2
  Z: "[f2,a5] [c2,f5] [f2,c5] [c5,e5,g5]@2 e5 c5 [f2,a4,c5,e5] [f2,a4,c5,e5]@2 [g2,g4,b4,d5]@2 c2@2 c3@2, ~@3 e2@4 ~@5 [e4,g4,c5]@4", // F F5 C Fmaj7 G C
  AA: "[g1,b4,d5,g5]@2 g2@2 [a1,a4,c#5,g5] [c#2,e5] [e2,c#5] [d2,f#4,a4,d5]@9", // G A7 C#m D
  AB: "[f2,a4] [c2,f4] [f2,c4] g4@2 e4 c4 [f2,a3,c4,e4] [f2,a3,c4,e4]@2 [g2,g3,b3,d4]@2 c3@2 c2@2, ~@3 e2@4 ~@5 [e3,g3,c4]@4", // F F5 Fmaj7 G C
  AC: "[f2,a5] [c2,f5] [f2,c5] [c5,e5,g5]@2 e5 c5 [f2,a4,c5,e5] [f2,a4,c5,e5]@2 [g2,g4,b4,d5]@2 [e4,g4,c5]@2 ~ d4, ~@3 e2@4 ~@5 c2@3 ~", // F F5 C Fmaj7 G C
  AD: "f#4 d5 f#4 [b3,d4,g4]@2 d5 e4@2 f#5 d6 f#5 [b4,d5,g5]@2 d6 e5@2, d2!2", // G
  AE: "f#4 d5 f#4 [b3,d4,g4]@2 d5 [a1,e4]@2 [d2,a3,d4,f#4]@2 d4@2 f#4@2 a4@2, d2@3 ~@5", // G A5 D
  AF: "[b2,d4,f#4,b4] [a2,c#4,e4,a4] [e2,f#3,b3,d4,f#4] [a2,a3,c#4,e4]", // Bm A Bm A
  AG: "[b3,c4,e4]@2 b3 c4@2 d4 c4@2 [b3,d4]@2 g4@2 a4@2 [d4,g4,b4]@2, g4@5 [b3,d4]@2 ~, c2 b1", // Cmaj7 Bm G Bm
  AH: "[d2@3 a2 ~ a2 a1@2 d2@3 a2 ~ a2 a1@2 d2@3 ~ a2 ~ a2 a1@2 d2@3 a2 ~@2 a2 a1@2 d2@36 ~@10, [f#3,a3]@7 ~, d4@17 ~@23]/5", // F#m
})).s("gm_piano").gain(0.64)

// bass · slap bass 2
const bass = note(`<
  A B C B C B C D E B C B C B C D E F G@2 H I G I H J K L M N O C B C B C D E F P Q P Q R S R T G I H J R S R U K L M N
  V W X B C B C D E A Y Z@3
>`.pickRestart({
  A: "d2@3 a2 ~ a2 a1@2 d2@3 a2 ~ a2 a1@2", B: "d2@3 a2 ~ a2 a1@2 d2@2 ~@6", C: "b2@3 a2@5 e2@4 a2@4", D: "c2 b1",
  E: "a1@2 b1 c#2", F: "d2@3 a2 ~ a2 a1@2 d2@8", G: "g1@2 g2@2 a1 e2@2 d2@2 a2 d3@6",
  H: "g1@2 g2@2 a1 e2@2 d2@2 a2 d3@4 f#2@2", I: "g1@2 g2@2 a1@3 d2@2 d2 f#2 a2 c3!2 b2 a2",
  J: "g1@2 g2@2 a1 c#2 e2 d2@9", K: "g1", L: "d2@3 c2", M: "a#1@2 a#1 c2", N: "f1 a1", O: "d2@4 d2 ~@3",
  P: "~ g2!3 g2@2 d2!3 g2@2 g2@3 e2!2", Q: "e2 f2@2 f2@3 c2!3 c2@2 c2 c2@4", R: "~ c2 d2 e2 g2@3 a2@5 e2@4",
  S: "f2 c2 f2 e2@4 f2 f2@2 g2@2 c3@2 c2@2", T: "f2 c2 f2 e2@4 f2 f2@2 g2@2 c2@2 c3@2",
  U: "f2 c2 f2 e2@4 f2 f2@2 g2@2 c2@4", V: "d2!2", W: "d2@3 a1 d2 ~@3", X: "b2 a2 e2 a2",
  Y: "d2@3 ~ a2 ~ a2 a1@2 d2@3 a2 ~@2 a2", Z: "[a1 d2@18 ~@5]/3",
})).s("gm_slap_bass_2").gain(0.48)

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

// drums · snare
const snare = s("sd").struct("<~@18 A B A B A B A B ~@21 A B A B ~@22>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@6 x!2 ~@3",
})).gain(0.48)

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

// drums · low tom
const low_tom = s("lt").struct("<A B A@16 ~@8 A B A B A@9 ~@4 A B A B ~@4 A B A B A@2 B A B A@9 ~ C ~@2>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "x",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A B@16 C D C D C D C D ~ A ~ A ~ B@8 ~@5 A ~ A C D C D ~ A ~ A ~@2 A ~ A ~ B@7 ~ E ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x", C: "~ x ~ x", D: "~@4 x ~@4 x ~@2 x ~@3", E: "~@11 x ~@4",
})).gain(0.42)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A ~@25 A ~ A ~@14 A ~ A ~@5 A ~ A ~@2 A ~ A ~@9 B ~@3>".pickRestart({
  A: "~@3 x ~@2 x ~", B: "~@7 x ~@6 x ~",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@39 x ~ x ~@31>").gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 [~ x ~ x ~ x ~ x]!16 ~@13 [~ x ~ x ~ x ~ x]!8 ~@22 [~ x ~ x ~ x ~ x]!7 ~@5>")
  .gain(0.42)

// drums · congas
const congas = s("conga:18").struct("<A@2 ~@24 A@5 ~@12 A@4 ~@4 A@10 ~@7 A B C ~@2>".pickRestart({
  A: "x ~@3 x!2 ~@2 x ~@2 x ~ x ~@2", B: "x ~@4 x!2 ~@2 x ~@2 x ~@2 x", C: "~ x ~@6",
})).gain(1.92)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  A B ~@24 A B A B A ~@12 A B A B ~@4 A B A B A@2 B A B A ~@7 A C D ~@2
>`.pickRestart({
  A: "~@2 x ~@3 x!2 ~@2 x ~@3 x ~", B: "~@2 x ~@4 x ~@2 x ~@4 x", C: "~@3 x ~@4 x ~@2 x ~@4", D: "~ x ~@14",
})).gain(1.92)

stack(piano, bass, kick, snare, hihat, low_tom, open_hat, mid_tom, crash, tambourine, congas, congas_2)

More by Billy Joel