Strudelify

steven universe the movie - finale song

Misc Cartoons

KeyG minorTempo95 bpm
0:00/0:00
// steven universe the movie - finale song — Misc Cartoons
// 95 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5902373; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 64 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(95/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 · epiano1 · "Electric Piano"
const epiano1 = note(`<
  A B C D E F G H E I@2 J@2 I@2 K@2 L M I N O P Q R S I A B C T E U@2 V W X J Y X Z A L M I N O P Q R S I ~@2 AA ~ AB@2
  AC AD@3 AE AF
>`.pickRestart({
  A: "[d4,f4]", B: "[d4,f4] [c4,e4]", C: "[bb3,d4]", D: "[bb3,d4,f4] [a3,db4,e4]", E: "[d4,f4,a4]",
  F: "[bb3,d4] [a3,db4]", G: "[bb3,c4,e4] [g3,bb3,g4]", H: "[bb3,d4] [a3,db4,g4]", I: "[g4,bb4]", J: "[c4,e4]",
  K: "[bb3,c4,e4]", L: "[bb3,eb4,g4] [g3,c4,e4]", M: "[g3,a3,db4] [c4,d4,gb4]", N: "[bb4,d5]", O: "[eb5,g5]",
  P: "[c5,e5]", Q: "[g4,bb4] [f4,a4]", R: "[bb3,d4] [g4,b4]", S: "[c4,eb4] [c4,d4,gb4]",
  T: "[bb3,d4,ab4] [a3,db4,e4,g4]", U: "[[c4,eb4,bb4,d5]@2 ~@6 [g3,b3,f4,bb4]@2 ~@4 [c4,eb4,bb4,d5]@17 ~]/2",
  V: "[a3,db4,g4,b4]@15 ~", W: "[d3,gb3,c4,gb4]@15 ~", X: "[g3,bb3]", Y: "[f3,a3]", Z: "[c4,eb4]",
  AA: "~ db6@7, [bb3,d4], ~ [ab4,db5]@15", AB: "[~@3 db6@9 ~@4, eb5@3 ~, ~ g5@11 ~@4, ~ bb5@5 ~@2]/2",
  AC: "~ [bb4,eb5]@7 [c4,g4,c5,e5]@8, [eb4,g4] ~", AD: "[[a3,db4,e4,a4] [d4,a4,c5,d5,gb5]@5]/3",
  AE: "~ [gb6,d7]@3 ~@4 [c4,g4,c5,eb5]@8, [d5,a5] ~@3", AF: "[d4,a4,c5,d5,gb5]@2 [g4,d5,g5,bb5] ~",
})).s("gm_epiano1").gain(0.3)

// chords · lead 1 square · "Mallet Synthesizer"
const lead_1_square = note("<~@29 A B C ~@2 D E F G H F I J K L M N O G P Q R M ~@4 S T U V@3 W X>".pickRestart({
  A: "~ f6@15, [bb5,d6]", B: "~ [f6,ab6]@7 ~ [e6,g6]@7, [bb5,d6] [a5,db6]", C: "~ a6@15, [d6,f6]",
  D: "~ b5@7, [g4,a4], ~ [db5,e5]@15", E: "~ [c5,gb5]@15, [d4,gb4]", F: "[g5,bb5]", G: "[c4,e4]", H: "[f4,a4]",
  I: "[c4,eb4]", J: "[d5,f5]", K: "[bb5,eb6,g6] [g5,c6,e6]", L: "[g5,a5,db6] [c6,d6,gb6]", M: "[g3,bb3]", N: "[bb3,d4]",
  O: "[eb4,g4]", P: "[g3,bb3] [f3,a3]", Q: "[bb2,d3] [g3,b3]", R: "[c3,eb3] [c3,d3,gb3]", S: "~@5 eb6 c7 g6",
  T: "eb6 g6 bb6 db7 ~@4", U: "~ [bb5,eb6]@7 [c5,g5,c6,e6]@8, [eb5,g5] ~", V: "[[a4,db5,e5,a5] [d5,a5,c6,d6,gb6]@5]/3",
  W: "~ [c5,g5,c6,eb6]", X: "[d5,a5,c6,d6,gb6]@2 [g4,d5,g5,bb5] ~",
})).s("gm_lead_1_square").gain(0.15)

