Strudelify

Plants vs. Zombies Soundtrack

K.V.H

KeyA minorTempo115 bpm
0:00/0:00
// Plants vs. Zombies Soundtrack — K.V.H
// 115 bpm, 4/4, key A minor. 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/5979789; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(115/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.

// other · clarinet · "B♭ Clarinet"
const clarinet = note("<~@12 A B C ~ D E D F D E D G H ~@54 A B C ~ D E D F D E D G H ~@42>".pickRestart({
  A: "a4 g#4 a4 b4 c5 ~@3", B: "a4 g#4 a4 b4 c5@2 d5@2", C: "b4", D: "a4@3 b4 c5 e4 c5 b4", E: "a4@3 b4 c5 d5 c5 b4",
  F: "a4 b4", G: "a4 g4", H: "a4",
})).s("gm_clarinet").gain(0.25)

// chords · string ensemble 1 · "Violins"
const string_ensemble_1 = note(`<
  ~@4 A B C ~ D E F G ~@24 H I J K L M N ~ O P J K L M N Q R Q R Q R Q R Q R Q R Q R Q R ~@4 A B C ~ D E F G ~@24 H I J
  K L M N ~ O P J K L M N Q R Q R Q R Q R Q R Q R Q R Q R
>`.pickRestart({
  A: "e5", B: "c5", C: "d#5", D: "[f5,a5]", E: "[e5,g#5] [e5,b5]", F: "[e5,c6] [g5,c6]", G: "[a5,d6]@3 ~",
  H: "a5@2 c6@2 ~ c5 b4 a4, a4 e5", I: "a5@3 c6 ~ c5 b4 a4, a4 e5", J: "[a5,c6]", K: "d6 c6 b5@2", L: "a5@2 b5 g5",
  M: "c6@2 d6 f6", N: "e6", O: "a5 c6 e5@2", P: "a5@3 c6 e5@4", Q: "[c5,e5]", R: "[d5,f5]",
})).s("gm_string_ensemble_1").gain(0.05)

// other · pizzicato strings · "Violins"
const pizzicato_strings = note("<~@2 A B ~@2 A B ~@16 C D C D ~@41 A B ~@2 A B ~@16 C D C D ~@39>".pickRestart({
  A: "a5 g#5 e5 g5 f#5 d5 f5 e5", B: "c5 ~@7", C: "a5@2 g#5 e5 g5@2 f#5@2", D: "e5 ~@3",
})).s("gm_pizzicato_strings").gain(0.25)

// chords · pizzicato strings · "Viola"
const pizzicato_strings_2 = note(`<
  ~@28 A@2 B C D E F G A@2 B C D E F G A@2 B C D E F H ~@43 A@2 B C D E F G A@2 B C D E F G A@2 B C D E F H ~@15
>`.pickRestart({
  A: "a3 [c4,e4] e3 [c4,e4]", B: "a3 [c4,e4] g4 [c4,e4]", C: "f3 [c4,e4] e3 [b3,d4]", D: "a3 [c4,e4] b3 [d4,g4]",
  E: "c4 [e4,g4] f4 [d4,f4]", F: "e4 [c4,e4] d4 [b3,d4]", G: "a3@2 [c4,e4]@2 e4 d4 c4 b3", H: "a3 ~@3",
})).s("gm_pizzicato_strings").gain(0.45)

// other · cello · "Violoncello"
const cello = note(`<
  ~@3 A B ~ C D E F G H ~@13 I J I K L M N O P Q J K L M N O P Q J K L M N O P Q J ~@18 A B ~ C D E F G H ~@13 I J I K L
  M N O P Q J K L M N O P Q J K L M N O P Q J ~@15
>`.pickRestart({
  A: "~@4 f2 f#2 g2 g#2", B: "a2 ~@15", C: "~@2 c3 e2", D: "f2@2 ~@3 f2 e2 d#2", E: "d2 ~@7", F: "~@4 e3 d3 c3 b2",
  G: "c3 b2", H: "a2 ~", I: "~@4 e2 f2 f#2 g2", J: "a2 ~@7", K: "a2 ~@3 e2 ~@3", L: "a2 g#2 a2 c3 e2 ~@3",
  M: "a2 g#2 a2 b2 c3 ~ e3 ~", N: "d3 ~ c3 ~ b2 ~@3", O: "a2 ~@3 g2 ~@3", P: "c3 b2 c3 e3 f3 ~@3",
  Q: "e3 ~ c3 a2 b2 ~ c3 ~",
})).s("gm_cello").gain(0.25)

