Strudelify

Guardian Angel

Masquerade

KeyD majorTempo88 bpm
0:00/0:00
// Guardian Angel — Masquerade
// 88 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/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.

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@5 A B A B A B A B A C D@2 E F G F H F I F G F E J I F G F G F H K H K L M N O H K H K L M N O E F E F G F H F I F G
  F H K H K L M N O E F E F G F H F I F G F E F G F H F I F G P
>`.pickRestart({
  A: "d2@3 a1", B: "g1 a1", C: "g1!2", D: "a1!2", E: "d2@6 d2 ~ d2@8", F: "g1@6 g1 ~ a1@8", G: "d2@6 d2 ~ d2@4 a1@4",
  H: "d2@6 d2 ~ d2@4 d2@4", I: "b1@6 b1 ~ b1@4 a1@4", J: "g1@6 g1 ~ a1@4 a1@4", K: "g1@6 g1 ~ g1@4 g1@4",
  L: "f#1@6 f#1 ~ f#1@4 a1@4", M: "b1@6 b1 ~ b1@4 b1@4", N: "e1@6 e1 ~ g1@6 g1 ~", O: "e1@6 e1 ~ a1@4 a1@4",
  P: "d2@3 ~@13",
})).s("gm_synth_bass_2").gain(0.61)

// chords · piano · "A.PIANO 3"
const piano = note(`<
  ~@5 A B A B A B A B A C D E F G H G F G I J H G K G L G M N O P Q R Q R S T U G Q R Q R S T U G F G V G H G F G I J H
  G Q R Q R S T U G F G V G H G F G W J H G F G H G F G I J X Y
>`.pickRestart({
  A: "[d4,f#4]@11 ~ [c#4,a4]@4", B: "[d4,g4] [c#4,a4]", C: "[d4,g4]", D: "[d4,a4]", E: "[c#4,a4]",
  F: "[a3,d4,f#4]@15 ~", G: "[b3,d4,g4] [a3,c#4,a4]", H: "[a3,d4,f#4]@11 ~ [a3,c#4,a4]@4",
  I: "[d4,f#4]@9 ~ [b4,d5]@2 [a3,a4,c#5]@4, b3@3 ~", J: "[b3,g4,b4] [a3,c#4,a4]",
  K: "[d4,f#4]@3 ~ [d4,f#4] ~ [d4,f#4]@3 ~ [d4,f#4]@5 ~, a3@15 ~", // D
  L: "[d4,f#4]@3 ~ [d4,f#4] ~ [d4,f#4]@3 ~ [d4,f#4]@3 ~@3, b3@15 ~", // D
  M: "[d4,f#4]@3 ~ [d4,f#4] ~ [d4,f#4]@6 [a3,c#4,a4]@4, a3@11 ~@5", N: "[b3,g4] [a3,c#4,a4]",
  O: "[a3,d4,f#4]@3 [a3,c#4,a4]", P: "[g3,b3,g4] [a3,c#4,a4]", Q: "[f#3,a3,d4]@15 ~", R: "[g3,b3,d4]@15 ~",
  S: "[f#3,a3,c#4]@15 ~", T: "[f#3,b3,d4]", U: "[g#3,b3,e4] [b3,d4,g4]", V: "[a3,d4]@11 ~@5, f#4@15 ~",
  W: "[b3,d4,f#4]@3 [c#4,e4,a4]", X: "[a3,d4,f#4]@13 ~ [a3,c#4,a4] ~", Y: "[f#3,a3,d4]@3 ~@13",
})).s("gm_piano").gain(0.5).pan(0.7)

// other · orchestra hit · "ORCH.HIT"
const orchestra_hit = note(`<
  ~@6 A B C B A B C B D E F B ~@14 A B C B ~@14 G B ~@10 C B ~@6 H B ~@10 C B ~@6 H I B
>`.pickRestart({
  A: "~@6 g4 ~ a4 ~@5 a4 ~", B: "d5 ~@15", C: "~@6 g4 ~ a4 ~@5 a4!2", D: "~@6 g4 ~ g4 ~@7", E: "~@6 a4 ~ a4 ~@7",
  F: "~@6 a4 ~ a4 ~@5 a4!2", G: "~@7 a4", H: "~@14 a4!2", I: "d5 ~@13 a4 ~",
})).s("gm_orchestra_hit").gain(0.41).pan(0.7)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@5 A B A B A B A B A C D E F B A B F B G B A B F B G B A B A B H I J I J H K L H I J I J H K L F B F B A B F B G B A
  B H I J I J H K L F B F B A B F B G B A B F B A B F B G B M N
>`.pickRestart({
  A: "[d3,a3]@3 [a2,c#4]", B: "[g2,b3] [a2,c#4]", C: "[g2,b3]", D: "[a2,d4]", E: "[a2,c#4]", F: "[d3,a3]",
  G: "[b2,d4]@3 [a2,c#4]", H: "[d3,f#4]", I: "[b3,g4]", J: "[a3,f#4]", K: "[g#3,e4] [b3,g4]", L: "[d4,b4] [c#4,a4]",
  M: "[d3,a3]@7 [a2,c#4]", N: "[d3,d4]@3 ~@13",
})).s("gm_string_ensemble_2").gain(0.26)

