Strudelify
KeyD majorTempo120 bpm
0:00/0:00
// halo theme — Martin O'Donnelarr. Karalina Coates
// 120 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 (4/4 at bar 1, 2/4 at bar 31, 3/4 at bar 40, 4/4 at bar 43, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/6132549; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 68 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · acoustic guitar steel · "Lute"
const acoustic_guitar_steel = note(`<
  ~@10 A@2 B C@2 D A@2 B C@2 D E@6 F@8 G@3 H I@3 J K L M N O P Q J K L M N O P Q R S T S R U V S ~
>`.pickRestart({
  A: "[~@5 [e4,e5]@4 b4@3 e4@2 ~ b4@2 c#5@2 d5@7 ~ [b4,c#5]@2 c#5@2 d5@2 ~ c#5@5 b4@2 e4@5 b4@2, ~@9 c#5 ~@38]/2", // E Bsus2
  B: "e4@4 b4@3 c#5 d5@2 c#5@2 b4@2 ~ [e4,e5]@3 c#5 b4@3 e4@2", // E
  C: "[b4@2 ~ d5@2 e5@7 a4 g4@2 f#4@2 g4@2 d5@7 ~ [g4,a4]@2 f#4@2 g4@2 ~ e5@7 a4 ~ f#4@2 ~ g4@2, ~@21 g4 ~@2]/2", // Gsus2
  D: "d5@7 e5@7 ~@10",
  E: "[~@7 [b4,e5]@10 ~@2 [e5,g5]@10 ~@2 [d5,f#5]@10 ~@2 [b4,e5]@10 ~@2 [e5,g5]@10 ~@2 [b4,e5]@10 ~@2 [d5,f#5]@10 ~@2 [b4,e5]@10 ~@2 [b4,e5]@10 ~@2 [e5,g5]@10 ~@2 [d5,f#5]@10 ~@7, ~@5 e4@12 ~ b4@11 ~ a4@11 ~ g4@11 g4@12 e4@12 ~ a4@11 ~ g4@11 ~ g4@11 g4@12 f#4@12 ~@7, ~@6 g4@11 g4@12 f#4@12 e4@12 ~ b4@11 ~ g4@11 f#4@12 e4@12 e4@12 ~ b4@11 ~ a4@11 ~@7]/6", // E5 Em D E5 Em E5 D E5 …
  F: "[~@7 [b4,e5]@10 ~@2 [d5,f#5]@10 ~@2 [d5,f#5]@10 ~@2 [b4,e5]@10 ~@14 [b4,e5]@10 ~@2 [e5,g5]@10 ~@2 [d5,f#5]@10 ~@2 [b4,e5]@10 ~@2 [e5,g5]@10 ~@2 [b4,e5]@10 ~@2 [d5,f#5]@10 ~@2 [b4,e5]@10 ~@2 [b4,e5]@10 ~@2 [e5,g5]@10 ~@2 [d5,f#5]@5, ~@5 e4@12 ~ a4@11 ~ a4@11 ~ g4@11 ~@13 g4@11 g4@12 f#4@12 e4@12 ~ b4@11 ~ g4@11 f#4@12 e4@12 e4@12 ~ b4@11 ~ a4@6, ~@6 g4@11 f#4@12 f#4@12 e4@12 ~@12 e4@12 ~ b4@11 ~ a4@11 ~ g4@11 g4@12 e4@12 ~ a4@11 ~ g4@11 ~ g4@11 g4@12 f#4@7]/8", // E5 D E5 Em D E5 Em E5 …
  G: "[~@19 [b4,e5]@10 ~@2 [d5,f#5]@10 ~@2 [d5,f#5]@10 ~@2 [b4,e5]@10 ~@7, ~@17 e4@12 ~ a4@11 ~ a4@11 ~ g4@11 ~@7, ~@18 g4@11 f#4@12 f#4@12 e4@12 ~@7]/3", // E5 D E5
  H: "~@5 g3@2 e4@2 ~@2 [e4,b4]@2 ~@3 g3@2 d4@2 ~@2 [d4,a4]@2, ~@15 [e4,b4]@2 ~@7", // E5 D5 E5
  I: "[~@2 [d4,a4]@2 b3@2 g4@2 ~ [e4,b4]@2 ~@2 [e4,b4]@2 ~@2 f#5 g5 f#5@2 e5@2 d5@2 [e4,a4]@2 ~ e4@2 ~@2 [e4,b4]@2 ~@2 [e4,b4]@2 g3@2 d4@2 ~@2 [d4,a4]@2 ~ [d4,a4]@2 b3@2 g4@2 ~@2 [e4,b4]@2 ~@2 [e4,b4]@2 ~@2 [f#5,g5] e5@2 b4@2 d5@2 c#5@2, ~@27 g3@2 ~@43]/3", // D5 E5 A5 E5 D5 E5 Gmaj7
  J: "b4@3 ~ b4 c#5 d5@3 ~ b4 d5", K: "b4 c#5 b4@2 a4@2 [e4,e5]@4 a4@2 e4@2 b4@2 c#5@2 b4@2 a4@2 e4@2",
  L: "b4@6 ~@2 a4 b4 d5@2 e5@6 ~@2 e4 f#4 g4@2", M: "a4 d5 c#5 d5 c#5 b4 e5 d5 c#5 b4 d5 e5",
  N: "e5 f#5 d5@2 b4@2 a4@6 ~@2 a4@2 f#4@2 a4@2 g4@2 a4@2", O: "f#5 e5 d5@2 b4@2 a4@6 ~@2 a4@2 b4@2 c#5@2 d5@2 e5@2",
  P: "d5 e5@5 ~@2 d5@2 e5@2 f#5@6 ~@2 e5@2 f#5@2", Q: "f#5 g5 f#5@2 e5@2 e5 f#5 e5@2 d5@2 c#5@4 d5@4 e5@4",
  R: "~ [b4,e5]@5 ~ [e5,g5]@5, e4@12 ~ b4@11, ~ g4@11 g4@12", S: "~ [d5,f#5]@5 ~ [b4,e5]@5, f#4 e4, ~ a4@11 ~ g4@11",
  T: "~ [e5,g5]@5 ~ [b4,e5]@5, g4 e4, ~ b4@11 ~ g4@11", U: "~ [d5,f#5]@5 ~@6, f#4 ~, ~ a4@11 ~@12",
  V: "~ [b4,e5]@5 ~ [d5,f#5]@5, e4@12 ~ a4@11, ~ g4@11 f#4@12", // E5 D
})).s("gm_acoustic_guitar_steel").gain(0.3)

