Strudelify

good omens - main theme

David Arnold

KeyA majorTempo169 bpm
0:00/0:00
// good omens - main theme — David Arnold
// 169 bpm, 3/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5630457; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(169/3)

// 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 · violin
const violin = note(`<
  ~@8 A@3 B A@3 B C D E F C G H@2 I J K L I M N@2 O P Q R O S T@2 U V C W I J X@2 ~@16 Y Z Y AA Y Z AB AC AD AE AD AF AD
  AG AH ~ AI AJ AK AL AI AM AN@2 U AO AP AQ U AR AS@2 AT AU AV AW AT AX AY ~ AZ BA BB BC BD BE BF@2 ~@2 BG BH BI
>`.pickRestart({
  A: "c5@5 ~@6 c5@5", B: "b4@5 ~@11", C: "~@5 e5@3 d#5@3 e5@2 d#5@3", D: "e5@3 ~@2 c#5@3 ~@3 a4@3 ~@2",
  E: "e4@5 a4@5 ~@3 c5@3", F: "e5", G: "e5@5 f5@8 c5@3", H: "[e5@5 d5@27]/2", I: "~@5 d5@3 c#5@3 d5@2 c#5@3",
  J: "d5@3 ~@2 b4@3 ~@3 g#4@3 ~@2", K: "e4@5 g#4@5 ~@3 b4@3", L: "d5", M: "d5@3 e5@2 f5@3 e5@3 d5@2 b4@3",
  N: "[d5@5 c5@27]/2", O: "~@5 a5@3 g#5@3 a5@2 g#5@3", P: "a5@3 ~@2 e5@3 ~@3 c#5@3 ~@2", Q: "a4@5 c#5@5 ~@3 e5@3",
  R: "a5", S: "a5@5 a#5@8 e5@3", T: "[g5@5 f5@27]/2", U: "~@5 f5@3 e5@3 f5@2 e5@3", V: "f5@3 ~@2 d5@3 ~@3 b4@3 ~@2",
  W: "e5@3 ~@2 c5@3 ~@3 a4@3 ~@2", X: "a4/2", Y: "e4@11 c#4@5", Z: "f#4@11 c#4@5", AA: "f#4@11 ~@5", AB: "e4@11 b3@5",
  AC: "d4@11 ~@5", AD: "f#4@11 d4@5", AE: "g#4@11 d4@5", AF: "g#4@11 ~@5", AG: "g#4@11 e4@5", AH: "a4",
  AI: "~@5 f#5@3 f5@3 f#5@2 f5@3", AJ: "f#5@3 ~@2 d#5@3 ~@3 a#4@3 ~@2", AK: "f#4@5 a#4@8 d#5@3", AL: "f#5",
  AM: "f#5@5 g#5@8 d#5@3", AN: "[f#5@5 f5@27]/2", AO: "f5@3 ~@2 d5@3 ~@3 a#4@3 ~@2", AP: "f4@3 ~@2 a#4@3 ~@3 d5@3 ~@2",
  AQ: "f5", AR: "f5@3 a#5@2 b5@3 a#5@3 g#5@2 f5@3", AS: "[f5@5 d#5@27]/2", AT: "~@5 g5@3 f#5@3 g5@2 f#5@3",
  AU: "g5@3 ~@2 d#5@3 ~@3 a#4@3 ~@2", AV: "a#4@3 ~@2 a#4@3 ~@3 d#5@3 ~@2", AW: "g5", AX: "g5@5 g#5@8 e5@3",
  AY: "e5@5 d#5@11", AZ: "~@5 g#4@3 g4@3 g#4@2 g4@3", BA: "g#4@3 ~@2 f4@3 ~@3 b3@3 ~@2",
  BB: "~@5 f#4@3 f4@3 f#4@2 f4@3", BC: "f#4@3 ~@2 d#4@3 ~@3 a#3@3 ~@2", BD: "~@5 f4@3 e4@3 f4@2 e4@3",
  BE: "f4@3 ~@2 d4@3 ~@3 a#3@3 ~@2", BF: "a#3/2", BG: "a#5@3 b5@2 a#5@3 b5@3 a#5@2 b5@3",
  BH: "a#5@3 b5@2 a#5@3 g#5@3 f#5@2 f5@3", BI: "d#5",
})).s("gm_violin").gain(0.4)

