Strudelify

Katy

Basie

KeyE♭ majorTempo66 bpm
0:00/0:00
// Katy — Basie
// 66 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 37 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(66/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.

// bass · acoustic bass · "Jazz Bass"
const bass = note("<~@2 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB ~@7>".pickRestart({
  A: "eb2@5 ~ eb2@6 ab2@3 ~ ab2@2 ab2@6", B: "g2 db2 c2 g2", C: "f2@9 ~@3 ab2@11 ~ c3@8 f1 ~@3 f2@8 ~@4",
  D: "db2 ab2 g2 d3", E: "gb2@3 ~ gb2@2 db2@6 c2@5 ~ c2@6", F: "b1 c2 b1 gb2", G: "bb1@6 c3@6 bb1@3 ~ bb1@2 bb1@6",
  H: "bb1 ~@3", I: "eb2@6 bb2@6 ab2@5 ~ ab2@6", J: "g2@6 d3@6 c2@3 ~ c2@2 gb2@6",
  K: "~@8 f1 ~@3 g2@12 ab2@12 d2@12, f2 ~@3", L: "db2@5 ~ db2@6 db2@6 g2@6", M: "gb2 db2 c2 g2",
  N: "b1@6 gb2@6 b1@3 ~ b1@2 gb2@6", O: "bb1@6 c3@6 bb1@5 ~ bb1@6", P: "eb2@6 e2@6 eb2@3 ~ eb2@2 a2@6",
  Q: "ab2@8 ab1@2 ~@2 eb2@11 ~ d2@22 ~@2", R: "db2@11 ~ c2@11 ~", S: "f2@12 c2@10 bb1 ~",
  T: "b1@4 b0 ~ bb1@6 b1@5 ~ gb2@6", U: "e2@11 ~ e2@11 ~ e2@22 ~@2", V: "bb1@5 ~ f2@6 bb1@11 ~", W: "eb2@12 f1@10 d2 ~",
  X: "eb2@20 eb1 ~@3 bb1@17 ~@3 bb1@2 ~@2", Y: "bb2@8 bb0 ~@3 ab2@12 gb2@8 bb0 ~@3 e2@11 ~", Z: "eb2 db2 c2!2",
  AA: "e2@6 f2@3 ~ f2@2 e2@6 f2@6", AB: "d2@3 ~ d2@2 d2@6 f2@6 f2@6",
})).s("gm_acoustic_bass").gain(0.35).pan(0.4)

// bass · acoustic bass · "Jazz Bass" · soft notes
const bass_soft = note("<~@30 [bb2@15 ~ bb2@2 bb2@4 bb1@2] [eb2@3 ~] [ab2@4 eb3@2 e3@15 ~@3] [ab2@2 eb3 e3@8 ~] ~@3>")
  .s("gm_acoustic_bass").gain(0.2).pan(0.4)

