Strudelify

Undertale

Toby Fox

KeyE♭ majorTempo97 bpm
0:00/0:00
// Undertale — Toby Fox
// 97 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/1687726; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(97/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
const piano = note(`<
  ~@16 A@2 B@2 C@2 D E A@2 B@2 C@2 D F ~@2 G ~@5 H I J K L M N O P@2 Q@2 R@2 S T U@2 V@2 R@2 S T W X Y Z AA AB AC AD ~@4
>`.pickRestart({
  A: "[~@15 eb3, bb4, ab2!2 bb5@6, ~ eb3@2 eb3@2 eb3@2 eb3 ab2 eb3 ab2 eb3 ab2 eb3 ab2@2, ~@2 ab2!2 f5@4]/2",
  B: "[~@15 eb3, eb5, g2!2 bb5@6, ~ eb3@2 eb3@2 eb3@2 eb3 g2 eb3 g2 eb3 g2 eb3 g2@2, ~@2 g2!2 bb4@4]/2",
  C: "[~@15 eb3, bb4, ab2!2 eb5@6, ~ eb3@2 eb3@2 eb3@2 eb3 ab2 eb3 ab2 eb3 ab2 eb3 [ab2,c6]@2, ~@2 ab2!2 bb5@4]/2", // Ab
  D: "~@7 eb3, bb5, bb2!2 f5@2, ~ eb3@2 eb3@2 eb3@2 ~, ~@2 bb2!2", E: "~@7 eb3, eb5, c3!4, ~ eb3@2 eb3@2 eb3@2 ~",
  F: "~ eb6 d6 bb5 g5 f5 eb5 bb4, c4@15 ~, eb5@3 ~", G: "~@4 d6@3 ~",
  H: "[c3,eb3]@2 ab2 ~ [c3,eb3,bb5]@2 g5@2, bb4@4 ~@2 ab2 ~", I: "[c3,eb3,f5] eb5 [c3,eb3,d5] eb5, ~@2 ab2 ~@3 ab2 ~",
  J: "[d3,f3]@4 bb2@2 ~@2 [d3,f3]@4 bb2@2 db6 c6, f5@4 d6@3 ~", K: "[eb3,g3]@2 bb2 ~ [eb3,g3]@2 bb2 ~, bb5@11 ~@5",
  L: "[c3,eb3]@2 ab2 ~ [c3,eb3,bb5]@2 g5@2, c5@4 ~@2 ab2 ~", M: "[c3,eb3,f5] eb5 [c3,eb3,f5] g5, ~@2 ab2 ~@3 ab2 ~",
  N: "[d3,f3]@2 bb2 ~ [d3,f3]@2 bb2 ~, d5 f5", O: "f5 eb5 d5 eb5",
  P: "[~@15 eb3, bb3@12 ab2 eb3 [ab2,c6]@2, bb4 bb4@3, ab2@2 ab2@2 bb5@4 ab2 eb3 ab2 eb3 bb5@4, ~ eb3@2 eb3 ab2 eb3 ab2 eb3 [f4,f5]@8]/2", // Ab F
  Q: "[~@15 [eb3,f5], [eb4,eb5]@13 eb3 [g2,g5]@2, g2!2 bb5@6, ~ eb3@2 eb3 g2 eb3 g2 eb3 g2 eb3 g2 eb3 [g2,g5] ab5@3, ~ bb4 bb4 [bb3,bb4]]/2", // Ebsus2 Eb G Bb
  R: "[~@15 eb3, bb3@12 ab2 eb3 [ab2,c5,c6]@2, bb4@7 eb3 ab2 eb3 ab2 eb3 f5@4, ab2!2 [eb4,eb5]@6, ~ eb3@2 eb3 ab2 eb3 ab2@2 [bb4,bb5]@8]/2", // Ab Eb Bb
  S: "~@7 eb3, bb5, bb4@4 bb2 eb3 [bb2,bb4]@2, bb2 eb5@3, ~ eb3 bb2 eb3 [f4,f5]@4", // Bb F
  T: "~@7 [eb3,bb4], eb4@3 eb3 [c3,g5] [eb3,f5] [c3,eb5]@2, eb5@2 c3 bb5@5, c3 eb3 d6@6, ~ eb6@7", // Eb5 C5 Ebsus2 Cm
  U: "[~@15 eb3, bb3@12 ab2 eb3 [ab2,eb5]@2, bb4@3 eb3 ab2 eb3 [ab2,f5] eb3 [f4,f5]@8, ab2@2 eb5@6 ab2 eb3 [ab2,eb5] eb3 d5@4, ~ eb3 ab2@2 [bb4,bb5]@12]/2", // Ab5 Db F Ab5 Bb
  V: "[~@8 bb4 ~@6 [eb3,bb5], eb4@7 eb3@2 bb4@3 g2 [eb3,f6] [g2,eb6]@2, eb5@4 g2 eb3 [g2,eb5]@2 [g2,eb5] eb3 eb5@6, g2@2 [g2,bb5]@2 bb5@6 g2 [eb3,bb5] g6@4, ~ eb3@2 eb3 bb4@4 eb4@8]/2", // Eb5 Ebsus2 Cm Gm Eb5
  W: "[eb3,eb4]!2, [ab2,c3]", X: "[bb1,f2,bb2,f4]@2 [g1,d2,g2,d4] [ab1,eb2,ab2,eb4]",
  Y: "[bb1,f2,bb2,f4]@2 [bb1,f2,bb2,f4] [ab1,eb2,ab2,eb4]", Z: "[g1,d2,g2,d4]@2 [eb2,eb3,bb4] [f2,f3,c5]",
  AA: "[ab2,c3,eb3,eb4]@2 [ab2,c3,eb3,eb4] [c3,eb3,g3,g4]", AB: "[bb2,d3,f3,f4]@2 [f2,bb2,d3,d4] [f3,f4]",
  AC: "[g2,bb2,bb3] [g2,c3,g3,g4] [f2,bb2,f3,f4] [g2,c3,eb3,eb4]", AD: "[ab2,c3,eb3,eb4]",
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft = note("<A@8 B@2 C@2 B@2 D E ~@16 F G H I J K L G ~@32 M@2 N@2>".pickRestart({
  A: "[~ eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3]/4",
  B: "[~@15 eb3, ab2!4 ab2!4, ~ eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 ~]/2",
  C: "[~@15 eb3, g2!4 g2!4, ~ eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 eb3@2 ~]/2",
  D: "~@7 eb3, bb2!4, ~ eb3@2 eb3@2 eb3@2 ~", E: "~@7 eb3, c3!4, ~ eb3@2 eb3@2 eb3@2 ~", F: "bb4@2 bb5 g5",
  G: "f5 eb5 d5 eb5", H: "f5@8 ~@6 db6 c6", I: "bb5@11 ~@5", J: "c5@2 bb5 g5", K: "f5 eb5 f5 g5", L: "d5 f5",
  M: "[~@8 d5@3 ~@3 eb5@4 bb4@2 eb5@2 bb4@2 d5@3 d5@3 eb5@2, bb4@3 bb4@5 ~@8, ~ f5@7 ~@8, ~@2 eb5@5 ~@9, ~@11 d5@5 ~@16]/2",
  N: "[bb4@2 f5@2 eb5@2 bb4@2 d5@3 d5@3 eb5@4 bb4@2 eb5@2 g5@2 f5@3 eb5@3 f5@2]/2",
})).s("gm_piano").gain(0.2)

stack(piano, piano_soft)

More by Toby Fox