Strudelify

Athair Ar Neamh

Enya

KeyB♭ majorTempo78 bpm
0:00/0:00
// Athair Ar Neamh — Enya
// 78 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 3/4 at bar 31, 4/4 at bar 32) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 71 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(78/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.

// chords · piano · "Piano Right"
const piano = note(`<
  ~@5 A B C D E F A G A B C D E F A G H I J K L M J N@2 O P Q R S T U V W X Y Z AA AB Y AC AD AE AF AG AH AI AF AJ@2 O P
  Q R S T U AK AL AM@4 ~@3
>`.pickRestart({
  A: "~@2 [d4,g4] bb4 a4 [d4,f4]@3", B: "d4@2 c4 ~ [bb3,d4]@11 ~", C: "~@2 [d4,g4] bb4 a4 f4@3",
  D: "a4 bb4 g4@6, ~@2 eb4@5 ~", E: "~ d4 [d4,g4] bb4 a4 f4@3", F: "d4@2 c4 ~ [bb3,d4]@10 ~@2",
  G: "a4@2 bb4 ~ [d4,g4]@11 ~", H: "~ [eb4,g4]@2 f4", I: "[eb4,bb4]@3 ~ [d4,f4]@7 ~ [bb3,d4]@3 ~",
  J: "[d4,f4]@3 ~ [a3,c4,f4]@6 ~@2 [f3,a3,c4]@3 ~", K: "[a3,c4,f4] ~ [bb3,d4]@3 ~ [f3,bb3,d4]@2",
  L: "~@4 [eb4,g4]@7 ~ f4@3 ~", M: "[eb4,bb4]@3 ~ [d4,f4]@6 ~@2 [bb3,d4]@3 ~", N: "[[a3,c4,f4] ~ [a3,d4,gb4]@12 ~@2]/2",
  O: "[d4,g4]@2 bb4@2 a4@2 [d4,f4]@6 d4@2 c4 ~", P: "[bb3,d4]@11 ~@5", Q: "[d4,g4] bb4 a4 f4@3 a4 bb4",
  R: "g4@6 ~ d4, eb4@5 ~@3", S: "[d4,g4]@2 bb4@2 a4@2 f4@6 d4@2 c4 ~", T: "[bb3,d4]@5 ~@3",
  U: "[d4,g4]@2 bb4@2 a4@2 [d4,f4]@6 a4@2 bb4 ~", V: "[d4,g4]@11 ~@5", W: "[bb3,d4] g4 bb4 [f4,a4]@3 f4 d4",
  X: "[d4,f4]@7 ~@9", Y: "~ g4 bb4 [f4,a4]@3 f4 a4, bb3 ~@7, ~ d4@2 ~@13", Z: "[eb4,g4]@7 ~@7 d4@2",
  AA: "[d4,g4] bb4 a4 f4@3 d4 c4", AB: "[bb3,d4]@3 ~@5", AC: "[d4,g4]@7 ~@9", AD: "[eb4,g4]@8 f4@4 [eb4,bb4]@3 ~",
  AE: "[d4,f4]@7 ~ [bb3,d4]@3 ~ [d4,f4]@3 ~", AF: "[a3,c4,f4]@6 ~@2 [f3,a3,c4]@3 ~ [a3,c4,f4]@2 ~@2",
  AG: "[bb3,d4]@6 ~@2 [f3,bb3,d4]@5 ~@3", AH: "[eb4,g4]@7 ~ f4@3 ~ [eb4,bb4]@3 ~",
  AI: "[d4,f4]@6 ~@2 [bb3,d4]@3 ~ [d4,f4]@3 ~", AJ: "[[a3,d4,gb4]@7 ~]/2", AK: "[d4,g4]@15 ~",
  AL: "[d4,g4,bb4]@5 ~@7 [c4,c5]@2 ~@2", AM: "[~ [c4,f4]@7 c4@4 ~ f4@2 c4@3 [d4,gb4]@22 [d4,g4]@19 ~@5]/4",
})).s("gm_piano").gain(0.17).pan(0.7)