// bass · acoustic bass
const bass = note(`<
  A@3 B@3 C@3 D E@2 F@3 G H@2 F@3 G I@8 J@8 K@2 L M N O P Q R S T U V O P Q R S T U V W X Y Z W AA Y X AB
>`.pickRestart({
  A: "[~@15 e2@7 e2@3 f#2@4 e2@7 e2@4 g2@3 e2@7 ~ e2@3 a2@4 e2@7 e2@2 d2@2 ~ c#2@2]/3",
  B: "[e2@7 e2@4 f#2@4 e2@7 e2@3 g2@4 e2@7 e2@4 a2@3 e2@7 ~ e2@2 d2@2 c#2@2 ~ e2@7 e2@4 f#2@3]/3",
  C: "[e2@7 e2@4 g2@4 e2@7 e2@3 a2@4 e2@7 e2@2 ~ d2@2 c#2@2 e2@7 ~ e2@3 f#2@4 e2@7 e2@4 g2@3]/3",
  D: "e2@7 e2@4 a2@4 e2@7 e2@2", E: "[d2@2 ~ c#2@2 b1@7 b1@7 g1@7 ~ g1@7 a1@7 a1@7]/2",
  F: "[a1@7 b1@7 ~ b1@7 b1@7 g1@7 g1@7 a1@7 ~ a1@7 b1@7 b1@7]/3", G: "d2@7 e2@7 ~@10",
  H: "[~@5 b1@7 b1@7 g1@7 ~ g1@7 a1@7 a1@7]/2",
  I: "[~@5 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 c#2@3 [e2,a2]@3 c#2@3 [e2,a2]@3 e2@3 [g2,b2]@3 f#2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 e2@3 [g2,b2]@3 e2]/8", // G F#m G F#m A5 G F#m G …
  J: "[~@2 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 c#2@3 [e2,a2]@3 c#2@3 [e2,a2]@3 e2@3 [g2,b2]@3 f#2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2@3 [f#2,a2]@3 d2]/8", // G F#m G F#m A5 G F#m G …
  K: "[~@2 [f#2,a2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 e2@3 [g2,b2]@3 [e1,e2]@4 e2@4 ~@3 [e1,e2]@4 e2@4]/2", // F#m G E
  L: "~@4 [e1,e2]@4 e2@4 ~@3 b1@8 ~", M: "~@3 [e1,e2]@3 e2@4 ~@4 [e1,e2]@4 e2@4 ~@2",
  N: "~ [e1,e2]@4 e2@4 ~@4 b1@8 ~@3", O: "e2!3 [e1,e2]@9", P: "e2!3 [f#1,f#2]@9", Q: "e2!3 [g1,g2]@9",
  R: "e2!3 [a1,a2]@9", S: "e2!3 [b1,b2]@9", T: "e2!3 [c#2,c#3]@9", U: "[e1,e2] ~ [f#1,f#2] ~",
  V: "[g1,g2]@3 [f#1,f#2]@3 [d2,a2]@2 [e2,b2]@2 [f#2,c#3]@2", W: "e2 [g2,b2] e2 [g2,b2] e2 [g2,b2] e2 [g2,b2]",
  X: "d2 [f#2,a2] d2 [f#2,a2] e2 [g2,b2] e2 [g2,b2]", Y: "e2 [g2,b2] e2 [g2,b2] d2 [f#2,a2] d2 [f#2,a2]",
  Z: "c#2 [e2,a2] c#2 [e2,a2] e2 [g2,b2] f#2 [g2,b2]", AA: "d2 [f#2,a2] d2 [f#2,a2] d2 [f#2,a2] d2 [f#2,a2]",
  AB: "e2 [g2,b2] e2 [g2,b2] ~@4", // G
})).s("gm_acoustic_bass").gain(0.4)

