Strudelify

The Groove Merchant

Thad Jones/Mel Lewis

KeyB♭ majorTempo128 bpm
0:00/0:00
// The Groove Merchant — Thad Jones/Mel Lewis
// 128 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Tenor Saxophone" named as a reed, played on tenor sax (its piano patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5691660; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 102 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/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 · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  A B C@3 D E F@3 G H I J@2 K L@2 M@2 N O P@2 Q R S T U@2 V W X Y Z AA AB AC AD AE AF AG AH AI AJ@2 AK AL AM ~@6 AN AO
  ~@7 AM ~@6 AN AO ~@6 AP L@2 M@2 N O P@2 Q R S T AQ@2 AR@2 AS AT AU ~ AV@2
>`.pickRestart({
  A: "[c4,c5]@2 [eb4,eb5] [f4,f5]@2 [ab4,ab5] ~@2 [ab3,ab4] ~@3", B: "[ab3,ab4]@2 ~@3 [ab3,ab4] ~@5 [b3,b4]",
  C: "[[c4,c5]@2 [eb4,eb5] [f4,f5]@2 [ab4,ab5] ~@2 [bb4,bb5] ~@2 [b4,b5]@3 [bb4,bb5] [ab4,ab5]@2 [f4,f5] [ab4,ab5]@2 [bb4,bb5] ~@2 [c5,c6]@3 [eb5,eb6] [b4,b5] [c5,c6] [eb5,eb6] [b4,b5] [c5,c6] [eb5,eb6] [b4,b5] [c5,c6] [eb5,eb6]]/3", // C Eb F Ab Bb B Bb Ab …
  D: "[f5,f6]@2 [eb5,eb6] [ab5,ab6]@2 [ab4,ab5] ~@3 [bb4,bb5] [db5,db6] [d5,d6]", // F Eb Ab Bb Db D
  E: "[eb5,eb6]@2 [db5,db6] [gb4,gb5] [g4,g5] [bb4,bb5]@3 [g4,g5] [c5,c6]@2 [f5,f6]", // Eb Db Gb G Bb G C F
  F: "[[eb5,eb6]@4 [eb4,eb5]@2 [db5,db6]@4 [db4,db5]@2 [b4,b5]@2 [c5,c6]@2 [ab4,ab5]@2 [bb4,bb5]@2 [f4,f5]@2 [ab4,ab5]@11 ~ [c4,eb4,ab4,f5,bb5,c6]@11 ~ [eb4,ab4,c5,eb5,gb5,c6]@11 ~ [c5,eb5,gb5,c6,eb6,gb6]@2 ~@10 e6@2]/3", // Eb Db B C Ab Bb F Ab …
  G: "f6@2 db6 bb5@2 [f4,ab4,b4,db5,ab5] ~@5 e6, [f4,ab4,b4,db5]@3 ~@5", // Db7
  H: "f6@2 d6 b5@2 [f4,ab4,b4,d5,ab5] ~@3 [eb4,eb5] [f4,f5] [ab4,ab5], [f4,ab4,b4,d5]@3 ~@5", // Fdim Eb F Ab Fdim
  I: "[eb4,ab4,c5,ab5,c6,eb6]@2 [eb4,ab4,c5,ab5,c6,eb6] [eb4,ab4,c5,ab5,c6,eb6]@2 [eb4,ab4,c5,ab5,c6,eb6] [e4,bb4,db5,g5,bb5,e6]@2 [e4,bb4,db5,g5,bb5,e6] [e4,bb4,db5,g5,bb5,e6]@2 [e4,bb4,db5,g5,bb5,e6]", // Ab Edim
  J: "[f6@2 eb6 ab6@2 [f4,ab4,b4,eb5,ab5] ~@2 [eb4,eb5] [gb4,gb5]@2 [ab4,ab5]@4 [b4,d5,e5,ab5]@3 [bb4,db5,eb5,g5]@3 [a4,db5,e5,g5]@3, [f4,ab4,b4,eb5]@3 ~@13]/2", // Fm7b5 Eb Gb Ab E7 Eb7 A7 Fm7b5
  K: "[ab4,c5,eb5,ab5]@6 ~@6 eb3 f3@3 ab3@2 ab3@4 f3@2", // Ab
  L: "[bb3 c4@3 [ab3,c4,eb4,f4,bb4,c5]@2 ~@6 [ab3,c4,eb4,f4,bb4,c5]@4 ~@2 [ab3,c4,eb4,f4,bb4,c5]@4 ~@8 eb3@4 e3@2 f3@4 ab3@2 ab3@4 f3@2, ~@22 [ab3,b3,db4,eb4,f4,ab4,b4]@19 ~@7]/2", // Fm7 Db7
  M: "[ab3@6 [ab4,ab5]@4 [f4,f5]@2 [eb4,b4]@4 ab4@2 [ab3,db4,f4,bb4]@4 [ab3,c4,eb4,ab4]@13 ~ ab3@4 ab3@2 ~@4 f3@2, ~ [ab3,c4] [ab3,b3] ~@3 [f3,bb3,db4,f4,bb4] [eb3,ab3,db4,f4,ab4,db5]]/2", // Ab F Abm Bbm7 Ab Abm Bbm Db
  N: "[b3,c4] c4@3 ~@2 [g3,b3,d4,e4,a4,b4]@4 [ab3,c4,eb4,f4,bb4,c5]@2 ~@4 [bb3,d4,e4,g4,bb4,c5,e5]@8, [ab3,eb4,f4,bb4,c5]@2 eb4@3 ~@7", // Cmaj7 Em7 Fm7 C7 Fm7
  O: "[ab3,c4,eb4,ab4,c5,f5]@3 f4@2 ~ bb3!2 [ab3,bb3,d4,f4,ab4,d5] ab3@2 f3, ~@3 [ab3,d4,f4,ab4,d5] ~@2, ~@12 b3 ~@11", // Fm7 Bb7 Ddim
  P: "[bb3@2 [g3,bb3,db4,g4,bb4,eb5] ~@3 [ab3,bb3,d4,f4,ab4,d5]@2 ~ [ab3,bb3,d4,f4,ab4,d5]@2 ~@7 c4@2 eb4 eb4@2 c4, ~@22 [g3,bb3,db4,g4,bb4,eb5]@25 ~]/2", // Eb7 Bb7 Eb7
  Q: "[ab3,c4,eb4,f4,ab4,c5,f5]@2 [ab3,c4,eb4,bb4,c5,eb5]@7 [gb3,ab3,c4,gb4,ab4,c5]@2 [ab3,c4,gb4,bb4,eb5]", // Fm7 Ab Ab7
  R: "~@3 ab5 gb5 eb5 [f3,d5]@2 [ab3,db5] [ab3,b4]@2 [f3,ab4], ~@6 [gb3,c4,eb4]@17 ~", // Dm Db5 Abm Fm Cdim
  S: "[f3,ab3,bb3,db4,f4,bb4]@2 [f3,ab3,b3,f4,ab4]@7 [f3,ab3,f4,ab4]@2 [f3,ab3,c4,d4,ab4]", // Bbm7 Fdim Fm Dm7b5
  T: "~@2 [f4,ab4,b4,d5,f5,ab5] ~@3 [f3,f4,ab4,b4,d5,f5,ab5]@2 ab3 f4@2 e4", // Fdim
  U: "[eb4@2 [eb3,ab3,c4,eb4,ab4,c5] eb4@2 e4 ~@2 [e3,g3,bb3,g4,bb4,db5] ~@2 [eb4,f4]@3 eb4 b3@2 bb3 b3@3 b3@2 ab3, ~@22 [ab3,ab4,b4,f5]@13 ~ [gb3,ab3,ab4,b4,eb5]@11 ~, ~@11 b3@4 ~@9]/2", // Ab Edim Ebsus2 Fdim Abm7
  V: "[f4,ab4,d5]@2 [db4,f4,ab4,db5] ab3@2 ab3 [eb3,gb3]@2 eb3 db3@2 b2, [f3,bb3,d4] [e3,b3,d4,gb4,b4] [g3,bb3,db4,gb4,bb4] [e3,g3,a3,db4,e4,a4]", // Ddim Db Ebm Bb Bm Gb A7
  W: "[ab2,c3,eb3,ab3,c4,eb4,ab4]@6 ~@6 g3 ab3@3 c4@2 c4@4 ab3@2", X: "[db4,eb4] eb4@5 ~@18, [eb3,ab3,c4,ab4]@23 ~",
  Y: "b3@3 b3@2 c4 db4@2 c4 c4@2 ab3, [db3,f3,ab3,eb4,ab4]@23 ~", Z: "[eb3,ab3,c4,eb4,ab4]@23 ~",
  AA: "[eb3,ab3,c4,eb4,ab4]@11 ~ f4@4 f4@2 db4@4 db4@2, ~@2 [f3,bb3,db4,ab4] [eb3,ab3,f4,ab4]", // Ab Bbm7 Fm7
  AB: "[f4,ab4] ab4@3 ~@8 [e3,bb3,db4,e4,g4]@11 ~, [eb3,ab3,c4,eb4]@11 ~@13, ~ c5@5", // Fm Edim Ab
  AC: "ab4@6 ab4@4 ~@2 ab4 ~ g4@4 f4@4 db4@2, [eb3,f3,ab3,c4,f4]@11 ~ [d3,f3,ab3,d4,bb4]@11 ~, ~@2 f4 ~", // Fm7 Bb7
  AD: "[db3,f3,bb3,eb4,g4,bb4]@11 ~ [d3,f3,ab3,d4,f4,bb4]@11 ~", // Eb7 Bb7
  AE: "~@6 ab4@2 c5 c5@2 ab4, [db3,f3,bb3,eb4,g4,bb4]@23 ~", AF: "[c5,db5]@2 c5@7 f4@2 ab4, [c3,eb3,ab3,eb4,ab4]@23 ~",
  AG: "~@6 db4@2 f4 f4@2 db4, [c3,eb3,ab3,eb4,gb4,c5]@23 ~", AH: "gb4@2 f4@7 db4@2 c4, [db3,f3,ab3,eb4,ab4,b4]@23 ~",
  AI: "f3@6 f3@2 ab3 f4@2 e4, [d3,ab4,b4]@23 ~, f4@3 ~, ab3@2 ~", // Abdim
  AJ: "[[eb3,ab3,c4,eb4,ab4,c5]@5 e4 [e3,g3,bb3,db4,g4,bb4]@5 ~ eb4@2 eb4 b3 bb3 ab3 b3@3 b3@2 ab3, ~@11 f4@3 ~@10, ~@24 [f3,ab3,ab4,b4]@11 ~ [gb3,ab3,eb4,ab4,b4]@11 ~, ~@4 b3 ~@3]/2", // Ab Edim Fdim Abm7
  AK: "db4@2 db4@4 ab3@2 ab3@4 eb3@2 eb3@4 db3 ~ b2@4, [d3,f3,bb3,f4,ab4] [e3,b3,d4,gb4,b4] [g3,bb3,db4,gb4,bb4] ~, d4 ~@11 gb3 ~@5 [e3,g3,a3,db4,e4,a4]@6", // Bb7 Bm Gb A7
  AL: "[ab2,c3,eb3,ab3,c4,eb4,ab4]@3 ~@3 [d4,d5] [db4,eb5] [c4,e5] [b3,f5] [bb3,gb5] [a3,g5]", // Ab D Dbsus2 C Bdim Ebm A7
  AM: "[ab3,c4,eb4,eb5,f5,ab5]@6 [ab3,c4,eb4,eb5,f5,ab5]@3 [g3,b3,d4,d5,e5,g5]@2 [ab3,c4,eb4,eb5,f5,ab5]", // Fm7 Em7 Fm7
  AN: "~@8 [eb3,eb4] [f3,f4]@2 [ab3,ab4]", AO: "~@4 [ab3,ab4]@2 ~@6 [ab3,ab4]@3 ~@7 [ab3,ab4]@2",
  AP: "~@12 eb3 f3@3 ab3@2 ab3@4 f3@2",
  AQ: "[eb4@2 [eb3,ab3,c4,eb4,ab4,c5] eb4@2 e4 ~@2 [e3,g3,bb3,g4,bb4,db5] ~@2 [eb4,f4]@3 eb4 b3@2 bb3 ~@3 f4@2 e4, ~@22 [ab3,ab4,b4,f5]@13 ~ [gb3,ab3,b3,ab4,b4,eb5]@11 ~, ~@11 b3@4 ~@9]/2", // Ab Edim Ebsus2 Fdim Abm7
  AR: "[eb4@2 [eb3,ab3,c4,eb4,ab4,c5] ~@2 e4 ~@2 [e3,g3,bb3,g4,bb4,db5] ~@2 [eb4,f4]@3 eb4 b3 bb3 ab3 ~@3 f4@2 e4, ~@22 [ab3,ab4,b4,f5]@13 ~ [gb3,ab3,b3,ab4,b4,eb5]@11 ~, ~@11 b3@4 ~@9]/2", // Ab Edim Ebsus2 Fdim Abm7
  AS: "eb4@2 eb4@3 eb4 e4@2 ~@3 e4, ~ [eb3,ab3,c4,ab4,c5]@2 ~ [e3,g3,bb3,g4,bb4,db5]@2", // Ab Edim
  AT: "f4@2 ~ f4@2 ~ [d3,ab3,b3,b4,d5,f5]@6, ~ [ab3,b3,eb4,b4,f5]@2 ~@3, ~@2 ab4@3 ab4@7", // Ddim Fm7b5
  AU: "b4@3 ab4@2 f4 ~@3 f4@2 [eb3,ab3,c4,ab4,c5,eb5], [d3,f3,ab3,bb4,d5,f5]@4 [db3,g3,bb3,g4,bb4,f5]@3 ~", // Ab Bb7 Gm7b5
  AV: "[~@8 f5@23 ~@17, ~@5 [ab2,ab3,f4]@26 ~@17, ~@6 [eb3,bb4]@25 ~@17, ~@7 [gb3,c5]@24 ~@17]/2", // Db Eb5 Gbdim
})).s("gm_tenor_sax").gain(0.25)

// other · electric guitar jazz · "Electric Guitar"
const electric_guitar_jazz = note(`<
  ~@16 A B C D E F G H I D J K L@2 M N ~@15 O P ~@6 Q R ~@7 P ~@6 Q R ~@6 S A B C D E F G H I D J K T@2 U@2 V W X ~ Y@2
