Strudelify

Cataract Rag

Robert Hampton

KeyB♭ majorTempo84 bpm
0:00/0:00
// Cataract Rag — Robert Hampton
// 84 bpm, 2/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 152 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(84/2)

// 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 M N O P Q@2 R S T F G U I V K L M N O W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AD AL AM AN AO
  AP AB AC AD AE AF AG AH AI AJ AK AD AL AM AN AO AP AQ AR AS AT AQ AU AV AW AX AR AS AY AZ BA BB BC AQ AR AS AT AQ AU
  AV AW AX AR AS AY AZ BA BB BC BD BE BF BG BH BI BJ BK BD BL BM BG BH BI BN BO BP BQ BR ~ BS BT BU@2 BP BQ BR ~ BV BW
  BX BY BP BQ BR ~ BS BT BU@2 BP BQ BR ~ BV BW BX BZ CA CB CC CD
>`.pickRestart({
  A: "[g5,bb5,db6,g6] ~", B: "[bb4,db5,g5,bb5] ~",
  C: "[c5,e5,bb5,c6] [c5,e5,bb5,c6]@2 [c5,e5,bb5,c6] [c5,e5,bb5,c6]@2 [c5,e5,bb5,c6]@2", // C7
  D: "[c5,eb5,f5,c6]@8 ~@2 [f4,f5]@2 [g4,g5]@2 [a4,a5] ~", E: "[bb4,d5,f5,bb5]@4 ~ [f4,f5] [g4,g5] [a4,a5]",
  F: "[bb4,bb5]@4 ~ [bb4,bb5] [c5,c6] [db5,db6]", G: "[d5,d6]@4 ~ [bb4,bb5] [c5,c6] [db5,db6]", H: "[d5,d6] ~",
  I: "~ [d5,gb5,a5,d6] [db5,gb5,a5,db6] [d5,gb5,a5,d6]", J: "[eb5,gb5,a5,eb6] [d5,gb5,a5,d6] [eb5,gb5,a5,eb6] [d5,d6]",
  K: "~ d5 [bb4,bb5] d5 gb5 [a4,a5] d5 gb5", L: "[g4,bb4,d5,g5] ~", M: "~ g5 [c5,c6] eb5 g5 [b4,b5] f5 g5",
  N: "[c5,c6] eb5 g5 [d5,d6]@3 [c5,c6]@2", O: "~ f5 [bb4,bb5] d5 f5 [a4,a5] d5 f5",
  P: "[bb4,bb5] d5 f5 [c5,c6]@3 [bb4,bb5]@2", Q: "[e5,g5,bb5,d6] [e5,g5,bb5,c6]", R: "c6 [eb5,a5] [eb5,g5] [eb5,gb5]",
  S: "[eb5,f5]@4 ~ [f4,f5] [g4,g5] [a4,a5]", T: "[bb4,bb5]@4 ~ [f4,f5] [g4,g5] [a4,a5]", U: "[d5,d6]@3 ~",
  V: "[eb5,gb5,a5,eb6] [d5,gb5,a5,d6] [db5,a5,db6] [d5,gb5,a5,d6]", // Ebdim D Gbm D
  W: "[bb4,bb5] d5 f5 [f5,g5,b5,eb6]@3 [f5,g5,b5,d6]@2", X: "[e5,bb5,d6] [e5,bb5,c6]", Y: "[eb5,a5,d6] [eb5,f5,c6]",
  Z: "[d5,f5,bb5] ~@3", AA: "~ [a4,eb5,f5] [bb4,d5,f5,bb5] ~", AB: "f5 g5 ~ f5 e5@4 eb5 f5 ~ eb5 d5@4",
  AC: "c5 d5 ~ c5 bb4@4 a4 bb4 ~ a4 g4@2 ~ [f4,g4]", AD: "bb4@2 g5 [bb4,d5,f5]@3 ~@2, a4 ~@15",
  AE: "~ d6 gb5 g5 bb5 db5 d5 f5", AF: "a4@2 g5 [a4,eb5,f5]@3 ~@2", AG: "~ eb6 ab5 a5 d6 e5 f5 c6",
  AH: "bb4@2 g5 [bb4,d5,f5]@3 ~@2", AI: "~ f6 db6 d6 a5 bb5 g5 gb5",
  AJ: "[d5,f5] g5 ~ f5 [db5,e5]@4 [c5,eb5] f5 ~ eb5 [bb4,d5]@4", // Dm Dbm Cm Bb
  AK: "[a4,c5] d5 ~ c5 [g4,bb4]@4 [f4,a4] bb4 ~ a4 [eb4,g4]@2 ~ [f4,g4]", AL: "~ d5 eb5 e5 f5 gb5 g5 a5",
  AM: "[bb4,eb5,g5,bb5]@2 eb5 [eb5,f5] d5@2 eb5@2 [c5,eb5,g5,c6]@2 [bb4,bb5]@2 [c5,c6]@2 [db5,db6]@2", // Eb Ebsus2 Cm Bb C Db
  AN: "[d5,f5,bb5,d6] [g4,b4,f5,g5]", AO: "[e4,bb4,d5] [eb4,f4,c5]", AP: "[d4,f4,bb4] [a4,eb5,f5] [bb4,d5,f5,bb5] ~",
  AQ: "~ eb6 bb5 g5 ~ bb5 g5 eb5 ~ g5 eb5 bb4 ~ eb5 bb4 g4", AR: "~ bb4 g4 eb4 ~ g4 eb4 bb3 ~@4 [d4,f4,g4]@4",
  AS: "[c4,eb4,g4,c5] [c4,eb4,g4]@2 [c4,eb4,g4]", AT: "[b3,f4,g4]@2 [c4,eb4,g4] ~",
  AU: "~ bb4 g4 eb4 ~ g4 eb4 bb3 ~@4 [c5,d5,gb5]@4", AV: "[g4,bb4,d5,g5] [g4,bb4,d5]@2 [g4,bb4,d5]",
  AW: "[gb4,c5,d5]@2 [g4,bb4,d5] ~", AX: "~ eb6 bb5 g5@2 bb5 g5 eb5 ~ g5 eb5 bb4@2 eb5 bb4 g4",
  AY: "[b3,f4,g4]@4 [c4,eb4,g4] [c4,c5] [db4,db5] [d4,d5]", // G7 Cm C Db D
  AZ: "[eb4,ab4,c5,eb5]@2 [eb4,eb5] [f4,f5]@2 [e4,e5] [f4,f5] [gb4,gb5]", // Ab Eb F E F Gb
  BA: "[g4,g5] [ab4,ab5] [a4,a5] [bb4,bb5] [c5,c6]@2 [bb4,e5,g5,bb5]@2", BB: "[a4,eb5,g5] [ab4,bb4,f5]",
  BC: "[g4,bb4,eb5] [d5,ab5,bb5] [g5,bb5,eb6] ~", BD: "~ eb3 g3 c4 ~ g3 c4 eb4 ~ c4 eb4 g4 ~ eb4 g4 c5",
  BE: "~ g4 c5 eb5 ~ c5 eb5 g5 ~ eb5 g5 c6@2 c6 g5 eb5", BF: "~ c6 ab5 f5@2 ab5 f5 c5 ~ f5 c5 ab4 ~ c5 ab4 f4",
  BG: "~ ab4 f4 c4 ~ f4 c4 ab3 ~ c4 ab3 f3 ~@4", BH: "~ [b3,f4,g4] [b3,gb4] [b3,f4,g4]", BI: "[c4,f4,ab4] [b3,f4,g4]",
  BJ: "~ [c4,eb4,g4] [c4,eb4,gb4] [c4,eb4,g4]", BK: "~ [b3,f4,g4] [b3,gb4] [b3,g4]",
  BL: "~ g4 c5 eb5 ~ c5 eb5 g5 ~ eb5 g5 c6 ~ c6 g5 eb5", BM: "~ c6 ab5 f5 ~ ab5 f5 c5 ~ f5 c5 ab4 ~ c5 ab4 f4",
  BN: "~ [g3,c4,eb4] [f3,b3,eb4] [f3,b3,d4]", BO: "[eb3,g3,c4] ~ [c5,eb5,g5,c6] ~", BP: "[bb3,eb4,g4]!2 [b3,f4,g4]!2",
  BQ: "[bb3,e4,g4] ~@3", BR: "[c4,f4,ab4] ~@3", BS: "~ ab5 [eb5,eb6] ab5 bb5 [d5,d6]@2 ab5",
  BT: "[c5,c6] ab5 bb5 [d5,d6]@3 ~@2", BU: "[[eb5,gb5,a5,eb6]@5 [bb4,db5,g5,bb5] [bb4,d5,ab5,bb5] ~]/2",
  BV: "[eb5,gb5,a5,eb6]", BW: "[bb4,g5,bb5] [c5,g5,c6]", BX: "[a4,eb5,g5] [ab4,d5,f5]",
  BY: "[g4,bb4,eb5] ~ [eb5,g5,bb5,eb6] ~", BZ: "[g4,bb4,eb5]@2 ~@2 [eb5,g5,bb5,eb6] [bb4,bb5] [c5,c6] [d5,d6]",
  CA: "[eb5,g5,eb6]@4 ~ [eb5,eb6] [f5,f6] [gb5,gb6]", CB: "[g5,g6]@4 ~ [g5,g6] [ab5,ab6] [a5,a6]",
  CC: "[bb5,d6,bb6]@3 [bb5,d6,bb6]", CD: "~ [eb5,eb6] [g5,g6] [bb5,bb6] [eb6,eb7]@2 ~@2",
})).s("gm_piano").gain(0.27)

stack(piano)