Strudelify

Cactus Tree

Joni Mitchell

KeyG majorTempo112 bpm
0:00/0:00
// Cactus Tree — Joni Mitchell
// 112 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (1/4 at bar 1, 4/4 at bar 1, 3/4 at bar 18, 1/4 at bar 19, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 2 "Adlib Violin" named as a string part, played on violin (its choir aahs patch is not one); ch 5 "Adlib Marimba" named as a mallet, played on marimba (its sitar patch is not one)
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(112/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 · "Adlib Piano"
const piano = note(`<
  A B C D E F G@3 H I@2 J K L M N O P Q R S T U V@3 J W@2 X Y L Z AA AB AC AD AE O AF AG AH@3 X AI@2 AJ AK AL M AM AN AO
  AP Z AQ AB AR AS@4 AT@5
>`.pickRestart({
  A: "~@6 d5!2", B: "d5@2 d5@2 d5 ~ d5 ~ d5@2 d5@2 ~ d5!2 ~, [f#4,b4]@15 ~",
  C: "d5@2 d5@2 d5!2 d5@6 ~ d5!2 ~, [g4,c5]@7 ~@9", D: "d5@2 d5@2 d5 ~ d5@2 d5@2 d5@3 d5!2 ~, [f#4,b4]@7 ~ [g4,c5]@7 ~",
  E: "b5@2 b5@2 a5 ~ g5@2 d6@4 c6@2 b5@2, b4@7 ~ [c5,f#5]@7 ~", F: "g5@2 d5 ~ d5@2 d5@2 c5@2 c5@3 b4 ~ g5, b4@7 ~@9",
  G: "[g5@2 d5 ~ d5@2 c5@2 [g4,c5]@11 ~ [g4,c5]@15 ~@2 b4 ~ b4 c5@2 c5@2 c5@2 d5 ~, b4@7 ~@33 g4@7 ~]/3", // C5
  H: "b4@2 ~@2 g4@2 g4 ~ g4@2 ~@3 b4!2 ~, g4@4 ~@6 g4@5 ~, ~ b4@5 ~@2",
  I: "[c5@2 c5@2 c5@2 d5@2 b4@2 ~@2 g4 ~ g4@2 g4@2 ~@3 b4!2 ~ c5@2 c5@2 c5 ~ d5@2, g4@7 ~ g4@4 ~@6 g4@5 ~ g4@7 ~, ~@5 b4@5 ~@6]/2",
  J: "b4@2 ~@2 g4@2 g4@2 g4@2 ~@3 b4!2 ~, g4@4 ~@6 g4@5 ~, ~ b4@5 ~@2",
  K: "c5@2 c5 ~ c5@2 d5@2 [c5,d5]@2 d5@2 ~ g5 a5 ~, g4@7 ~@9", L: "b5@2 d6@4 b5@5 ~ a5@2 g5@2, d5@15 ~",
  M: "~@4 d5@7 ~ b5@4, c5@15 ~", N: "[b4,a5]@6 g5 ~ g5@2 d5@2 d5@2 d5 ~, ~@8 c5@7 ~",
  O: "d5@2 d5@2 d5@2 d5 ~ d5@2 d5@3 d5!2 ~, [f#4,b4]@7 ~ [g4,c5]@7 ~", // B5 C5
  P: "d5@2 d5@2 d5 ~ d5@2 d5@2 d5@2 d5 ~ d5@2, [f#4,b4]@7 ~ [g4,c5]@4 ~@4", // B5 C5
  Q: "d5@2 d5@2 d5 ~ d5@2 d5@2 d5@2 ~ d5!2 ~, [f#4,b4]@15 ~", R: "d5@2 d5 ~ d5!2 d5@6 ~ d5!2 ~, [g4,c5]@7 ~@9",
  S: "d5@2 d5 ~ d5@2 d5@2 d5@2 d5@3 d5!2 ~, [f#4,b4]@7 ~ [g4,c5]@7 ~", // B5 C5
  T: "b5 ~ b5@2 a5@2 g5@2 d6@3 ~ c6@2 b5@2, b4@7 ~ [c5,f#5]@7 ~", U: "g5 ~ d5@2 d5@2 d5@2 c5@2 c5@3 ~ b4 g5, b4@7 ~@9",
  V: "[g5@2 d5@2 d5@2 c5 ~ [g4,c5]@11 ~ [g4,c5]@15 ~@2 b4 ~ b4 c5@2 c5@2 c5 ~ d5@2, b4@7 ~@33 g4@7 ~]/3", // C5
  W: "[c5@2 c5 ~ c5@2 d5@2 [g4,b4]@2 ~@2 g4@2 g4@2 g4@2 ~@3 b4!2 ~ c5 ~ c5@2 c5@2 d5@2, g4@7 ~@3 b4@10 ~@12, ~@18 g4@6 g4@7 ~]/2", // G
  X: "g4@2 ~@2 g4@2 g4@2 g4 ~@4 b4!2 ~, b4 ~ b4@10 ~@4, ~@5 g4@3",
  Y: "c5@2 c5@2 c5@2 d5 ~ d5@2 d5@3 g5 a5 ~, g4@7 ~ c5@4 ~@4", Z: "~@4 d5@7 ~ b5@3 ~, c5@15 ~",
  AA: "b4@3 g5!2 d5!3, a5@5 ~@3 c5@7 ~", AB: "d5@2 d5 ~ d5@2 d5@2 d5@2 d5@2 ~ d5!2 ~, [f#4,b4]@7 ~ [g4,c5]@7 ~",
  AC: "d5@2 d5 ~ d5@2 d5@2 d5@2 d5@2 d5@2 d5@2, [f#4,b4]@7 ~ [g4,c5]@4 ~@4", // B5 C5
  AD: "d5 ~ d5@2 d5@2 d5@2 d5 ~ d5@3 d5!2 ~, [f#4,b4]@15 ~", AE: "d5 ~ d5@2 d5!2 d5@6 ~ d5!2 ~, [g4,c5]@7 ~@9",
  AF: "b5@2 b5@2 a5@2 g5@2 d6@4 c6 ~ b5@2, b4@7 ~ [c5,f#5]@7 ~", AG: "g5@2 d5@2 d5 ~ d5@2 c5@2 c5@3 b4 ~ g5, b4@7 ~@9",
  AH: "[g5@2 d5@2 d5@2 c5@2 [g4,c5]@11 ~ [g4,c5]@15 ~@2 b4 ~ b4 c5 ~ c5@2 c5@2 d5@2, b4@7 ~@33 g4@7 ~]/3", // C5
  AI: "[c5@2 c5@2 c5@2 d5 ~ b4@2 ~@2 g4@2 g4 ~ g4@2 ~@3 b4!2 ~ c5@2 c5@2 c5@2 d5@2, g4@7 ~ g4@4 ~@6 g4@5 ~ g4@7 ~, ~@5 b4@5 ~@6]/2",
  AJ: "b4@2 ~@2 g4 ~ g4@2 g4@2 ~@3 b4!2 ~, g4@4 ~@6 g4@5 ~, ~ b4@5 ~@2",
  AK: "c5@2 c5@2 c5 ~ d5@2 d5@2 d5@2 ~ g5 a5 ~, g4@7 ~ c5@4 ~@4", AL: "b5@2 d6@3 ~ b5@5 ~ a5@2 g5@2, d5@15 ~",
  AM: "b4@6 g5@2 g5 ~ d5@2 d5@2 d5@2, a5@5 ~@3 c5@7 ~",
  AN: "d5 ~ d5@2 d5@2 d5@2 d5@2 d5@3 d5!2 ~, [f#4,b4]@7 ~ [g4,c5]@7 ~", // B5 C5
  AO: "d5@2 d5@2 d5@2 d5 ~ d5@2 d5@2 ~ g5 a5 ~, [f#4,b4]@7 ~ [g4,c5]@4 ~@4", AP: "b5@2 d6@4 b5@6 a5 ~ g5@2, d5@15 ~",
  AQ: "b4@6 g5@2 g5@2 d5 ~ d5@2 d5@2, a5@5 ~@3 c5@7 ~",
  AR: "d5@2 d5@2 d5@2 d5@2 d5 ~ d5@2 ~@2 g5@2, [f#4,b4]@7 ~ [g4,c5]@4 ~@4", // B5 C5
  AS: "[a5@2 b5@2 ~@2 d6@6 b5@9 ~ a5@2 ~ g5@2 ~@7 d5@12 ~ b5@6 ~ [b4,a5]@9 g5, ~@2 d5@25 ~ c5@25 ~@11]/4", // B7
  AT: "[~@2 g5@2 ~@2 d5@2 ~ d5@2 ~ d5@2 ~ d5@2 ~ d5@2 ~@2 d5@2 ~ d5@2 ~ d5@2 ~ d5@4 ~ d5@2 d5@2 ~ d5@2 ~ d5@2 ~ d5@2 ~ d5@2 ~@2 d5@2 ~ d5@22 ~, ~@2 c5@12 ~ [f#4,b4]@12 ~ [g4,c5]@12 ~ [f#4,b4]@12 ~ [g4,c5]@25 ~]/5", // B5 C5 B5 C5
})).s("gm_piano").gain(0.26)

// chords · piano · "Adlib Piano"
const piano_2 = note(`<
  ~ A B A C D E@3 F G@2 H I J K L A M N O N C D P@3 H Q@2 H R J K L N M N B A C D E@3 H G@2 F S J K T A U J K V N W@7
  X@3
>`.pickRestart({
  A: "g2@11 ~ g2@3 ~", B: "g2@7 ~ g2@4 g2@3 ~", C: "[g2,d3]@7 ~ [d2,d3]@7 ~", D: "[g2,f#3]@7 ~ [g2,g3]@7 ~",
  E: "[[g2,f#3]@7 ~ [g2,e3]@11 ~ [g2,e3]@4 [g2,e3]@11 ~ [g2,d3]@4 [g2,e3]@7 ~]/3", F: "[g2,d3]@11 ~ [g2,d3]@3 ~",
  G: "[[g2,e3]@7 ~ [g2,d3]@11 ~ [g2,d3]@3 ~ [g2,e3]@7 ~]/2", H: "[g2,d3]@11 ~ [g2,d3]@4",
  I: "[g2,e3]@7 ~ [a2,f#3]@3 ~ [d3,c4]@4", J: "[g2,b2]@15 ~", K: "[g2,e3,a3]@7 ~ [g2,e3,a3]@7 ~",
  L: "[g2,f#3]@4 [g2,f#3]@3 ~ [g2,g3]@7 ~", M: "g2@11 ~@5", N: "g2@11 ~ g2@4", O: "g2@7 ~ g2@3 ~ g2@4",
  P: "[[g2,f#3]@7 ~ [g2,e3]@11 ~ [g2,e3]@3 ~ [g2,e3]@11 ~ [g2,d3]@3 ~ [g2,e3]@7 ~]/3", // Gmaj7 C G5 C
  Q: "[[g2,e3]@7 ~ [g2,d3]@11 ~ [g2,d3]@4 [g2,e3]@7 ~]/2", R: "[g2,e3]@7 ~ [a2,f#3]@4 [d3,c4]@3 ~",
  S: "[g2,e3]@7 ~ [a2,f#3]@4 [d3,c4]@4", T: "[g2,f#3]@3 ~ [g2,f#3]@4 [g2,g3]@7 ~", U: "g2@11 ~ [d3,c4]@3 ~",
  V: "[g2,f#3]@4 [g2,f#3]@4 [g2,g3]@7 ~", // Gmaj7 G
  W: "[g2@11 ~ [d3,c4]@6 [g2,b2]@25 ~ [g2,e3,a3]@12 ~ [g2,e3,a3]@12 ~ [g2,f#3]@6 [g2,f#3]@6 [g2,g3]@12 ~ g2@17]/7", // D7 G A7 Gmaj7 G
  X: "[~@2 g2@6 ~ g2@38 ~]/3",
})).s("gm_piano").gain(0.26)

// other · marimba · "Adlib Marimba"
const marimba = note("<A B C D E F G@3 H I@2 H J K L M N@2 O C P Q R S@3 H T@2 U V K W X Y@2 ~@32>".pickRestart({
  A: "~@6 d5!2", B: "d5@2 d5@2 d5 ~ d5 ~ d5@2 d5@2 ~ d5!2 ~", C: "d5@2 d5 ~ d5!2 ~ d5@5 ~ d5!2 ~",
  D: "d5@2 d5@2 d5 ~ d5@2 d5@2 d5@3 d5!2 ~", E: "b5@2 b5@2 a5 ~ g5@2 d6@4 c6@2 b5@2",
  F: "g5@2 d5 ~ d5@2 d5@2 c5@2 c5 ~@2 b4 ~ g5",
  G: "[g5@2 d5 ~ d5@2 c5@2 [g4,c5]@15 ~ c5@11 ~@2 b4 ~ b4 c5@2 c5@2 c5@2 d5 ~]/3", H: "b4@2 b4@9 ~@2 b4!2 ~",
  I: "[c5@2 c5@2 c5@2 d5@2 b4@2 b4@9 ~@2 b4!2 ~ c5@2 c5@2 c5 ~ d5@2]/2", J: "c5@2 c5 ~ c5@2 d5@2 d5@2 d5 ~@2 g5 a5 ~",
  K: "b5@2 d6@4 b5@5 ~ a5@2 g5@2", L: "c5@3 ~ d5@7 ~ b5@4", M: "a5@6 g5 ~ g5@2 d5@2 d5@2 d5 ~",
  N: "[d5@28 d5 ~ d5@2]/2", O: "d5@2 d5@2 d5 ~ d5@2 d5@2 d5@2 ~ d5!2 ~", P: "d5@2 d5 ~ d5@2 d5@2 d5@2 d5@3 d5!2 ~",
  Q: "b5 ~ b5@2 a5@2 g5@2 d6@3 ~ c6@2 b5@2", R: "g5 ~ d5@2 d5@2 d5@2 c5@2 c5@2 ~ b4 ~ g5",
  S: "[g5@2 d5@2 d5@2 c5 ~ [g4,c5]@15 ~ c5@11 ~@2 b4 ~ b4 c5@2 c5@2 c5 ~ d5@2]/3", // C5
  T: "[c5@2 c5 ~ c5@2 d5@2 b4@2 b4@9 ~@2 b4!2 ~ c5 ~ c5@2 c5@2 d5@2]/2", U: "b4 ~ b4@9 ~@2 b4!2 ~",
  V: "c5@2 c5@2 c5@2 d5 ~ d5@2 d5@2 ~ g5 a5 ~", W: "c5@4 d5@7 ~ b5@3 ~", X: "a5@5 ~ g5@2 g5@2 d5@2 d5@2 d5@2",
  Y: "[d5@7 ~]/2",
})).s("gm_marimba").gain(0.26)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@3 x] ~@17 [~@3 x] ~@17 [~@3 x] ~@32>").gain(0.26)

