Strudelify
KeyD majorTempo120 bpm
0:00/0:00
// Taxi — Harry Chapin
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 3/4 at bar 23, 4/4 at bar 24, 3/4 at bar 25, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 189 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 · epiano1
const epiano1 = note(`<
  A B@8 C D@3 E@3 F E@2 G H I J K@2 L M@6 N M@8 O M@2 P Q R S P T U V W@4 X Y Z AA@5 AB@2 AA AC AD AE AF AG AH AI@2 Y@2
  AJ AK@2 AL AM@2 AN AO AP@3 AQ AR AS AT AM AU AV AW AX AY AZ BA BB@3 BC BD BE BF@3 BG U BH BD BI BJ BK BL BM U BN BO@2
  BP BQ@3 BR@6 BS O BR BT M@6 O BR BU@2 BV BU BV BU BW O M@2 P Q R S P T U V M@8 O M@2 P U Q BX P Q O M BY BZ@2 CA CB
  CC@3
>`.pickRestart({
  A: "~@4 c4!2 e4 c4", B: "d4 a#3 g4 a#3 c4!2 e4 c4", C: "d4 a#3 g4 a#3 [d4,f4]@4",
  D: "[[c4,d#4]@4 [c4,e4,g4]@2 [c4,g4] [a#3,g4]@2 d4 [a#3,g4] d4 [c4,e4,g4]@2 [c4,g4] [a#3,g4]@5 ~ c4 e4 c4]/3", // Cm C C5 D# C C5 D#
  E: "d4 a#3 g3@2 ~ c4 e4 c4", F: "d4 a#3 g3 a#3 ~ c4 e4 c4", G: "d4 a#3 g3 c4 [d4,f4]@4", H: "[c4,d#4]@2 [c4,e4,g4]!2",
  I: "[a#3,d4,g4]!2 [c4,e4,g4]!2", J: "[a#3,d4,g4]@2 [a#3,d4,g4]@2 c4 a#3 a3 a#3",
  K: "[c4 a#3 [a3,d4,f#4]@8 g4 f#4 e4 a#4 a4 g4]/2", L: "[d4,f#4,a4]!2 [c4,e4,a4]!2, c5",
  M: "[d4,f#4,a4]!2 [c4,e4,a4]!2", N: "[c4,e4,g4] [a#3,d4,g4]", O: "[c4,e4,g4] [a#3,d4,f4]", P: "[b3,d4,g4]!4",
  Q: "[a3,d4,f#4]!4", R: "[c4,e4,g4]!2 [b3,d4,g4]!2", S: "[d4,f#4,a4]!4", T: "[a3,d4,f#4]!2 [b3,d4,f#4]!2",
  U: "[b3,e4,g4]!4", V: "[b3,e4,g4]@7 ~", W: "~ d4 f#4 d4 e4 c4 a3 c4", X: "[g3,c4,e4]@3 [f3,a#3,d4]@3 ~ d4",
  Y: "f#4 d4 e4 c4 a3 c4 ~ d4", Z: "f#4 d4 e4 c4 a3 c4 [d4,f#4,a4]@2", AA: "[d4,f#4,a4] [c4,e4,a4]!2 [d4,f#4,a4]",
  AB: "[[d4,f#4,a4] [c4,e4,a4]!2 [c4,e4,g4]@2 [a#3,d4,f4]@2 [d4,f#4,a4]]/2", AC: "[d4,f#4,a4] [c4,e4,a4]!2 [b3,d4,g4]",
  AD: "[b3,d4,g4]!3 [b3,e4,g4]", AE: "[b3,e4,g4]!3 [a3,d4,f#4]", AF: "[a3,d4,f#4]!3 [b3,d4,f#4]",
  AG: "[b3,d4,f#4]!3 [b3,d4,g4]", AH: "[b3,d4,g4]!3 [a3,d4,f#4]",
  AI: "[[a3,d4,f#4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [c4,e4,g4]@4 [a#3,d4,f4]@4 ~ d4]/2", AJ: "f#4 d4 e4 c4 a3 c4 ~ c4",
  AK: "e4 c4 d4 a#3 g3 a#3 ~ c4", AL: "e4 c4 d4 a#3 g3 a#3 [c4,e4,g4]@2", AM: "[c4,e4,g4]!4",
  AN: "[c4,e4,g4]!3 [d4,f#4,b4]", AO: "[d4,f#4,b4]!3 [e4,g#4,b4]",
  AP: "[[e4,g#4,b4]@2 [e4,g#4,b4]@2 [e4,g#4,b4]@2 [c4,e4,a4]@3 [c4,e4,a4]@3 [c4,e4,a4]@3 [c4,e4,a4]@2 [c4,e4,a4]!4 [c4,e4,a4]@3]/3", // E Am
  AQ: "[c4,e4,a4] [d4,f#4,a4]!3", AR: "[d4,f#4,a4] [b3,e4,g4,b4]!3", AS: "[b3,e4,g4,b4]!4",
  AT: "[b3,e4,g4,b4] [c4,e4,g4]!3", AU: "[c4,e4,g4] [d4,f#4,b4]!3", AV: "[d4,f#4,b4] [e4,g#4,b4]!3",
  AW: "[e4,g#4,b4]@2 [c4,e4,a4]@3 [c4,e4,a4]@3", AX: "[c4,e4,a4]@3 [c4,e4,a4]@3 [c4,e4,a4]@2",
  AY: "[c4,e4,a4]!3 [d4,f4,a4]", AZ: "[d4,f4,a4]!4", BA: "[d4,f4,a4]!3 [a#3,d4,g4]", BB: "[a#3,d4,g4]!4",
  BC: "[a#3,d4,g4]!3 [a#3,d4,f4]", BD: "[a#3,d4,f4]!4", BE: "[a#3,d4,f4]!3 [c4,f4,a4]", BF: "[c4,f4,a4]!4",
  BG: "[c4,f4,a4]!3 [b3,e4,g4]", BH: "[b3,e4,g4]!3 [a#3,d4,f4]", BI: "[a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#3,d4,f4]@2 ~ a4",
  BJ: "a4 g4!2 f4!2 e4!2 d4", BK: "d4 c4!2 a#3!2 a3 c4@2", BL: "[c4,f4,a4]!3 [d4,g4,b4]",
  BM: "[d4,g4,b4] [c4,f4,a4] [d4,g4,b4] [b3,e4,g4]", BN: "[b3,e4,g4]!3 [c4,e4,g4]",
  BO: "[[c4,e4,g4]!3 [c4,e4,g4]@4 ~]/2", BP: "d4 a#3 d4 f4 [b3,d4,f4,a4]@12",
  BQ: "[e5@2 b4@2 g4@2 e5@4 b4@4 g4@3 b4 f#4 g4 [c4,e4]@4]/3", BR: "~ d4 f#4 d4 e4 c4 a3@2",
  BS: "~ d4 f#4 d4 e4 c4 a3 d4", BT: "~ d4 f#4 d4 [c4,e4]@4", BU: "[a3,d4,f#4,a4]!4",
  BV: "[a3,d4,f#4,a4]!2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]!2 [a3,d4,f#4,a4]@2", BW: "[a3,d4,f#4,a4]!2 [a3,d4]!2",
  BX: "[b3,d4,f#4]!4", BY: "[a3,d4,f#4,a4]!2 [a3,d4,e4,a4] [a3,d4,f#4,a4]", BZ: "[b3,d4,g4,b4]!4",
  CA: "[c#4,e4,a4]@2 [c#4,e4,a4] a3 [c#4,e4,a4] a3 [c#4,e4,a4] a3", CB: "a3@3 ~",
  CC: "[d4 f#4 d4 e4 c4 a3 c4 d4@12 ~@5]/3",
})).s("gm_epiano1").gain(0.16)

