Strudelify

Drill Instructor

Captain Jack

KeyE♭ majorTempo150 bpm
0:00/0:00
// Drill Instructor — Captain Jack
// 149.9 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 5 "TENOR SAX" named as a reed, played on tenor sax (its lead 2 sawtooth patch is not one)
// note: Full arrangement: all 153 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(149.9/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.

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@17 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~ A B C D A B C D A B C D A B C D A B C D A B C D
  ~@25 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~ A B C D A B C D ~@5
>`.pickRestart({
  A: "eb2 ~ eb2!3 ~ eb2!3 ~ eb2!3 ~ eb2!2", B: "bb1 ~ bb1!3 ~ bb1!3 ~ bb1!3 ~ bb1!2",
  C: "ab1 ~ ab1!3 ~ ab1!3 ~ ab1!3 ~ ab1!2", D: "ab1 ~ ab1!3 ~ ab1!2 bb1 ~ bb1!3 ~ bb1!2",
})).s("gm_synth_bass_2").gain(0.61)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@33 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@25 A@2 B@2 A@2 B@2 A@2 B@2
  A@2 B@2 ~@25 A@2 B@2 A@2 B@2 A@2 B@2 ~
>`.pickRestart({
  A: "[[eb4,g4] [d4,f4], bb3]/2", B: "[[ab3,c4,eb4]@3 [bb3,d4,f4]]/2",
})).s("gm_synth_strings_1").gain(0.31)

// bass · tenor sax
const bass_2 = note(`<
  ~ A B C D A B C D A B C D A B C D ~@8 E F G H E F G H E F G H E F G H E F G H E F G H ~ E F G H E F G H E F G H E F G
  H E F G H E F G H ~@8 I B C D A B C D I B C D A B C D ~ E F G H E F G H E F G H E F G H ~@8 E F G H E F G H E F G H E
  F G H ~ E F G H E F G H ~@5
>`.pickRestart({
  A: "eb2 ~ eb2@2 ~@2 eb2@2 ~@2 eb2@2 ~@2 eb2 bb2", B: "bb1 ~ bb1@2 ~@2 bb1@2 ~@2 bb1@2 ~@2 eb2 ab2",
  C: "ab1 ~ ab1@2 ~@2 ab1@2 ~@2 ab1@2 ~@2 eb2 ab2", D: "ab1 ~ ab1@2 ~@2 ab1@2 ~@2 bb1@2 ~@2 bb1 bb2",
  E: "eb2 ~ eb2!3 ~ eb2!3 ~ eb2!3 ~ eb2 eb3", F: "bb1 ~ bb1!3 ~ bb1!3 ~ bb1!3 ~ bb1 bb2",
  G: "ab1 ~ ab1!3 ~ ab1!3 ~ ab1!3 ~ ab1!2", H: "ab1 ~ ab1!3 ~ ab1!2 bb1 ~ bb1!3 ~ bb1!2",
  I: "~@2 eb2@2 ~@2 eb2@2 ~@2 eb2@2 ~@2 eb2 bb2",
})).s("gm_electric_bass_finger").gain(0.38)

// other · lead 1 square · "+EXPLOSION"
const lead_1_square = note(`<
  ~ A B C D A B C D A B C D A B C D ~@33 A B C D A B C D A B C D A B C D A B C D A B C D ~@25 A B C D A B C D A B C D A
  B C D ~@25 A B C D A B C D E B C D ~
>`.pickRestart({
  A: "g4 bb3 eb4 bb3 f4 bb3 eb4 bb3 g4 bb3 eb4 bb3 f4 bb3 bb4 bb3",
  B: "f4 bb3 eb4 bb3 f4 bb3 d4 bb3 f4 bb3 eb4 bb3 f4 bb3 bb4 bb3",
  C: "eb4 ab3 d4 ab3 eb4 ab3 c4 ab3 eb4 ab3 d4 ab3 eb4 ab3 c4 ab3",
  D: "eb4 ab3 d4 ab3 eb4 ab3 c4 ab3 f4 bb3 eb4 bb3 f4 bb3 bb4 bb3",
  E: "~@4 f4 bb3 eb4 bb3 g4 bb3 eb4 bb3 f4 bb3 bb4 bb3",
})).s("gm_lead_1_square").gain(0.35)

