Strudelify

sons of liberty

Metal Gear Solid

KeyD majorTempo100 bpm
0:00/0:00
// sons of liberty — Metal Gear Solid
// 100 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (1/4 at bar 1, 2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/113345; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 59 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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 · trumpet · "Bb Trumpet"
const trumpet = note("<~@18 A@4 B@3 ~@4 C@3 D@2 E@2 F@3 ~@20>".pickRestart({
  A: "[~@22 d4@17 g3@17 ~@13 f4@2 ~ d#4@2 d4@17 g4@17 d4@17 ~@13 a4@2 g4@2 f#4@17 d4@17 ~ g3@15, ~@57 g4@17 ~@51 a#4@17 ~@50]/4",
  B: "[~@15 f4@2 d#4@2 d4@17 g4@17 d5@17 ~@13 a#4@2 a4@2 g4@51 ~@6, ~@2 g4@17 ~@51 c5@17 ~@57]/3",
  C: "[~@6 e4@4 d4@4 c4@5 d4 e4 a3 e4@2]/3", D: "[d4@4 c4 d4 e4@5 a4 g4 e4 c4@2]/2",
  E: "[d4@4 e4 a4 c5@5 b4 c5 d5 c5@2]/2", F: "[a4@4 g4 a4 b4@3 c5 b4@2 a4 g4 a4@8 ~@2]/3",
})).s("gm_trumpet").gain(0.4)

// bass · tuba · "F Tuba"
const bass = note("<~@2 A B@2 C@2 D@2 E@2 F@2 G@2 H@7 I@3 ~@34>".pickRestart({
  A: "~@3 a1!3 ~@2", B: "[~@17 a1@3 a1@3 a1@3 ~@19 e2@3]/2", C: "[~ a1@16 a1@16 c2@15]/2", D: "[~ c2@16 a1@16 a1@15]/2",
  E: "[~ g1@16 a1@16 a1@15]/2", F: "[~ b1@16 b1@16 d2@15]/2", G: "[~ d2@16 b1@16 b1@15]/2",
  H: "[~@2 a1@32 b1@64 d1@17 d1@17 g1@17 d1@17 d1@17 d1@17 ~ g1@17 d1@17 d1@17 d1@17 g1@17 d1@17 d1@17 ~ d1@15]/7",
  I: "[~@2 g1@17 d1@17 d1@17 d1@17 g1@17 d1@51 ~@6]/3",
})).s("gm_tuba").gain(0.4)

// bass · trombone · "Bass Trombone"
const bass_2 = note("<~@5 A@2 B@2 C@2 D@2 E@2 F@2 G@5 H@3 ~@34>".pickRestart({
  A: "[~ a2@16 a2@16 c3@15]/2", B: "[~ c3@16 a2@16 a2@15]/2", C: "[~ g2@16 a2@16 a2@15]/2",
  D: "[~ b2@16 b2@16 d3@15]/2", E: "[~ d3@16 b2@16 b2@15]/2", F: "[~ a2@16 b2@16 b2@15]/2",
  G: "[~@2 d2@17 d2@17 g2@17 d2@17 d2@17 d2@17 ~ g2@17 d2@17 d2@17 d2@17 g2@17 d2@17 d2@17 ~ d2@15]/5",
  H: "[~@2 g2@17 d2@17 d3@17 d3@17 g3@17 d3@17 ~ d3@34 ~@5]/3",
})).s("gm_trombone").gain(0.4)