// chords · piano
const piano = note("<A@2 B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG@4>".pickRestart({
  A: "[bb4,bb5]/2", B: "[g3,d4,f4,bb4] [gb3,d4,f4,bb4]", C: "[f3,g3,bb3,d4]@3 g4 g4@2, ~ [e3,bb3,db4,db5]",
  D: "[eb3,g3,ab3,c4]@47 ~", E: "~ ab4@2 ~ g4@2, [f3,b3,eb5]!2",
  F: "~@4 ab4@8 [e3,a3,bb3,c4] ~ [f3,bb3,b3,db4] ~ [e3,a3,bb3,c4]@8, [f3,bb3,db5] ~", // Am Bbm Am Bbm
  G: "~ db5@2 ~ b4@2, [bb3,eb4,gb5] [ab3,eb4,gb5]", H: "g5@12 f5@10 gb5 g5 ab5@12 g5@12", I: "bb5",
  J: "[g3,bb3,d4,f4]@12 [gb3,d4,f4,bb4] ~ [g3,eb4,gb4,b4] ~ [gb3,d4,f4,bb4]@8", // Gm7 Bb B Bb
  K: "g4 g4@2 ~ ab4@2, [f3,bb3,d4,d5] [e3,bb3,db5]", L: "[eb3,ab3,c4,g4]@9 ~ [eb3,ab3,c4,g4]@13 ~",
  M: "[f3,bb3,b3,eb4] ~ [gb3,b3,c4,e4] ~ [f3,bb3,b3,eb4]@8 [f3,b3,eb4]@6 [f3,b3,eb4]@6", // Ebsus2 Esus2 Ebsus2 Fm7b5
  N: "~ ab4@2 ~ [e3,bb3,c4,a4]@2, [f3,bb3,db5] ~", O: "~ [bb3,db4,eb4,gb4]@2 ~ [ab3,eb4,gb4,b4]@2",
  P: "~ g4@2 ~ [ab3,b3,d4,e4]@2, [eb3,ab3,c5] ~", Q: "~ c5@2 ~ [g3,db4,e4,c5]@2, [ab3,db4,f5] ~",
  R: "[c4,g4,bb4,eb5]@24 [gb3,c4,gb4,ab4]@6 ~@2 [gb3,c4,gb4,ab4]@13 ~@3, d5 ~@47", // Cm7 Ab7
  S: "ab4 ab4@2 ~ ab4@2, [f3,c4,eb4,eb5] [e3,ab3,bb3,db4,c5]", T: "[e3,a3,c4,g4]@30 ~@2 [e3,a3,c4,g4]@13 ~@3",
  U: "[a3,eb4,a4,c5]@6 ~@2 [a3,eb4,a4,c5]@13 ~@11 b4@16, ~ [a3,eb4,g4,c5,g5]", // Adim Am7b5
  V: "[a3,e4,b4] [ab3,e4,b4] [ab3,e4,b4]@2, bb4 ~@11 bb4 ~@11 bb4 ~@23", // Asus2 E
  W: "[ab3,d4,ab4,b4]@6 ~@2 [ab3,d4,ab4,b4]@13 ~@11 bb4@16, ~ [ab3,d4,g4,c5,gb5]", // Abdim
  X: "eb2 bb2 db3 eb3 f3 ab3 [bb3,bb4] [db4,db5], [bb3,db4,f4]@3 ~, ab3@5 ~@3", Y: "[eb4,eb5] ~ [eb2,eb3]@6",
  Z: "[ab3,db4,e4,bb4]@23 ~", AA: "[g3,db4,eb4,bb4] [g3,eb4,bb4] [e3,bb3,db4] [e3,bb3,db4,ab4]",
  AB: "[f3,c4,f4] [eb3,ab3,c4,f4] [f3,c4,f4] [eb3,ab3,c4,g4]", // F5 Fm7 F5 Abmaj7
  AC: "[gb3,c4,eb4] [gb3,c4,d4] [gb3,eb4,gb4] [eb3,a3,db4]", AD: "bb2@2 f3 ab3@9", AE: "eb2 e3@5",
  AF: "ab2@2 eb3 e3@2 bb3 b3@2 eb4 e4@2 gb4",
  AG: "[ab2@8 eb3@4 e3@8 bb3@4 ~ b3@8 eb4@5 e4@8 gb4@5 ~@59 ab2@63 ~@19, ~@51 [eb4,ab4,eb5]@122 ~@19]/4", // Ab5
})).s("gm_piano").gain(0.3).pan(0.6)

// other · alto sax
const alto_sax = note("<A B C@2 D E F G H I J K L M N G O P Q ~ R S T U V W X Y Z AA AB AC ~@5>".pickRestart({
  A: "~@2 bb3 b3", B: "eb4 ~ ab4@2", C: "[f4@14 ~ bb3@2 c4 ~@2 e4@4]/2", D: "g4 c4", E: "eb4@2 ~@3 f4 g4@6",
  F: "ab4 a4", G: "gb4@11 ~", H: "c4 db4", I: "eb4 ~@5", J: "~@4 bb3 d4 f4@4 e4 eb4", K: "d4 db4",
  L: "~@4 c4 eb4 g4@4 gb4 f4", M: "eb4@20 d4 db4 c4 b3 bb3@24", N: "~@4 gb4 ab4 a4@4 ab4 g4", O: "eb4 e4", P: "f4 e4",
  Q: "eb4@2 ~", R: "~@36 c4@7 [db4,d4] eb4 e4 [f4,gb4] g4", S: "ab4 g4", T: "a4 ab4@2 b3", U: "g4 gb4", V: "f4@3 db4",
  W: "bb3@8 ~@4 eb4@8 e4@4 eb4@3 e4@3 eb4@3 db4@3 eb4@3 e4@3 eb4 e4@2 ~ db4@2, ~@45 eb4@2 ~",
  X: "eb4@21 db4 ab3 e3 c4@12 bb3@7 b3 c4 db4 [d4,eb4] e4", Y: "f4@18 ~@6 gb4@12 g4@9 ~ f4@2, ~@45 gb4@2 ~",
  Z: "e4@12 f4@12 g4@12 ~ db4@2 ~ e4@2 ~ g4@2 ~ bb4@2, ~@36 c4@2 ~ eb4@2 ~ f4@2 ~ ab4@2 ~", AA: "b4 bb4!2 a4",
  AB: "~ f4@3", AC: "~ gb4@3",
})).s("gm_alto_sax").gain(0.32).pan(0.4)

