Strudelify

Spear of Justice

Toby Fox

KeyB majorTempo127 bpm
0:00/0:00
// Spear of Justice — Toby Fox
// 127 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Glockenspiel" named as a mallet, played on glockenspiel (its overdriven guitar patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5856189; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 58 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(127/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 · trumpet
const trumpet = note("<~@10 A@2 B C D@2 E F G@2 H ~@3 I J ~@18 A@2 B C D@2 E F G@2 K L M@2>".pickRestart({
  A: "b4@2 ~@2 f#4@2 ~ a4 g#4 ~ e4 ~ f#4@2 ~@2", B: "b4@2 ~@2 f#4@2 ~ a4 g#4 ~ f#4 ~ e4@2 ~@2",
  C: "f#4 e4 d4 ~ c#4 f#4 a#4 ~", D: "[d4,b4]@2 ~@2 [b3,f#4]@2 ~ [d4,a4] [c#4,g#4] ~ [a3,e4] ~ [b3,f#4]@2 ~@2",
  E: "[d4,b4]@2 ~@2 [b3,f#4]@2 ~ [d4,a4] [c#4,g#4] ~ [b3,f#4] ~ [a3,e4]@2 ~@2", // G B5 D5 C#5 B5 A5
  F: "[b3,f#4] [a3,e4] [f#3,d4] ~ [e3,c#4] [a3,e4] [c#4,a4] ~", // B5 A5 D C#m A5 F#m
  G: "[d4,b4] [b3,g4] [g3,d4] ~ [a3,e4] [c#4,a4] [e4,c#5] ~", H: "[d4,b4] [b3,g4] [g3,d4] ~ [a3,e4] ~@3", I: "~@3 a5",
  J: "b5", K: "[g4,d5] [d4,b4] [b3,g4] ~ [c#4,a4] [e4,c#5] [a4,e5] ~",
  L: "[e4,f#4,b4]!2 ~ [e4,f#4,b4] ~ [e4,f#4,b4] ~ [e4,f#4,b4] ~@3 [e4,f#4,b4] ~ [e4,f#4,b4]!3", // Esus2
  M: "[e4@2 d#4@3 ~@3, [f#4,b4]@5 ~@3]/2", // B5
})).s("gm_trumpet").gain(0.4)

// other · tubular bells · "Chimes"
const tubular_bells = note("<~@2 A@2 B C D@2 E F G ~@3 G ~@6 G@8 ~@7 A@2 B C D@2 E F G@13 ~>".pickRestart({
  A: "b4@2 ~@2 f#4@2 ~ a4 g#4@2 e4@2 f#4@2 ~@2", B: "b4@2 ~@2 f#4@2 ~ a4 g#4@2 f#4@2 e4@2 ~@2",
  C: "f#4 f4 e4 c4 c#4 f#4 a#4 c#5", D: "b4@2 ~@2 f#4@2 ~ a4 g#4@2 e4@2 ~ f#4 ~@2",
  E: "b4@2 ~@2 f#4@2 ~ a4 g#4@2 f#4@2 ~ e4 ~@2", F: "f#4 e4 d4@2 c#4@2 f#4@2", G: "b4 ~@3",
})).s("gm_tubular_bells").gain(0.57)

