Strudelify

Cornflake Girl

Tori Amos

KeyA minorTempo134 bpm
0:00/0:00
// Cornflake Girl — Tori Amos
// 134 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 29, 4/4 at bar 29, 3/4 at bar 37, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 169 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(134/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 · "Right Hand"
const piano = note(`<
  ~@5 A@20 B@2 ~ C D E D E ~ F G@2 H I@3 J K J K J K J K J K J K J K J K J K L M N O N O ~ P Q R@2 S T U D V D V ~@4 W@3
  X W@3 X W@3 X W@3 X Y Z AA@2 Y Z AA@2 Y Z AA@2 Y Z AA@2 AB AC AB AD AB AC AB AD AE AF@2 AG AE AF@2 AG AE AF@2 AG AE
  AF@2 AG W@3 X W@3 X W@3 X W@3 X Y Z AA@2 Y Z AA@2 Y Z AA@2 Y Z AH@2
>`.pickRestart({
  A: "[~@2 [c4,g4] b3@2 a3 [g3,e4]@3 [a3,e4]@6 ~@9]/2", B: "[~@2 [c4,g4] b3@2 a3 [g3,e4]@3 [a3,e4]@6 ~@6 [f#4,a4]@3]/2",
  C: "~@2 [f#4,a4]@2 ~ [f#4,a4] ~@2", D: "~@8 [c4,g4] b3@2 a3", E: "[g3,e4] ~@3",
  F: "[c4,f4,a#4]@4 [c4,f4,a4]@4 [c4,f4,g4]@3 [c4,f4,a4]@4 ~@9", // Fsus4 F Csus4 F
  G: "[e4@6 f4@6 g4@6 [g4,b4]@4 [g4,b4]@8 ~@6 a4@3 g4@9]/2", H: "[f#5,d6]@3 ~@3 [e5,d6]@2 [f#5,d6] [g5,d6]@3",
  I: "[[f#5,d6]@6 [a5,d6]@12 [f#5,d6]@12 ~@6 [e5,d6]@4 [f#5,d6]@2 [g5,d6]@9 f#5@3 e5@6 ~@12]/3", // D D5 D E7 D G5
  J: "~@5 [c4,g4] b3@2 a3 [g3,e4]@3", K: "[a3,e4] ~", L: "[f#4,a4] ~@3", M: "~@4 [f#4,a4]@2 ~ [f#4,a4]",
  N: "~@11 [c4,g4]", O: "b3@2 a3 [g3,e4]@3 ~@6", P: "~@6 [c4,f4,a#4]@4 [c4,f4,a4]@4 [c4,f4,g4]@3 [c4,f4,a4]@4 ~@3",
  Q: "~ e4 f4 g4", R: "[[g4,b4]@4 [g4,b4]@8 ~@6 a4@3 g4@9 [f#5,d6]@6 ~@6 [e5,d6]@4 [f#5,d6]@2]/2",
  S: "[g5,d6] [f#5,d6] [a5,d6]@2", T: "[f#5,d6]@6 ~@3 [e5,d6]@2 [f#5,d6]", U: "[g5,d6]@3 f#5 e5@2 ~@2",
  V: "[g3,e4] [a3,e4]@2 ~", W: "~ [d5,g5] [e5,a5]!2 [d5,g5]!2", X: "~@3 d5 e5 c6 d5 e5 b5 d5 e5 a5", Y: "[e4,g4]",
  Z: "[d4,a4]", AA: "[~@7 [d4,a4]@9, [e4,g4] ~]/2", AB: "~@3 [d4,g4,d5]@2 [e4,a4,e5] [g4,c5,g5]@3 [g4,c5,g5]@3",
  AC: "~@3 [d4,g4,d5]@2 [e4,a4,e5] [g4,c5,g5]@3 [c5,e5,c6]@2 [a4,d5,a5]", // G5 A5 C5 C D5
  AD: "~@3 [d4,g4,d5]@2 [e4,a4,e5] [g4,c5,g5]@2 [e4,a4,e5] [d4,g4,d5]@3", AE: "~@3 g4@2 e4 g4@3 g4@2 e4",
  AF: "g4@2 g4 e4@2 g4@4 g4@2 e4", AG: "g4@4 g4@2 e4@4 ~@5 e4@9, ~@5 g4@4 ~@3", AH: "[~@7 a4@9, [e4,g4] ~]/2",
})).s("gm_piano").gain(0.41).pan(0.7)

