Strudelify

Jeep's Blues

Ellington

KeyF majorTempo75 bpm
0:00/0:00
// Jeep's Blues — Ellington
// 75 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 75 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(75/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 · piano
const piano = note(`<
  ~ A B C D E F G H I J K L A B C D E F G H I J K M@2 N ~ O P Q@2 R@2 S ~ T@2 U ~ V W X Y@2 Z AA AB AC A B C D E F G H I
  J K L A B C D E F G H I AD AE AF@3
>`.pickRestart({
  A: "~@5 [f4,g4,c5] ~@5 [f4,g4,c5] ~@4 [f4,g4,c5]@5 [f4,g4,c5] ~@10", // Fsus2
  B: "~@5 [f4,g4,ab4,c5] ~@5 [f4,g4,ab4,c5] ~@4 [g4,bb4,db5]@5 [g4,bb4,db5] ~@10", // Fm Gdim
  C: "~@5 [f4,g4,c5] ~@10 [f4,g4,c5]@5 [f4,g4,c5] ~@5 [d5,g5]@4 ~", D: "[c5,g5]@4 ~ [c5,g5] ~@21 [f4,a4] ~@4",
  E: "~@5 [ab3,c4,d4,f4] ~@10 [ab3,c4,d4,f4]@4 ~ [ab3,c4,d4,f4] ~@10", // Dm7b5
  F: "~@5 [ab3,b3,d4,f4] ~@10 [ab3,b3,d4,f4]@5 [ab3,b3,d4,f4] ~@10", // Abdim
  G: "~@8 [f4,g4,c5] ~@7 [f4,g4,c5]@4 ~ [f4,g4,c5] ~@10", H: "~@5 [f4,g4,c5] ~@10 [f4,g4,c5]@4 ~ [f4,g4,c5] ~@10",
  I: "~@5 [f3,g3,bb3,d4] ~@10 [f3,g3,bb3,d4]@4 ~ [f3,g3,bb3,d4] ~@10", // Gm7
  J: "~@3 [bb3,d4,f4,a4] ~@4 [bb3,d4,f4,g4]@5 [bb3,d4,f4,g4] ~@18", // Bbmaj7 Gm7
  K: "~@5 [f4,g4,c5] ~@10 [f4,g4,c5]@5 [f4,g4,c5] ~@10", L: "~@5 [f3,bb3,d4] ~@5 [f3,bb3,d4] ~@15 [c4,e4,ab4]@5",
  M: "[~@5 [f3,bb3,d4] ~@5 [f3,bb3,d4] ~ f3 ~@2 [f3,b3,d4]@7 ~ [f3,bb3,db4]@5 [f3,a3,c4]@11 ~@24, ~@16 bb3 ~@47]/2", // Bb Bdim Bbm F
  N: "~@14 f3 ~ bb3 b3@6 ~ [f3,bb3,db4]@5 ab3 a3@2, ~@16 [f3,d4]@7 ~@6 [f3,c4]@3", // Bbm Dm F5
  O: "~@5 [a4,d5]@5 ~ [g4,c5] ~@15 [ab3,c4,d4,f4] ~@4, ~@5 ab4 ~@26", // D5 C5 Dm7b5
  P: "[ab3,c4,f4]@5 [ab3,c4,f4]@5 ~ [ab3,c4,d4,f4] ~@4 [ab3,c4,d4]@2 ~@14, d4@11 ~@5 f4 ~@15", // Fm Dm7b5
  Q: "[~@13 f3 ~@2 [f3,d4]@8 [f3,bb3,db4]@5 [f3,a3,c4]@7 ~ [f3,a3,c4] ~@26, ~@16 [b3,c4]@5 ~@43, ~@16 bb3@2 ~@11 ab3 ~@34, ~@16 db4 ~@47]/2", // Dm Bbm F Cmaj7
  R: "[~@14 f3 ~ [f3,b3,d4]@7 ~ [f3,bb3,db4]@5 ~ d4@13 ~@21, ~@29 [g3,bb3,f4]@13 ~@22]/2", // Bdim Bbm Gm7
  S: "~@5 [bb3,d4,f4,a4]@9 ~@2 [bb3,d4,f4,g4]@8 [bb3,d4,gb4]@5 [a3,c4,d4,f4]@3", // Bbmaj7 Gm7 Bbaug Dm7
  T: "[~@13 f3 ~@2 [f3,b3,d4]@7 ~ [f3,bb3,db4]@5 [f3,a3,c4]@7 [a3,c4,eb4,f6]@3 ~ [a3,c4,eb4,f6]@4 ~ [a3,c4,eb4,f6]@3 ~@2 a3@3 ~ [a3,c4,eb4,f6]@3 ~@7, ~@16 bb3 ~@32 [c4,eb4,f6]@4 ~@11]/2", // Bdim Bbm F F7
  U: "~@3 [ab3,c4,d4,f6]@4 ~ [ab3,c4,d4,f6]@3 ~ [ab3,c4,d4,f6]@4 ~ [ab3,c4,d4,f6]@3 ~ [ab3,c4,d4,f6]@3 ~@8", // Dm7b5
  V: "~@5 a3@3 ~ [a3,c4,eb4,f6]@3 ~ [a3,c4,eb4,f6]@3 ~@2 [a3,c4]@3 ~ [a3,c4,eb4,f6]@3 ~@7, ~@4 [c4,eb4,f6]@4 ~@9 [eb4,f6]@4 ~@11", // F7 Am F7 Ebsus2
  W: "~@16 [ab3,c4,d4,f6]@3 ~@2 [ab3,c4,d4,f6]@4 ~ [ab3,c4,d4,f6]@4 ~@2", // Dm7b5
  X: "~@8 [ab3,b3,d4,f6]@3 ~ [ab3,b3,d4,f6]@3 ~@2 [ab3,b3,d4,f6]@4 ~ [ab3,b3,d4]@4 ~@6, ~@11 f6 ~@4", // Abdim
  Y: "[~@16 [a3,c4,eb4,f6]@3 ~@2 [a3,c4,eb4,f6]@4 [a3,c4,eb4,f6]@3 ~@2 [a3,f6]@4 ~@30, ~@29 [c4,eb4]@4 ~@31]/2", // F7 Dm Cm
  Z: "~@4 [bb3,d4,f4,f6]@4 [g3,bb3,d4,f4,f6]@3 ~@2 [g3,bb3,d4,f4,f6]@3 ~ [g3,bb3,d4,f4,f6]@3 ~ [g3,bb3,d4,f4,f6]@3 ~@8, ~@3 g3@3 ~@26", // Bb Gm7
  AA: "~@4 [bb3,c4,e4,f6]@4 ~ [bb3,c4,e4,f6]@3 ~ [bb3,c4,e4,f6]@3 ~ [ab3,c4,e4,f6]@3 ~@2 [ab3,c4,e4,f6]@3 ~@7", // Bbsus2 Fm
  AB: "~@19 [a3,c4,eb4,f6]@4 ~ [a3,c4]@4 [a3,c4,eb4,f6]@3 ~, ~@23 [eb4,f6]@4 ~@5", // F7 Am F7 Ebsus2
  AC: "~@11 [g3,bb3,d4,f4,f6]@4 ~ [g3,bb3,d4,f4,f6]@3 ~@8 [ab3,c4,e4,f6]@5", // Gm7 Fm
  AD: "~@3 [bb3,d4,f4,a4] ~@4 [bb3,d4,f4,g4]@5 [bb3,d4,f4,g4] ~@10 [bb3,d4,f4,g4]@5 ~@3", // Bbmaj7 Gm7
  AE: "[f4,g4,c5] ~@4 [eb4,eb5]@5 ~ [c4,c5]@5 [bb3,bb4]@5 [ab3,ab4]@5 ~ [a3,a4]@4 ~", // Fsus2 Eb C Bb Ab A
  AF: "[[f2,eb4,g4,a4,c5]@8 ~@3 [db3,e4,ab4,bb4,eb5]@5 ~@7 [c5,eb5] c5 eb5 c5 eb5 c5 eb5 c5 eb5 [c5,eb5] c5 eb5 c5 eb5 [f2,a3,c4,d4,g4,c5]@43 ~@16, ~@16 [gb2,e4,ab4,bb4,db5]@21 ~@59]/3", // F7 Bbm7b5 Cm Dm7 Gb7
})).s("gm_piano").gain(0.45)