// other · cello · "Violoncello" · soft notes
const cello_soft = note("<~@55 A B C D A B C D A B C D ~@55 A B C D A B C D A B C D>".pickRestart({
  A: "a2", B: "b2", C: "c3", D: "d3",
})).s("gm_cello").gain(0.15)

// chords · piano · "Grand Piano"
const piano = note(`<
  A B C D A B C D E F G H I J K L M N O P M N O P Q R Q R ~@23 S T S T S T S U@8 V A B C D A B C D E F G H I J K L M N O
  P M N O P Q R Q R ~@23 S T S T S T S U@8 V
>`.pickRestart({
  A: "a2 ~@3 [e3,d#4]@2 [a3,e4]@2 a4 ~@3 e2@4", B: "a2 ~@3 [e3,d#4]@2 [a3,e4]@2 g4@2 f#4@2 f4@2 e4@2, ~@3 e2",
  C: "d#4@4 c3 ~@3 f3 ~@3 e2 ~@3, f2 ~@15", D: "[c3,c4] ~@15", E: "[d2,d4]@4 a2@3 ~ d3@3 ~ [d2,e4]@2 f4@2",
  F: "[e2,e4] [b2,b3] [e3,e4] [d3,d4]", G: "c4 e4", H: "a4@11 ~@5", I: "d2@2 ~ c3 f3 ~@3", J: "d2@2 ~ a2 d3@2 d2@2",
  K: "[e2,b2,e3] e5", L: "g#5@2 b5 e6", M: "[a1,a2,a6]@2 g#6 e6 [a2,a3,g6]@2 f#6 d6, ~ [e2,e3] ~ [e2,e3]",
  N: "f6 e6 c6 e6 [a2,a3]@2 e6 c6, [a1,a2]@2 [e2,e3]@2 c6 ~ [e2,e3]@2", O: "[f1,f2] [c2,c3] [f2,f3] [c2,c3], a5 ~@7",
  P: "[f1,f2] [g1,g2]", Q: "a2 ~@5 e3@2 a3@2 ~@2 e2@4", R: "a2 ~@15",
  S: "~@7 e5, e6!2, ~ c6@4 c6@3, ~ a5@2 a5, ~@3 e5@4 ~", T: "~@7 f5, f6!2, ~ d6@4 d6@3, ~ a5@2 a5, ~@3 f5@4 ~",
  U: "[~@63 e5, f6@4 f6@9 c6@9 a5 f5@9 f6 d6 a5 f5 f6@9 c6@9 a5 f5@6 c6 a5@2, ~ d6@4 d6@9 a5 e5@9 e6 c6 a5 e5 e6@9 d6@9 a5 e5@9 e6 c6 a5 e5 e6@4, ~@2 a5@4 a5@2 e6 c6 a5 e5 e6@9 d6@9 a5 e5@9 e6 c6 a5 e5 e6@9 d6@11, ~@3 f5@4 f5@9 f6 d6 a5 f5 f6@9 c6@9 a5 f5@9 f6 d6 a5 f5 f6@12]/8",
  V: "~@3 a5, f6!2, ~ d6@4 d6@3, ~ a5@2 ~, ~@3 f5@5",
})).s("gm_piano").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@16 A@3 B A@3 B ~@59 A@3 B A@3 B ~@43>".pickRestart({
  A: "x ~@5 x!2", B: "x ~@3 x ~ x!2",
})).gain(0.3)

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

// drums · china
const china = s("cr").struct("<~@16 A ~@3 A ~@3 A ~@58 A ~@3 A ~@3 A ~@42>".pickRestart({
  A: "x",
})).gain(0.3)

stack(clarinet, string_ensemble_1, pizzicato_strings, pizzicato_strings_2, cello, cello_soft, piano, kick, snare, china)