// chords · piano
const piano = note(`<
  ~ A B C D E F G H I J K@6 L M N O P Q R S T U V W ~@4 X Y Z B C D E F G H I J K@6 L M N AA AB AC@2
>`.pickRestart({
  A: "~@15 [f3,f#3]", B: "[b2,b3,d4,f#4,b4]@2 ~@12 a2 b2", C: "[e2,e3,e4,g#4,b4]@2 ~@12 e2 f#2",
  D: "[g2,g3,d4,g4,b4]@2 ~@12 b2 g2", E: "[f#2,f#3,d4,f#4,b4] ~@3 [f#1,f#2,c#4,e4,a#4] ~@2 f#2",
  F: "[b1,b2,d4,f#4,b4]@2 ~@11 [b1,b2,d4,f#4,b4]@3", G: "[e2,e3,e4,g#4,b4]@2 ~@11 [f#2,f#3,e4,g#4,b4]@3",
  H: "[g2,g3,d4,g4,b4]@2 ~@11 [e2,e3,d4,g4,b4]@3", I: "[f#2,f#3,d4,f#4,b4] ~@3 [f#1,f#2,c#4,e4,a#4] ~@3",
  J: "[b1,b2,d4,f#4,b4]@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~", K: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~",
  L: "g1@2 g2 ~ g1@2 g2 ~ a1@2 a2 ~ a1@2 a2 ~", M: "b1@2 b2 ~ b1@2 b2 ~ c#2@2 c#3 ~ c#2@2 c#3 ~",
  N: "d2@2 d3 ~ d2@2 d3 ~ c#2@2 c#3 ~ c#2@2 c#3 ~", O: "b1@2 b2 ~ b1@2 b2 ~ [a1,a2]@2 ~@3 c#4 e4 g4",
  P: "[b2,f#3] ~@2 [b2,f#3] b4@2 [b2,f#3] d5 b4 ~ [b2,f#3] ~ [a2,e3,c#5] d5 [e5,f#5] [c#5,e5], f#4@3 ~@13", // B5 A Esus2 C#m
  Q: "[b2,f#3] ~@2 [b2,f#3] c#5@2 [b2,f#3] [a4,b4] g4 ~ [b2,f#3] ~ [a2,e3,c#5] d5 e5 f#5, d5@3 ~@13", // B5 Asus2 B5 A
  R: "[b2,f#3] ~@2 [b2,f#3] c#5@2 [b2,f#3] f#4 b4 ~ [b2,f#3] ~ [a2,e3,a4] ~ g4 ~, d5@3 ~@13", // B5 A5
  S: "[b2,f#3,a4] g4 f#4 [b2,f#3] e4 ~ [b2,f#3,b4] ~ [a2,e3] ~@4 e3 a3 c#4, ~@4 f#4 ~@3", // B7 B5 A5
  T: "[b2,f#3] ~@2 [b2,f#3] d4@2 [b2,f#3] d4 e4@2 [b2,f#3] ~ [a2,e3,e4] f#4 g4 e4, b3@3 ~@13", // B5 A5
  U: "[b2,f#3] ~@2 [b2,f#3] e4@2 [b2,f#3] [d4,e4] c#4@2 [b2,f#3] ~ [a2,e3,e4] f#4 g4 a4, f#4@3 ~@13", // B5 Dsus2 B5 A5
  V: "[b2,f#3] ~@2 [b2,f#3] e4@2 [b2,f#3] d4 e4@2 [b2,f#3] ~ [a2,e3,d4] ~ c#4 ~, f#4@3 ~@13", // B5 Asus4
  W: "[b2,f#3,d4] c#4 b3 [b2,f#3] a3 ~ [a2,e3,c#4] ~ [b2,f#3,b3]@2 ~@6", X: "[b3,d4,f#4] [b3,d4,e4]",
  Y: "[a3,c#4,e4] [g#3,b3,e4]", Z: "[g3,b3,e4]@8 [a3,c#4,e4]@7 [e3,f#3]", AA: "d2@2 d3 ~ d2@2 d3 ~ e2@2 e3 ~ e2@2 e3 ~",
  AB: "[e4,f#4,b4]@2 ~ [f#2,f#3] ~ [f#2,f#3] ~ [f#2,f#3,a4] [b3,e4,g#4]@2 ~ [f#2,f#3] ~ [f#2,f#3]!3, [f#2,f#3] ~@3 [b3,e4,f#4]@2 ~@4 f#4@2 [b3,e4]@2 c#4@2", // Esus2 F# F#m E F# Bsus4 E5
  AC: "[b3@8 b1@11 ~@13, [b2,d#4,f#4,b4]@19 ~@13]/2", // B
})).s("gm_piano").gain(0.49)

// other · violin
const violin = note("<A B C@3 D C@3 D C@11 ~@15 C@3 D C@3 D C@12 ~@2>".pickRestart({
  A: "~@7 g4", B: "[f#4,f#5] [g4,g5] [f#4,f#5] [g4,g5] [f#4,f#5] [g4,g5] [a4,f#5] [a#4,g5]", C: "[b4,b5] ~@15",
  D: "[b4,b5] ~@7 [a#4,a#5] ~@7", // B A#
})).s("gm_violin").gain(0.52)

// other · violin · soft notes
const violin_soft = note("<A ~@28 B@2 C D E@2 F ~@22>".pickRestart({
  A: "f#4 g4 f#4 g4 f#4 g4 f#4 ~", B: "[f#4 e4@2 f#4]/2", C: "f#4", D: "f#4 e4", E: "[f#4 e4@2 g#4]/2", F: "d5 c#5",
})).s("gm_violin").gain(0.26)

// other · viola
const viola = note(`<
  A B C@3 D C@3 D C ~@3 E F G H I H J ~@4 K L M N ~@7 C@3 D C@3 D C ~@3 E F G H I H O P ~@2
>`.pickRestart({
  A: "~@4 f#3 g3 f#3 g3", B: "a#3 b3 a#3 b3 c#4 d4 [c#4,f#4] [d4,g4]", C: "b3 ~@15", D: "b3 ~@7 a#3 ~@7", E: "b3",
  F: "e4", G: "f#4", H: "g4 a4", I: "b4 a4", J: "b4@4 a4 ~@3", K: "b3 f#4 e4 b3", L: "d4@2 e4 f#4 e4@2 b3 c#4",
  M: "d4@2 c#4 b3 c#4@2 a3 c#4", N: "b3 ~", O: "g4 e4", P: "b3 ~@7",
})).s("gm_viola").gain(0.39)