// other · pizzicato strings
const pizzicato_strings = note("<~@48 A B C D A E F G H F H F H F I ~@54>".pickRestart({
  A: "a4@3 e5@2 a5@3 e5@3 a5@2 e5@3", B: "g#4@3 c#5@2 g#5@3 c#5@3 g#5@2 c#5@3",
  C: "f#4@3 c#5@2 f#5@3 c#5@3 f#5@2 c#5@3", D: "e4@3 b4@2 e5@3 b4@3 e5@2 b4@3",
  E: "c#5@3 g#5@2 c#6@3 g#5@3 c#6@2 g#5@3", F: "e5@3 b5@2 e6@3 b5@3 e6@2 b5@3", G: "c#5@3 b5@2 e6@3 b5@3 e6@2 b5@3",
  H: "b4@3 f#5@2 b5@3 f#5@3 b5@2 f#5@3", I: "a5@5 ~@11",
})).s("gm_pizzicato_strings").gain(0.2)

// other · viola
const viola = note(`<
  ~@4 A B C B C D C D C D C D E F G H E I J@2 K L M N K O P@2 Q R S T Q U V@2 W X E Y K L Z@2 ~@16 AA AB AC AD AA AD AB
  AD AE AD AE AD AE AD AF AG AH AI AJ AK ~ AL AM@2 AN AO AP AQ AN AR AS@2 AT AU AV AW ~ AX AY AZ BA ~@7 BB@3 BC BD
>`.pickRestart({
  A: "~@8 c4@3 e4@5", B: "g#3@8 d4@3 b3@5", C: "a3@8 c4@3 e4@5", D: "f4@8 d4@3 b3@5", E: "~@5 e4@3 d#4@3 e4@2 d#4@3",
  F: "e4@3 ~@2 c#4@3 ~@3 a3@3 ~@2", G: "e3@5 a3@5 ~@3 c4@3", H: "e4", I: "e4@5 f4@8 c4@3", J: "[e4@5 d4@27]/2",
  K: "~@5 d4@3 c#4@3 d4@2 c#4@3", L: "d4@3 ~@2 b3@3 ~@3 g#3@3 ~@2", M: "e3@5 g#3@5 ~@3 b3@3", N: "d4",
  O: "d4@3 e4@2 f4@3 e4@3 d4@2 b3@3", P: "[d4@5 c4@27]/2", Q: "~@5 a4@3 g#4@3 a4@2 g#4@3",
  R: "a4@3 ~@2 e4@3 ~@3 c#4@3 ~@2", S: "a3@5 c#4@5 ~@3 e4@3", T: "a4", U: "a4@5 a#4@8 e4@3", V: "[g4@5 f4@27]/2",
  W: "~@5 f4@3 e4@3 f4@2 e4@3", X: "f4@3 ~@2 d4@3 ~@3 b3@3 ~@2", Y: "e4@3 ~@2 c4@3 ~@3 a3@3 ~@2", Z: "a3/2",
  AA: "a4@5 a4@5 ~ a4@5", AB: "g#4@5 g#4@5 ~ g#4@5", AC: "f#4@5 f#4@5 ~ f#4@5", AD: "e4@5 e4@5 ~ e4@5",
  AE: "b4@5 b4@5 ~ b4@5", AF: "a3@5 ~@11", AG: "c3 d3 d#3 f3 f#3 g#3 a#3 b3 ~ c#4 d#4 f4 g4 g#4 ~ a4", AH: "a#4@3 ~@13",
  AI: "a#3@3 ~@2 f#3@3 ~@3 d#3@3 ~@2", AJ: "a#3@5 d#4@8 g4@3", AK: "a#3", AL: "a#3@5 b3@8 d#4@3",
  AM: "[a#3@5 g#3@27]/2", AN: "~@5 g#3@3 g3@3 g#3@2 g3@3", AO: "g#3@3 ~@2 f3@3 ~@3 d3@3 ~@2",
  AP: "a#3@3 ~@2 d4@3 ~@3 f4@3 ~@2", AQ: "g#3", AR: "g#3@3 a#3@2 b3@3 a#3@3 g#3@2 f3@3", AS: "[g#3@5 f#3@27]/2",
  AT: "~@5 d#4@3 d4@3 d#4@2 d4@3", AU: "d#4@3 ~@2 a#3@3 ~@3 g3@3 ~@2", AV: "d#3@3 ~@2 g3@3 ~@3 a#3@3 ~@2", AW: "f4",
  AX: "d#4@5 e4@8 a#3@3", AY: "d#4@5 c#4@11", AZ: "b4@5 g#4@5 ~ d#4@5", BA: "b3@3 ~@13", BB: "a#4@5 a#4@5 ~ a#4@5",
  BC: "a#4@5 c5@5 ~ d5@5", BD: "d#5",
})).s("gm_viola").gain(0.4)

