Strudelify
KeyF majorTempo130 bpm
0:00/0:00
// Moanin' — Art Blakey and the Jazz Messengers
// 130 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5921332; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 129 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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 · trumpet
const trumpet = note(`<
  ~ A ~ A ~ A ~ A B C D E F E B C G H I@3 H J@2 ~ A ~ A ~ A ~ A ~@44 A ~ A ~ A ~ A B C D E F E B C G H I@3 H J@2 ~ A ~ A
  ~ A ~ A B C D E F E B C G H I@3 H I@3 H K@2 L@2
>`.pickRestart({
  A: "~@6 bb4@5 a4", B: "~@2 f4 ~@2 f4 ab4@2 ab4 f4@2 c4", C: "eb4 f4@2 ~", D: "~@4 f4@2 ~@4 f4@2 ab4@6 bb4@3 bb4 b4 ~",
  E: "bb4 ab4 ~ f4 ~@2 f4@12 ~@6", F: "~@4 f4@2 ~@3 f4 b4 ~ c5@6 eb5@3 bb4 b4 ~", G: "~@2 f4!2",
  H: "bb4 b4 c5@10 b4 bb4 ab4 f4@3 bb4@4 f4@2", I: "[ab4@5 f4 eb4@2 c4 eb4@2 f4@19 f4@3 f4@3]/3",
  J: "[ab4@5 f4 ab4@2 f4 ab4@2 c5@7 eb5@2 c5 bb4@2 c5]/2", K: "[ab4@5 f4 ab4@2 f4 ab4@2 bb4@13]/2", L: "[f4@3 ~]/2",
})).s("gm_trumpet").gain(0.3)

// chords · piano
const piano = note(`<
  A B C D E D A F ~ G ~ G ~ G ~ G ~ H I@2 J H K L A B C D E D A F ~ M N O N O N O N O N H P Q R H K L M N O N M N O N O
  N O N O N H P Q R H K L M N O N A B C D E D A F ~ G ~ G ~ G ~ G ~ H I@2 J H K L A B C D E D A F ~ G ~ G ~ G ~ G ~ H
  I@2 S H I@2 J H K ~ T@2
>`.pickRestart({
  A: "~@4 f4@2 ~@4 f4@2 ab4@3 ~ ab4@2 f4@3 ~ c4@2", B: "eb4@3 ~@3 f4@6 [d3,f3,bb3,c4]@9 ~ [c3,f3,a3]@2",
  C: "~@4 f4@2 ~@4 f4@2 ab4@6 bb4@4 bb4 ~", D: "b4 bb4 ab4 f4 ~@2 f4@6 [d3,f3,bb3,c4]@9 ~ [c3,f3,a3]@2",
  E: "~@4 f4@2 ~@3 f4 bb4 b4 c5@6 eb5@4 c5 ~", F: "eb4@6 f4@6 [d3,f3,bb3,c4]@9 ~ [c3,f3,a3]@2",
  G: "~@12 [d3,f3,bb3,c4]@9 ~ [c3,f3,a3]@2", H: "[bb2,g3,bb3,db4,f4,ab4,c5]@11 ~ [ab2,gb3,ab3,c4,eb4,gb4,bb4]@11 ~",
  I: "[[g2,f3,g3,b3,d4,gb4,ab4]@11 ~ [gb2,eb3,c4,eb4,gb4,bb4,eb5]@9 ~ [bb4,f5]@6 ~@8 [g3,bb3,d4,f4]@11 ~, ~@22 [f2,d3]@25 ~]/2", // G7 Cm7b5 Bb5 Gm7 Dm
  J: "[f3,ab3,c4,eb4]@11 ~ [f2,eb3,a3,f4]@3 ~@3 [f2,eb3,a3,f4]@3 ~@3", K: "[g2,f3,g3,b3,d4,gb4,ab4]@23 ~",
  L: "[g2,f3,g3,bb3,d4,f4]@11 ~ [c4,eb4,g4,bb4]@10 [c3,bb3]@2, ~@4 [c3,bb3]@3 ~", // Gm7 Cm7 C7
  M: "[f2,eb3,c4,eb4,f4,ab4,d5]@11 ~ [ab2,gb3,ab3,c4,eb4,gb4,bb4]@11 ~", // Fm7 Ab7
  N: "[g2,f3,g3,bb3,d4,f4]@11 ~ [gb2,eb3,c4,eb4,gb4,bb4]@11 ~", // Gm7 Cm7b5
  O: "[f2,eb3,c4,eb4,f4,ab4,c5]@11 ~ [ab2,gb3,ab3,c4,eb4,gb4,bb4]@11 ~", // Fm7 Ab7
  P: "[g2,f3,g3,b3,d4,gb4,ab4]@11 ~ [gb2,eb3,c4,eb4,gb4,bb4,eb5]@11 ~", Q: "[f2,d3,g3,bb3,d4,f4]@23 ~",
  R: "[f2,d3,d4,f4,ab4,bb4]@11 ~ [f2,eb3,a3,f4]@11 ~", S: "[f3,ab3,c4,eb4]@23 ~", T: "[[f2,c3,c4,f4,a4,c5]@17 ~@7]/2",
})).s("gm_piano").gain(0.25)