// drums · clap
const clap = s("cp").struct("<~@10 A B C A B C A B C A B C D@17 E F G H ~@16 I@8 J>".pickRestart({
  A: "~@5 x ~@6 x ~@6 x ~@4", B: "~@3 x ~@6 x ~@6 x ~@6", C: "x ~@6 x ~@7 x ~@6 x ~", D: "~@5 x ~@5 x ~@5 x ~@5 x",
  E: "~@5 x ~@10 x ~@7", F: "~ x ~@4", G: "~@3 x ~@10 x ~@9", H: "~ x ~@22", I: "x!4", J: "x!2 ~@2",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A B C D B E D F G H I J K L J K L J K L J K M N O N O@6 P O P O@4 Q R S T U@6 ~ V U@6 ~ V W X W X W@4 Y
>`.pickRestart({
  A: "~@11 x", B: "~ x ~@10 x ~@3 x ~@7", C: "~@3 x ~@2 x ~@12 x ~@2 x ~", D: "~@7 x ~@3 x ~@10 x ~",
  E: "~@5 x ~ x ~@9 x ~@3 x ~@2", F: "~ x ~@13 x ~ x ~@6", G: "~@3 x ~@2 x ~@10 x ~@3 x ~@2", H: "~@7 x ~@3 x ~@12",
  I: "x ~@2 x ~ x ~@13 x ~@4", J: "~@5 x ~@6", K: "x ~@4 x ~@2", L: "~@5 x ~@13 x ~@4", M: "~@4 x ~@2 x ~@2 x ~",
  N: "~@2 x ~@5 x ~@5 x ~@2 x ~@2 x ~@2 x", O: "~ x ~@2 x ~@2 x ~@2 x ~", P: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@5 x ~@3",
  Q: "~@2 x ~@2 x ~@5 x ~@3 x!2 ~@5 x ~", R: "~@2 x ~ x ~@4 x ~@3 x ~@10", S: "~@3 x ~@4 x ~@3 x ~ x ~@5 x ~@2 x",
  T: "~ x ~@5 x ~@3 x ~@12", U: "~ x ~@2", V: "x!7 ~ x ~ x ~", W: "~ x ~ x ~ x ~ x", X: "~ x ~ x!5", Y: "~ x ~ x ~@4",
})).gain(0.3)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@5 A B C D B E F B G D B E F B G D B H@17 I J K L M@6 ~ N M@6 ~ N O@8 P
>`.pickRestart({
  A: "~@10 x ~@6 x ~@6", B: "x ~@6 x ~@7 x ~@6 x ~", C: "~@5 x ~@6 x ~@6 x ~@4", D: "~@3 x ~@6 x ~@6 x ~@6",
  E: "~@5 x ~@6 x ~@4 x ~ x ~@4", F: "~@3 x ~@3 x ~@2 x ~@6 x ~@6", G: "~@3 x ~ x ~@6 x ~@4 x ~ x ~@4",
  H: "~@5 x ~@5 x ~@5 x ~@5 x", I: "~@5 x ~@5 x ~@3 x!2 ~@5 x ~", J: "~@2 x ~ x ~@4 x ~@3 x ~@10",
  K: "~@3 x ~@4 x ~@3 x ~ x ~@5 x ~@2 x", L: "~ x ~@5 x ~@3 x ~@12", M: "x!3 ~@9", N: "x!6 ~@6", O: "x!4", P: "x!2 ~@2",
})).gain(1.51)

stack(acoustic_guitar_steel, bass, clap, mid_tom, cabasa)