Strudelify

Captain Jack

Billy Joel

KeyC majorTempo71 bpm
0:00/0:00
// Captain Jack — Billy Joel
// 71 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: track names are the Roland MT-32 patch names at their program numbers ("Pipe Organ" on 12, "Organ" on 11, "Organ 2" on 8), so with no bank select the whole file is read through the MT-32 patch table: ch 2 "Pipe Organ" Pipe Org 1 -> church organ; ch 3 "Organ" Elec Org 4 -> drawbar organ; ch 4 "Organ 2" Elec Org 1 -> drawbar organ
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(71/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 · church organ · "Pipe Organ"
const church_organ = note("<A B A C D@4 ~@14 E F ~@26 E F ~@26 E F ~@32 D@4 ~>".pickRestart({
  A: "g6 d6 g6 d6 g6 d6 [b4,g6] [c5,d6] f#6 d6 f#6 d6 f#6 d6 f#6 d6, b5@7 ~@9, g4@5 ~@3 [d5,a5]@3 ~ [b4,g5]@3 ~", // Em Csus2 D5 Em
  B: "e6 c6 e6 c6 c7 c6 [b4,e6] [c5,c6] g6 c6 e6 c6 [b4,g6] [d5,e6] g6 f#6, g5@5 ~@3, c5@5 ~@3 d5@3 ~@5", // E5 C Em Dsus2
  C: "e6 c6 e6 c6 c7 c6 e6 c6 g6 c6 e6 c6 g6 e6 f#6@2, c5, g5@5 ~@3", D: "[a4,c5,f5,a5]", E: "~@2 a4 b4 c5 d5 e5 g5",
  F: "d4 e4 f#4 g4 a4 b4 c5 d5",
})).s("gm_church_organ").gain(0.27)

// chords · drawbar organ · "Organ"
const drawbar_organ = note(`<
  ~@24 A B C D C B C E F G H I ~@16 A B C D C B C E F G H I ~@16 A B C D C B C E A B C D C B C E A B C D C B C E A B C D
  C B C E ~@5
>`.pickRestart({
  A: "[d4,g4,b4]!8 [d4,f#4,a4]!4 [d4,g4,b4]!4", B: "[e4,g4,c5]!7 [d4,f#4,a4]!9",
  C: "[d4,g4,b4]!7 [d4,f#4,a4]!5 [d4,g4,b4]!4", D: "[e4,g4,c5]!16", E: "[e4,g4,c5]!8 [e4,g4,c5]@8", F: "[a3,c4,f4]",
  G: "[a3,d4,f4]@3 [a4,c5,f5]", H: "[f4,a4,c5]@3 [f4,a4,c5,f5]", I: "[f4,a4,d5]",
})).s("gm_drawbar_organ").gain(0.27)

// chords · drawbar organ · "Organ 2"
const drawbar_organ_2 = note(`<
  ~@24 A B@2 C@2 B@2 D@8 ~@13 E B@2 C@2 B@2 D@8 ~@13 E B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 F@8 G H ~@6
>`.pickRestart({
  A: "[g2,g3]@6 [b2,b3] [c3,c4] [d3,d4]@3 ~ [b2,b3]@3 ~", // G B C D B
  B: "[[c3,c4]@6 [b2,b3] ~ [d3,d4]@3 ~ [d3,d4]@3 ~ [g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~, ~@7 [c3,c4]@16 [c3,c4]@9]/2", // C B D G B D B C
  C: "[~@16 [g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~, [c3,c4]@23 [c3,c4]@9]/2", D: "[c3,c4]/8",
  E: "[g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~, ~@7 [c3,c4]@9", // G B D B C
  F: "[[c3,c4]@6 [b2,b3] ~ [d3,d4]@3 ~ [d3,d4]@3 ~ [g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~@17 [g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~@7 [b2,b3] ~ [d3,d4]@3 ~ [d3,d4]@3 ~ [g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~@17 [g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~, ~@7 [c3,c4]@121]/8", // C B D G B D B G …
  G: "~@6 [b2,b3] ~ [d3,d4]@3 ~ [d3,d4]@3 ~", H: "[g2,g3]@6 [b2,b3] ~ [d3,d4]@3 ~ [b2,b3]@3 ~",
})).s("gm_drawbar_organ").gain(0.27)

// chords · synth strings 1 · "Unnamed" · F5
const synth_strings_1 = note("<~@116 [[f2,f3,c4,f4]]>").s("gm_synth_strings_1").gain(0.11)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@23 A B C B D B E B@2 ~@19 A B C B D B E B@2 ~@19 A B C B D B E B F B C B G B E B H B C B I B E B@3 J B K B E L M ~@5
>`.pickRestart({
  A: "~@9 x!3 ~ x ~@2", B: "x!2 ~ x", C: "x ~@3 x ~@7 x ~ x!2", D: "x ~ x ~@3 x!2", E: "x ~@3 x ~@7 x!4",
  F: "x ~@3 x ~@4 x!2 ~ x!3 ~", G: "x ~@3 x ~@4 x!7", H: "x ~@3 x ~@3 x!5 ~ x!2", I: "x ~@3 x ~ x!4 ~@2 x ~ x ~",
  J: "x ~@3 x ~@4 x!4 ~ x!2", K: "x ~@3 x ~@3 x ~ x!3 ~ x ~", L: "x!8", M: "x ~@3 x ~@7 x!2 ~@2",
})).gain(0.75)

// drums · hihat
const hihat = s("hh").struct("<~@24 [x!16]!8 ~@20 [x!16]!8 ~@20 [x!16]!32 ~@5>").gain(0.6)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@23 A ~ B ~ C ~ D ~@21 A ~ B ~ C ~ D ~@21 A ~ B ~ C ~ D ~ E ~ F ~ G ~ D ~ H ~ B ~ I ~ D ~@3 J ~ K ~ D ~@7
>`.pickRestart({
  A: "~@2 x!2", B: "~@11 x!3 ~@2", C: "~@11 x ~ x ~@2", D: "~@12 x!3 ~", E: "~@8 x!2 ~@2 x!2 ~@2", F: "~@11 x!4 ~",
  G: "~@9 x ~ x ~ x!2 ~", H: "~@13 x ~@2", I: "~@6 x ~ x ~@2 x ~ x ~@2", J: "~@8 x ~@2 x!4 ~", K: "~@8 x!2 ~ x ~ x ~@2",
})).gain(0.75)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@23 A ~ B ~ B ~ C ~@21 A ~ B ~ B ~ C ~@21 A ~ B ~ B ~ C ~ D ~ E ~ F ~ C ~ G ~ B ~ H ~ C ~@3 I ~ J ~ C ~@7
>`.pickRestart({
  A: "~@4 x ~ x!2 ~@8", B: "~@5 x ~@2", C: "~@11 x!2 ~@3", D: "~@6 x!2 ~ x ~@2 x ~@3", E: "~@5 x!2 ~",
  F: "~@8 x ~ x!3 ~@3", G: "~@8 x!5 ~@3", H: "~@6 x ~ x ~ x!3 ~@3", I: "~@7 x ~@2 x ~ x!2 ~@2", J: "~@3 x ~ x ~@2",
})).gain(0.75)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A@3 B A@17 ~ A ~ A ~ A@2 ~@4 A@17 ~ A ~ A ~ A@2 ~@4 A@17 ~ A ~ A ~ A@3 ~ A ~ A ~ A@3 ~ A ~ A ~ A@3 ~ A ~ A ~ A@5 B
  A
>`.pickRestart({
  A: "x", B: "~@3 x ~@4",
})).gain(0.23)

// drums · ride
const ride = s("rd").struct("<~@7 A B@16 ~@12 B@16 ~@12 B@16 ~@35 A B>".pickRestart({
  A: "x!2 ~@6", B: "x",
})).gain(0.38)

stack(
  church_organ, drawbar_organ, drawbar_organ_2, synth_strings_1, kick, snare, low_tom, hihat, mid_tom, high_tom, crash,
  ride
)

More by Billy Joel