// bass · acoustic bass
const bass = note(`<
  ~ A B C D E F G H I J K L A B C D E F G H I J K L A B C D E F G H I J K L A B C D E F G H I J K L M B C D E F G H I J
  K L M B C D E F G H I J N O@3
>`.pickRestart({
  A: "f1@7 ~ a1@7 ~ c2@7 ~ f1@7 ~", B: "bb1@7 ~ bb1@7 ~ db2@7 ~ db2@7 ~", C: "f1@7 ~ f2@7 ~ bb1@7 ~ b1@5 c2@3",
  D: "f1@7 ~ a1@8 bb1@8 eb2@5 bb1@3", E: "bb1@8 bb1@7 ~ f1@7 ~ bb1@5 f1@3", F: "b1@7 ~ b1@7 ~ f1@7 ~ b1@5 f1@3",
  G: "f2@7 ~ f2@7 ~ c2@8 a1@5 c2@3", H: "f1@7 ~ a1@8 c2@7 ~ a1@5 f1@3", I: "g1@7 ~ a1@7 ~ bb1@8 d2@7 ~",
  J: "c2@7 ~ d2@7 ~ e2@8 c2@5 f2@3", K: "f1@7 ~ a1@7 ~ bb1@8 b1@8", L: "c2@5 f2@3 d2@5 a1@3 g1@5 db2@3 c2@5 g1@3",
  M: "f1@4 ~@4 a1@4 ~@4 c2@7 ~ f1@4 ~@4", N: "f1@3 ~@2 c2@5 ~ bb1@5 ab1@5 f1@5 ~ c2@4 ~",
  O: "[f2@8 ~@3 db2@5 gb1@21 f1@43 ~@16]/3",
})).s("gm_acoustic_bass").gain(0.36)

