Strudelify

Last Boss - Trove Soundtrack Shadow tower

Trion Worlds

KeyE♭ majorTempo120 bpm
0:00/0:00
// Last Boss - Trove Soundtrack Shadow tower — Trion Worlds
// 120 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 8 "Euphonium" tuba (copy of ch 7 "Trombone 3 & Bass Trombone" trombone)
// note: Transcription provider: pdmx. https://musescore.com/score/1681966; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 43 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · flute · "Flute 1"
const flute = note("<~@2 A@3 ~ A@3 ~@6 B@2 C D B@2 C D E F ~@18>".pickRestart({
  A: "c5 ~ g4 ~", B: "~@2 c5 d5 eb5@2 d5@2 c5@2 g4@2 g5@2 ~@2", C: "~@2 c5 d5 eb5@2 d5@2 c5@2 g4@2 g5@2 c5@2",
  D: "ab5 g5 f5 ab5 g5 f5 eb5 g5", E: "gb5 ~@3 gb5 ~@3 gb5 ~@3 gb5 ~@3", F: "g5@11 ~@5",
})).s("gm_flute").gain(0.45)

// other · oboe
const oboe = note("<~@2 [~@2 g4 ~@3 g4 ~]!3 ~ [~@2 g4 ~@3 g4 ~]!3 ~@34>").s("gm_oboe").gain(0.3)

// other · trumpet · "B♭ Trumpet 1"
const trumpet = note("<~@2 A@3 B A@3 B C D E F ~ A@3 B A@3 B C D E G H@2 I@2 J K L M N O P Q R S T ~>".pickRestart({
  A: "~@2 c4 d4 eb4 d4 c4 ~", B: "ab4 g4", C: "gb4 ~@3 gb4 ~@3 gb4 ~@3 gb4 ~@3", D: "g4@3 ~",
  E: "g4@2 ~@4 g4 ab4 g4@2 f4@2 eb4@2 d4@2", F: "c4", G: "c4@2 c4 d4 eb4@2 g4@2",
  H: "[f4@2 d4@4 d4 eb4@3 c4 d4 eb4@2 g4@2]/2", I: "[f4@2 eb4@2 d4@2 c4@4 b3 c4 d4@2 c4 d4]/2", J: "eb4 d4 c4 g4",
  K: "ab4 g4 f4 ab4", L: "g4 b4", M: "c5 ~@3 c4 d4 eb4 ~", N: "c4@8 ~@4 d4@2 eb4 ~", O: "~@2 c4 d4 eb4@2 g4@2",
  P: "f4 eb4 d4 c4", Q: "~@2 b3 c4 d4@2 c4 d4", R: "eb4@2 d4 eb4 f4@2 eb4 f4", S: "g4 ~ g4@4 g4@2", T: "c5 ~@7",
})).s("gm_trumpet").gain(0.3)

// other · french horn · "F Horn 1 & 2"
const french_horn = note("<~@2 A@3 B A@3 B ~@5 A@3 C A@3 C ~@20>".pickRestart({
  A: "~@2 c3@2 eb3@2 c3 ~", B: "ab3 g3", C: "ab4 g4 f4 ab4 g4 f4 eb4 g4",
})).s("gm_french_horn").gain(0.45)