// other · alto sax
const alto_sax_2 = note("<~ A B C D E F G H I ~@6 J K L ~ M N O P Q R ~@4 S@2 ~@5>".pickRestart({
  A: "~ f4@3", B: "d4 c4", C: "d4 ~@2 db4@3", D: "eb4 ab3", E: "b3@2 ~ eb4@9", F: "db4 gb4", G: "db4@11 ~",
  H: "ab3 bb3", I: "c4 ~@5", J: "c4 d4", K: "db4", L: "c4@2 ~", M: "~@36 c4@10 db4 d4", N: "eb4", O: "e4@3 b3", P: "d4",
  Q: "db4@3 bb3", R: "g3 ~@5", S: "~ db4@3",
})).s("gm_alto_sax").gain(0.2).pan(0.4)

// other · tenor sax
const tenor_sax = note("<A B C D E F G H I J ~@6 K L M ~ N O P O Q R ~@4 S T ~@5>".pickRestart({
  A: "~ bb3", B: "eb4", C: "g3 gb3", D: "f3@2 ~ bb3@9", E: "ab3 eb3", F: "f3@2 ~ bb3@2 ab3 g3@2 f3@4", G: "f3 e3",
  H: "eb3@11 ~", I: "eb3 e3", J: "f3 ~@5", K: "g3 ab3", L: "a3 g3", M: "g3@2 ~",
  N: "~@36 c3@7 [db3,d3] eb3 e3 [f3,gb3] g3", O: "ab3", P: "a3 ab3@2 b2", Q: "ab3@3 f3", R: "db3 ~@5", S: "~ ab3@3",
  T: "~ f3@3",
})).s("gm_tenor_sax").gain(0.24).pan(0.4)

// other · baritone sax · "Bari Sax"
const baritone_sax = note("<~@2 A B C D E F G@2 A B C D E F H I J ~ K L M N O P Q R S T N I U@2 ~@3>".pickRestart({
  A: "eb3 ab3", B: "g3 ~@5", C: "f3@21 e3 eb3 d3", D: "db3@2 ~ bb4@2 ab4 g4@2 f4 db4@2 g3",
  E: "gb3@7 g3 ab3 a3 bb3 b3 c4@12", F: "b3@11 ~", G: "[bb3@7 ~@5]/2", H: "bb3@21 a3 g3 f3", I: "eb3", J: "ab3@2 ~",
  K: "~@3 c4", L: "b3", M: "e3@3 b3", N: "bb3", O: "eb3@3 bb3", P: "eb3@2 ~ eb3@9", Q: "bb3 bb3@2 bb3",
  R: "eb3 db3 c3@2", S: "f3@12 f3@24 f3@9 ~ eb3@2, ~@45 e3@2 ~", T: "d3 f3", U: "ab3",
})).s("gm_baritone_sax").gain(0.2).pan(0.4)