// chords · brass section
const brass_section = note(`<
  A B C D E F ~ G ~ H@2 ~ A B C D E F ~ G ~ H@2 ~@25 A B C D E F ~ G ~ H@2 ~ A B C D E F ~ G ~ H@2 ~@4
>`.pickRestart({
  A: "~@21 [a3,c4,d4,f4]@3 [a3,c4,d4,f4]@5 [a3,c4,d4,f4]@3", B: "[a3,c4,d4,f4]@5 [a3,c4,d4,f4]@23 ~@4",
  C: "[ab3,c4,d4,f4]@5 [ab3,c4,d4,f4]@8 ~@3 [f3,bb3,db4]@5 [g3,bb3,db4]@7 ~@4", // Dm7b5 Bbm Gdim
  D: "[a3,c4,d4,f4]@5 [a3,c4,d4,f4]@19 ~@8", E: "[a3,c4,eb4,g4]@25 ~@7", F: "[ab3,c4,d4,f4]@25 ~@7",
  G: "[a3,c4,d4,f4]@29 [f3,a3] ~@2", H: "[~@8 [g3,bb3,d4,f4]@53 [f3,a3] ~@2]/2",
})).s("gm_brass_section").gain(0.35).pan(0.3)

// chords · alto sax
const alto_sax = note(`<
  A B C D E F ~ G ~ H@2 ~ A B C D I F ~ G ~ H@2 ~@25 A B C D E F ~ G ~ H@2 ~ A B C D E F ~ G ~ H@2 ~@4
>`.pickRestart({
  A: "~@21 [f3,f4]@3 [g3,f4]@5 [ab3,f4]@3", B: "[c4,a4]@5 [d4,c5]@22 ~@5",
  C: "[d4,bb4]@5 [d4,c5]@9 ~@2 [db4,bb4]@5 [e4,c5]@9 ~@2", D: "[c4,a4]@5 [a3,f4]@18 ~@9",
  E: "[a4,g5]@12 [g4,f5] [f4,eb5] ~ [eb4,c5] [c4,a4]@13 [a3,f4]@3", F: "[bb3,ab4]@3 ~", G: "[a3,d4,f4]@29 [f3,a3] ~@2",
  H: "[~@8 [g3,d4,f4]@53 [f3,a3] ~@2]/2", I: "[a4,g5]@12 [g4,f5] [f4,eb5] ~ [eb4,c5] [c4,a4]@13 [a3,f4]@2 ~",
})).s("gm_alto_sax").gain(0.48).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note("<A@2 B@8 C@4 B@8 C@4 B@8 C@4 B@8 C@4 B@8 C@4 B@8 D@2 ~@3>".pickRestart({
  A: "[~@31 [c4,f4,a4]@32 [d4,f4,ab4]]/2", // F Ddim
  B: "[~@15 [db4,e4,c5]@16 [c4,f4,a4]@32 [c4,eb4,a4]@32 [d4,f4,ab4]@32 [b3,f4,ab4]@32 [c4,f4,a4]@64 [g3,bb3,d4,f4]@32 [bb3,c4,e4]]/8", // Dbm F Adim Ddim Fdim F Gm7 C7
  C: "[~@31 [c4,f4,a4]@32 [g3,bb3,d4,f4]@16 [bb3,c4,e4]@16 [c4,f4,a4]@32 [d4,f4,ab4]]/4", // F Gm7 C7 F Ddim
  D: "[~@31 [c4,f4,a4]@2 ~@31]/2", // F
})).s("gm_synth_strings_1").gain(0.14)