// other · trumpet · "C Trumpet"
const trumpet_2 = note("<~@10 A@7 ~@5 B@5 C ~@11 D E@2 F G H I J K L M@2 N O P Q R S T ~>".pickRestart({
  A: "[~@21 b3@2 b3@2 b3@10 c#4@2 d4@2 f#3@2 b3@4 b3@8 b3@2 c#4@2 d4@10 d4@2 d4@2 b3@2 a3@4 a3@8 b3@2 d4@2 d4@10 e4@2 e4@2 e4@2 e4@4 d4@8 a3@2 b3@2 a3@6 b3@2 a3@3 f#3@3 f#3@2 f#3@16 d#3@15]/7",
  B: "[~@36 g5@17 d6@17 ~@13 a#5@2 a5@2 g5@26 g6@26 c2@8 c4@26 [c3,c4]@34 [d#3,d#4]@33, ~@70 c6@17 ~@52 c3@34 ~@67]/5", // C D#
  C: "~ [d#3,d#4]@17 ~@6", D: "~@18 c5 ~@2 b4 ~@2", E: "c5 ~@2 a4 ~@2 c5 ~@2 b4 ~@2 c5 ~@2 a4 ~@2 c5 ~@2 b4 ~@2",
  F: "c5 ~@2 g4 ~@2 c5 ~@2 b4 ~@2 c5 ~@2 g4 ~@2 c5 ~@2 d5 ~@2",
  G: "a4 ~@2 g4 ~@2 d5 ~@2 c5 ~@2 a4 ~@2 g4 ~@2 e5 ~@2 d5 ~@2",
  H: "e5 ~@2 c5 ~@2 e5 ~@2 d5 ~@2 e5 ~@2 c5 ~@2 f5 ~@2 e5 ~@2", I: "f5 ~@2 c5 ~@2 f5 ~@2 e5 ~@2 f5 ~@2 c5 ~@5 f#5 ~@2",
  J: "g5 ~@2 e5 ~@2 g5 ~@2 f#5 ~@2 g5 ~@2 e5 ~@2 a5 ~@2 g5 ~@2",
  K: "a5@2 ~@4 g5@2 ~@4 d5@2 ~@4 g5@2 ~@4 a5@2 ~@4 g5@2 ~@4 a5@2 ~ f#5@2 ~ d5@2 ~ a4@2 ~",
  L: "f#4@2 ~ d4@2 ~ a3@2 ~ f#3@2 ~@19 b4@2 ~ c#5@2 ~ d5@2 ~@4 c#5@2 ~@4",
  M: "d5 ~@2 b4 ~@2 d5 ~@2 c#5 ~@2 d5 ~@2 b4 ~@2 d5 ~@2 c#5 ~@2",
  N: "d5 ~@2 a4 ~@2 d5 ~@2 c#5 ~@2 d5 ~@2 a4 ~@2 d5 ~@2 e5 ~@2",
  O: "b4 ~@2 a4 ~@2 e5 ~@2 d5 ~@2 b4 ~@2 a4 ~@2 f#5 ~@2 e5 ~@2",
  P: "f#5 ~@2 d5 ~@2 f#5 ~@2 e5 ~@2 f#5 ~@2 d5 ~@2 g5 ~@2 f#5 ~@2",
  Q: "g5 ~@2 d5 ~@2 g5 ~@2 f#5 ~@2 g5 ~@2 d5 ~@2 a5 ~@2 g#5 ~@2",
  R: "a5 ~@2 f#5 ~@2 a5 ~@2 g#5 ~@2 a5 ~@2 f#5 ~@2 b5 ~@2 a5 ~@2",
  S: "b5@2 ~@4 a5@2 ~@4 b5@2 ~@4 a5@2 ~@4 b5@2 ~@4 a5@2 ~@4 b5@2 ~ g#5@2 ~ e5@2 ~ b4@2 ~",
  T: "g#4@2 ~ e4@2 ~ b3@2 ~ g#3@2 ~@37",
})).s("gm_trumpet").gain(0.35)

// other · orchestra hit · "Harry Gregson Williams" · A A# B
const orchestra_hit = note("<~@27 [~@19 [a4,a5,a6]@6 [a#4,a#5,a#6]@6 ~ [b4,b5,b6]@4 ~@12] ~@31>")
  .s("gm_orchestra_hit").gain(0.4)

// chords · french horn · "Horn"
const french_horn = note("<~@28 A@8 B@4 ~@19>".pickRestart({
  A: "[~@11 e4@4 f4@4 g4@4 f4@4 [a3,e4]@4 f4, ~@3 a5@29]/8", B: "[~@3 [f4,g4]@4 [f#4,a4]@8 ~]/4",
})).s("gm_french_horn").gain(0.4)

// other · tuba · "Euphonium"
const tuba = note("<~@30 A@8 B@8 C@8 D@5>".pickRestart({
  A: "[~@3 a2@29]/8", B: "[~@3 a2@4 a2@4 f2@4 c3@4 g2@4 a2@4 f2@4 e2]/8", C: "[~@3 d2@8 b2@4 g2@4 d3@4 a2@4 b2@4 g2]/8",
  D: "[~@3 f#2@4 e2@7 ~ e2@4 ~]/5",
})).s("gm_tuba").gain(0.3)

