Strudelify

Fine & Dandy

Tatum Art

KeyF majorTempo123 bpm
0:00/0:00
// Fine & Dandy — Tatum Art
// 123 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 150 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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 · "A.PIANO 2"
const piano = note(`<
  ~@2 A@2 ~ B@8 C@3 D@3 E F@2 G H I@3 J K L M N O@2 P@5 Q@2 R ~ S@2 ~ T@3 U@3 V W@3 X Y Z AA AB AC@2 AD@2 AE@2 AF AG
  AH@2 AI ~@6 AJ AK@3 AL AM@4 AN AO AP AQ AR ~ AS AT@3 AU AV@3 AW@2 AX AY AZ BA@2 BB BC BD@3 BE BF BG BH BI@2 BJ BK@3 BL
  BM BN@2 BO BP ~@7 BQ@2 BR BS@2 ~@9
>`.pickRestart({
  A: "[~@17 [bb3,db4,f4]@5 ~@4 g3@11 ~@27, ~@25 [c4,e4]@11 ~@28]/2", // Bbm C
  B: "[~@10 c2@8 ~ [a2,f3]@19 ab2@8 ~@4 ab2@13 ~ g2@8 ~@3 [g2,f3]@8 c2@3 ~@16 c2@5 ~ [a2,f3]@16 ~ [ab2,f3]@8 ~@3 [ab2,f3]@16 ~ [g2,f3]@22 [c3,e3,bb3]@22 ~@12 ab3@8 a3@30 ~ bb2@5 bb2@3, ~@38 f3@2 ~@9 f3@14 f3@5 ~@15 e3@24 ~@90 g3@11 ~@48, ~@99 f2@25 ~@4]/8", // Dm G7 Dm Db G7 C7
  C: "[~@3 bb2@5 ~ bb2@21 ~ g3@8 gb3@8 ab3@11 ~ g3@16 [ab2,gb3]@21, ~@31 eb2@16 ~@49]/3", // Ab7
  D: "[~@2 db2@11 [f3,bb3]@5 ~ c3@5 ~@11 e3@10 ~@2 ab2@16 ab1@5 ~ g1@16 ~@11, ~@18 bb3@5 ~ a2@22 f3@21 ~@29]/3", // Bb5
  E: "~@12 [c3,e3]@5 a3@3 ~ f3 e3 eb3 ~ d3 ~ db3 ~ c3@2 ~", F: "[a2@2 a2@2 ~@4 ab2@14 [ab2,b3]@8 [g2,bb3]@5 ~@29]/2",
  G: "~@5 [c2,e3]@5 ~ c2 eb3@20", H: "~@7 [c3,bb3]@5 [f2,a3]@10 ~ [bb2,ab3]@9",
  I: "[~@14 [eb2,g3]@22 f3@11 ~ d3@10 ~ g2@11 c3@8 f3@2 ~@16, ~@47 gb3@10 ~ f3@11 ~@27]/3", // Eb
  J: "~ e3 f3 ~ f3@2 ~ f3@2 ~ f3@2 ~ f3@2 f3@2 ~ f3@2 ~ e3 f3@4 ~ f3@2 f3@2 ~",
  K: "e3 f3@4 ~ f3@4 f3 e3 f3@4 ~ f3@2 ~ f3@2 ~ f3@4 ~ f3@4, ~@23 e3 ~@8",
  L: "f3 ~ f3@4 ~ f3@2 ~ e3 f3@4 ~ g2@5 a2@5 ~ bb2@5, ~@2 e3 ~@29", M: "c3@5 ~@15 c3@2 ~ a2@5 ~@4",
  N: "~@6 c3 a2 ~ bb2 ~ c3 ~ c2 ~ d3 ~ c3 ~ d3 ~ e3 f3 ~ g3 ~ ab3 ~ b3 ~@3",
  O: "[~@9 [g2,bb3]@16 ~ c3@2 ~@3 c3@8 ~@9 eb3@11 ~@5]/2", // Gm
  P: "[~ [db3,bb3,e4]@5 [c3,a3,eb4]@5 ~ [bb2,db4]@5 ~ [a2,c4]@5 [f2,eb3,a3]@5 ~ [bb2,d3,ab3]@5 [f3,bb3,d4]@5 ~ [e3,g4]@5 [eb3,gb4]@5 ~ [d3,f4]@5 ~ [c3,eb4]@5 [bb2,d4]@5 ~ [f3,ab4]@5 [eb3,g4]@44 ~ [ab3,c4,gb4]@22 [db3,b3,f4]@11 ~ [c3,bb3]@8]/5", // Bbdim Adim Bbm Am F7 Bb7 Bb Em …
  Q: "[~@6 [a2,f3,c4]@2 ~@6 c2@5 bb1@5 ~ a1@5 ~ f1@5 ab1@5 ~ f1@5 g1@5 ~ a1@5 ~ bb1@5]/2", // F
  R: "b1@5 ~ c2@5 ~@9 [c3,bb3,e4]@8 [a2,f3,c4]@4", // C7 F
  S: "[~@3 [ab2,f3,b3]@5 ~ [g2,bb3]@11 [f2,ab3]@5 [f2,ab3]@5 ~ [e2,g3]@5 ~ [d2,f3]@5 [c2,e3]@5 ~ [c3,e3,bb3]@5 ~@3 [f2,eb3,a3]@8]/2", // Fdim Gm Fm Em Dm C C7 F7
  T: "[~@8 bb1@5 ~@11 [bb2,g3,db4]@14 [bb2,f3,g3,db4]@8 ~ [a2,c3,f3,c4]@5 ~@11 [c4,e4]@5 ~ g2@5 ~ [f3,b3,d4]@5 c2@5 ~ [f3,b3,c4]@5 [f2,a3]@5, ~@2 d3@11 ~@83]/3", // Gdim Gm7b5 F C Bdim F
  U: "[~ [f3,a3,c4,d4]@5 ~ d2@5 [gb3,a3,c4,d4]@5 ~ g2@5 f3@5 ~ c2@5 [g3,bb3]@5 ~ f2@5 ~ [f3,a3,d4]@5 g2@5 ~ [f3,g3,bb3,d4]@5 a2@5 ~ [f3,a3,c4,d4]@5 ~ ab2@4 ~ [a3,c4]@5 ~ g2@5 [f3,a3,d4]@5 ~]/3", // Dm7 D7 Gm Dm Gm7 Dm7 Am Dm
  V: "e3@5 [f3,g3,b3,d4]@5 ~ e3@5 ~ [g3,bb3,e4]@5 c3@5 ~ [e3,bb3,c4]@4", // G7 Edim C7
  W: "[~ [f2,f3]@5 ~ [f3,a3,c4]@5 ~ b2@5 [f3,b3,d4]@5 ~ a2@5 [f3,a3,c4,d4]@5 ~ ab2@5 [f3,b3,d4]@5 ~ g2@5 ~ [e3,bb3,c4]@5 [g2,f3]@5 ~ [f3,ab3,b3]@5 [c2,e3]@5 ~ [g3,bb3,c4,e4]@5 ~ [c2,e3]@5 [c3,e3,bb3]@5 ~ [f2,eb3,a3]@5]/3", // F Bdim Dm7 Bdim C7 G7 Fdim C …
  X: "[g2,e3,bb3]@5 ~ [ab2,f3,b3]@5 [a2,f3,c4]@5 ~ [d3,b3,f4]@5 ~ [db3,bb3,e4]@5 [c3,a3,eb4]@4", // Edim Fdim F Bdim Bbdim Adim
  Y: "~@2 [a2,g3,db4]@5 ~ bb2@11 ~@13, ~@7 ab3@11 ~@14", Z: "~@9 ab3 ~ f3 ~ d3 db3 ~ e3@2 ~ f3 g3 ~ a3 ~ bb3 ~@7",
  AA: "~@10 eb2@5 ~@9 [bb2,f3,db4]@8", AB: "~ [ab2,gb3]@16 ~@6 [c3,bb3,e4]@5 ~@4",
  AC: "[~@8 e3 d3 ~ c3 bb2 [a2,f3]@16 ~ [ab2,f3]@8 ~@3 [ab2,f3]@16 ~ [g2,f3]@5 ~]/2", // Dm Db G7
  AD: "[~@5 g2@3 d3@5 ~ [g2,f3]@5 ~@9 [c2,c3]@10 ~ a2@5 ~@20, ~@5 db3@2 ~@57]/2", // G7 C
  AE: "[~@3 [ab2,f3,b3]@16 [g2,f3,bb3]@16 ~@10 [c3,e3,bb3]@8 ~@3 c3@8]/2", AF: "[c3,bb3]@11 ~@21",
  AG: "~@3 [f3,a3,eb4]@9 ~ [f3,bb3,d4]@5 ~@14", AH: "[~@14 c3@5 ~ bb2@5 a2@16 ~ g3 ~ f3 ~ f3 gb3 g2 f3@10 [c2,e3]@5]/2",
  AI: "[c2,e3]@5 ~@4 f3@8 ~@15", AJ: "[c3,e3]@5 [f2,eb3]@5 ~ [a3,eb4,a4]@5 ~ [b3,f4]@5 [db3,bb3,e4]@5 ~ [c3,a3,eb4]@4",
  AK: "[~ [bb2,g3,eb4]@5 ~ [a2,f3,c4]@5 [f2,eb3,a3]@5 ~ [bb2,g3,d4]@5 ~ [a2,gb3,c4]@5 [g2,e3,bb3]@5 ~ [gb2,eb3,a3]@5 [f2,d3,ab3]@5 ~ [f3,ab3,d4]@5 ~ bb1@5 [f3,ab3,d4]@5 ~ [eb2,g3]@5 [f2,eb3,ab3]@5 ~ [g2,eb3,bb3]@5 [a2,gb3,c4]@5 ~ [bb2,g3,db4]@5 ~ [g3,bb3,db4]@5]/3", // Eb F F7 Gm Gbdim Edim Ebdim Ddim …
  AL: "eb2@5 ~ [eb3,g3,db4]@5 [ab2,gb3,c4]@5 ~ [bb2,g3,db4]@5 ~ [c3,ab3,eb4]@5 [eb3,ab3,c4]@4", // Eb7 Ab7 Gdim Ab
  AM: "[~@5 [c3,g3,bb3,e4]@2 ~@9 [bb3,b3] ~@13 c3@5 ~@3 bb3 b3 ~@12 c3@5 ~@3 bb3 b3 ~@12 c3@5 ~@4 [bb3,b3] ~@13 c3@5 ~@3 bb3 b3 ~@12 c3@5 ~@3 bb3, ~@17 c4@21 ~ c4@21 ~@2 c4@21 ~ c4@21 ~ c4@21 ~]/4", // C7 Bmaj7
  AN: "b3 ~@12 c3@5 ~ c4@2 ~ [a3,bb3] b3@6 ~@3, ~ c4@18 ~@13", AO: "~@26 c3@5 ~, ~@9 eb4@22 ~",
  AP: "eb4 db4 d4 eb4 ~ eb4 ~ f4 ~ eb4@7 ~@16", AQ: "~@16 [f3,a3,eb4]@7 [bb2,ab3]@5 ~@4",
  AR: "~@17 [bb2,g3]@12 [eb3,a3]@3", AS: "~@11 f4@5",
  AT: "[~ [ab3,b3,f4]@5 ~@4 [g3,f4,bb4]@8 ~@6 [c4,e4]@5 [f3,c4,a4]@11 ~ [g3,f4,bb4]@5 [ab3,f4,b4]@5 ~ [a3,f4,c5]@5 [a2,c4]@5 ~ [ab2,b3]@5 ~@6 [g2,bb3]@5 ~ [g3,b3]@5 [f2,ab3]@10 ~]/3", // Fdim Gm7 C F Gm7 Fdim F Am …
  AU: "[e2,g3]@5 ~ [d2,f3]@5 ~ [c2,e3]@5 [gb2,e3,bb3]@5 ~ [f2,c3,a3]@8 ~", // Em Dm C Gb7 F
  AV: "[~@2 c2@5 ~@6 a2@5 ~@12 [ab2,f3]@5 [g2,e3,bb3]@11 ~ [gb2,eb3,a3]@10 ~ [g2,d3,bb3]@5 [e3,bb3]@5 ~ c2@5 [e3,a3]@5 ~ [f2,eb3,a3]@5 ~ [g2,e3,bb3]@5 ~ ab2@4, ~@91 [e3,b3]@5]/3", // Db Edim Ebdim Gm Edim A5 F7 Edim …
  AW: "[~ [a2,f3,c4]@5 [d3,b3,f4]@5 ~ [db3,bb3,e4]@5 ~ [c3,a3,eb4]@5 [a2,f3,c4]@5 ~ [bb2,ab3]@5 [ab3,bb3,d4,f4]@5 ~ f2@5 [f3,c4,eb4]@5 ~ [bb2,ab3]@2 ~@11]/2", // F Bdim Bbdim Adim F Bb7 F7 Bb7
  AX: "~@4 [bb1,f2,ab2]@5 [bb1,g2,db3]@11 ~@12", AY: "~@3 [bb2,f3,g3,db4]@5 [bb2,f3,g3,db4]@14 [ab2,gb3,bb3]@10",
  AZ: "~@12 [db3,b3,f4]@11 ~ [c3,bb3,e4]@8", // Db7 C7
  BA: "[~@6 [e3,f3] [d3,eb3] c3@4 ~ bb2 a2@10 ~ ab2@13 ~ ab2@8 [g2,f3]@11 ~ f3 e3 ~ eb3 ~, ~@8 db3 ~@16 [b2,f3]@22 ~@17]/2", // Fmaj7 Ebmaj7 G7 Bdim
  BB: "d3@2 ~@12 c3@14 e3 ~ eb3 d3, ~@9 a3@19 ~@4", BC: "db3 ~ c3@10 ~ [ab2,f3]@19",
  BD: "[a3 ab3 g3@6 ~ d4 ~ db4 ~ c4@7 a4@2 ~ ab4 g4@12 ~ eb5@16 [f2,eb3,g3]@22 ~@12 [eb3,gb3,d4]@9]/3", // Cm Ebm
  BE: "~@2 [f3,bb3,c4]@11 ~@14 [f3,bb3]@2 ~@3", BF: "~@6 [f3,g3,bb3]@8 ~@5 ab3 a3 ~ ab3 ~ a3 ~ ab3 ~ a3 ~ ab3 ~",
  BG: "a3 ab3 ~ a3 ~ ab3 ~ a3 ~ ab3 ~ a3 ~ ab3 a3 ~ ab3 ~ a3 ~ ab3 ~ a3 ~ ab3 ~ eb3@3 eb3 ~ d3",
  BH: "~ c3 d3 ~ c3 bb2 ~ b3 bb3 a3 ~ ab3 a3 ~ ab3 a3 f3 ~ f3 ~ eb3 ~ c3 eb3 ~ c3 ~ eb3 ~ d3 ~ eb3",
  BI: "[~ d3 b2 ~ c3 ~ b2 ~ [a2,f3,c4]@5 ~@6 [f3,a3]@8 ~@3 [ab2,f3,b3]@5 ~ [bb3,db4]@5 ~ [ab2,f3,b3]@5 [gb2,eb3,a3]@5 ~ [g2,bb3]@5 [d3,bb3,d4]@5 ~]/2", // F Fdim Bbm Fdim Ebdim Gm
  BJ: "e4@5 [bb2,f3,d4]@5 ~ [a2,c4]@5 ~ [ab2,f3,b3]@5 ~ g2@4 ~ [c3,bb3]@4, ~@22 [e3,bb3]@5 ~@5", // Bb Am Fdim C7 Edim
  BK: "[~ [f2,a3]@5 ~@7 c2@5 [gb3,db4]@5 ~ [a2,f3,c4]@5 [c3,f3,a3]@5 ~ [ab2,f3]@5 [f3,g3,bb3,d4]@5 ~ [g2,e3,bb3]@5 ~ [f2,d3,ab3]@5 [e2,c3,g3]@5 ~ [d2,b2,f3]@5 [c2,bb2,e3]@5 ~ [d2,bb2,f3]@5 ~ [e2,c3,g3]@5 [g2,e3,bb3]@5 ~ [f2,eb3,a3]@5]/3", // F Gb5 F Db Gm7 Edim Ddim C …
  BL: "[a3,eb4,f4]@5 ~ [d3,b3,f4]@5 [db3,bb3,e4]@5 ~ [c3,a3,eb4]@5 ~ [a3,c4,eb4]@5 ~@4", // F7 Bdim Bbdim Adim
  BM: "~@2 [c3,ab3,eb4]@5 [bb2,ab3,f4]@5 ~@18 c4 ~", // Ab Bb7
  BN: "[ab3 ~ f3 d3 ~ bb2 ~ ab2 ~ f2 ab2 c3 d3 f3 ab3@5 ~@7 [eb2,bb2]@5 [g3,db4,f4]@5 ~ [ab3,d4]@5 ~@6 bb2@5 ~@11, ~@20 g3@11 ~@11 [g3,db4]@11 ~@11]/2", // Eb5 Gm7b5 Abdim Gdim
  BO: "~ [ab2,gb3,c4]@5 ~@20 [db3,b3,f4]@2 ~@4", BP: "~@5 [c3,bb3,e4]@2 ~@9 e3 eb3 [db3,d3] c3 ~ b2 ~ bb2 ~@8",
  BQ: "[~@25 [a2,f3,c4]@5 ~ [f3,a3,d4]@5 ~@6 [d3,gb3,c4]@5 ~ g2@5 [ab3,b3,d4]@5 ~ c2@5]/2", // F Dm D7 Abdim
  BR: "[g3,bb3,c4]@5 ~ [f3,a3,c4]@5 ~@21", BS: "[~@10 c3@8 ~ [c3,bb3]@8 gb3@2 ~ g3@5 bb3@10 ~@19, ~@35 c3@6 ~@23]/2",
})).s("gm_piano").gain(0.27).pan(0.2)