// drums · kick
const kick = s("bd").struct(`<
  A B@2 C B C B C B D C D B C D C B C B C B C B C B E@24 D B C B C D@2 B C B C B C B C B C B C B C B F G H ~
>`.pickRestart({
  A: "~@21 x ~@2 x ~@4 x ~@2", B: "x ~@4 x ~@10 x ~@4 x ~@7 x ~@2", C: "x ~@4 x ~@10 x ~@4 x ~@10",
  D: "x ~@4 x ~@7 x ~@2 x ~@4 x ~@10", E: "x ~@7 x ~@7 x ~@7 x ~@4 x ~@2", F: "x ~@20 x ~@5 x ~@4", G: "x",
  H: "~@5 x ~@26",
})).gain(0.33)

// drums · rim
const rim = s("rim").struct("<~@25 [~ x ~ x]!11 [~ x ~@2] ~@38>").gain(0.44)

// drums · snare
const snare = s("sd").struct(`<
  A B C@23 ~@11 D E F G H I G J K L M N O P C@2 Q C@3 R C@2 R C S T C@3 S B C@3 ~@4
>`.pickRestart({
  A: "~@16 x ~@4 x ~@2 x ~@4 x ~@2", B: "x ~@4 x ~@7 x ~@7 x ~@7 x ~@2", C: "~@5 x ~@7 x ~@7 x ~@7 x ~@2",
  D: "~@13 x ~@18", E: "~@4 x ~@8 x ~@6 x ~@6 x ~@4", F: "x ~@3 x ~@6 x ~@7 x ~@4 x ~@7",
  G: "~@4 x ~@6 x ~@4 x ~@3 x ~@6 x ~@4", H: "~@3 x ~ x ~@5 x ~ x ~@5 x ~ x ~@5 x ~@4",
  I: "x ~@3 x ~@6 x ~ x ~@6 x ~@3 x ~@4 x ~@2", J: "x ~@3 x ~@6 x ~@4 x ~@3 x!2 ~@5 x ~@4",
  K: "x ~@3 x ~@6 x ~@4 x ~@3 x ~@6 x ~@4", L: "~@3 x!2 ~@6 x ~@4 x ~@3 x ~@3 x ~@4 x ~@2",
  M: "~@4 x!2 ~@5 x ~@4 x ~@3 x!2 ~@5 x ~@4", N: "x ~@3 x!2 ~@7 x ~@6 x!2 ~@5 x ~@4",
  O: "x ~@3 x!2 ~@5 x ~@4 x ~@3 x!2 ~@5 x ~@4", P: "x ~@4 x ~@7 x ~@7 x ~@5 x ~@4", Q: "~@5 x ~@7 x ~@10 x ~@4 x ~@2",
  R: "~@5 x ~@7 x ~@5 x ~@4 x ~@4 x ~@2", S: "~@5 x ~@7 x ~@7 x ~@5 x ~@4", T: "x ~@4 x ~@7 x ~@5 x ~@4 x ~@4 x ~@2",
})).gain(0.27)