// chords · piano · "Left Hand"
const piano_2 = note(`<
  ~@3 A B C D C E C D C F G H G H G H G H G H G H G I ~ J K L M L M N ~@2 O P@4 Q@2 ~ R S R S R S R S R S R S R S ~ T
  U@7 ~ V W X Y Z AA AB ~ M L M L AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC
  AD AC AD AE AF AG AH AE AF AG AH AE AF AG AH AE AF AG AH AE AF AG AH AE AF AG AH AC AD AC AD AC AD AC AD AC AD AC AD
  AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AC AD AI@2
>`.pickRestart({
  A: "~ a2", B: "e3@4 ~ e3@3", C: "a3 ~", D: "~@2 e3@2 ~ d3@3", E: "~@5 e3@3", F: "~@7 a3", G: "[c4,g4] ~",
  H: "[g3,a3,e4]@4 ~@3 a3", I: "[g3,a3,e4] ~", J: "~@2 d3 ~", K: "~ e3@2 ~ a3@4", L: "~ [g3,a3,e4]",
  M: "~@3 a3 [c4,g4]@4", N: "~ f3", O: "[f#4,a4]@3 ~@3 g4@2 a4 b4@3",
  P: "[a4@6 d5@12 a4@12 ~@6 g4@4 a4@2 b4@9 ~@18 e3@9 a3@12 ~@6]/4", Q: "[~@4 e3@2 ~ d3@3 a3@4 ~@2]/2",
  R: "~ a3 [c4,g4]@4 ~@2", S: "~ [g3,a3,e4]@2 ~", T: "~@3 d3",
  U: "[~@3 e3@2 ~ a3@4 ~@4 [g3,a3,e4]@4 ~@3 a3 [c4,g4]@4 ~@4 [g3,a3,e4]@4 ~@3 a3 [c4,g4]@4 ~@4 f3@4 ~@6]/7", // A7 C5 A7 C5
  V: "~@3 [f#4,a4]@3 ~@3 g4@2 a4", W: "b4 a4 d5@2", X: "a4@6 ~@3 g4@2 a4", Y: "b4@3 ~@5", Z: "~ e3@3 a3@4",
  AA: "~@3 e3", AB: "~ d3@3 a3@4", AC: "~@3 e3 [g3,c4]@4", AD: "~@3 g3 [a3,d4]@4", AE: "~ [e3,a3]", AF: "~ [f3,c4]",
  AG: "~ [g3,d4]", AH: "~ [d3,a3]", AI: "[~@3 e3 [g3,c4]@3 a3@9]/2",
})).s("gm_piano").gain(0.41).pan(0.4)

// bass · piano · "Left Pinky"
const bass = note(`<
  ~@4 A@8 B@7 C@8 D E F G H I J K L@2 ~@3 M@2 N@2 O@2 P@2 Q@2 P@2 Q@2 P@2 Q@2 R S T U@2 V W@2 X@2 Y@2 ~@2 Z AA AB AC AD
  AE AF H K AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AG AH AC AA AG AH
  AC AA AG AH AC AA AG AH AC AA AG AH AC AA AG AH AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC AA AC F AC
  AA AC F AC AA AC F ~
>`.pickRestart({
  A: "[~@3 e1@3 a1@12 c2 ~@2 c2@6 ~@3 d2@12 f2 ~@2 f2@6 g2 a2 e2 a1@12 c2 ~@2 c2@6 ~@3 d2@12 f2@3 f2@3, ~@180 e2 ~@11]/8",
  B: "[~@4 a1@6 ~ a1 c2@2 c2@6 d2@6 ~ d2 f2@2 f2@6 a1@6 ~ a1 c2@2 c2@6 d2@4]/7",
  C: "[~@3 d2 f2@2 f2@6 a1@6 ~ a1 c2@2 c2@6 d2@6 ~ d2 f2@2 f2@6 a1@6 ~ a1 c2@2 c2@6 d2@2 ~@2]/8", D: "~ d2 ~@2",
  E: "~ d3@3 ~@20", F: "c2", G: "c2 c2@2 ~", H: "d2@6 ~ d2", I: "d2 d2@3", J: "f2@6 ~ f2", K: "f2 f2@3",
  L: "[c2 d2 e2 g2@2 g1 g1@2]/2", M: "[~@9 f#1@3 g1@2 a1@2 e1@2 a1@24 c2@2 ~@4]/2", N: "[c2@6 ~@3 d2@12 f2 ~@2]/2",
  O: "[f2@4 ~@2 a1@6 ~ a1 c2@2]/2", P: "[c2@6 d2@6 ~ d2 f2@2]/2", Q: "[f2@6 a1@6 ~ a1 c2@2]/2", R: "c2@3 d2",
  S: "~@2 d2 ~", T: "~@7 d3@3 ~@14", U: "[~ c2@4 c2 c2@2]/2", V: "~ d2@3", W: "[~ d2 d2@2 d2@6 f2@6]/2",
  X: "[~ f2 f2@2 f2@6 c2@2 d2@2 e2@2]/2", Y: "[g2@2 g1 g1@2 ~@3]/2", Z: "~@15 f#1@3 g1@2 a1@2 e1@2", AA: "a1",
  AB: "c2 ~@2 c2@6 ~@3", AC: "d2", AD: "f2 ~@2 f2@6 ~@3", AE: "a1@6 ~ a1", AF: "c2 c2@3", AG: "f2", AH: "g2",
})).s("gm_piano").gain(0.41).pan(0.2)

