Strudelify

The X-Files

Mark Snow

KeyA minorTempo120 bpm
0:00/0:00
// The X-Files — Mark Snow
// 120 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.

// bass · electric bass finger
const bass = note(`<
  ~@2 A@4 B A@14 C D E@3 D E F E D E@3 D E@3 D E@3 G E@3 D E@3 G E@3 F E@3 G E@2 F E ~@12 H@2 I@2 J@2 H@6 K@4 J@2 ~@10
>`.pickRestart({
  A: "a1", B: "a0", C: "a1@10 e1 g1", D: "a1@19 ~ e1@2 g1@2", E: "a1@23 ~", F: "a1@21 ~ g1@2", G: "a1@11 g1",
  H: "[a1@23 ~]/2", I: "[a1@45 ~ g1@2]/2", J: "[a1@47 ~]/2", K: "[a1@95 ~]/4",
})).s("gm_electric_bass_finger").gain(0.42)

// chords · synth strings 1
const synth_strings_1 = note("<~@2 A@8 ~@65 B@8 ~@9 C@4 D@7>".pickRestart({
  A: "[e3,a3,b3,c4,e4]/8", B: "[a1,a2]/8", C: "b3/4", D: "c4/7",
})).s("gm_synth_strings_1").gain(0.09).pan(0.6)

// other · pad halo
const pad_halo = note("<~@10 A@8 ~@85>".pickRestart({
  A: "a6/8",
})).s("gm_pad_halo").gain(0.13)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@9 A@8 ~@6 B@2 C@2 D@2 E@2 F@2 C@2 D@2 E@2 G@4 H@4 G@4 H@4 I@2 J@2 K@8 L@8 M@2 N@2 M@2 N@2 O@8 ~ P@4 Q@7
>`.pickRestart({
  A: "[~ [e3,a3,b3,c4,e4]@15]/8", B: "[~@11 [a3,c4,e4]@5, [a4,c5,e5]@37 ~@11]/2", C: "[[e3,a#3,e4,a#4,d#5]@23 ~]/2",
  D: "[[d3,g#3,c4,d4,g#4,c5]@23 ~]/2", E: "[[c3,f#3,b3,c4,f#4,b4]@23 ~]/2", F: "[[a3,c4,e4,a4,c5,e5]@23 ~]/2",
  G: "[[c3,e3,a3,c4,e4]@95 ~]/4", H: "[[c3,f3,a3,c4,f4]@95 ~]/4", I: "[[d#3,f#3,b3,d#4,f#4,b4]@47 ~]/2",
  J: "[[d3,f3,a3,b3,d4,f4,b4]@47 ~]/2", K: "[~@7 e7@4 a6@5, [a2,e3,a3,c4,e4,a4] ~]/8", L: "[~ e7@6 a6@9]/8",
  M: "[[a5,c6,e6,a6]@23 ~]/2", N: "[[a5,b5,e6,a6]@23 ~]/2", O: "[~@7 e5, [a5,e6,a6]]/8",
  P: "[[d#3,f#3,a3,b3]@4 ~@3 [e5,b5,e6,b6], [a5,e6,a6]@7 ~, ~ [d3,f3,a3,b3]]/4", // B7 E5 A5 Bm7b5
  Q: "[[a2,e3,a3,c4], [a4,e5,c7]@83 ~]/7", // Am
})).s("gm_string_ensemble_2").gain(0.1)

// other · pad poly
const pad_poly = note(`<
  ~@2
  [a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~]!21
  ~@42
  [a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~]!27
  ~@4
  [a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~ a2 ~ e3 ~]!6
  [a2 ~ e3 ~ a2 ~@19]
>`).s("gm_pad_poly").gain(0.2).pan(0.4)

// other · whistle
const whistle = note(`<
  ~@3 A B C A D E F G H F I E A J E K L M N C ~@15 O P Q R@2 P S T U V W X@2 Q Y Z AA AB@2 AC@2 AD@2 AE@2 B C A D E F G
  H F I E A B C ~ A D E F G H F I E AF AG AF AH ~@12
