Strudelify

Rockin' in Rhythm

Duke Ellington

KeyC majorTempo120 bpm
0:00/0:00
// Rockin' in Rhythm — Duke Ellington
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 106 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 · [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 A E F G H@2 I J K@4 L M N O L P@2 Q R@2 S T S U V W X Y A Z F D A AA F G H@2 AB AC H@2 AD@2 L M AE AF L AG
  AH@3 AI AJ AK AL AM AL AN AO AP AQ AR AL AS AL AN AO AP AQ AT A Z AU D A AA AU D AV@2 AW@2 H@2 AX@2 L M AY AZ M AG
  BA@2 BB@2 BC@2
>`.pickRestart({
  A: "~@2 [g4,e5,g5]@4 [g4,d5,f5]@3 [g4,d5,f5] [g4,c5,e5]@4 ~@2, c3@7 ~", // C G7 C
  B: "e5 f5 ~ e5 [a3,f#4,c#5,d5]@3 [g4,c#5,e5] [b3,g#4,d5,f5]@4 [c4,g4,c#5,e5]@4, [g3,g4] ~@3", // Dmaj7 C#dim Bdim C G
  C: "[g4,c5,e5] [c5,e5,g5] [e4,g4,c5] [g4,c5,e5] [c4,e4,g4] [b3,g4,c5] [g3,c4,e4] [c4,e4,g4], g3@7 ~ c3@7 ~", // C Cmaj7 C
  D: "[g3,c4,e4] [g#3,d4,f4] ~ [a3,d#4,f#4] [a#3,e4,g4] [a3,d#4,f#4] ~ [g#3,d4,f4] g3@4 g3@4, ~@8 [c4,e4]@7 ~", // C Ddim D#dim Edim D#dim Ddim C
  E: "e5 f5 ~ e5 f#4@2 ~ [c#5,e5] [b3,g#4,d5,f5]@4 [c4,g4,c#5,e5]@4, [g3,g4,c5] [a3,c#5,d5] ~@2, ~@3 g4 ~@4", // C#m Bdim C C5 Dmaj7
  F: "[g4,c5,e5] [c5,e5,g5] [e4,g4,c5] [g4,c5,e5] [c4,e4,g4] [e4,g4,c5] [g3,c4,e4] [c4,e4,g4], g3@7 ~ c3@7 ~", // C
  G: "[g3,c4,e4] [g#3,d4,f4] ~ [a3,d#4,f#4] [a#3,e4,g4] [a3,d#4,f#4] ~ [g#3,d4,f4] [g3,c4,e4]@4 [g3,c4,e4,g4,c5]@4", // C Ddim D#dim Edim D#dim Ddim C
  H: "[c3@4 g2@4 c3@4 g2@4 c3@4 e3@4 [f4,a4,d5]@2 ~@3 [c4,f4,a4]@3, [e4,g4,c5,e5]@23 ~ f3@3 [f4,a4,c5]@2 ~@3, ~@7 c3]/2", // Dm F C F
  I: "[c4,f4] ~ g2@2 c3@2 g2@2, d3 ~@3, ~@2 g4@13 ~, ~@2 [b3,f4]@5 ~ [c4,e4]@7 ~", // F5 Bdim C
  J: "c3 g2 c3 [g2,e4,g4,c5], [c4,e4,g4]@11 ~@5", // C
  K: "[c3@2 g2@2 c3@2 g2@2 c3@2 e3@2 [f4,a4,d5] ~@5 g2@2 c3@2 g2@2 c3@2 g2@2 c3@2 g3@2, [e4,g4,c5,e5]@23 ~ f3@3 [f4,a4,c5]@2 f4@10 ~ g4@22 ~@2, ~@7 c3 d3 ~@7, ~@29 [c4,a4]@5 [b3,g4]@5 ~ [c4,e4]@7 ~ [c4,e4]@14 ~@2]/4", // Dm C F Em C
  L: "[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 b3@2, c4@11 ~@5", // C
  M: "[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 g3@2, a3@11 ~@5", // C
  N: "[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 [g3,g4]@2, c3@11 ~@5", // C G
  O: "[e4,g4,c5] [f4,a4,d5] ~ [f#4,a4,d#5] [g4,c5,e5]@3 [e4,g4,c5] ~@4 g3@4, c4@11 ~@5, ~@8 [f4,b4,d5]@7 ~", // C Dm D#dim C Bdim
  P: "[[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 [b4,d5,g5]!2 [a4,c5,f5]!2 [g4,b4,e5]!2 [f4,a4,d5]!2 [e4,g4,c5]!2, a3@11 ~ g3@18 ~@2]/2", // C G F Em Dm C
  Q: "[d4,f4,b4]!2 [c4,f4,a4]!2 ~@2 g3!2, g3@11 ~@5, ~@8 [b3,f4,g4]@7 ~", // Bdim F G7
  R: "[f3!2 e3!2 d3!2 c3!2 b2!2 a2!2 [g2,c4,e4,g4]@2 c5!2, [b3,f4,g4]@23 ~@9]/2", // C G7
  S: "~@4 [e4,g4,c5]@7 ~ [d#4,a4,c5,a5]@4, g5@11 ~@5", // C Adim
  T: "[b3,d#5]@5 ~ c4@4 d4@2 c5@2 c5@2, a4@11 ~ [d#4,a4]@4, ~@3 c5@3 ~@2", // B D#dim
  U: "[f#4,a4,c5,d#5]@5 ~ [b4,d5]@2 [b4,d5]@4 c5@2 c5@2, ~@3 [f#4,g4]@3 [d#4,f#4]@2", // F#dim Bm Gmaj7 D#m
  V: "~@2 g3 [f#3,a4,c5,d#5,a5], g5@11 ~@5, e4@7 ~@9, ~@4 [g4,c5]@7 ~@5", // F#dim C5
  W: "[f3,d#4,a4,c5,d#5]@5 ~ [f#3,d#4,g#4,c5]@6 [c5,d#5]@2 [c5,f5]@2, ~@3 [g3,d#4,g4]", // F7 G#7 Cm F5 Cm
  X: "[f4,c5,f5]@2 [f4,c5,f5] [f#4,f#5] [g#3,f#4,c5,f#5]@2 [f4,b4,g5] [e4,g4,c5], g#3@7 ~@5 g3@4", // F5 F# G#7 G7 C
  Y: "c3 g2 a2 b2, [e4,g4,c5]@7 ~", // C
  Z: "e5 f5 ~ e5 [a3,f#4,c5,d#5]@3 [g4,c5,e5] [b3,g#4,d5,f5]@4 [c4,g4,c5,e5]@4, [g3,g4,c5] ~@3", // Adim C Bdim C C5
  AA: "e5 f5 ~ e5 [f#4,c5,d#5]@2 [g4,c5,e5]@2 [b3,g#4,d5,f5]@4 [c4,g4,c5,e5]@4, [g3,g4,c5] a3 ~@2", // Cdim C Bdim C C5
  AB: "c4 ~ g2@2 c3@2 g2@2, d3 ~@3, ~@2 g4@13 ~, ~@2 b3@6 [c4,e4]@7 ~", AC: "c3 g2 c3 [g2,e4,g4,c5], [c4,e4,g4]@3 ~",
  AD: "[[c4,c5] ~ g2@2 c3@2 g2@2 c3@2 g2@2 c3@2 g3@2, f4@7 ~@25, d3 ~@7, ~ g4@14 ~, ~@2 b3@5 ~ [c4,e4]@7 ~ [c4,e4]@14 ~@2]/2", // C
  AE: "[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 g3@2, c3@11 ~@5", // C
  AF: "[e4,g4,c5] [f4,a4,d5] ~ [f#4,a4,d#5] [g4,e5]@3 [e4,g4,c5] ~@4 g3@4, c4@11 ~@5, ~@8 [f4,d5]@7 ~", // C Dm D#dim C Dm
  AG: "[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 [b4,d5,g5]!2, a3@11 ~ g3@4", // C G
  AH: "[[a4,c5,f5]!2 [g4,b4,e5]!2 [f4,a4,d5]!2 [e4,g4,c5]!2 [d4,f4,b4]!2 [c4,f4,a4]!2 ~@2 g3!2 f3!2 e3!2 d3!2 c3!2, g3@9 ~@7, ~@12 [b3,f4,g4]@11 ~]/3", // F Em Dm C Bdim F G7
  AI: "b2!2 a2!2 [g2,c4,e4,g4]@2 [e2,g#3,d4,g#4]@2, [b3,f4,g4]@7 ~@9", AJ: "[a2,c4,e4,a4] [e4,a4,c5] e3 g#3",
  AK: "a3 [c4,e4,a4,c5] e3 g#3", AL: "a3@4 c5 d5 ~ c5 b4@2 c5@2 d#5@2 e5@2, ~ [c4,e4] e3 g#3",
  AM: "~ [c5,e5] e3 [g#3,b4,d5], [a3,a4,a5]@7 ~ [e4,e5]@7 ~", AN: "a3 [e5,a5] e3 [g#3,d5,f5], [c5,c6]@7 ~ [a4,a5]@7 ~",
  AO: "[a3,a4,c5,e5,a5]@2 [c5,e5,a5,c6]@2 [e3,b4,b5]@2 ~ [a4,a5], ~@8 e5@7 ~, ~@3 g#3", // Am E5 A
  AP: "[c5,e5,c6]!2 [c5,e5,b5]@2 [e3,c5,e5,a5]@2 [g#3,d5,f5,c6]@2, a3 ~@3", // C Cmaj7 Am Dm7b5
  AQ: "[a3,c5,e5,a5] [a4,c5,f5] [e3,a4,c5,e5] [g#3,d4,f4,c5]", AR: "a3 ~ e3 g#3, a4@7 ~, ~@4 [c4,e4]@11 ~",
  AS: "a4 [a4,c5] e3 [g#3,b4,d5], [c4,a5]@7 ~ [e4,e5]@7 ~", // Am G#dim F E
  AT: "[a3,c4,e4,a4] [c3,a3,d#4] [c#3,b3,e4] [d3,b3,f4,g4], ~@4 a4@7 ~@5", // Am Adim C#m7 G7
  AU: "[g4,c5,e5] [c5,e5,g5] [e4,g4,c5] [g4,c5,e5] [c4,e4,g4] [e4,g4,c5] [b3,c4,e4] [c4,e4,g4], g3@7 ~ c3@7 ~", // C Cmaj7 C
  AV: "[c3@4 g2@4 c3@4 g2@4 c3@4 e3@4 [f4,a4,d5]@2 ~@3 [c4,f4,a4]@2 ~, [e4,g4,c5,e5]@23 ~ f3@3 [f4,a4,c5]@2 ~@3, ~@7 c3]/2", // Dm F C F
  AW: "[[c4,f4,a4] ~ g2@2 c3@2 g2@2 c3@2 g2@2 c3@2 [g2,e4,g4,c5]@2, d3 ~@7, ~@2 [b3,f4,g4]@5 ~ [c4,e4,g4]@19 ~@5]/2", // F C G7 C
  AX: "[[c4,f4] ~ g2@2 c3@2 g2@2 c3@2 g2@2 c3@2 g3@2, d3@4 ~@4 [e4,g4]@7 ~ [e4,g4]@16, ~@2 [b3,f4,g4]@5 ~ c4@22 ~@2]/2", // F5 Em G7
  AY: "[g4,c5,e5] [c5,e5,g5]@2 [g4,c5,e5] [c5,e5,g5]@2 [g3,g4,c5,e5]@2, c3@11 ~@5", // C
  AZ: "[e4,g4,c5] [f4,a4,d5] ~ [f#4,a#4,d5] [g4,e5]@3 [e4,g4,c5] ~@4 g3@4, c4@11 ~@5, ~@8 [f4,d5]@7 ~", // C Dm F#aug C Dm
  BA: "[[a4,c5,f5]!2 [g4,b4,e5]!2 [f4,a4,d5]!2 [e4,g4,c5]!2 [d4,f4,b4]!2 [c4,f4,a4]!2 ~@2 g3!2, g3@27 ~@5, ~@24 [b3,f4,g4]@7 ~]/2", // F Em Dm C Bdim F G7
  BB: "[f3!2 e3!2 d3!2 c3!2 b2!2 a2!2 g2@2 c2@2, [b3,f4,g4]@23 ~ [c4,f4,g4]@7 ~]/2", BC: "[[g2,e4,g4]@23 ~@9]/2",
})).s("gm_piano").gain(0.05)

// bass · piano
const bass = note(`<
  A B C D A B C D E F G E@2 H G I J K L M J N@2 O P Q R S R T U V W X A B C D A B C D E H G E@2 H G I J K L J@2 K Y@2 P
  Z AA@2 AB AC AB AA@5 AB AC AB AA@4 AD A B C D A B C D E H G E@2 H G I J K L M J K Y@2 P AE AF@2
>`.pickRestart({
  A: "c2@7 ~", B: "c3@7 ~", C: "c3@7 ~ c2@7 ~", D: "c3@3 g2", E: "c2 g1 c2 g1", F: "c2 e2 f2 a1", G: "d2 g1 c2 g1",
  H: "c2 e2 f2 c2", I: "c2 g1 c2 g2", J: "c3@11 ~ b2@4", K: "a2@11 ~ g2@4", L: "c2@11 ~ g2@4", M: "c3@11 ~ g2@4",
  N: "[a2@11 ~ g2@18 ~@2]/2", O: "g2@11 ~ g2@2 g2@2", P: "f2!2 e2!2 d2!2 c2!2", Q: "b1!2 a1!2 c2@2 ~@2",
  R: "~@4 g3@7 ~ g3@4", S: "f3@7 ~", T: "g3@6 a3 g#3", U: "g3@7 ~ g2@4 f#2@4", V: "f2@5 ~ f#2@6 g2@4",
  W: "g#2@7 ~ g#2@4 g2@4", X: "c2 g1 a1 b1", Y: "[g2@27 ~ g2@2 g2@2]/2", Z: "b1!2 a1!2 c2@2 e2@2", AA: "a2 ~ e2 g#2",
  AB: "a2 a3 e2 g#2", AC: "a2@7 ~ e2@4 g#2@4", AD: "a2 f2 f#2 g2", AE: "b1!2 a1!2 g1@2 c2@2", AF: "[c2@23 ~@9]/2",
})).s("gm_piano").gain(0.03)

stack(piano, bass)

More by Duke Ellington