// other · trombone
const trombone = note("<~@39 A@7 B@8 C@5>".pickRestart({
  A: "[~@3 a3@4 f3@4 c4@4 g3@4 a3@4 f3@4 e3]/7", B: "[~@3 d3@8 b3@4 g3@4 d4@4 a3@4 b3@4 g3]/8",
  C: "[~@3 f#3@4 e3@7 ~ e3@4 ~]/5",
})).s("gm_trombone").gain(0.3)

// other · piano
const piano = note("<~@39 A@7 B@8 C@5>".pickRestart({
  A: "[~@3 a1@4 f1@4 c2@4 g1@4 a1@4 f1@4 e1]/7", B: "[~@42 b4 c#5 b1@16 g1@16 d2@16 a1@16 b1@16 g1@4, ~@3 d1@8 ~@21]/8",
  C: "[~@3 f#1@4 e1@7 ~ e1@4 ~]/5",
})).s("gm_piano").gain(0.3)

// chords · trumpet · "Flugelhorn"
const trumpet_3 = note("<~@48 A@8 B@2 ~>".pickRestart({
  A: "[~@3 [b4,d5]@4 [g4,b4]@4 [a4,d5]@4 [e4,a4]@4 [f#4,b4]@4 [g4,b4]@4 [f#4,a4]@4 [e4,a4]]/8", // Bm G D5 A5 B5 G F#m A5
  B: "[~@3 [e4,g#4]@4 ~]/2", // E
})).s("gm_trumpet").gain(0.4)