// drums · clap
const clap = s("cp").struct(`<
  ~ A B@23 ~@11 C D E F B G F H@2 I J K L M B@2 N B@3 O B@2 O B P Q B@3 P A B@3 ~@4
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "~@11 x ~@4 x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", D: "x ~@2 x ~ x ~@2 x ~@7 x ~@2 x ~@4 x ~@7",
  E: "~@3 x ~ x ~@2 x ~@4 x ~@2 x ~@15", F: "x ~@2 x ~ x ~@2 x ~@4 x ~@5 x ~@4 x ~@7",
  G: "~@3 x ~ x ~@2 x ~@7 x ~@2 x ~@12", H: "~@3 x ~ x ~@2 x ~@4 x ~@5 x ~@4 x ~@7",
  I: "x ~@4 x ~@2 x ~@4 x ~@5 x ~@12", J: "x ~@2 x ~@4 x ~@4 x ~@5 x ~@4 x ~@7", K: "~@3 x ~@4 x ~@7 x ~@2 x ~@4 x ~@7",
  L: "~@3 x ~@4 x ~@4 x ~@5 x ~@4 x ~@7", M: "~@8 x ~@7 x ~@7 x ~@4 x ~@2", N: "x ~@7 x ~@7 x ~@4 x ~@5 x ~@4",
  O: "x ~@7 x ~@7 x ~@4 x ~@10", P: "x ~@7 x ~@7 x ~@7 x ~@4 x ~@2", Q: "~@8 x ~@7 x ~@4 x ~@10",
})).gain(0.33)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@37 A B C D E C F C E F G F ~@26>".pickRestart({
  A: "~@11 x ~@9 x ~@7 x ~@2", B: "~@20 x!2 ~@5 x ~ x ~@2", C: "~@21 x ~@7 x ~@2", D: "~@4 x ~@15 x ~@8 x ~@2",
  E: "~@21 x ~@5 x ~@4", F: "~@29 x ~@2", G: "~@11 x ~@17 x ~@2",
})).gain(0.22)

// drums · hihat
const hihat = s("hh").struct("<~@74 [~ x]>").gain(0.22)

// drums · open hat
const open_hat = s("oh").struct("<~@74 [~@15 x ~@16]>").gain(0.22)

// drums · crash
const crash = s("cr").struct("<A B ~@35 B ~@11 C D ~@2 B ~ E B F G B H B ~ I H B ~ B J ~@2 K B L ~>".pickRestart({
  A: "~ x", B: "x", C: "x ~@4 x ~@26", D: "~@3 x", E: "x ~@26 x ~@4", F: "x ~@10 x ~@4 x ~@15", G: "~@3 x ~@4 x ~@23",
  H: "~@19 x ~@4 x ~@7", I: "~@19 x ~@12", J: "~@3 x ~@23 x ~@4", K: "x ~@20 x ~@5 x ~@4", L: "~@5 x ~@26",
})).gain(0.38)

// drums · ride
const ride = s("rd").struct("<A B C@23 D@12 E D@11 F G C@2 B C@2 B H C B C B C@2 G B C B C I@2 ~@4>".pickRestart({
  A: "~@21 x ~@2 x ~@4 x ~@2", B: "~@5 x ~@2 x ~@4 x ~@2 x ~@4 x ~@2 x ~@4 x ~@2",
  C: "x ~@4 x ~@2 x ~@4 x ~@2 x ~@4 x ~@2 x ~@4 x ~@2",
  D: "x ~@2 x!3 ~@2 x ~@2 x ~ x ~@2 x ~@2 x!3 ~@2 x ~@2 x ~ x ~@2",
  E: "~@3 x!3 ~@2 x ~@2 x ~ x ~@2 x ~@2 x!3 ~@2 x ~@2 x ~ x ~@2", F: "~@8 x ~@4 x ~@2 x ~@4 x ~@2 x ~@4 x ~@2",
  G: "x ~@4 x ~@2 x ~@4 x ~@2 x ~@4 x ~@7 x ~@2", H: "~@5 x ~@2 x ~@4 x ~@7 x ~@2 x ~@4 x ~@2",
  I: "x ~@4 x ~@2 x ~@4 x ~@2 x ~@2 x ~ x ~@2 x ~@4 x ~@2",
})).gain(0.27)

stack(
  piano, bass, brass_section, alto_sax, synth_strings_1, kick, rim, snare, clap, clap_soft, hihat, open_hat, crash, ride
)

More by Ellington