>`.pickRestart({
  A: "bb3 c4@5 ~@18", B: "~@3 eb3@2 e3 f3@2 ab3 ab3@2 f3", C: "ab3 ~@3", D: "~@6 f3@2 ab3 ab3@2 f3",
  E: "b3 c4@3 eb4@20", F: "~@6 f4@4 ~@2 b3 ~ bb3@4 ab3@4 f3@2", G: "bb3 ~@3", H: "~@6 c4@2 eb4 eb4@2 c4",
  I: "f4@2 eb4@7 c4@2 ab3", J: "bb3@2 ab3@7 f3@2 ab3", K: "~@6 f3@2 ab3 f4@2 e4",
  L: "[eb4@3 eb4@2 e4 ~@5 f4@3 eb4 b3@2 bb3 ab3@3 b3@2 ab3]/2", M: "d4@2 db4 b3@2 ab3 gb3@2 eb3 db3@2 b2", N: "ab2 ~@3",
  O: "~@6 d4 eb4 e4 f4 gb4 g4", P: "[f3,bb3,eb4,ab4]@6 [f3,bb3,eb4,ab4]@3 [e3,a3,d4,g4]@2 [f3,bb3,eb4,ab4]",
  Q: "~@8 eb4 f4@2 ab4", R: "~@4 [ab3,ab4]@2 ~@6 [ab3,ab4]@3 ~@7 [ab3,ab4]@2", S: "~@12 eb3 f3@3 ab3@2 ab3@4 f3@2",
  T: "[eb4@3 eb4@2 e4 ~@5 f4@3 eb4 b3@2 bb3 ab3@3 f4@2 e4]/2", U: "[eb4@3 ~@2 e4 ~@5 f4@3 eb4 b3 bb3 ab3@4 f4@2 e4]/2",
  V: "eb4@2 ~@3 eb4 e4@2 ~@3 e4", W: "f4@2 ~ f4@2 ab4@7", X: "b4@3 ab4@2 f4 bb4@3 f4@2 ab4",
  Y: "[~@9 bb4@22 ~@17, ~@5 ab2@26 ~@17, ~@6 gb3@25 ~@17, ~@7 c4@24 ~@17, ~@8 f4@23 ~@17]/2",
})).s("gm_electric_guitar_jazz").gain(0.25)

// bass · acoustic bass
const bass = note(`<
  A B C@2 D E F G H I J K L M N O A B C@2 D E F G H I J K L M N O A B C@2 D E F G H I J K L M N P A B C@2 D E F G H I J
  K L M N Q A B C@2 D E F G H I J K L M N O A B C@2 D E F G H I J K L M L M L R S ~ T@2