// other · viola · soft notes
const viola_soft = note("<[a3@8 c4@3 e4@5] [g#3@8 d4@3 b3@5] [a3@8 c4@3 e4@5] [g#3@8 d4@3 b3@5] [a3 ~] ~@112>")
  .s("gm_viola").gain(0.2)

// other · pizzicato strings
const pizzicato_strings_2 = note("<~@48 A B C D A E F G H F H F H G I ~@54>".pickRestart({
  A: "a3@3 e4@2 a4@3 e4@3 a4@2 e4@3", B: "g#3@3 c#4@2 g#4@3 c#4@3 g#4@2 c#4@3",
  C: "f#3@3 c#4@2 f#4@3 c#4@3 f#4@2 c#4@3", D: "e3@3 b3@2 e4@3 b3@3 e4@2 b3@3",
  E: "c#4@3 g#4@2 c#5@3 g#4@3 c#5@2 g#4@3", F: "e4@3 b4@2 e5@3 b4@3 e5@2 b4@3", G: "c#4@3 b4@2 e5@3 b4@3 e5@2 b4@3",
  H: "b3@3 f#4@2 b4@3 f#4@3 b4@2 f#4@3", I: "a4@5 ~@11",
})).s("gm_pizzicato_strings").gain(0.2)

// other · cello
const cello = note(`<
  ~@15 A B C D E D C@2 F C G C F C G D E D C D E D C H I H D@2 C@2 E D E ~@16 J K L M J M K M N M N M N M O ~ P Q P R P
  Q@2 S Q T Q S Q T P R P Q P R P Q U V U W P Q@2 ~ P ~ X Y@2 Z W
>`.pickRestart({
  A: "~@11 [a2,a#2] [b2,c3,c#3] [d3,d#3] [e3,f3] [f#3,g3]", B: "a3, g#3 ~@15", C: "e2", D: "a2",
  E: "e2@3 ~@2 f#2@3 ~@3 g#2@3 ~@2", F: "b2@3 ~@2 c3@3 ~@3 d3@3 ~@2", G: "b2", H: "d2",
  I: "a2@3 ~@2 b2@3 ~@3 c#3@3 ~@2", J: "a2@5 e3@5 ~ e3@5", K: "g#2@5 e3@5 ~ e3@5", L: "f#2@5 c#3@5 ~ c#3@5",
  M: "e2@5 b2@5 ~ b2@5", N: "b2@5 f#3@5 ~ f#3@5", O: "a2@5 ~@11", P: "d#2", Q: "a#2", R: "a#2@3 ~@2 c3@3 ~@3 d3@3 ~@2",
  S: "f2@3 ~@2 f#2@3 ~@3 g#2@3 ~@2", T: "f2", U: "g#2", V: "d#2@3 ~@2 f2@3 ~@3 g2@3 ~@2", W: "d#3",
  X: "a#2@5 ~@6 a#2@5", Y: "a#2@5 a#2@5 ~ a#2@5", Z: "a#2@5 c3@5 ~ d3@5",
})).s("gm_cello").gain(0.45)

// other · cello · soft notes
const cello_soft = note("<A B C B C B D E F@3 G F@3 G ~@93 H ~ H I ~@4>".pickRestart({
  A: "a3", B: "~@5 g4@5 ~ e4@5", C: "c4@5 a3@11", D: "c4@5 c4@5 ~ e4@5", E: "g#3@5 d4@5 ~ b3@5", F: "a3@5 ~@6 a3@5",
  G: "g#3@5 ~@11", H: "a#2@3 ~@2 c3@3 ~@3 d3@3 ~@2", I: "~@5 a#2@5 ~@6",
})).s("gm_cello").gain(0.25)

// other · pizzicato strings
const pizzicato_strings_3 = note("<~@48 A B C D A E F@2 G F G F G F H ~@54>".pickRestart({
  A: "a2@3 e3@2 a3@3 e3@3 a3@2 e3@3", B: "g#2@3 c#3@2 g#3@3 c#3@3 g#3@2 c#3@3",
  C: "f#2@3 c#3@2 f#3@3 c#3@3 f#3@2 c#3@3", D: "e2@3 b2@2 e3@3 b2@3 e3@2 b2@3",
  E: "c#3@3 g#3@2 c#4@3 g#3@3 c#4@2 g#3@3", F: "e3@3 b3@2 e4@3 b3@3 e4@2 b3@3", G: "b2@3 f#3@2 b3@3 f#3@3 b3@2 f#3@3",
  H: "a3@5 ~@11",
})).s("gm_pizzicato_strings").gain(0.2)

stack(violin, pizzicato_strings, viola, viola_soft, pizzicato_strings_2, cello, cello_soft, pizzicato_strings_3)