// bass · contrabass
const bass = note(`<
  ~@9 A B@6 C@3 D E F G@2 H I J K J L M N O J P Q R M S T N O J N U V W X Y Z AA AB AC@4 AD@8 AE@8 AF AG@8 AH@8 AI@2
  AJ@2 AK AL@2 AM AN@2 AO@8 AP@6 AQ@8 AR@4 AS AT AU AV AU AV AU AW O J AX L AY AZ R M N O T BA BB BC BB BC BB BD O BE AW
  U V W BF U BG AA AB J BH J L M S T N O J BI BJ BK BL BM U V O J BN BO BP BQ BR BS@2 ~
>`.pickRestart({
  A: "~ a#2", B: "[g#2@4 c3@8 c3@7 d3 c3@7 g2 c2@7 d3 c3@7 g2 c2@4]/6", C: "[~@2 g2 a#2 c3@7 d3 c3@7 g2 c2@4]/3",
  D: "~ c2 g2 c3 a#2@4", E: "g#2@4 c2@3 c2", F: "c2@3 g2 [c2,c3]@3 [c2,c3]",
  G: "[[c2,c3]@4 c3@3 a#2@3 [d2,d3]@3 d2 a2@2]/2", H: "d3@2 c3@3 a#2@3", I: "[d2,d3]@3 d2 d2@2 a2 c2",
  J: "d2@3 d2 d2@3 a2", K: "d2@3 d2 a2@2 c2 c#2", L: "d3@3 d3 d3@2 c3 a2", M: "d2@3 d2 a2@2 a2@2",
  N: "d2@3 d2 a2@2 d3@2", O: "c3 a#2", P: "d2@3 d2 d2@2 a2 c3", Q: "d3@3 d3 f#2 g2 g#2 a2", R: "d2@3 d3 d3@2 c3 a2",
  S: "d2@3 d2 g#2 a2 c3 c#3", T: "d3@3 d3 d3@3 a2", U: "g2@3 g2 b2@2 c#3@2", V: "d3@3 f#3 e3 d3 b2 a2",
  W: "[c2,c3]@4 g2@3 a2", X: "d2@3 d2 a2@2 d3 f#2", Y: "g2@3 g2 f#2@2 e2@2", Z: "d2 b2", AA: "e2@3 e2 b2@2 e2@2",
  AB: "a2@7 a2", AC: "d2@2 d2 a2",
  AD: "[c3@3 a#2@3 d2@4 a2@2 d3@2 d2@4 a2@2 d3@2 d2@3 d2 d2@3 a2 d3@3 d3!2 a2 c3 a2 d2@4 a2@2 a2@2 d2@3 d2 a2@2 c3 c#3 d3@3 d3 d3@3 a2 d2@2]/8",
  AE: "[~ d2 a2@2 d3@2 c3@4 a#2@4 d2@3 d2 d2@2 d2 a2 d2@3 d2 a2@2 d3@2 g2@3 d2 g2@2 f#2@2 e2@3 f#2 g2 a2 b2 c#3 d2@3 d2 f#2@2 a2@2 b2@3 f#2 b2@4 g2@2]/8",
  AF: "~ g2 b2@2 c#3@2 d3@2",
  AG: "[~ a2 d2@2 c#2@2 c2@4 a#2@4 d2@4 d2@2 a2@2 d2@4 d2@2 a2@2 d2@4 d2@2 a2@2 c2@4 c2@2 g2@2 c2@4 c2@2 g2@2 c2@4 c2@2 g2@2 c3!2]/8",
  AH: "[c3!6 c3@3 c3 c3@3 g2 c2@3 c2 g2@2 c3@2 b2@3 f2 f#2 b2 f#2 f2 e2@3 e2 b2 e3@3 a3@3 g3@3 f#3@3 g3@2 g3 a3 g3 f#3 f#3@5 [d2,d3]@3 d2 a2@2]/8", // D
  AI: "[d3@2 e2@3 e2 b2@3 b2 f#3@3 e3@3]/2", AJ: "[d3 c#3 c3@3 c3 c3@3 g2 c2@3 c2 g2@2]/2", AK: "c3@2 b2@3 f2 f#2 b2",
  AL: "[f#2 f2 e2@3 e2 b2 e3@3 a3@3 g3@3]/2", AM: "f#3@3 g3@3 a3@2",
  AN: "[a3@2 g3@2 f#3@2 a#2@3 a#2 a#2@3 f2 a#2 c3]/2",
  AO: "[a#2@2 ~ a#2 f2 e2 d#2@3 d#2 d#2@3 d#2 d#2@3 d#2 d#2@3 d#2 d#2@3 d#2 d#2@3 d#2 d#2@3 d#2 d#2@3 d#2 a#2@3 a#2 a#2@3 a#2 a#2@3 a#2 a#2@3 a#2 f2@3 f2 f2@3 f2 f2@2]/8",
  AP: "[~ f2 f2@3 f2 f2@3 f2 f2@3 c3 f2@3 f2 a2@2 b2@2 c3@3 c3 c3@3 g2 c2@3 c2 e2@2 f2 f#2 g2@3 g2 g2@3 d2 g2@2]/6",
  AQ: "[~ g2 d3@2 g3@2 [c3,g3,a#3]@4 [c3,g3,a#3]@4 [c3,g3,a#3]@4 c2@2 e2@2 f2@3 f2 c3@3 e3 f3@3 b2 c3@2 c2 f2 e2@3 a#2 b2@3 d#3 e3@3 b2 c3@2 e2 c3 a2@3 a2 a2@3 e2 a2@2]/8", // C7
  AR: "[~ a2 e2@2 a2@2 g2@8 d3@18]/4", AS: "d3@5 b3 g3 e3", AT: "d3@7 e3", AU: "d3@7 a2", AV: "d2@7 e3",
  AW: "d2@4 ~ d2 a2 d3", AX: "d2@3 d2!2 a2 c3 c#3", AY: "d2@3 d2 d2@2 a2@2", AZ: "d2@3 d2 f2 g2 g#2 a2",
  BA: "[d2,d3]@2 [d2,d3]@2 [d2,d3]!4", BB: "[d2,d3]!4", BC: "[d2,d3]!2 [d2,d3]@2 [d2,d3]!2 [d2,d3]@2",
  BD: "[d2,d3]!2 d3!2", BE: "d3@3 a2", BF: "d2@3 d2 a2 d3@2 f#2", BG: "d3@2 c#3 b2@2 f#2 b2 d2",
  BH: "d2@3 d2 d2@2 a2 c2", BI: "d2@3 d2 d2@2 a2 d2", BJ: "g2@3 d2 [g2,g3]@2 [f#2,f#3]@2",
  BK: "[e2,e3]@3 f#2 g2 a2 b2 c#3", BL: "d2@3 d2 f#2@2 a2@2", BM: "b2@2 f#2 b2@2 f#2 b2 a2", BN: "d2@3 d2 d2@2 d2@2",
  BO: "e2@3 e2 e2@2 b2@2", BP: "e3@3 e3!2 d3 b2@2", BQ: "a2@3 a2 a2@2 e2@2", BR: "[a2,a3]@3 ~", BS: "d3/2",
})).s("gm_contrabass").gain(0.18)

stack(epiano1, bass)

More by Harry Chapin