// other · piccolo · "Whistle"
const piccolo = note("<A@5 ~@3 B@2 C@2 ~@28 D@4 ~@125>".pickRestart({
  A: "[~ e4@8 ~]/5", B: "[~ a5@2 e5]/2", C: "[d5@4 e5@4 a4@4 d5@24 a4 ~@5 a4 ~@5]/2",
  D: "[~@9 a5@12 e5@6 d5@2 e5@2 a4@2 d5@12 ~@3]/4",
})).s("gm_piccolo").gain(0.41)

// chords · sitar · A5
const sitar = note(`<
  [~@12 [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~]
  [[a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~]!3
  [[a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~ [a4,e5,a5,e6] ~@13]
  ~@164
>`).s("gm_sitar").gain(0.2)

// drums · kick
const kick = s("bd").struct("<A B A B A@23 ~@2 C@8 ~@3 D@21 E@8 ~@4 C@95 ~>".pickRestart({
  A: "~ x", B: "~@5 x!2 ~@5", C: "x", D: "~@3 x", E: "~ x ~@2",
})).gain(0.26)

// drums · snare
const snare = s("sd").struct("<~ A@3 B C@22 ~@2 A@8 ~@3 D@21 E@8 ~@4 A@95 ~>".pickRestart({
  A: "x", B: "x!2", C: "~ x", D: "~@3 x", E: "~ x ~@2",
})).gain(0.26)

// drums · tambourine
const tambourine = s("tb").struct("<A B@25 C ~@2 B@8 ~@3 D B@17 E F@2 G B@7 H ~@3 B@95 ~>".pickRestart({
  A: "~@6 x ~ x!2 ~ x", B: "x ~ x!2 ~ x!2 ~ x!2 ~ x", C: "x ~ x!2 ~ x ~@6", D: "~@9 x ~ x",
  E: "x ~ x!2 ~ x!2 ~ x!2 ~@2", F: "~@3 x", G: "~@3 x ~ x!2 ~ x!2 ~ x", H: "x!2 ~@4",
})).gain(0.26)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@7 A ~@16 B ~@10 C ~@20 D ~@11 B ~@7 B ~@7 B ~@7 B ~@15 B ~@7 B ~@7 B ~@7 B ~@7 B ~@7 B ~@3 B ~@3 B ~@3 B ~@3
>`.pickRestart({
  A: "~ x", B: "x", C: "~@3 x", D: "~ x ~@2",
})).gain(0.41)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@4 A@23 ~@2 B@8 ~@3 C@21 D@8 ~@4 B@95 ~>".pickRestart({
  A: "~ x", B: "x", C: "~@3 x", D: "~ x ~@2",
})).gain(3.01)

stack(piano, piano_2, bass, piccolo, sitar, kick, snare, tambourine, crash, vibraslap)

More by Tori Amos