// drums · high tom
const high_tom = s("ht").struct("<~ A@17 B A@17 B A@23 C D E F G H I J ~>".pickRestart({
  A: "x!5 ~ x ~ x ~@3 x ~@3", B: "x!5 ~ x ~ x ~@7", C: "~@2 x ~ x ~ x!2 ~ x ~@2 x ~@3", D: "x ~@5 x ~@5 x ~ x!2",
  E: "~ x ~ x ~@2 x ~@2 x ~@6", F: "x ~@5 x!2 ~ x!2 ~ x ~@3", G: "x ~@2 x ~@5 x ~@5 x",
  H: "~ x!2 ~ x ~ x ~@2 x ~@2 x ~@3", I: "~@3 x ~@5 x!2 ~ x ~ x ~", J: "x ~@2 x ~@2 x ~@5 x ~@3",
})).gain(0.26)

// drums · cowbell
const cowbell = s("cb").struct("<A B@59 C D E F G H I J ~>".pickRestart({
  A: "~@3 x", B: "x!5 ~ x ~ x ~@3 x ~@3", C: "~@2 x ~ x ~ x!2 ~ x ~@2 x ~@3", D: "x ~@5 x ~@5 x ~ x!2",
  E: "~ x ~ x ~@2 x ~@2 x ~@6", F: "x ~@5 x!2 ~ x!2 ~ x ~@3", G: "x ~@2 x ~@5 x ~@5 x",
  H: "~ x!2 ~ x ~ x ~@2 x ~@2 x ~@3", I: "~@3 x ~@5 x!2 ~ x ~ x ~", J: "x ~@2 x ~@2 x ~@5 x ~@3",
})).gain(0.26)

stack(piano, piano_2, marimba, mid_tom, high_tom, cowbell)

More by Joni Mitchell