Strudelify

Ghost Fight

Toby Fox

KeyG minorTempo107 bpm
0:00/0:00
// Ghost Fight — Toby Fox
// 107 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/1732746; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 29 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(107/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · church organ · "Pipe Organ"
const church_organ = note("<A B A C D E D F G ~ H I ~@3 J ~@8 A B A B K>".pickRestart({
  A: "g2 ~ bb2 ~ c3 ~ g2 ~ bb2 ~ c3 db3 ~ d3 f3 ~", B: "g2 ~ bb2 ~ c3 ~ g2 ~ bb2 ~ c3 db3 ~ d3 gb3 ~",
  C: "g2 ~ bb2 ~ c3 ~ g2 ~ f2 gb2 ~ g2@2 ~@3", D: "g2 ~ bb2 ~ c3 ~ g2 ~ bb2 ~ c3 db3 ~ d3 f3@2",
  E: "g2 ~ bb2 ~ c3 ~ g2 ~ bb2 ~ c3 db3 ~ d3 gb3@2", F: "g2 ~ bb2 ~ c3 ~ eb3@2 d3 eb3 ~ d3 gb3@2 ~@2",
  G: "~@10 db4 ~ c4 bb3 g3@2", H: "bb3 c4 d4 eb4", I: "d4 ~ g3 ~ g4 ~ g3 ~ gb4 eb4 ~ d4@2 ~@3",
  J: "db4 c4 bb3@2 g3@2 d3@2 f3 gb3 ~ g3@2 ~@3", K: "g2 ~@7",
})).s("gm_church_organ").gain(0.3)

// other · trombone
const trombone = note("<~@11 A B C D E F ~ F ~ F ~ F ~@5 G>".pickRestart({
  A: "~@13 eb4 d4 eb4", B: "d4@2 bb3@2 g3@2 d3@2 bb3 ~ g3 a3@2 eb4 d4 eb4",
  C: "d4!2 bb3@2 g3@2 d3@2 bb3 ~ c4 a3@2 eb4 d4 eb4", D: "d4 ~ g4 ~ c4@2 bb3@2 c4 bb3 ~ c4@2 ~ bb3 c4",
  E: "db4 c4 bb3@2 g3@2 d3@2 f3 gb3 ~ g3@2 ~@3", F: "~@2 db4 c4 ~ db4 c4 ~@3 db4 c4 ~ db4 c4 ~", G: "g3 ~@7",
})).s("gm_trombone").gain(0.3)

// chords · piano
const piano = note("<~@8 A B C D E B F G ~@12 H>".pickRestart({
  A: "[g2,g3,g5] d6 ~ f5 [f2,f3,g5] ~ e5 g5 [eb2,eb3] e5 g5@2 [d2,d3] ~ d6@2, ~@6 f6 ~", // G Fsus2 Eb D
  B: "[g2,g3,g5] d6 ~ f5 [gb2,gb3,g5] ~ e5 g5 [f2,f3] e5 g5@2 [e2,e3] ~ c6@2, ~@6 db6 ~", // G Gmaj7 F E
  C: "g5 d6 ~ f5 [a2,e3,a3]@2 e5 g5 ~ e5 [bb1,f2,bb2,g5]@2 [c3,g3,c4,f6]@2 [c2,c3,d6]@2, [g2,d3,g3]@2 [g1,d2,g2]@2 g5 ~ [a1,e2,a2]@2 [bb2,f3,bb3]@2 ~@6", // A5 Gm7 Csus4 Csus2 G5 A5 Bb5
  D: "[c2,c3,bb4] c5 [d2,d3] f4 [eb2,eb3,g4] ~ [f2,f3,bb4] ~ [g2,g3,eb5] f5 [a2,ab3] d5 [b2,b3,d5,eb5] [d5,eb5] [g2,g3,d5,eb5] [d5,eb5]", // C7 D Eb Bb5 Cm Amaj7 B Ebmaj7
  E: "[g2,g3,eb5,g5] d6 ~ f5 [f2,f3,g5] ~ e5 g5 [eb2,eb3] e5 g5@2 [d2,d3] ~ d6@2, ~@6 f6 ~", // Cm Fsus2 Eb D
  F: "g5 d6 ~ f5 [a2,e3,a3]@2 e5 g5 ~ e5 [bb1,f2,bb2,g5]@2 [c3,g3,c4,f6]@2 [g5,d6] a5, [g2,d3,g3]@2 [g1,d2,g2]@2 g5 ~ [a1,e2,a2]@2 [bb2,f3,bb3]@2 ~@4 [c2,c3]@2", // A5 Gm7 Csus4 G5 A5 Bb5 C
  G: "bb5 g5 eb5 ~ [g2,bb2,eb3,g3,bb4]@2 g4@2 [d4,a4] gb4 ~ [g2,bb2,d3,g3]@2 ~@3, [bb2,d3,g3,bb3]@2 ~@6 [a2,d3,gb3,a3]@3 [g4,g5] ~@4", // Eb D5 Gm D G
  H: "[bb2,g3,d4,g4,bb4,d5] ~@7", // Gm
})).s("gm_piano").gain(0.3)

// bass · electric bass finger · "5-str. Electric Bass"
const bass = note("<~@4 A B A C A B A C A B A D E F E F E F E G ~@4 H>".pickRestart({
  A: "g2!2 gb2 ~ f2 ~ e2 ~ eb2 ~ bb1 ~ a1 ~ g1@2", B: "g2!2 gb2 ~ f2 ~ e2 ~ eb2 ~ g2 ~ gb2 ~ d2@2",
  C: "c2!2 bb1 ~ c2 ~ db2 ~ d2 ~ e2 ~ gb2 ~ d2@2", D: "c2!2 bb1 ~ c2 ~ db2 ~ d2 ~ gb2 g2@2 ~@3",
  E: "db2!2 c2 ~ bb1 ~ g1 ~ eb1!2 g1 ~ bb1 ~ d2 ~", F: "g2!2 d2@2 c2 bb1@2 d2 g2!2 d2@2 c2 bb1@2 c2",
  G: "g2!2 d2@2 c2 bb1@2 d2 g2!2 d2@2 c2 bb1@3", H: "g1 ~@7",
})).s("gm_electric_bass_finger").gain(0.3)

// drums · snare
const snare = s("sd").struct("<~@8 [~ x ~ x ~ x ~ x]!7 [~ x ~ x ~ x ~@2] ~@13>").gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@4 [x!4]!4 ~@21>").gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@8 [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!7 [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@3] ~@13>").gain(0.3)

stack(church_organ, trombone, piano, bass, snare, low_tom, ride)

More by Toby Fox