Strudelify

Ode to the Banana King

Tori Amos

KeyC majorTempo99 bpm
0:00/0:00
// Ode to the Banana King — Amos, Tori
// 99 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 102 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(99/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 · "Bösendorfer"
const piano = note(`<
  A@2 B@2 A@2 C@2 D@2 E@2 F@2 G@2 H I E@2 F@2 G@2 H J K L M N E@2 O@2 G@2 H P Q R@3 S T@2 U@2 V@2 W X Y@2 Z AA@2 AB@2
  AC@2 H AD AA@2 AB@2 AC@2 H AE K L M AE K L M S T@2 U@2 V@2 W X AF@3 AG@2 AH@2 AI@6 AJ@3
>`.pickRestart({
  A: "[[c2,c3]@2 c3 a#2 g2@2 [a#2,d3,d4] c3 c2@2 c3 a#2 g2@2 a#2 c3, c4@6 ~ [d#3,d#4]@6 ~ [d3,d4]@2]/2", // C A# D# D
  B: "[[c2,c3]@2 c3 a#2 g2@2 [a#2,a#3] ~ c2 c3@2 d#3 d#2 f3 [f2,f3,c4]@2, c4@6 ~ c4@6 ~@3, ~@7 c3@2 ~@7]/2", // C A# F5
  C: "[[c2,c3]@2 c3 a#2 g2@2 [a#2,a#3] ~ c2@2 d#3 d#2 ~ c3 [f3,c4]@2, c4@6 ~ [c3,c4]@6 ~@3, ~@3 f2, ~@6 f3 ~]/2", // C A# F5 C
  D: "[[c2,c3]@2 c3 a#2 g2@2 [a#2,a#3] ~ c2@2 ~ d#2 f2@2 a#2 c3, [g3,c4]@6 ~ [c3,c4]@3 [d#3,d#4]@2 [f3,f4]@4]/2", // C A# C5 C D# F
  E: "[c2@2 c3 a#2 g2@2 [a#2,d4] c3 c2@2 c3 a#2 g2@2 a#2 c3, c4@6 ~ d#4@6 ~ f4@2]/2", // A#
  F: "[c2@2 c3 a#2 g2@2 [a#2,g#4,f5] c3 c2@2 c3 a#2 g2@2 a#2 c3, [g4,e5]@6 ~ [g4,e5]@4 ~@3 [g4,e5]@2]/2", // A#7 C
  G: "[c2@2 c3 a#2 ~@2 a#2 c3 c2@2 c3 a#2 ~ a#3 [a#2,c4] [c3,d4], [f4,d5]@2 g2 ~@3 g2 ~, ~@5 [g4,e5]@2 [g#4,f5]@6 ~@3]/2", // A#sus2 Csus2 Dm C C#
  H: "c2@4 c3@2 a#2@2 g2@4 [a#2,f4,c5]@2 [c4,g4] ~, [f4,c5]@3 c4@4 c3, ~@3 g4@3 ~@2", // A#sus2 C5 F5
  I: "~ [f3,a3,f4] [f3,a3,f4]@2 [d#3,d#4,g4] [d3,d4] [g2,g3]@2", // F D# D G
  J: "~@4 [c2,c4,g4,b4]@4 [e4,g4] ~ c2@2 d2@2 e2@2, ~@4 c3 [c4,e4]@2 ~", // Cmaj7 Em C
  K: "[f2,f3,f4,c5]@3 [f2,f3,f4,c5]@3 [f2,f3,f4,c5]@3 ~@5 d#3 f3", L: "[f2,f3,f4,c5]@2 f4@2 f4 d#4 c4@2",
  M: "[c2,e4]@2 c3 a#2 g2@2 [a#2,g3,d4,g4] [c3,g3,c4,g4], ~ [g3,c4,g4]@2 ~", // C Gm C5
  N: "~@4 [c3,g3,e4]@4 [g3,d4] ~@3 a#2@2 c3@2, ~@2 a#2 ~, ~@5 [g3,c4]@2 ~", // C G5 C5
  O: "[c2@2 c3 a#2 [g2,g4,e5]@2 [a#2,g#4,f5] c3 c2@2 c3 a#2 g2@2 a#2 c3, [g4,e5]@4 ~@3 [g4,e5]@4 ~@3 [g4,e5]@2]/2", // C A#7 C
  P: "~@2 [c2,c4,g4,c5]@2 [c2,c4,g4,c5] [c2,c4,e4,c5]@2 ~", Q: "[f2,f3,f4,c5]@2 ~ [f2,f3,f4,c5]@2 ~ [f2,f3,f4,c5]@2",
  R: "[~ f2 [f3,a3,c4,f4]@2 [f2,a3,c4,f4]!3 g2 ~ c4 c3 a#2 g2@2 [a#2,g3,d#4] [c3,g3,d4]@2 [c3,g3,c4]@2 ~@2 c3 [a#2,f3,a#3] [c3,g3,c4], ~@7 [g3,d#4]@2 ~ c4@4 ~@5 c3@2 ~@3, ~@4 c2 ~@5 [g3,c4] ~]/3", // F D# Csus2 C5 A#5 C5 Cm C5
  S: "~@2 [c2,c3,c5,e5]!3 [d2,d3,d5] [e2,e3,c5]@2", // C D C
  T: "[[f4,c5,f5]!3 [g#2,g#3,f4,c5,f5] [f4,c5,f5]!2 [c3,c4,f4,c5,f5] [f4,c5,f5] [f4,c5,f5]!5 [a2,a3,f4,c5,f5] [f4,c5,f5]!2, [f2,f3]@2 ~@2 [a2,a3]@2 ~ [d#3,d#4]@2 [d3,d4]@2 [c3,c4]@2 ~ [g2,g3]@2]/2", // F5 Fm F5 F F5 F A D# …
  U: "[[e4,c5,e5]!2 [d#2,d#3,e4,c5,e5] [e4,c5,e5]!3 [g2,g3,e4,c5,e5] [e4,c5,e5] [e4,c5,e5]!5 [g2,g3,e4,c5,e5] [d2,d3,e4,c5,e5] [e2,e3,e4,c5,e5], [c2,c3]@2 ~ [e2,e3]@2 ~@2 [c2,c3]@2 [a#2,a#3]@2 [a2,a3]@2 ~@3]/2", // C E C A# A
  V: "[[f4,c5,f5]!3 [g#2,g#3,f4,c5,f5] [f4,c5,f5]!2 [c3,c4,f4,c5,f5] [f4,c5,f5] [f4,c5,f5]!6 [f4,c5,f5]@2, [f2,f3]@2 ~@2 [a2,a3]@2 ~ [d#3,d#4]@2 [d3,d4]@2 [c3,c4]@4 ~]/2", // F5 Fm F5 F A D# D C
  W: "[g3,d4,g4,d5] [f3,c4,f4,c5]", X: "[d#3,a#3,d#4,a#4]",
  Y: "[[g2,g3,b3]@2 [g2,g3,b3]@4 [f2,f3,a3]@2 [f2,f3,a3]@4 [c2,e3,g3]@2 [c2,e3]@4 ~@2 c3@2 a#2@2 g2@4 [a#2,f3,c4]@2 [c3,g3,c4] ~, ~@7 g3@4 ~@5]/2", // G F C A#sus2 C5
  Z: "~@4 [e2,e3,c4]@4 [f2,f3,c4] ~ [g2,g3,c4]@4 ~@2", // C F5 C5
  AA: "[c2@2 c3 a#2 g2@2 [a#2,d4] c3 c2@2 c3 a#2 g2@2 a#2 c3, c4@4 ~@3 d#4@6 ~ f4@2]/2", // A#
  AB: "[c2@4 c3@2 a#2@2 g2@4 [a#4,f5] g#4 c3@2 c2@4 c3@2 a#2@2 g2@4 a#2@2 c3@2, [g4,e5]@4 ~@2 a#2 [g4,e5]@4 ~@3 [g4,e5]@2]/2", // A#5 C
  AC: "[c2@2 c3 a#2 ~@2 a#2 c3 c2@2 c3 a#2 ~ a#3 [a#2,c4] [c3,d4], [f4,d5]@3 ~@5, ~@2 g2 ~@3 g2 ~, ~@5 [g4,e5]@2 [g#4,f5]@6 ~@3]/2", // A#sus2 Csus2 Dm C C#
  AD: "~ [d2,c4,g4,b4]@2 ~ [f2,e4,g4]@2 a#2 c3", // G C
  AE: "~@4 [c2,c4,g4,c5]@4 [c4,f4,c5] ~ c2@2 d2@2 e2@2, ~@4 c3 [c4,e4,c5]@2 ~", // C5 F5 C
  AF: "[[g2,g3,b3] [g2,g3,b3]@2 [f2,f3,a3] a3@2 g3 ~ c2@2 c3 a#2 g2@2 [a#2,d4] c3 c2@2 c3 a#2 g2@2 a#2 c3, ~ [f2,f3] ~@4, ~@7 g3@4 ~@4 d#4@4 ~@3 d4@2]/3", // G F A# F
  AG: "[c2@2 c3 a#2 g2@2 [a#2,d4] c3 c2@2 c3 a#2 [g2,b4]@2 a#2 c3, [c4,g4]@4 ~@3 d#4@4 ~ [e4,g4]@4]/2", // A# G C5 Em
  AH: "[c2@2 c3 a#2 g2@2 [a#2,d4,d5] c3 c2@2 c3 a#2 g2@2 a#2 c3, [c4,g4]@4 ~@3 [d#4,d#5]@4 ~@3 [d5,f5]@2]/2", // A# C5 D# Dm
  AI: "[c2@2 c3 a#2 g2@2 [a#2,d5,g5] c3 c2@2 c3 a#2 [g2,g5,b5]@2 [a#2,f5,a5] c3 ~@2 c3 a#2 g2@2 [a#2,d5,d6] c3 c2@2 c3 a#2 ~@2 a#2 c3 c2@2 c3 a#2 ~ g5 [a#2,d6,f6] c3 ~ [c6,e6] [c3,c6,e6]!2 [f2,a5,f6]@2 [g2,c6,e6]@2, [d5,f5]@4 ~@3 [c5,g5]@4 ~@4 [e5,g5]@2 [c5,g5,c6]@4 ~@2 [d#5,d#6]@4 ~@2 [d6,f6]@2 [c6,g6]@4 ~@4 [c6,e6]@2 ~@7, ~@8 c2 ~@5 g2 ~@3 g2 ~ c2 ~@3]/6", // Gm G A#maj7 A# C F C Dm …
  AJ: "[c2@2 c3 a#2 g2@2 [a#2,d6] c3 c2@2 [c3,g5,b5]!2 [c3,g5,d6]@2 [g2,c5,b5] [g2,e5,d6]@2 [g2,c5,b5] [g2,e5,d6]@2 [g2,c5,b5] [g2,e5,d6]@2 ~, [c6,g6]@4 ~@3 [g5,e6]@3 ~@14]/3", // A# Cmaj7 Csus2 Cmaj7 Em7 Cmaj7 Em7 Cmaj7 …
})).s("gm_piano").gain(0.41)

stack(piano)

More by Tori Amos