// other · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~@5 A B A B A B A B A C D@2 E B A B E B A B A B E B F B A B A B C@4 G C H I C@4 G C H I E B E B A B E B A B A B C@4 G
  C H I E B E B A B E B A B A B E B A B E B A B J K
>`.pickRestart({
  A: "f#4@3 a4", B: "d4 e4", C: "d4", D: "e4", E: "f#4", F: "f#4@3 e4", G: "c#4", H: "d4 g4", I: "e4 a4",
  J: "f#4@14 a4 ~", K: "d4 ~@7",
})).s("gm_pad_poly").gain(0.44).pan(0.3)

// other · timpani
const timpani = note(`<
  ~@18 A B C ~@3 D B E B ~@14 D B ~@8 A B A B D B F ~ D B ~@10 A B A B D B F ~ D B ~@2 A B D B F ~@4
>`.pickRestart({
  A: "~@14 a2 ~", B: "d3 ~@15", C: "~@6 g2!2 a2 ~@7", D: "~@14 a2!2", E: "~@6 g2 ~ a2 ~@5 a2!2", F: "~@6 g2 ~ a2 ~@7",
})).s("gm_timpani").gain(0.46).pan(0.7)

// chords · pad bowed · "BOWEDGLASS"
const pad_bowed = note(`<
  ~@4 A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C D E F G B C B C D E F G B C B C B C B C B C
  B C B C B C D E F G B C B C B C B C B C B C B C B C B C B C H ~
>`.pickRestart({
  A: "[d4,a4,d5,a5]", B: "d6, a5@7 ~", C: "a5", D: "c#6, f#5@7 ~", E: "b5", F: "e5, b5@7 ~", G: "e5", H: "[a5,d6]",
})).s("gm_pad_bowed").gain(0.28).pan(0.7)

// chords · pad halo · "HALO PAD"
const pad_halo = note("<A@5 ~@88>".pickRestart({
  A: "[~ [d2,d3,f#3,a3,d4]@9]/5", // D
})).s("gm_pad_halo").gain(0.05).pan(0.4)

// other · pad poly · "POLYSYNTH"
const pad_poly_2 = note("<~ A@35 ~@2 A@6 ~@2 A@18 ~@2 A@25 B C>".pickRestart({
  A: "e4 f#4 a4 e4 f#4 a4 e4 f#4 a4 e4 f#4 a4 e4 f#4 a4 f#4", B: "e4 f#4 a4 e4 f#4 a4 e4 f#4 a4 e4 f#4 a4 e4 f#4 a4 e4",
  C: "a4 ~@15",
})).s("gm_pad_poly").gain(0.21).pan(0.7)

// other · agogo
const agogo = note(`<
  ~@5 A@2 B A@3 B A@3 B A@3 B A@3 B A@5 B A@3 B A ~@16 A@4 B A@3 B A@3 ~@8 A@4 B A@3 B A@5 B A@3 B A@2 C
>`.pickRestart({
  A: "e3 f#3 a3 e3 f#3 a3 e3 f#3 a3 e3 f#3 a3 e3 f#3 a3 f#3",
  B: "e3 f#3 [d3,a3]!2 e3 f#3 a3 e3 f#3 [d3,a3] e3 f#3 e3!2 f#3 a3", C: "d3 ~@15",
})).s("gm_agogo").gain(0.11).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!2 ~@3]!90 [x ~@2 x!2 ~@2 x] x>").gain(0.53)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!91 ~>").gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<~ [~ x!7]!91 [~ x ~@6]>").gain(0.23)

// drums · open hat
const open_hat = s("oh").struct("<~ x!92>").gain(0.23)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@25 A ~ A ~ A ~ B ~ B ~@27 B ~@9 B ~ B ~ B ~ B ~ B ~ B ~ C ~ C ~ C ~ C ~ C ~
>`.pickRestart({
  A: "x ~ x!2 ~ x ~@2", B: "x ~ x!4 ~@2", C: "x ~ x!5 ~",
})).gain(0.38)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@25 A ~ A ~ A ~ B ~ B ~@27 C ~@9 C ~ C ~ C ~ C ~ C ~ C ~@11>".pickRestart({
  A: "~@2 x!2", B: "~@5 x ~@3 x ~@2 x ~@3", C: "~@3 x",
})).gain(0.23)

stack(
  bass, piano, orchestra_hit, string_ensemble_2, pad_poly, timpani, pad_bowed, pad_halo, pad_poly_2, agogo, kick, snare,
  hihat, open_hat, tambourine, tambourine_soft
)