Strudelify

Return of the Mack

Mark Morrison

KeyA minorTempo97 bpm
0:00/0:00
// Return of the Mack — Mark Morrison
// 97 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(97/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.

// other · orchestra hit · A
const orchestra_hit = note("<[[a3,a4] ~@15] ~@3 [[a3,a4] ~@15] ~@51 [[a3,a4] ~@15] ~@29>")
  .s("gm_orchestra_hit").gain(0.24)

// other · string ensemble 1
const string_ensemble_1 = note("<~@24 A@8 ~@16 A@8 ~@12 A@16 ~@2>".pickRestart({
  A: "a6/8",
})).s("gm_string_ensemble_1").gain(0.12)

// bass · electric bass finger
const bass = note(`<
  ~@8 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@4 A@2 B C A@2 B
  C A@2 B C A@2 B C A@2 B C A@2 B C D ~
>`.pickRestart({
  A: "a1@3 e1 ~@2 d1@6 ~@2 g1@2", B: "a1@3 e1 ~@2 d1@6 d2@2 a1@2", C: "e1 a1 e2 d2@3 ~ g1", D: "a1",
})).s("gm_electric_bass_finger").gain(0.38)

// other · pad metallic
const pad_metallic = note(`<
  ~@3 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@6 B@2 ~@6 B@2 ~@2 A@2 ~@2 A@2 ~@6 C ~@7 B@2 ~@2 A@2 ~@6 C ~@7 B@2 ~@6 D E ~
>`.pickRestart({
  A: "[[d4,d5]@11 ~@5]/2", B: "[[d4,d5]@9 ~@7]/2", C: "[d4,d5]@7 ~", D: "[d4,d5]", E: "[a4,a5]",
})).s("gm_pad_metallic").gain(0.2)

// other · soprano sax
const soprano_sax = note("<~@8 A ~ B C ~@2 D C ~@16 E@2 B C ~ F D C ~@46>".pickRestart({
  A: "~@10 e4 d4 e4@2 ~@2", B: "~@14 e4!2", C: "d4 ~ d4!2 ~ e4 e4@3 ~@7", D: "~@14 e4 ~", E: "~@7 e4 ~ d4 ~ e4 ~@4",
  F: "~@6 c4 ~ d4 ~ e4 ~ c4 ~@3",
})).s("gm_soprano_sax").gain(0.49).pan(0.8)

// other · electric guitar jazz
const electric_guitar_jazz = note(`<
  [e5 ~ e5 d5 ~ d5!2 ~ e5 ~ e5 ~@5]!8
  ~@16
  [e5 ~ e5 d5 ~ d5!2 ~ e5 ~ e5 ~@5]!8
  ~@16
  [e5 ~ e5 d5 ~ d5!2 ~ e5 ~ e5 ~@5]!12
  ~@8
  [e5 ~ e5 d5 ~ d5!2 ~ e5 ~ e5 ~@5]!16
  ~@2
>`).s("gm_electric_guitar_jazz").gain(0.18)

// chords · epiano1
const epiano1 = note(`<
  ~@3 A B C B D@2 E F C D E F C D E F C D E F G H@3 G H@3 C D E F C D E F C D E F C D E F G H@3 G H@3 C ~@3 A D E F C D
  E F G H@3 G H@3 C H@3 G H@3 C I ~
>`.pickRestart({
  A: "~@5 g4 f4 e4", B: "[e3,g3,b3,d4]@5 ~ [d3,f3,a3,c4]@8 ~@2",
  C: "[e3,g3,b3,d4]@2 ~ [e3,g3,b3,d4] ~@2 [f3,a3,c4,e4]@8 ~@2", // Em7 Fmaj7
  D: "[e3,g3,b3,d4]@3 [e3,g3,b3,d4] ~@2 [f3,a3,c4,e4]@8 ~@2", E: "[e3,g3,b3,d4]@3 [e3,g3,b3,d4] ~@2 [f3,a3,c4,e4]@9 ~",
  F: "[e3,g3,b3,d4]@2 ~ [e3,g3,b3,d4] ~@2 [f3,a3,c4,e4]@9 ~", // Em7 Fmaj7
  G: "[e3,g3,b3,d4]@2 ~ [e3,g3,b3,d4] ~@2 e4@6 e4@2 g4@2, ~@3 [f3,a3,c4]@4 ~", // Em7 F
  H: "[a3,c4,e4,g4]@2 ~ [a3,c4,e4,g4] ~@2 [f3,a3,c4,e4]@8 ~@2", I: "[e3,a3,c4,e4]",
})).s("gm_epiano1").gain(0.19)

// drums · kick
const kick = s("bd").struct("<A@7 B A@15 B A@23 B A@19 B A@16 C ~>".pickRestart({
  A: "x!2 ~@4 x ~ x ~@7", B: "x!2 ~@4 x ~@9", C: "x",
})).gain(0.47)

// drums · snare
const snare = s("sd").struct("<A@7 B A@15 B A@23 B A@19 B A@16 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.53)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!23 [~ x ~@2] [~ x ~ x]!23 [~ x ~@2] [~ x ~ x]!19 [~ x ~@2] [~ x ~ x]!16 ~@2>")
  .gain(0.42)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  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 ~@3
>`.pickRestart({
  A: "~@3 x ~@3 x", B: "~@3 x ~ x ~@2",
})).gain(0.26)

// drums · crash
const crash = s("cr").struct(`<
  A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@3 A ~@7 A ~@7 A ~@7 A ~
>`.pickRestart({
  A: "x",
})).gain(0.42)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!8]!23 [x!4 ~@4] [x!8]!23 [x!4 ~@4] [x!8]!19 [x!4 ~@4] [x!8]!16 ~@2>")
  .gain(1.33)

stack(
  orchestra_hit, string_ensemble_1, bass, pad_metallic, soprano_sax, electric_guitar_jazz, epiano1, kick, snare, clap,
  hihat, hihat_soft, crash, cabasa
)