// other · trumpet · "Trumpet 1"
const trumpet = note("<A B C@2 D@2 E@2 F@2 G@2 D@2 H@2 I@2 ~@7 J K@2 L M ~@7>".pickRestart({
  A: "~@2 bb3 b3", B: "eb4 f4 ab4 b4", C: "[bb4@14 ~ bb3@2 c4 db4@2 e4@2 g4 c5]/2",
  D: "[bb4@14 ~ eb4@2 f4 g4@2 ab4 bb4@2 eb5]/2", E: "[db5@14 ~@2 b4 bb4 b4@4 bb4 ab4]/2",
  F: "[bb4@14 ~ bb3@2 b3 eb4@2 f4 ab4@2 b4]/2", G: "[bb4@14 ~ bb3@2 c4 db4@2 e4!2 g4 c5]/2",
  H: "[db5@14 ~@2 b4 bb4 b4@4 gb4 ab4]/2", I: "[bb4@7 ~@5]/2", J: "~@8 bb4 ~@2 e5, ~@3 b4",
  K: "[[c5,eb5]@14 ~ bb4@2 c5 db5@2 eb5 e5@2 ab5]/2", L: "g5@32 ~@4 f5@7 gb5 [g5,ab5] [a5,bb5] [b5,c6] [db6,d6]",
  M: "eb6@11 ~",
})).s("gm_trumpet").gain(0.31).pan(0.6)

// other · muted trumpet · "Mute Trpt"
const muted_trumpet = note("<~@2 A B C D E F ~@9 G H I J K L M N@2 ~@3 O P Q R S T@3>".pickRestart({
  A: "~@4 bb4 d5 f5@4 e5 eb5", B: "d5 db5", C: "~@4 c5 eb5 g5@4 gb5 f5", D: "eb5 bb4", E: "~@4 gb5 ab5 a5@4 ab5 gb5",
  F: "gb5", G: "~@12 eb4@8 f4@3 gb4 g4@8 bb4@8 db5@2 eb5 d5 c5@4", H: "eb5", I: "~@3 db5@2 c5 db5@4 c5 bb4", J: "c5",
  K: "~@12 c5@6 db5 c5 b4@4 c5@16 b4@4 a4@4", L: "b4 c5 b4@10", M: "~@3 b4@2 bb4 b4@4 bb4 ab4", N: "[bb4@7 ~@5]/2",
  O: "~@9 db5@2 c5", P: "db5@9 db5@2 c5", Q: "db5@32 ~@3 b4 c5@12", R: "ab4@32 ~@4 b4@10 bb4 a4", S: "ab4@33 ~@5 b4@10",
  T: "[~@3 ab4@122 ~@19]/3",
})).s("gm_muted_trumpet").gain(0.31).pan(0.6)

// other · trumpet · "Trumpet 4"
const trumpet_2 = note("<~@25 A B@2 C D ~@7>".pickRestart({
  A: "~@3 eb4@2 e4 ab4@6", B: "[ab4@14 ~ bb3@2 c4 db4@2 eb4 e4@2 ab4]/2",
  C: "g4@32 ~@4 f4@7 gb4 [g4,ab4] [a4,bb4] [b4,c5] [db5,d5]", D: "eb5@11 ~",
})).s("gm_trumpet").gain(0.46).pan(0.6)

// other · trombone
const trombone = note("<~ A B@2 C D E@2 F G H@2 C D I J ~@9 K L M N O P Q R S ~@3>".pickRestart({
  A: "~ f4@3", B: "[d4@14 ~@3 c4 ~@2 e4@4]/2", C: "eb4 c4", D: "eb4@2 ~ eb4@9", E: "[db4@23 ~]/2", F: "c4 db4",
  G: "c4@2 ~@3 b3 ~@2 f4@4", H: "[d4@7 ~@3 e4@2]/2", I: "db4", J: "d4@11 ~", K: "~@8 bb3 b3@3", L: "db4 db4@2 db4",
  M: "c4 bb3 db4@2", N: "c4 c4@2 c4", O: "c4 eb4", P: "~ ab4@3", Q: "~ gb4@3", R: "~@2 eb4", S: "~@11 eb4@5",
})).s("gm_trombone").gain(0.2).pan(0.6)

// other · trombone
const trombone_2 = note("<~ A B C D E F@2 G H I C D E F@2 ~@9 J K L K M N@2 O P ~@3>".pickRestart({
  A: "eb4", B: "g3 c4", C: "bb3 ~@2 db4@3", D: "c4 ab3", E: "b3@2 ~ c4@9", F: "[bb3@18 ab3@5 ~]/2", G: "ab3 bb3",
  H: "ab3 ~@2 eb4@3", I: "bb3 c4", J: "~ ab3", K: "ab3 ab3@2 ab3", L: "g3 bb3", M: "b3 bb3!2 a3", N: "~ db4@3",
  O: "~@3 bb3 b3@4", P: "~@18 bb3@6 ~ b3@23",
})).s("gm_trombone").gain(0.2).pan(0.6)