// bass · acoustic bass
const bass = note(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B C D E B C F ~ A ~ A ~ A ~ A ~ G H G H G H G H G H B C D E B C F G H G H G H G H G
  H G H G H B C D E B C F G H G H ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B C D E B C F ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B C
  D I B C D E B C J K@2
>`.pickRestart({
  A: "~@6 d2@5 c2", B: "bb2 ab2 gb2 f2", C: "g2 gb2 eb2 d2", D: "c2 f1 g1 ab1", E: "c2 d2 eb2!2", F: "c2@6 c2@5 c2",
  G: "f2 ab1", H: "f2@5 g1 c2@3 eb2@3", I: "c2 d2 f2!2", J: "bb1", K: "[f1@3 ~]/2",
})).s("gm_acoustic_bass").gain(0.3)

// other · trombone
const trombone = note(`<
  ~ A ~ A ~ A ~ A B C D E F E B C G H I@3 H J@2 ~@5 A ~ A ~@44 A ~ A ~ A ~ A B C D E F E B C G H I@3 H J@2 ~ A ~ A ~ A ~
  A B C D E F E B C G H I@3 H K@3 H L@2 M@2
>`.pickRestart({
  A: "~@6 f3@5 f3", B: "~@2 f3 ~@2 f3 ab3@2 ab3 f3@2 c3", C: "eb3 f3@2 ~", D: "~@4 f3@2 ~@4 f3@2 ab3@6 bb3@3 bb3 b3 ~",
  E: "bb3 ab3 ~ f3 ~@2 f3@12 ~@6", F: "~@4 f3@2 ~@3 f3 b3 ~ c4@6 eb4@3 bb3 b3 ~", G: "~@2 f3!2",
  H: "bb3 b3 c4@10 b3 bb3 ab3 f3@3 bb3@4 f3@2", I: "[ab3@5 f3 eb3@2 c3 eb3@2 bb3@9 ab3 g3@2 ab3@7 f3@3 f3@3]/3",
  J: "[ab3@5 f3 ab3@2 f3 ab3@2 c4@7 eb4@2 c4 bb3@2 c4]/2", K: "[ab3@5 f3 ab3@2 f3 ab3@2 d4@19 f3@3 f3@3]/3",
  L: "[ab3@5 f3 ab3@2 f3 ab3@2 d4@13]/2", M: "[c4@3 ~]/2",
})).s("gm_trombone").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@17 A ~ A ~ A ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@19 A ~ A ~ A
  ~@19 A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "~ x ~@2",
})).gain(0.2)

// drums · rim
const rim = s("rim").struct("<~@16 [~@2 x!2] ~@74 [~@2 x!2] ~@23 [~@2 x!2] ~@13>").gain(0.2)

// drums · snare
const snare = s("sd").struct(`<
  ~@17 A B A B A B@2 ~@8 C A B A B A B A B A B A B A B A B A B A B D A B A B A B A B A B A B A B A B A B A B D ~@17 A B
  A B A B@2 ~@17 A B A B A B A B A B ~@3
>`.pickRestart({
  A: "~ x ~ x", B: "~@5 x ~@5 x", C: "~@3 x!21", D: "~@5 x ~@6",
})).gain(0.2)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@44 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~@14
>`.pickRestart({
  A: "~ x",
})).gain(0.2)

// drums · splash
const splash = s("cr").struct("<~@17 A ~@15 A ~@20 A ~@37 A ~@23 A ~@3 A ~@5 A ~@2>".pickRestart({
  A: "x",
})).gain(0.2)

stack(trumpet, piano, bass, trombone, kick, rim, snare, hihat, open_hat, splash)