// bass · synth bass 1 · "Bass"
const bass = note(`<
  A B ~@4 C D E F G H I F J H I K L M N O P Q R S M ~@5 T@2 U E V W X Y Z AA AB AC M N O P Q R S AD ~@6 K AE AF AG AH AI
>`.pickRestart({
  A: "~@7 a3", B: "d3 ~", C: "~@3 c3", D: "bb2 a2", E: "d2", F: "[g1,g2] ~@6 [f1,f2]",
  G: "[g1,g2] ~@4 [g1,g2] [bb1,bb2] [d2,d3]", H: "[c2,c3] ~@6 [bb1,bb2]", I: "[c2,c3] ~@7", J: "[g1,g2] ~@7",
  K: "eb2 c2", L: "a2 d2", M: "[g1,g2]@3 [g1,g2]@2 [g1,g2] [f1,f2] [g1,g2] ~ [g1,g2]@2 [g1,g2] [f1,f2] [g1,g2] ~@2",
  N: "[bb1,bb2]@3 [bb1,bb2]@2 [bb1,bb2] [a1,a2] [bb1,bb2] ~ [bb1,bb2]@2 [bb1,bb2] [a1,a2] [bb1,bb2] ~@2", // Bb A Bb A Bb
  O: "[eb2,eb3]@3 [eb2,eb3]@2 [eb2,eb3] [d2,d3] [eb2,eb3] ~ [eb2,eb3]@2 [eb2,eb3] [d2,d3] [eb2,eb3] ~@2", // Eb D Eb D Eb
  P: "[c2,c3]@3 [c2,c3]@2 [c2,c3] [bb1,bb2] [c2,c3] ~ [c2,c3]@2 [c2,c3] [bb1,bb2] [c2,c3] ~@2", Q: "[g1,g2] [a1,a2]",
  R: "[bb1,bb2] [b1,b2]", S: "[c2,c3] [d2,d3]", T: "[c2 ~@3 g1 ~@2 c2@9]/2", U: "a2",
  V: "[g1,g2] ~@2 [g1,g2] ~@3 [g1,g2]", W: "[c2,c3] ~@2 [c2,c3] ~@3 [c2,c3]",
  X: "[f1,f2]@2 ~@4 [f1,f2]@2 ~@2 [f1,f2]@3 [gb1,gb2]@3", Y: "[g1,g2] ~@2 [g1,g2] ~@4", Z: "[c2,c3]", AA: "[d2,d3]",
  AB: "[eb1,eb2] [c1,c2]", AC: "[a1,a2] [d1,d2]", AD: "[g1,g2]@3 [g1,g2]@2 [g1,g2] [f1,f2] ~@9", AE: "a2 [d1,d2]",
  AF: "[d1,d2]@3 ~", AG: "[d1,d2] ~", AH: "~ [c2,c3]", AI: "[d1,d2]@2 [g1,g2] ~",
})).s("gm_synth_bass_1").gain(0.3)

// other · lead 1 square · "Square Synthesizer"
const lead_1_square_2 = note("<~@3 A B ~@6 C D ~@16 E ~@32 F G>".pickRestart({
  A: "f7 ~ e7 ~", B: "~ a6 d7 e7 f7@2 ~@2", C: "~@5 d6 f6 d7", D: "c7 ~@7", E: "~@3 d6 g6 bb6 ~ d7@2 bb6@2 ~@5",
  F: "~@2 d5@2 c5@2 bb4 g4 ~@2 d5@2 c5@2 bb4 c5", G: "~@2 bb4@3 g4 f4 g4@5 ~@4",
})).s("gm_lead_1_square").gain(0.15)