>`.pickRestart({
  A: "ab1 c2 eb2 c2", B: "db2 b1 bb1 eb2", C: "[ab2@3 eb2@3 c2@3 f2@2 ab2@4 c2@3 bb1@3 eb2@3]/2",
  D: "ab1@3 bb1@3 c2@2 d2 e2@3", E: "f2 eb2 d2 bb1", F: "eb2 g2 ab2 bb2", G: "eb2@2 eb2 db2@3 c2@3 bb1@3",
  H: "ab1 eb2 ab2 gb2", I: "f2 eb2 db2 c2", J: "db2 eb2 f2 eb2", K: "d2 f2 ab2 d2", L: "eb2 ab1 e2 g2",
  M: "ab2 f2 gb2 b1", N: "bb1 e2 eb2 a1", O: "ab1 ~@3", P: "ab1 ~ bb1 eb2", Q: "ab1@3 eb2@2 ab2@4 eb2@2 g1",
  R: "ab2 f2 d2 ab1", S: "bb1@3 d2@3 eb2@3 ab2@2 ab1", T: "[~@5 ab1@26 ~@17]/2",
})).s("gm_acoustic_bass").gain(0.25)

// drums · kick
const kick = s("bd").struct("<[x!2]!99 ~ [~@2 x ~@2 x ~@18] ~>").gain(0.25)

// drums · snare
const snare = s("sd").struct("<A@15 B A@15 B A@15 B A@31 B A@19 ~ C ~>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~@5 x ~@18",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<~@99 [~@19 x ~@3 x] [~@5 x ~@18] ~>").gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@99 [~@13 x ~@2 x ~@7] ~@2>").gain(0.45)

// drums · high tom
const high_tom = s("ht").struct("<~@99 [~@5 x ~@6] ~@2>").gain(0.45)

// drums · crash
const crash = s("cr").struct("<A ~@15 A ~@15 A ~@15 A ~@15 A ~@15 A ~@19 B ~>".pickRestart({
  A: "x", B: "~@5 x ~@18",
})).gain(0.25)

// drums · ride
const ride = s("rd").struct("<A B@14 C A B@14 C A B@14 C A B@15 A B@14 C A B@18 ~@3>".pickRestart({
  A: "~@3 x ~ x!2 ~@2 x ~ x", B: "x ~@2 x ~ x!2 ~@2 x ~ x", C: "x ~@5 x ~@2 x ~ x",
})).gain(0.25)

stack(tenor_sax, electric_guitar_jazz, bass, kick, snare, low_tom, mid_tom, high_tom, crash, ride)