// chords · oboe
const oboe = note("<~@39 A B C D E F G H I J K L M N O P Q R S ~>".pickRestart({
  A: "~@36 [c4,e4]@2 ~ [c4,e4]@2 ~ [c4,e4]@2 ~@4", // C
  B: "~@6 [c4,e4]@2 ~ [c4,e4]@2 ~ [c4,e4]@2 ~@16 [c4,e4]@2 ~@4 [c4,f4]@2 ~ [c4,f4]@2 ~ [c4,f4]@2 ~@4", // C F5
  C: "~@6 [c4,f4]@2 ~ [c4,f4]@2 ~ [c4,f4]@2 ~@16 [c4,f4]@2 ~@4 [e4,g4]@2 ~ [e4,g4]@2 ~ [e4,g4]@2 ~@4", // F5 Em
  D: "~@6 [e4,g4]@2 ~ [e4,g4]@2 ~ [e4,g4]@2 ~@16 [e4,g4]@2 ~@4 [d4,g4]@2 ~ [d4,g4]@2 ~ [d4,g4]@2 ~@4", // Em G5
  E: "~@6 [d4,g4]@2 ~ [d4,g4]@2 ~ [d4,g4]@2 ~@16 [d4,g4]@2 ~@4 [e4,a4]@2 ~ [e4,a4]@2 ~ [e4,a4]@2 ~@4", // G5 A5
  F: "~@6 [e4,a4]@2 ~ [e4,a4]@2 ~ [e4,a4]@2 ~@16 [e4,a4]@2 ~@4 [f4,a4]@2 ~ [f4,a4]@2 ~ [f4,a4]@2 ~@4", // A5 F
  G: "~@6 [f4,a4]@2 ~ [f4,a4]@2 ~ [f4,a4]@2 ~@16 [f4,a4]@2 ~@4 [e4,g4]@2 ~ [e4,g4]@2 ~ [e4,g4]@2 ~@4", // F Em
  H: "~@6 [e4,g4]@2 ~ [e4,g4]@2 ~ [e4,g4]@2 ~@16 [e4,g4]@2 ~ [e4,g4]@2 ~ [g4,a4]@2 ~ [g4,a4]@2 ~ [g4,a4]@2 ~@4", // Em Gsus2
  I: "~@6 [g4,a4]@2 ~ [g4,a4]@2 ~ [g4,a4]@2 ~@16 [g4,a4]@2 ~@4 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [f#4,a4]@2 ~@4", // Gsus2 F#m
  J: "~@6 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [f#4,a4]@2 ~@22 [d4,f#4]@2 ~ [d4,f#4]@2 ~ [d4,f#4]@2 ~@4", // F#m D
  K: "~@6 [d4,f#4]@2 ~ [d4,f#4]@2 ~ [d4,f#4]@2 ~@16 [d4,f#4]@2 ~@4 [d4,g4]@2 ~ [d4,g4]@2 ~ [d4,g4]@2 ~@4", // D G5
  L: "~@6 [d4,g4]@2 ~ [d4,g4]@2 ~ [d4,g4]@2 ~@16 [d4,g4]@2 ~@4 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [f#4,a4]@2 ~@4", // G5 F#m
  M: "~@6 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [f#4,a4]@2 ~@16 [f#4,a4]@2 ~@4 [e4,a4]@2 ~ [e4,a4]@2 ~ [e4,a4]@2 ~@4", // F#m A5
  N: "~@6 [e4,a4]@2 ~ [e4,a4]@2 ~ [e4,a4]@2 ~@16 [e4,a4]@2 ~@4 [f#4,b4]@2 ~ [f#4,b4]@2 ~ [f#4,b4]@2 ~@4", // A5 B5
  O: "~@6 [f#4,b4]@2 ~ [f#4,b4]@2 ~ [f#4,b4]@2 ~@16 [f#4,b4]@2 ~@4 [g4,b4]@2 ~ [g4,b4]@2 ~ [g4,b4]@2 ~@4", // B5 G
  P: "~@6 [g4,b4]@2 ~ [g4,b4]@2 ~ [g4,b4]@2 ~@16 [g4,b4]@2 ~@4 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [f#4,a4]@2 ~@4", // G F#m
  Q: "~@6 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [f#4,a4]@2 ~@16 [f#4,a4]@2 ~ [f#4,a4]@2 ~ [a4,b4]@2 ~ [a4,b4]@2 ~ [a4,b4]@2 ~@4", // F#m Asus2
  R: "~@6 [a4,b4]@2 ~ [a4,b4]@2 ~ [a4,b4]@2 ~@16 [a4,b4]@2 ~@4 [g#4,b4]@2 ~ [g#4,b4]@2 ~ [g#4,b4]@2 ~@4", // Asus2 G#m
  S: "~@6 [g#4,b4]@2 ~ [g#4,b4]@2 ~ [g#4,b4]@2 ~@34", // G#m
})).s("gm_oboe").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B@7 C B@7 D E F G H I J K L M N ~@2 O P Q P Q P Q P R@2 P Q P Q P Q P R@2 P Q P Q P Q P R S ~
>`.pickRestart({
  A: "~ x ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2 ~@2 x", B: "x!2 ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2 ~@2 x",
  C: "x!2 ~ x!2 ~@2 x ~ x ~ x!2 ~@2 x!3 ~ x!2 ~@2 x",
  D: "x ~ x ~@3 x ~ x ~@6 x ~ x ~ x ~@3 x ~@8 x ~ x ~ x ~@3 x ~ x ~@5",
  E: "~ x ~ x ~ x ~@12 x ~ x ~ x ~@4 x ~ x ~@5 x ~ x ~ x ~@4 x ~@3",
  F: "~@4 x ~ x ~@2 x ~@3 x ~ x ~@5 x ~@2 x ~ x ~@12 x ~ x ~ x ~@3 x",
  G: "~ x ~@6 x ~ x ~ x ~@3 x ~@8 x ~ x ~ x ~@3 x ~@2 x ~@5 x ~ x ~ x ~",
  H: "~@11 x ~ x ~ x ~@4 x ~ x ~@5 x ~ x ~@2 x ~@3 x ~@7 x ~@2",
  I: "x ~ x ~@3 x ~ x ~@6 x ~ x ~ x ~@12 x ~ x ~ x ~@3 x ~ x ~@5",
  J: "~ x ~ x ~ x ~@3 x ~@8 x ~ x ~ x ~@4 x ~ x ~@5 x ~ x ~ x ~@8",
  K: "~@4 x ~ x ~@2 x ~@3 x ~ x ~@5 x ~@2 x ~ x ~@3 x ~@8 x ~ x ~ x ~@4", L: "~@8 x ~@20 x ~@12 x ~@5",
  M: "~@15 x ~@12 x ~@19", N: "~@2 x ~@12 x ~@32", O: "~@3 x", P: "~ x ~ x", Q: "~@2 x!2 ~@2 x ~", R: "~@2 x!2 ~ x!2 ~",
  S: "~@2 x!3 ~ x ~",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  ~ A B A B A B A B A B A B A B A B C D E F G H I J K L M ~@2 N O P O P O P O Q@2 O P O P O P O Q@2 O P O P O P O Q R ~
>`.pickRestart({
  A: "~@5 x ~@4 x ~@2 x ~@7 x ~@2", B: "~@2 x ~@2 x ~@7 x ~@4 x ~@2 x ~@2", C: "~@10 x ~@16 x ~@17 x ~@2",
  D: "~@9 x ~@4 x ~@16 x ~@16", E: "x ~@16 x ~@12 x ~@3 x ~@13", F: "~@3 x ~@17 x ~@16 x ~@9",
  G: "~@3 x ~@3 x ~@16 x ~@16 x ~@6", H: "~@10 x ~@12 x ~@3 x ~@17 x ~@2", I: "~@14 x ~@16 x ~@12 x ~@3",
  J: "x ~@16 x ~@16 x ~@13", K: "~@6 x ~@16 x", L: "~@11 x ~@4", M: "~@19 x ~@28", N: "~@3 x", O: "x!5 ~@5 x!3 ~@3",
  P: "x!5 ~ x ~@5 x ~@3", Q: "x!5 ~ x ~@3 x ~ x ~@3", R: "x!5 ~ x ~ x ~ x!2 ~@4",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@25 [~@6 x!2 ~@8] [~@5 x ~ x ~@31 x ~ x ~@6] [~@25 x ~ x ~@20] ~@31>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@25 [~@7 x!2 ~@15] [x ~@2 x ~@31 x ~ x ~@10] [~@21 x ~ x ~@24] ~@31>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~
  [~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~]!16
  ~@8
  [~@3 x ~@8 x ~@8 x ~@7 x ~@8 x ~@7 x ~]
  [~@7 x ~@16 x ~@8 x ~@7 x ~@6]
  [~@2 x ~@7 x ~@8 x ~@7 x ~@20]
  ~@31
>`).gain(0.4)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct(`<
  ~
  [~@3 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]
  [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!15
  x
  ~@41
>`).gain(0.25)

// drums · high tom
const high_tom = s("ht").struct("<~@25 [~@6 x ~@16 x] [~@11 x ~@4] [~@19 x ~@28] ~@31>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<A B C D ~ E C F ~ G A H I F J K L M N O P Q R S T ~ U V W ~@28 X ~>".pickRestart({
  A: "~@20 x!4", B: "x!3 ~@45", C: "~@3 x ~@4", D: "~@17 x ~@6", E: "~ x ~@22", F: "~@14 x!4 ~@6", G: "~ x ~@15 x!6 ~",
  H: "x!2 ~@22", I: "~@6 x!4 ~@14", J: "~@22 x!2", K: "x!2 ~@5 x ~ x ~@2 x ~@2 x ~ x ~@6", L: "~@4 x!6 ~@10 x!4",
  M: "x!3 ~@7 x ~@8 x ~@3 x ~@3 x ~@8 x ~@8 x ~@2", N: "~@5 x ~@3 x ~@4 x ~@7 x ~@16 x ~@8",
  O: "~@9 x ~@16 x ~@3 x ~@12 x ~@4", P: "~@12 x ~@3 x ~@12 x ~@16 x ~", Q: "~@7 x ~@7 x ~@17 x ~@14",
  R: "~@2 x ~@16 x ~@3 x ~@12 x ~@11", S: "~@5 x ~@3 x ~@12 x ~@16 x ~@8",
  T: "x ~@8 x ~@16 x ~@5 x ~ x ~ x ~@2 x ~ x ~ x ~@4", U: "~@5 x ~@10", V: "~@12 x!4", W: "x!2 ~@14",
  X: "~@21 x ~@2 x ~@2 x ~@2 x ~@2 x ~ x!2 ~@11",
})).gain(0.3)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<A ~@6 B ~ C D ~ E B F ~ G ~@7 H ~@3 I ~@28 J ~>".pickRestart({
  A: "~@17 x!3 ~@4", B: "~@13 x ~@10", C: "~@23 x", D: "x!20 ~@4", E: "~@5 x ~@18", F: "~@7 x", G: "~ x!3 ~@13 x!3 ~@4",
  H: "~@13 x!3 ~@8", I: "~@6 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~ x ~@12", J: "~@4 x!3 ~@9",
})).gain(0.05)

stack(
  trumpet, bass, bass_2, trumpet_2, orchestra_hit, french_horn, tuba, trombone, piano, trumpet_3, oboe, kick, snare,
  low_tom, mid_tom, open_hat, open_hat_soft, high_tom, crash, crash_soft
)