// bass · trombone · "Trombone 3 & Bass Trombone"
const bass = note("<~@2 A@3 B A@3 B C D E F ~ A@3 B A@3 B C D E G H@2 I@2 J K L M N O P Q R S T ~>".pickRestart({
  A: "~@2 c3 d3 eb3 d3 c3 ~", B: "ab3 g3", C: "gb3 ~ d3 ~ gb3 ~ d3 ~ gb3 ~ d3 ~ gb3 ~ a3@2", D: "g3@3 ~",
  E: "g3@2 ~@4 g3 ab3 g3@2 f3@2 eb3@2 d3@2", F: "c3", G: "c3@2 c3 d3 eb3@2 g3@2",
  H: "[f3@2 d3@4 d3 eb3@3 c3 d3 eb3@2 g3@2]/2", I: "[f3@2 eb3@2 d3@2 c3@4 b2 c3 d3@2 c3 d3]/2", J: "eb3 d3 c3 g3",
  K: "ab3 g3 f3 ab3", L: "g3 b3", M: "c4 ~@3 c3 d3 eb3 ~", N: "bb2@8 ~@4 d3@2 eb3 ~", O: "~@2 c3 d3 eb3@2 g3@2",
  P: "f3 eb3 d3 c3", Q: "~@2 b2 c3 d3@2 c3 d3", R: "eb3@2 d3 eb3 f3@2 eb3 f3", S: "g3 ~ g3@4 g3@2", T: "c4 ~@7",
})).s("gm_trombone").gain(0.3)

// bass · tuba
const bass_2 = note("<A@2 B@3 C B@3 C D E F A@2 G@3 H G@3 H D I F J K J K L M@2 L N E O K L M P A Q>".pickRestart({
  A: "c2@2 g2 ~ g2 ~ g2 ~", B: "c2@2 g2 ~ g1@2 g2 ~", C: "ab1 eb2 ab1 d2", D: "d2 a1 d2 a1", E: "d2@3 ~", F: "d2 ~@7",
  G: "c2@2 eb2 ~ g1@2 eb2 ~", H: "ab1 c2 g1 [b1,d2]", I: "g2@3 ~", J: "c2 eb2 c2 eb2", K: "bb1 d2 bb1 d2",
  L: "g1 b1 g1 b1", M: "ab1 c2 ab1 c2", N: "eb2 ~@7", O: "eb2 ~@5 eb2@2", P: "g1 b1@2 b1", Q: "c2 ~@3 c2 ~@3",
})).s("gm_tuba").gain(0.45)

// chords · timpani
const timpani = note(`<
  A@2 B C B D B C B D E F G A@2 B@2 C H B@2 C H I J G K L K L M N@2 M O P Q L M N R A S
>`.pickRestart({
  A: "c3@2 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", B: "c3@2 [c3,g3] ~ c3@2 [c3,g3] ~", C: "c3@2 [c3,g3] ~ b2@2 [c3,g3] ~",
  D: "c3 [c3,f3] b2 [b2,f3]", E: "d3 [gb2,a2] d3 [gb2,a2]", F: "[b2,d3,g3]@3 ~", G: "[b2,d3,g3] ~@7",
  H: "b2 [c3,f3] b2 [b2,f3]", I: "b2 [gb2,a2] d3 [gb2,a2]", J: "[c3,d3,g3]@3 ~", K: "c3 [c3,g3] c3 [c3,g3]",
  L: "b2 [d3,f3] b2 [d3,f3]", M: "b2 [b2,d3] b2 [b2,d3]", N: "b2 [c3,d3] b2 [c3,d3]", O: "[c3,d3,g3] ~@7",
  P: "[b2,d3,f3]@3 ~", Q: "[c3,d3,g3] ~@5 [c3,d3,g3]@2", R: "b2 [b2,d3]@2 [g2,b2,d3]", S: "c3 ~@3 c3 ~@3",
})).s("gm_timpani").gain(0.3)

// drums · rim
const rim = s("rim").struct("<~@40 [~@3 x] ~@2>").gain(0.3)

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

// drums · snare
const snare = s("sd").struct("<~@10 A B@2 ~@10 C B@2 ~ D ~ D@5 B@2 E D@4 ~@2>".pickRestart({
  A: "x!2", B: "x", C: "~ x", D: "~ x ~ x", E: "x ~@2 x",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<A@2 B@8 ~ C@2 A@2 B@8 ~ C@2 B@4 ~@4 C@2 D B ~@3 A ~>".pickRestart({
  A: "~ x!3", B: "~ x ~ x", C: "x", D: "x ~@2 x",
})).gain(0.3)

stack(flute, oboe, trumpet, french_horn, bass, bass_2, timpani, rim, kick, snare, low_tom)