// bass · lead 1 square · "Mallet Synthesizer"
const bass_2 = note("<~@17 A B C D E F G H I J ~@9 K L M N F O P Q R S T U G H I V ~@10 W X>".pickRestart({
  A: "eb3 c3", B: "a2 d2", C: "g2", D: "bb2", E: "eb2", F: "c2", G: "[g1,g2] [a1,a2]", H: "[bb1,bb2] [b1,b2]",
  I: "[c2,c3] [d2,d3]", J: "[g1,g2]@3 ~", K: "g1 ~@2 g1 ~@3 g1", L: "c2 ~@2 c2 ~@3 c2",
  M: "f1@2 ~@4 f1@2 ~@2 f1@3 gb1@3", N: "g1 ~@2 g1 ~@4", O: "d2", P: "[eb1,eb2] [c1,c2]", Q: "[a1,a2] [d1,d2]",
  R: "[g1,g2]@3 [g1,g2]@2 [g1,g2] [f1,f2] [g1,g2] ~ [g1,g2]@2 [g1,g2] [f1,f2] [g1,g2] ~@2", // G F G F G
  S: "[bb1,bb2]@3 [bb1,bb2]@2 [bb1,bb2] [a1,a2] [bb1,bb2] ~ [bb1,bb2]@2 [bb1,bb2] [a1,a2] [bb1,bb2] ~@2", // Bb A Bb A Bb
  T: "[eb2,eb3]@3 [eb2,eb3]@2 [eb2,eb3] [d2,d3] [eb2,eb3] ~ [eb2,eb3]@2 [eb2,eb3] [d2,d3] [eb2,eb3] ~@2", // Eb D Eb D Eb
  U: "[c2,c3]@3 [c2,c3]@2 [c2,c3] [bb1,bb2] [c2,c3] ~ [c2,c3]@2 [c2,c3] [bb1,bb2] [c2,c3] ~@2", // C Bb C Bb C
  V: "[g1,g2]@3 [g1,g2]@2 [g1,g2] [f1,f2] ~@9", W: "~@2 [c2,c3]!2", X: "[d1,d2]!2 [g1,g2] ~",
})).s("gm_lead_1_square").gain(0.25)

// other · pad sweep · "Sweep Synthesizer"
const pad_sweep = note("<~@8 A ~@8 B C D E F G H I J K ~@15 L M D E F G H I J K ~@8 N O P Q>".pickRestart({
  A: "[d2,d3]", B: "[eb2,eb3] [c2,c3]", C: "[a1,a2] [d1,d2]", D: "g1", E: "bb1", F: "eb1", G: "[c1,c2]",
  H: "[g1,g2] ~ [a1,a2] ~", I: "[bb1,bb2] ~ [b1,b2] ~", J: "[c2,c3] ~ [d2,d3] ~", K: "[g1,g2]@3 ~",
  L: "[eb1,eb2] ~ [c1,c2] ~", M: "[a1,a2] ~ [d1,d2]@2", N: "~ [d1,d2]", O: "[d1,d2] ~", P: "~ [c2,c3]",
  Q: "[d1,d2]@2 [g1,g2] ~", // D G
})).s("gm_pad_sweep").gain(0.45)

// drums · kick
const kick = s("bd").struct(`<
  ~@9 A B A C A B A B D@2 E@7 F ~@4 G H ~ I@2 ~@7 J E@7 F A K L M A K A E@3 F N
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x ~@2 x ~ x ~@3 x ~@3", C: "x ~@2 x ~@2 x ~ x ~@7", D: "x ~@2 x ~@4 x ~@2 x ~@2 x ~",
  E: "x!2", F: "x", G: "x ~@4 x ~@2", H: "x ~@3 x ~@2 x", I: "x!4", J: "~@7 x", K: "x ~@2 x ~@2 x ~ x ~@2 x ~@4",
  L: "x ~@7 x ~@6 x", M: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~", N: "x!3 ~",
})).gain(0.3)

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

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

// drums · hihat
const hihat = s("hh").struct("<~@31 [~ x ~ x ~ x ~ x] ~@2 [x!16] [x!12 ~@4] ~@28>").gain(0.25)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@33 [x!16] ~@30>").gain(0.15)

// drums · open hat
const open_hat = s("oh").struct("<~@33 [x!2] ~@30>").gain(0.15)

// drums · crash
const crash = s("cr").struct("<~@26 x ~@5 [x ~@3 x ~@2 x] ~@18 x ~@11 [x!3 ~]>").gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@54 [~@2 x!2 ~@2 x ~@3 x!2 ~@2 x ~] ~@9>").gain(0.3)

stack(
  epiano1, lead_1_square, bass, lead_1_square_2, bass_2, pad_sweep, kick, rim, snare, hihat, hihat_soft, open_hat,
  crash, tambourine
)

More by Misc Cartoons