// chords · piano · "Piano Left"
const piano_2 = note(`<
  ~@5 A@6 B@8 C@8 D@3 E F G H G I J K E F G H G I J K L M N M L M N O@2 E F G H G I J K P Q@6 ~
>`.pickRestart({
  A: "[~@6 d3@2 g3@2 ~@6 f3@4 ~@12 a2@3 ~@3 d3@2 g3@2 ~@6 f3@4 ~@12 f2@2 ~@4 d3@2 g3@2 ~@6 f3@4 ~@4 bb3@8, ~@4 g2@5 ~ d2@9 ~@5 bb3@11 ~@11 d3@6 ~@4 eb3@10 ~@12 d3@6 ~@2 f3@10, ~@12 a2@7 ~ bb2@15 ~ g2@5 ~ d2@10 eb2@14 ~@8 d2@10 ~@12, ~@14 d3@5 ~@3 f3@13 ~@9 a2@8 ~@2 bb2@12 ~@2 g2@5 ~@3 a2@8 bb2@12]/6",
  B: "[a2@2 ~@4 d3@2 ~@6 f3@6 ~@4 g3@12 ~@2 d3@2 g3@2 ~@6 f3@4 ~@12 a2@3 ~@3 d3@2 g3@2 ~@6 f3@4 ~@12 f2@2 ~@4 d3@2 g3@2 ~@6 f3@4 ~@4 bb3@8, ~@4 g2@4 g3@12 ~@26 d3@5 ~@3 f3@13 ~@9 a2@8 ~@2 bb2@12 ~@2 g2@5 ~@3 a2@8 bb2@12, ~@10 f2@10 g2@16 g2@5 ~ d2@9 ~@5 bb3@11 ~@11 d3@6 ~@4 eb3@10 ~@12 d3@6 ~@2 f3@10, ~@12 c3@8 ~@2 d3@14 ~@8 a2@7 ~ bb2@15 ~ g2@5 ~ d2@10 eb2@14 ~@8 d2@10 ~@12]/8",
  C: "[a2 ~@2 d3 ~@3 f3@3 ~@2 g3@6 ~@6 eb3 bb2 ~@6 bb3 f3 ~@6 f3 c3 ~@6 bb3 f3 ~@6 eb3 bb2 ~@5 f3, ~@4 g2@4 g3@12 ~@20 eb3@4 eb3@4 ~@6 f3@4 f3@4 f3@4 ~@4 c3@4 c3@4 c3@4 ~@2 bb2@15 ~ eb2@15 ~@5 bb3@4 bb3@4, ~@10 f2@10 g2@16 eb2@15 ~@5 bb3@4 bb3@4 ~@8 f3@4 f3@4 ~@6 f3@4 f3@4 f3@4 ~@4 bb2@4 bb2@4 bb2@4 ~@2 bb2@12, ~@12 c3@8 ~@2 d3@14 ~@2 bb2@4 bb2@4 bb2@4 ~@2 bb2@15 ~ f2@15 ~@5 bb3@4 bb3@4 ~@8 eb3@4 eb3@4 ~@6 f3@4 f3@4 ~@2]/8",
  D: "[bb3 f3 ~@6 f3 c3 ~@2 d3@10 ~@2, ~@4 f2@15 ~ d2@24 ~@4, ~@3 c3@2 c3@2 c3@2 ~@2 a2@11 ~@2, ~@2 f3!2 ~@8]/3",
  E: "~ d3 g3 ~@3 f3@2, g2@5 ~ d2@9 ~, ~@8 a2@7 ~, ~@10 d3@5 ~", F: "~@12 a2@3 ~, bb2@15 ~, ~@2 f3@13 ~, ~@4 bb3@11 ~",
  G: "~ d3 g3 ~@3 f3@2, g2@5 ~ d2@10, ~ a2, ~@5 d3@3", H: "~@6 f2 ~, eb2@7 ~, ~ bb2@6 ~, ~@2 eb3@5 ~",
  I: "~@6 a2 ~, bb2@7 ~, ~ f3@6 ~, ~@2 bb3@5 ~", J: "~ d3 ~@3 f3@3, g2 g3@3, ~@3 f2@5, ~ c3", K: "~ g3@3, g2, ~ d3@7",
  L: "~@6 eb3 bb2, eb2@15 ~, ~ bb2@2 bb2@2 bb2@2 ~, ~ eb3!2 ~",
  M: "~@6 bb3 f3, bb2@15 ~, ~ f3@2 f3@2 f3@2 ~, ~ bb3!2 ~", N: "~@6 f3 c3, f2@15 ~, ~ c3@2 c3@2 c3@2 ~, ~ f3!2 ~",
  O: "[~ d3@6 ~, d2@3 ~, ~ a2@11 ~@4]/2", P: "~ g3, g2, ~ d3@2 d3@5, ~ g3 ~@2",
  Q: "[~@5 f3@2 ~ f3@9 ~@9 d4@14 ~@17 d3@2 g2@26 ~@11, ~ f2@17 ~@2 a3@4 a3@16 ~@3 d3@4 d3@5 d3@5 ~@39, ~@3 c3@4 c3@11 d3@22 g2@19 ~@37, ~@22 d4@4 ~@19 g3@4 g3@5 g3@5 ~@37]/6",
})).s("gm_piano").gain(0.17).pan(0.2)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  A@6 ~@7 B@8 C@4 D@5 E@2 F G F H I J K@2 F G F H I J L@4 M@5 E@2 F G F H I N@2 O@7
>`.pickRestart({
  A: "[~ [bb3,d4,g4,bb4]@8 [c4,f4]@4 [d4,gb4]@8 ~@3, ~@3 [a3,a4]@4 ~]/6", // Gm F5 D A
  B: "[~@10 d4@8 g3@3 f3@5 [g3,eb4]@8 g3@3 f3@5 [f3,d4]@8 [g3,d4]@3 [f3,c4]@5 [g3,d4]@6, ~@5 f3@13 d4@8 ~@8 d4@8 ~@22]/8", // Cm Dm G5 F5 G5
  C: "[~ [g3,eb4]@4 d4@4 [c4,a4]@4 [d4,bb4]@3, ~ bb4@8 ~@7, ~@5 f3@11]/4", // Cm F Gm
  D: "[~ [g3,eb4]@4 d4@4 c4@4 [gb3,d4]@7, ~ bb4@8 a4@11, ~@5 f3@8 ~@7]/5", E: "[~@3 a4@5 [d4,bb4]@8, ~@3 f3@13]/2",
  F: "[g3,g4]@3 [f3,a4]@5, d4", G: "[g3,eb4,g4]", H: "[f3,d4,bb4]", I: "[g3,d4,g4]@3 [f3,c4,f4]@5", J: "[g3,d4,g4]",
  K: "[[g3,d4]@3 a4@5 [d4,bb4]@8, ~@3 f3@13]/2", L: "[[g3,eb4] d4 [c4,a4] [d4,bb4], bb4 ~, ~ f3@3]/4",
  M: "[[g3,eb4]@16 d4@16 c4@16 [gb3,d4]@31 ~, bb4@32 a4@47 ~, ~ f3@2 ~@2]/5", N: "[g3,d4,g4]/2",
  O: "[~ [c4,f4]@17 gb4@22 [b3,g4]@63 ~@9, ~ a3@40 ~@71, ~@18 d4@85 ~@9]/7", // F5 Em
})).s("gm_string_ensemble_2").gain(0.14).pan(0.3)

// chords · pad warm · "Treble Pad"
const pad_warm = note(`<
  A@5 B@6 C@8 D@2 E@6 F@3 G@2 H I H J K L G@2 H I H J K M N@6 O@3 G@2 H I H J K P@2 Q@7