// other · viola · soft notes
const viola_soft = note("<A ~@28 B@2 C D E@2 F ~@22>".pickRestart({
  A: "f#3 g3 f#3 g3 ~@4", B: "[b3 a3@2 b3]/2", C: "b3 a3", D: "a3 g#3", E: "[b3 a3@2 e3]/2", F: "g3 a3",
})).s("gm_viola").gain(0.26)

// bass · electric bass finger · "Electric Bass"
const bass = note("<~@10 A@10 B ~@4 C@3 D ~@3 E F G H I J K L I J K M A@11 N O@2>".pickRestart({
  A: "b1@7 ~", B: "b1@4 a1 ~@3", C: "b1 ~ f#2 ~@3 f#2 ~@2 f#2 b1 ~ f#2 ~@3", D: "b1 ~ f#2 ~@3 e2 ~ b1@2 ~@6",
  E: "~@3 f#1", F: "b1 a1", G: "a1@2 e1 f#1", H: "g1 a1", I: "b1", J: "e1", K: "g1", L: "f#1 a#1", M: "e1 f#1",
  N: "b1 ~@7", O: "[b1@5 ~@3]/2",
})).s("gm_electric_bass_finger").gain(0.47)

// bass · electric bass finger · "Electric Bass" · soft notes
const bass_soft = note("<~@21 [b1 ~ f#2 ~@3 f#2 ~@2 f#2 b1 ~ f#2 ~@3]!3 [b1 ~ f#2 ~@3 f#2 ~ e2 ~@7] ~@33>")
  .s("gm_electric_bass_finger").gain(0.31)

// drums · kick
const kick = s("bd").struct("<~@6 A@4 B@10 A ~@4 B@3 A ~@11 A@4 B@12 C ~>".pickRestart({
  A: "x!3 ~", B: "x!4", C: "x",
})).gain(0.6)

// drums · rim
const rim = s("rim").struct("<~@21 [x ~@2 x!2 ~ x ~@2 x!2 ~ x ~@3]!3 [x ~@2 x!2 ~ x ~ x ~@7] ~@33>").gain(0.33)

// drums · snare
const snare = s("sd").struct(`<
  ~@5 A B C@2 D E F E F E F E F E@2 G ~@4 H@3 I ~@3 J K L M N ~@2 A B C@2 D E F E F E F E F E@2 F O N ~
>`.pickRestart({
  A: "~@12 x!4", B: "x!2 ~@14", C: "x!16", D: "x ~ x!4 ~ x!2 ~@3 x!4", E: "~@3 x ~@2 x ~@2 x ~ x ~@2 x ~",
  F: "~@3 x ~@2 x ~@2 x ~ x ~@2 x!2", G: "~@3 x ~@2 x ~ x ~@7", H: "x ~@2 x!2 ~ x ~@2 x!2 ~ x ~@3",
  I: "x ~@2 x!2 ~ x ~ x ~@7", J: "~@14 x!2", K: "x ~ x!4 ~ x!2 ~@3 x ~ x ~", L: "x ~@2 x!3 ~ x!2 ~@2 x!2 ~ x ~",
  M: "x ~ x!4 ~ x!2 ~@3 x!2 ~ x", N: "x", O: "x ~@2 x ~@2 x ~@3 x ~@2 x!3",
})).gain(0.53)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@6 [~@2 x!14] ~@33 [~@2 x!14] ~@17>").gain(0.27)

// drums · hihat
const hihat = s("hh").struct("<~@21 A@3 B C@3 D ~@11 E@4 F G@10 ~@3>".pickRestart({
  A: "x ~ x!3 ~ x ~ x!3 ~ x ~@3", B: "x ~ x!3 ~ x ~ x ~@7", C: "~@2 x!3 ~ x ~ x!3 ~ x ~@3", D: "~@2 x!3 ~ x ~ x ~@7",
  E: "x!8", F: "~ x!15", G: "x!16",
})).gain(0.33)

// drums · open hat
const open_hat = s("oh").struct("<~@25 x!4 ~@29>").gain(0.33)

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A@2 B C D ~@3 D ~@6 D ~@3 D ~@3 D ~@2 E D ~@6 A@2 B C D ~@3 D ~@6 D@2 ~
>`.pickRestart({
  A: "x ~@12 x ~@2", B: "x!2", C: "x!3 ~", D: "x", E: "~@3 x",
})).gain(0.53)

stack(
  trumpet, tubular_bells, piano, violin, violin_soft, viola, viola_soft, bass, bass_soft, kick, rim, snare, snare_soft,
  hihat, open_hat, crash
)

More by Toby Fox