// other · lead 1 square · "SQUAREWAVE"
const lead_1_square_2 = note("<~@17 A B A C A B A D E ~@89 A B A C A B A D ~@30>".pickRestart({
  A: "eb4 bb3 eb4 bb3 eb4 ~ eb4 bb3", B: "eb4 bb3 eb4 bb3 eb4 ab3 eb4 ab3", C: "eb4 bb3 eb4 bb3 db4 ab3 db4 ab3",
  D: "eb4 ~ eb4 ~ eb4 ~ eb4 ~", E: "eb4 ~@7",
})).s("gm_lead_1_square").gain(0.57)

// other · pad sweep · "SQUAREWAVE"
const pad_sweep = note("<~@17 A@3 ~ B@4 ~@90 A@3 ~ B@4 ~@30>".pickRestart({
  A: "[[eb3,eb4]@37 ~@11]/3", B: "[eb3,eb4]/4",
})).s("gm_pad_sweep").gain(0.57).pan(0.6)

// other · woodblock
const woodblock = note("<~@20 A ~@11 A ~@24 A ~@15 A ~@7 A ~@24 A ~@15 A ~@24 A ~@5>".pickRestart({
  A: "~@2 eb6 ~ gb6 ~ gb6!2 ~ gb6!2 eb6 gb6 ~ eb6 ~",
})).s("gm_woodblock").gain(0.39)

// drums · rim
const rim = s("rim").struct("<~@20 A ~@11 A ~@24 A ~@15 A ~@7 A ~@24 A ~@15 A ~@24 A ~@5>".pickRestart({
  A: "~@2 x ~ x ~ x!2 ~ x!4 ~ x ~",
})).gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  ~@17 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
  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 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 D ~@4
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~", C: "x!2 ~@6", D: "x",
})).gain(0.73)

// drums · clap
const clap = s("cp").struct(`<
  ~ A B A C A B A C A B A C A B A C A B A C A B A C ~@8 A B A C A B A C ~@9 A B A C A B A C A B A C A B A C A B A C A B
  A C D E D F D E D F D E D F D E D F D E D F D E D F ~ A B A C A B A C A B A C A B A C A B A C A B ~@2 A B A C A B A C
  A B A C A B A C ~ A B A C A B A C ~@5
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "~@4 x ~@6 x!2 ~ x ~", D: "x!4", E: "x ~ x ~ x!3 ~",
  F: "x ~@3 x ~@2 x!2 ~ x ~ x ~@3",
})).gain(0.58)

// drums · snare
const snare = s("sd").struct("<~@33 A B A C A B A C ~@82 A B A C A B A C ~@22>".pickRestart({
  A: "~@3 x!2 ~@6 x!2 ~@3", B: "~@3 x!2 ~@11", C: "x!16",
})).gain(0.29)

// drums · hihat
const hihat = s("hh").struct("<~@5 A B@18 ~ B@24 ~ B@23 ~ C@24 ~ B@20 D ~@3 B@8 ~@9 B@8 ~@5>".pickRestart({
  A: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2", B: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", C: "x!4", D: "x",
})).gain(0.65)

// drums · open hat
const open_hat = s("oh").struct("<~@5 A@19 ~ A@24 ~ A@23 ~ A@24 ~ A@20 ~@4 A@8 ~@9 A@8 ~@5>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.65)

// drums · tambourine
const tambourine = s("tb").struct("<~@50 [x!16]!24 ~@25 [x!16]!16 ~@25 [x!16]!8 ~@5>").gain(0.22)

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

stack(
  bass, synth_strings_1, bass_2, lead_1_square, lead_1_square_2, pad_sweep, woodblock, rim, kick, clap, snare, hihat,
  open_hat, tambourine, crash
)

More by Captain Jack