>`.pickRestart({
  A: "~@18 a5@5 ~", B: "e6@5 ~ d6@5 ~ e6@6 g6@5 ~", C: "e6 ~@2", D: "e6@5 ~ d6@5 ~ e6@6 a6@6", E: "e6@5 ~@7",
  F: "~@18 c7@5 ~", G: "b6@5 ~ a6@6 g6@6 a6@5 ~", H: "e6 ~", I: "b6@5 ~ a6@5 ~ g6@5 ~ b6@6",
  J: "e6@5 ~ d6@5 ~ e6@6 g6@6", K: "~@3 a5", L: "e6@6 d6@5 ~ e6@6 a6@5 ~", M: "e6@11 ~@13", N: "~@18 a6@5 ~",
  O: "~@3 a6", P: "e7@19 ~ d7 ~ b6 ~", Q: "c7@19 ~ b6 ~ g6 ~", R: "[a6@9 ~ b6 ~ e6@28 ~@2 a6@5 ~]/2",
  S: "c7@18 ~@2 b6 ~ g6 ~", T: "a6 e6", U: "d6@3 ~", V: "c7@18 ~ b6 ~ g6 ~@2", W: "a6@17 ~@2 c7 ~ g6 ~@2",
  X: "[a6@11 ~ e6@30 ~@6]/2", Y: "a6@19 ~@2 c7@2 g6", Z: "~ a6@11 e6@11 ~", AA: "d6@23 ~",
  AB: "[d#6@11 ~ f#6@23 ~ a6@11 ~]/2", AC: "[d6@11 ~ f6@23 ~ b6@10 ~@2]/2", AD: "[a6@33 ~@3 b6@10 ~@2]/2",
  AE: "[a6@33 ~@9 a5@5 ~]/2", AF: "~@9 a5@2 ~", AG: "e6 ~@3", AH: "e6@7 ~@17",
})).s("gm_whistle").gain(0.21)

// other · pad choir
const pad_choir = note("<~@19 A@4 ~@69 B@4 C@7>".pickRestart({
  A: "e4/4", B: "[a3@7 b3]/4", C: "c4/7",
})).s("gm_pad_choir").gain(0.13).pan(0.4)

// other · bassoon
const bassoon = note("<~@39 A@16 B@5 A C@2 ~@40>".pickRestart({
  A: "~ b3@12 a3@11", B: "[~ b3@48 b3@48 b3@12 a3@11]/5", C: "[~ b3@12 a3@35]/2",
})).s("gm_bassoon").gain(0.15).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@2 A ~@13 A ~@6 A ~@38 B A@2 C A@2 C A@2 C A@3 D E D@21 A ~@4>".pickRestart({
  A: "x", B: "~@11 x", C: "x ~@10 x", D: "x!2", E: "x ~@5 x ~@4 x",
})).gain(0.5)

// drums · rim
const rim = s("rim").struct("<~@4 A@18 B C A@46 B A@11 B A@15 ~@5>".pickRestart({
  A: "x!8 ~ x ~@2", B: "x!12", C: "x!10 ~@2",
})).gain(0.15)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@4 A@18 ~ B A@46 ~ A@11 ~ A@15 ~@5>".pickRestart({
  A: "~@8 x ~ x!2", B: "~@10 x!2",
})).gain(0.05)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 A ~@13 A ~@6 A ~@39 A ~ A ~ A ~ A ~@2 A ~@2 A ~ A B A B A C A D A ~ E ~@2 A ~@7 A ~@4
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@11 x", D: "~@10 x!2", E: "x ~@10 x",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<[x!2] [x!4] ~@101>").gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@82 [~@5 x] ~ [~@3 x] ~@18>").gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@63 x ~@39>").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@62 A B@2 C B@2 C B@2 C B@3 D E D@21 B ~@4>".pickRestart({
  A: "~@11 x", B: "x", C: "x ~@10 x", D: "x!2", E: "x ~@5 x ~@4 x",
})).gain(0.45)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@2 A ~@13 A ~@46 A ~@11 A ~@27>".pickRestart({
  A: "x",
})).gain(1.29)

// drums · bell tree
const bell_tree = s("marktrees:0").struct("<~@97 x ~@5>").gain(1.77)

stack(
  bass, synth_strings_1, pad_halo, string_ensemble_2, pad_poly, whistle, pad_choir, bassoon, kick, rim, rim_soft,
  low_tom, hihat, mid_tom, ride, tambourine, jingle_bells, bell_tree
)