Strudelify

the jody grind

Horace Silver

KeyF majorTempo120 bpm
0:00/0:00
// the jody grind — Horace Silver
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/4792181; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  ~@11 A@2 B C B D B E ~ F G H I J B C B D B E ~ F G H I ~@12 K@8 L M N@2 O ~ O ~ O ~ O ~@3 O ~ P
>`.pickRestart({
  A: "[~@7 g3@2 bb3!2 g3 bb3@2 db4@2]/2", B: "~@7 bb3", C: "db4 bb3 c4 g3 bb3@2 ~@2", D: "eb4 db4 eb4 f4 db4 bb3 ~@2",
  E: "db4 bb3 ~ f3 eb3@2 db3@6 ~@4", F: "~@2 gb4 ~ b3@2 db4@2 g3@2 b3@2 gb3@2 e3@2", G: "a3@2 ab4 ~ eb4@2 db4@6 ~@4",
  H: "~@2 f5@4 ~ bb3", I: "e4 eb4 db4@2 bb3@2 ab3@2 bb3@2 ~@4 g3@2", J: "~ bb3!2 g3 bb3@2 db4@2",
  K: "[~@2 f4@2 g4 f4@11]/2", L: "~ gb4@3", M: "~ ab4@3", N: "[~@2 f4@2 g4!2 ~ f4@9]/2", O: "~@4 db4 eb4@2 db4",
  P: "e4 eb4 db4@2 bb3@2 ab3@2 bb3@4 f5@4",
})).s("gm_alto_sax").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  ~@11 A@2 B C B D B E ~ F G H I J B C B D B E ~ F G H I ~@12 K@8 L M N@2 O ~ O ~ O ~ O ~@3 O ~ P
>`.pickRestart({
  A: "[~@7 g3@2 bb3!2 g3 bb3@2 db4@2]/2", B: "~@7 bb3", C: "db4 bb3 c4 g3 bb3@2 ~@2", D: "eb4 db4 eb4 f4 db4 bb3 ~@2",
  E: "db4 bb3 ~ f3 eb3@2 db3@6 ~@4", F: "~@2 gb4 ~ b3@2 db4@2 g3@2 b3@2 gb3@2 e3@2", G: "a3@2 ab4 ~ eb4@2 db4@6 ~@4",
  H: "~@2 db4@4 ~ bb3", I: "e4 eb4 db4@2 bb3@2 ab3@2 bb3@2 ~@4 g3@2", J: "~ bb3!2 g3 bb3@2 db4@2",
  K: "[~@2 db4@2 eb4 db4@11]/2", L: "~ db4@3", M: "~ eb4@3", N: "[~@2 db4@2 eb4!2 ~ db4@9]/2", O: "~@4 bb3 c4@2 bb3",
  P: "e4 eb4 db4@2 bb3@2 ab3@2 bb3@4 db5@4",
})).s("gm_tenor_sax").gain(0.3)

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@11 A@2 B C B D B E ~ F G H I J B C B D B E ~ F G H I ~@12 K@8 L M N@2 O ~ O ~ O ~ O ~@3 O ~ P
>`.pickRestart({
  A: "[~@7 g4@2 bb4!2 g4 bb4@2 db5@2]/2", B: "~@7 bb4", C: "db5 bb4 c5 g4 bb4@2 ~@2", D: "eb5 db5 eb5 f5 db5 bb4 ~@2",
  E: "db5 bb4 ~ f4 eb4@2 db4@6 ~@4", F: "~@2 gb5 ~ b4@2 db5@2 g4@2 b4@2 gb4@2 e4@2", G: "a4@2 ab5 ~ eb5@2 db5@6 ~@4",
  H: "~@2 bb5@4 ~ bb4", I: "e5 eb5 db5@2 bb4@2 ab4@2 bb4@2 ~@4 g4@2", J: "~ bb4!2 g4 bb4@2 db5@2",
  K: "[~@2 f4@2 g4 f4@11]/2", L: "~ gb4@3", M: "~ ab4@3", N: "[~@2 f4@2 g4!2 ~ f4@9]/2", O: "~@4 f4 g4@2 f4",
  P: "e5 eb5 db5@2 bb4@2 ab4@2 bb4@4 bb5@4",
})).s("gm_trumpet").gain(0.3)

// other · piano
const piano = note("<A@4 B@2 A@2 C D E@2 F G H G I G J ~ K L M N F G H G I G J ~ K L M N ~@36 O>".pickRestart({
  A: "[bb3@3 f4 ~ ab4 ~ bb4@3 ab4 bb4 ab4@2 f4@2]/2", B: "[eb4@3 bb4 ~ db5 ~ eb5@3 db5 eb5 db5@2 bb4@2]/2",
  C: "a3@3 e4@2 d4 e4 a3", D: "b3@3 gb4@2 e4 gb4 b3", E: "[bb3@3 f4 ~ ab4 ~ bb4@3 ab4 bb4 ab4@2 f4 g4]/2",
  F: "g4 bb4!2 g4 bb4@2 db5@2", G: "~@7 bb4", H: "db5 bb4 c5 g4 bb4@2 ~@2", I: "eb5 db5 eb5 f5 db5 bb4 ~@2",
  J: "db5 bb4 ~ f4 eb4@2 db4@6 ~@4", K: "~@2 gb5 ~ b4@2 db5@2 g4@2 b4@2 gb4@2 e4@2", L: "a4@2 ab5 ~ eb5@2 db5@6 ~@4",
  M: "~@2 bb5@4 ~ bb4", N: "e5 eb5 db5@2 bb4@2 ab4@2 bb4@2 ~@4 g4@2", O: "e5 eb5 db5@2 bb4@2 ab4@2 bb4@4 bb5@4",
})).s("gm_piano").gain(0.3)

stack(alto_sax, tenor_sax, trumpet, piano)