Strudelify

Apollo 13

james horner

KeyD majorTempo100 bpm
0:00/0:00
// Apollo 13 — HORNER JAMES
// 100 bpm, 3/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, 3/4 at bar 20, 4/4 at bar 68) are rendered on a constant 3/4 grid of one bar per cycle
// note: ch 4 "Bass2" named as a bass, played on electric bass finger (its lead 6 voice patch is not one); ch 5 "Bass3" named as a bass, played on electric bass finger (its synth strings 2 patch is not one)
// note: Full arrangement: all 86 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · timpani
const timpani = note("<A B C@2 ~@21 D ~@5 E F G H I J ~@16 K L M ~ K L M ~@26>".pickRestart({
  A: "~@17 [f-1,f1]@3 [f-1,f1]@3 [f-1,f1]", B: "[f-1,f1]!2 ~ [f-1,f1] [f-1,f1]@5 ~@15",
  C: "[~@12 [f-1,f1]@2 [f-1,f1]@3 [f-1,f1]!2 ~ [f-1,f1]!2 [f-1,f1]@5 ~@21]/2", D: "~@4 a1@4 a1@9 ~@7",
  E: "~@15 g2!4 ~ g2!4", F: "[a1,g2]@3 ~@5", G: "~@20 g2 ~ g2!2", H: "g2!5 [a1,g2]@9 ~@10", I: "~@8 e2@9 ~@7",
  J: "~@11 a1@9 ~@4", K: "e2 ~@2", L: "d2 ~@2", M: "a1 ~@2",
})).s("gm_timpani").gain(0.64).pan(0.4)

// bass · slap bass 2 · "Bass"
const bass = note("<A B C@2 ~@82>".pickRestart({
  A: "~@17 a-1@3 a-1@3 a-1", B: "a-1!2 ~ a-1 a-1@11 ~@9", C: "[~@12 a-1@2 a-1@3 a-1!2 ~ a-1!2 a-1@11 ~@15]/2",
})).s("gm_slap_bass_2").gain(0.64).pan(0.6)

// bass · electric bass finger · "Bass2"
const bass_2 = note("<~ A@4 ~@81>".pickRestart({
  A: "[~@2 d0@16 ~@5 d0@16 ~@9]/4",
})).s("gm_electric_bass_finger").gain(0.14).pan(0.8)

// bass · electric bass finger · "Bass3"
const bass_3 = note("<A@4 ~@82>".pickRestart({
  A: "[~@17 a-1@32 ~@11 a-1@32 ~@4, ~@17 e0@11 ~@32 e0@11 ~@25]/4",
})).s("gm_electric_bass_finger").gain(0.64).pan(0.4)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~@18 A@4 B C D@8 E F G@8 H I J K H L M N O P H Q J K H Q J R O P S@2 T@2 ~@20
>`.pickRestart({
  A: "[~@16 d4@9 f#4@9 a4@9 [g2,g3,d4,g4,b4]@26 [d2,d3,d4,f#4,a4]@27, ~@16 [d2,d3]@27 ~@53]/4", // G D
  B: "d5@3 c#5@3 d5@2, [b1,b2,f#4,b4]", C: "~@3 [a4,c#5,e5]@17 c#5@4, ~ [a1,a2]@7",
  D: "[~@5 [d2,d3,d4,f#4,a4]@27 d4@9 f#4@9 a4@9 [g2,e3,g3,g4,b4]@26 [f#2,f#3,f#4,a4,c#5]@27 d5@9 c#5@9 d5@9 [a4,c#5,e5]@17 f#5@9 [a4,d5,f#5]@18 d5@9, ~@32 [d2,d3]@27 ~@53 [b1,b2,f#4,b4]@27 [a1,a2]@26 [d2,d3]@27]/8", // D Em F#m A D B5 A D
  E: "[a4,c#5,e5]@3 f#5, [a1,a2]", F: "~@3 [a4,d5,f#5]@17 d5@4, ~ [d2,d3]@7",
  G: "[~@5 [a4,c#5,e5]@18 f#5@9 [b4,e5,g5]@18 f#5@9 [a4,c#5,e5]@17 a4@9 [d4,g4,b4]@18 c#5@4 ~ b4@4 a4@18 a4@9 b4@17 c#5@4 ~ d5@4 c#5@4 ~ b4@4 a4@18, ~@5 [a1,a2]@27 [e2,e3]@27 [a1,a2]@26 [g2,g3]@53 ~ [d2,d3]@53]/8", // A Em A G A E A G …
  H: "e4 g4 b4", I: "[e1,e2,e3,b3,e4,g4,e5]", J: "[d1,d2,d3,a3,d4,f#4,a4,d5]", K: "[a1,a2,a3,c#4,e4,a4,c#5]",
  L: "[e1,e2,e3,b3,e4,g4,b4,e5,g5]", M: "[d1,d2,d3,a3,d4,f#4,a4,d5,f#5]", N: "[a3,a4]@2 [a3,a4], [a1,a2,c#4,e4,c#5,e5]",
  O: "[g1,g2,d3,a3,d4,a4]", P: "[g1,g2,d3,g3,d4,g4,b4,d5]", Q: "[e1,e2,e3,b3,e4,g4,b4,e5]",
  R: "[a3,a4]@2 [a3,a4], [a1,a2,c#4,e4,c#5]", S: "[g2,g3]/2", T: "[d2,d3]/2",
})).s("gm_string_ensemble_2").gain(0.64)

// chords · tubular bells · "Chimes"
const tubular_bells = note("<~@25 A@2 ~@26 B C D ~ B C D ~@26>".pickRestart({
  A: "[~@2 a4@3 ~@3, ~@4 [d4,d5]@9 ~@11, ~@3 f#5@6 ~@7, ~@5 a5@9 ~@10]/2", B: "[e4,e5]@2 ~", C: "[d4,d5]@2 ~",
  D: "[a3,a4,c#5]@2 ~", // A
})).s("gm_tubular_bells").gain(0.64).pan(0.4)

// drums · snare
const snare = s("sd").struct(`<
  [~@15 x!3 ~@2 x ~@2 x]
  [x!2 ~ x!2 ~@19]
  [~@10 x!3 ~ x ~@2 x!2 ~ x!3 ~]
  ~@21
  [~@23 x]
  [~ x ~@2 x ~ x ~ x ~@15]
  ~@60
>`).gain(0.32).pan(0.4)

// drums · splash
const splash = s("cr").struct("<~@25 [~ x ~] ~@6 x ~ [~@5 x ~@18] ~@51>").gain(0.32).pan(0.4)

// drums · ride
const ride = s("rd").struct("<~@25 [~ x ~] ~@6 x ~ [~@5 x ~@18] ~@51>").gain(0.32).pan(0.4)

stack(timpani, bass, bass_2, bass_3, string_ensemble_2, tubular_bells, snare, splash, ride)

More by james horner