>`.pickRestart({
  A: "[~ [g2,d3]@8 [f2,c3]@4 [d2,d3]@7]/5", // G5 F5 D
  B: "[~@2 [g2,d3,g3,bb3]@3 [d2,a2,a3]@5 [bb3,d4]@8 [g2,d3,g3,bb3]@3 [d2,a2,f3,a3]@5 [eb2,bb2,g3,bb3]@8 [g2,d3,g3,bb3]@3 [d2,a2,f3,a3]@5 [bb2,d3,f3,bb3,d4]@6, ~@2 d4@8 [bb2,d3]@7 ~@31, ~@5 f3@13 d4@8 eb4@7 ~ d4@8 ~@6]/6", // Gm D5 Bb Gm Dm Eb Gm Dm …
  C: "[~@2 [g2,d3,g3,bb3,d4]@3 [f2,c3,f3,a3,c4]@5 [g2,d3,g3,bb3,d4]@8 [g2,g3,bb3]@3 [d2,a2,a3]@5 [bb2,d3]@7 ~ [g2,d3,g3,bb3]@3 [d2,a2,f3,a3]@5 [eb2,bb2,g3,bb3]@8 [g2,d3,g3,bb3]@3 [d2,a2,f3,a3]@5 [bb2,d3,f3,bb3]@6, ~@21 f3@13 ~@30, ~@13 bb3@4 ~@15]/8", // Gm F Gm D5 Bb Gm Dm Eb …
  D: "[~@2 [g2,d3,g3,bb3]@3 [f2,c3,f3,a3]@5 [g2,d3,g3,bb3]@6]/2", // Gm F Gm
  E: "[~ [eb2,bb2,g3]@4 [bb2,d3]@4 [f2,c3,a3]@4 d3@4 [eb2,g3]@4 [bb2,d3,f3]@3, ~ bb3@8 ~@4 bb3@11, ~@5 f3@12 ~@7, ~@13 bb2@8 ~@3]/6", // Eb Bb F Eb Bb
  F: "[~@4 [f2,c3]@16 [d2,a2,gb3]@27 ~, ~@4 a3@43 ~]/3", // F5 D
  G: "[[g2,g3,bb3]@3 [d2,a2,a3]@5 [bb2,d3]@7 ~, ~@3 f3@13, ~ bb3]/2", H: "[g2,d3,g3,bb3]@3 [d2,a2,f3,a3]@5",
  I: "[eb2,bb2,g3,bb3]", J: "[f3,bb3], [bb2,d3]@7 ~", K: "[g2,d3,g3,bb3]@3 [f2,c3,f3,a3]@5", L: "[g3,bb3], [g2,d3]@7 ~",
  M: "[g2,d3,g3,bb3]", // Gm
  N: "[[eb2,bb2,g3] [bb2,d3] [f2,c3,a3] d3 [eb2,g3] [bb2,d3,f3], bb3@2 ~ bb3@3, ~ f3@3 ~@2, ~@3 bb2@2 ~]/6", // Eb Bb F Eb Bb
  O: "[[f2,c3]@16 [d2,a2,gb3]@31 ~, a3@47 ~]/3", P: "[g2,d3,g3,bb3]/2",
  Q: "[~ [f2,c3,f3]@17 [d2,d3,gb3]@22 [g2,d3,g3,b3]@63 ~@9, ~ a3@40 ~@71]/7", // F5 D G
})).s("gm_pad_warm").gain(0.15).pan(0.7)

// chords · tubular bells · "Bell"
const tubular_bells = note("<A ~@2 B ~@9 C ~@3 D ~@20 E F E G E H I J K ~@3 K ~@2 L ~@9 M ~ N O P ~ Q ~>".pickRestart({
  A: "~@3 [d4,g4]@5", B: "~@4 [a3,d4]@7 ~@5", C: "~ [d4,g4] ~@2", D: "~@4 [d4,g4]@3 ~@9", E: "[d4,g4] ~@3",
  F: "[bb3,d4] ~@3", G: "[eb4,ab4]@5 ~@11", H: "[bb3,d4]@5 ~@11", I: "[d4,g4]@3 ~@5", J: "[d4,g4]@5 ~@11",
  K: "[eb4,ab4] ~@3", L: "[d4,gb4]@5 ~@11", M: "[d4,g4] ~", N: "~ [d4,gb4]@4 ~@3", O: "~@9 g4@5 ~@2, ~@8 d4@5 ~@3",
  P: "~@11 [d4,g4]@5", Q: "[d4,g4]@9 ~@7",
})).s("gm_tubular_bells").gain(0.09)

stack(piano, piano_2, string_ensemble_2, pad_warm, tubular_bells)

More by Enya