// other · trombone
const trombone_3 = note("<A@2 B C D E F G H I J C D E F G ~@9 K L M N O P Q R@2 ~@3>".pickRestart({
  A: "[~@3 b3@5]/2", B: "f3 gb3", C: "f3@2 ~@3 c4@7", D: "ab3 g3", E: "bb3@2 ~ bb3@2 ab3 g3@2 f3@4", F: "f3 e3",
  G: "eb3@11 ~", H: "g3 f3 ab3 g3", I: "ab3@2 ~@3 b3@7", J: "eb3 gb3", K: "~@3 eb3@2 e3@7", L: "e3 e3@2 e3",
  M: "db3 eb3 e3@2", N: "g3 f3 e3 eb3", O: "gb3", P: "~ c4@3", Q: "~ ab3@3", R: "~ eb3 e3@6",
})).s("gm_trombone").gain(0.2).pan(0.7)

// other · trombone
const trombone_4 = note("<A@2 B C D E F G H@2 B C D E F G ~@4 I J K L M N O P Q R S T U@2 ~@3>".pickRestart({
  A: "[~ bb3@3]/2", B: "bb2 ab2", C: "g2@2 ~ bb3@9", D: "g3 eb3", E: "f3@2 ~@7 db3@2 g2", F: "gb2 c2", G: "b1@11 ~",
  H: "[bb1@14 ~ bb3@9]/2", I: "~@3 c3", J: "ab3 g3", K: "b2@3 b2", L: "g3 gb3", M: "bb2@3 ~", N: "~ eb2@3",
  O: "bb2 bb2@2 bb2", P: "eb2 db2 c2@2", Q: "f2 f2@2 f2", R: "d2 f2", S: "bb2@2 f3 ab3@9", T: "eb2 e3@5", U: "ab2",
})).s("gm_trombone").gain(0.2).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@2 A@2 B C A@2 D E B A@2 D A@3 F D A@2 D A B D G A C D A H E ~@5>".pickRestart({
  A: "x ~@4 x ~@5 x", B: "x ~@4 x ~@6", C: "~@2 x ~@5 x ~@2 x", D: "~@5 x ~@6", E: "x", F: "~@5 x!2 ~@2 x ~@2",
  G: "~@5 x ~@3 x ~ x", H: "~@2 x",
})).gain(0.16)

// drums · snare
const snare = s("sd").struct("<~@2 A B C ~@4 D C ~ B ~ B ~ B E ~ B@2 ~ B C ~ F G ~@2 B ~@7>".pickRestart({
  A: "~@3 x", B: "~@2 x!2 ~@6 x!2", C: "~ x ~@4", D: "x", E: "~@8 x!4", F: "~@2 x!2 ~ x ~@6", G: "~@2 x!2 ~@4 x ~@3",
})).gain(0.13)

// drums · low tom
const low_tom = s("lt").struct("<~@25 [~@11 x] [~@5 x] ~@10>").gain(0.26)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x!4]!7 ~ [x!4]!15 [~ x!3] [x!4]!4 ~@7>").gain(0.26)

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 [~@8 x ~@2 x] ~@22 [~@9 x!2 ~] [~@3 x] ~@10>").gain(0.13)

// drums · high tom
const high_tom = s("ht").struct("<~@25 [~@7 x!2 ~@3] ~@11>").gain(0.23)

// drums · crash
const crash = s("cr").struct("<A B C ~@6 D ~@16 C ~@5 B E F ~@2>".pickRestart({
  A: "~@24 x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~",
  B: "x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~", C: "x",
  D: "~@12 x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~",
  E: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~ x!2 ~ x!2 ~ x ~ x!2 ~ x!2 ~ x ~ x!2 ~ x ~ x!2 ~ x ~",
  F: "x!2 ~ x ~@44",
})).gain(0.1)

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

stack(
  bass, bass_soft, piano, alto_sax, alto_sax_2, tenor_sax, baritone_sax, trumpet, muted_trumpet, trumpet_2, trombone,
  trombone_2, trombone_3, trombone_4, kick, snare, low_tom, hihat, mid_tom, high_tom, crash, ride
)

More by Basie