// chords · piano · "A.PIANO 2" · soft notes
const piano_soft = note("<A@3 ~@68 B C D E F G H ~@50 I@6 J@2 K ~@3 L@2 M N O@2 P@3 Q>".pickRestart({
  A: "[[a3,f4,c5]@44 ~ [ab3,eb4,b4]@36 ~@15]/3", B: "~@17 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~ e3 f3",
  C: "~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 e3",
  D: "~ f3 e3 f3 ~ e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3",
  E: "~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~ e3 f3 ~",
  F: "e3 f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~",
  G: "f3 e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3 e3 ~ f3 e3 ~ f3 e3 f3 ~",
  H: "e3 f3 ~ e3 f3 e3 ~ f3 e3 f3 ~ e3 f3 ~ e3 f3@5 ~@12",
  I: "[~@25 eb3@5 db3@5 ~ [ab2,f3]@22 ~@11 d3@5 ~ e3@5 ~@12 c2@10 ~ e3@9 ~ eb3 d3@10 ~ [ab2,f3]@5 ~@3 [ab2,f3]@14 [g2,f3]@19 ~ [bb2,c3,e3,bb3]@24 ~, ~@25 [f2,a2]@10 ~@23 [g2,f3]@16 ~@6 e3@22 ~ a2@22 ~@67]/6", // Db G7 C7 F G7
  J: "[a3@11 g3@8 ~ bb3@8 a3@10 ~@7 [bb2,ab3]@19, c3@19 ~ f2@24 ~@20]/2", K: "[eb3,g3]@19 ~ [bb2,g3,db4]@5 ~@7",
  L: "[~@15 [f2,a3]@16 [bb2,ab3]@5 ~@18 [eb3,g3]@5 ~@5]/2", M: "~@12 f3@5 ~@6 [d3,c4]@9",
  N: "~@2 [g2,b3]@5 ~@7 [c3,bb3]@10 ~ [f3,a3]@5 ~@2", // G C7 F
  O: "[~@4 [ab2,gb3]@10 ~ db3@5 ~@6 gb2@10 ~ b2@5 ~@7 bb2@10 ~ eb3@4]/2", // Ab7
  P: "[~@7 [db3,b3]@10 ~ g3@5 ~@6 [bb2,bb3]@10 ~ c3@5 ~@7 [c3,bb3]@10 ~ f2@2 ~ gb2@2 g2@2 ~ ab2@2 ~ a2@5 bb2@4 ~ b2 c3@8 f2@2 ~]/3", // Db7 Bb C7
  Q: "~@6 f2@5 ~@21",
})).s("gm_piano").gain(0.17).pan(0.2)

stack(piano, piano_soft)

More by Tatum Art