Strudelify

May It Be

Enya

KeyA majorTempo76 bpm
0:00/0:00
// May It Be — Enya
// 76 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 5/4 at bar 6, 4/4 at bar 7, 5/4 at bar 10, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 71 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(76/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 · synth bass 2
const bass = note("<~@15 A@5 B C D E B F D G@7 ~@12 A@5 B C D E B F D H@7 I@5 ~>".pickRestart({
  A: "[~@3 a1@4 f#1@4 d1@4 e1@5]/5", B: "a1", C: "b1", D: "d1", E: "e1", F: "f#1",
  G: "[b0@2 e1@3 f#1@4 d1@4 b0@5 a0@8 ~@2]/7", H: "[b0@2 e1@3 f#1@4 d1@4 b0@4 a0@2 g#0@2 f#1@4 d1@3]/7",
  I: "[~ b0@2 ~@5 a0@12, ~@3 e1@6 ~@11]/5",
})).s("gm_synth_bass_2").gain(0.22)

// chords · pad warm
const pad_warm = note("<~ A@4 B@6 C@2 D E@6 F@3 G H@4 I@8 B@6 C@2 D E@6 F@3 G J@8 K@4 L@3 ~>".pickRestart({
  A: "[~ [f#1,f#2,c#3,f#3,a3,c#4,f#4]@2 [f#3,c#4]@2 [d3,d4]@2 [c#3,a3,e4,a4], ~@3 [f#4,a4]@4 ~]/4", // F#m F#5 D A F#m
  B: "[~@2 [b2,g#3,e4,g#4]@5 [c#3,c#4]@4 [d3,d4]@4 [c#3,a3,e4,a4]@4 [b2,g#3,e4,g#4]@5, ~@7 [f#4,a4]@8 ~@9]/6", // E C# D A E F#m
  C: "[[d3,a3,d4,f#4] [c#3,a3,c#4], e4]/2", D: "[b2,f#3,b3,d4,f#4]",
  E: "[a3@3 g#3@4 [a2,e4]@4 f#2@4 [d2,d4]@4 ~@2 g#3@3, [e2,e3,b3,e4]@7 a3@14 ~@3, ~@7 c#4@8 e4@9, ~@11 f#4@8 [e2,e3]@5, ~@19 b3@4 ~]/6", // A5 D E5 E
  F: "[[a2,c#3,a3,c#4] [b2,g#3] [d2,f#3,a3], e4@2 ~, ~ [b3,d4]@2]/3", G: "a3 g#3, [e2,b3,e4]",
  H: "[[a2,e4]@2 f#2@2 [d2,d4]@2 [b1,b2] [e2,e3,g#3], a3@7 ~, c#4 e4, ~ f#4@2 b3]/4", // A5 D B E
  I: "[~ [f#2,c#3,a3,c#4]@4 [d2,d3]@4 ~@2 g#3@3 [a2,e3,a3,c#4,e4]@8 [f#3,c#4]@4 [d3,d4]@4 [c#3,a3,e4,a4]@2, ~ f#4@8 [b1,b3]@5 ~@18, ~@5 e4@9 ~@8 [f#4,a4]@8 ~@2, ~@5 d4@8 ~@19, ~@5 a3@4 f#3@4 ~@19]/8", // F#m D A F#5 D A B F#m
  J: "[[a2,e4]@4 f#2@4 [d2,d4]@4 [b1,b2]@2 [e2,e3,g#3]@3 [f#2,c#3,a3,c#4]@4 [d2,d3]@4 f#3@2 g#3@2 [c#3,a3,c#4]@2 [b2,g#3,b3], a3@14 ~@7 d4@8 ~@3, c#4@8 e4@9 f#4@8 [b1,b3]@4 ~@3, ~@4 f#4@8 b3@4 ~@5 e4@11, ~@21 a3@6 ~@5]/8", // A5 D B E F#m D F#m E …
  K: "[~ [f#2,c#3,a3,c#4]@4 [d2,d3]@4 [b1,f#3]@2 [e2,e3]@5, ~ f#4@8 b3@7, ~@5 [d4,e4]@11, ~@5 a3@6 g#3@3 ~@2]/4", // F#m D B5 E Dsus2
  L: "[a2,e3,a3,c#4,e4]/3", // A
})).s("gm_pad_warm").gain(0.22)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@2 A@4 B@5 C@2 D E@6 F@4 G@4 H@3 I@6 B@5 C@2 D E@6 F@4 J@8 K@4 L@3 ~>".pickRestart({
  A: "[~ f#3@4 ~@2 g#3, ~ a3@6 ~, ~@5 e3@3]/4", B: "[~@3 f#3@8 ~@4 g#3@5, ~@3 a3@12 ~@5, ~@11 e3@9]/5",
  C: "[[d4,f#4] c#4, [a3,e4]]/2", D: "[f#3,b3,d4]",
  E: "[a3@3 g#3@4 ~@8 d4@4 ~@2 g#3@3, [b3,e4]@7 e4@17, ~@7 a3@14 ~@3, ~@7 c#4@8 ~@4 b3@5, ~@11 f#4@8 ~@5]/6", // E5
  F: "[[a3,c#4]@2 g#3@2 f#4@2 ~ g#3, e4@4 a3@3 ~, ~ b3@3, ~ d4@2 e4]/4", // A
  G: "[~@7 g#3, a3@7 ~, [c#4,e4] d4, ~ f#4@2 [b3,e4]]/4", // C#m E5
  H: "[~ [a3,c#4]@4 d4@4 ~@2 g#3, ~ e4@11, ~ f#4@8 b3@3, ~@5 a3@6 ~]/3", // A
  I: "[~ [c#3,a3,c#4,e4]@4 f#3@4 ~@2 g#3, ~@5 a3@6 ~, ~@3 e3]/6", // A
  J: "[~@14 g#3@3 [a3,c#4]@4 d4@4 ~@2 g#3@2 [a3,c#4]@2 [g#3,b3], a3@14 ~@7 a3@6 ~@5, [c#4,e4]@8 d4@9 e4@15, ~@4 f#4@8 [b3,e4]@5 f#4@8 b3@4 ~@3]/8", // A G#m C#m E5
  K: "[~ [a3,c#4]@4 d4@4 ~@2 g#3@5, ~ e4@15, ~ f#4@8 b3@7, ~@5 a3@6 ~@5]/4", L: "[a3,c#4,e4]/3",
})).s("gm_string_ensemble_2").gain(0.17).pan(0.3)

// other · string ensemble 2
const string_ensemble_2_2 = note(`<
  ~@2 A@3 B@6 C D E F@6 G H I J G K L M@3 N@6 B@6 C D E F@6 G H I J G K L O@7 P@2 Q@3 ~
>`.pickRestart({
  A: "[~ [f#1,f#2]@2 [d1,d2]@2 [c#1,c#2]]/3", B: "[~@2 [b0,b1]@5 [c#1,c#2]@4 [d1,d2]@4 [c#1,c#2]@4 [b0,b1]@5]/6",
  C: "[d1,d2,d3]", D: "[c#1,c#2,c#3]", E: "[b0,b1,b2]", F: "[[e0,e1,e2]@7 [a1,a2]@4 [f#1,f#2]@4 [d1,d2]@4 [e1,e2]@5]/6",
  G: "[a1,a2]", H: "[b1,b2]", I: "[d1,d2]", J: "[e1,e2]", K: "[f#1,f#2,c#3]", L: "[d1,d2,a2]",
  M: "[[b0,b1]@2 [e1,e2]@3 [f#1,f#2]@4 [d1,d2]@3]/3", N: "[~ [b0,b1]@5 [a0,a1]@8 [f#1,f#2]@4 [d1,d2]@4 [c#1,c#2]@2]/6",
  O: "[[b0,b1]@2 [e1,e2]@3 [f#1,f#2]@4 [d1,d2]@4 [b0,b1]@4 [a0,a1]@2 [g#0,g#1]@2 [f#1,f#2]@4 [d1,d2]@3]/7", // B E F# D B A G# F# …
  P: "[~ [b0,b1]@2 [e1,e2]@5]/2", Q: "[a1,a2]/3",
})).s("gm_string_ensemble_2").gain(0.25).pan(0.7)

// other · french horn
const french_horn = note(`<
  ~@2 A@3 B@6 C@2 D E@6 F@2 G H@2 I@2 J@3 K@6 B@6 C@2 D E@6 F@2 G H@2 I@2 L@7 M@2 N@3 ~
>`.pickRestart({
  A: "[~@13 a5@59, ~ a4@5]/3", B: "[~@13 g#5@29 ~ a5@71 ~ g#5@29, ~@2 g#4@5 a4@12 g#4@5]/6", C: "[~ a5@47, a4]/2",
  D: "~ f#5@23, f#4",
  E: "[~ a5@17 ~ g#5@23 ~ e5@23 ~@25 e5@53, a4@3 g#4@4 e4@4 f#4@8 ~@5, ~@67 f#5@48 ~@29, ~@5 e4@3]/6",
  F: "[~ e5@47, e4]/2", G: "~ d5@23, d4", H: "~ e5@23, e4", I: "[~ f#5@47, f#4]/2", J: "[~ e5@29 ~ e5@41, e4@5 e4@7]/3",
  K: "[~@7 b4@29 ~ c#5@47 ~ a5@59, ~ b3@5 c#4@8 a4@10]/6",
  L: "[~ e5@29 ~ e5@47 ~ b4@23 ~ c#5@11 ~ b4@11 ~ e5@41, e4@5 e4@8 b3@4 c#4@2 b3@2 e4@7]/7",
  M: "[~@7 b4@11 ~ e5@29, ~ b3@2 e4@5]/2", N: "[~ [c#5,e5]@71, [c#4,e4]]/3",
})).s("gm_french_horn").gain(0.13).pan(0.6)

// chords · orchestral harp
const orchestral_harp = note("<~@15 A@8 B@6 C@4 ~@13 A@8 B@6 D@3 E F@5 ~@2>".pickRestart({
  A: "[~@40 [e4,a4]@32 ~@14 a4@39 ~@7 [f#4,a4]@34 ~@14 a4@19 ~@6 g#4@29 ~@7 e4@35 ~@13 d4@41 ~@7 f#4@36 ~@9 b3@2, ~@35 a2@37 ~@8 f#2@4 e4 f#4@40 ~@6 e4@34 ~@13 d4 e4@20 ~@4 d4 e4@30 ~@6 c#4@37 ~@11 b3@42 ~@6 d4@37 ~@11, ~@36 e3@36 ~@9 c#3@44 ~@2 d2@39 ~@9 e2@60 ~@2 a2@39 ~@9 b2@45 ~@54, ~@37 a3@36 ~@9 a3@43 ~@4 [d3,a3]@38 ~@9 e3@58 ~@4 e3@39 ~@9 e3@44 ~@3 d3@40 ~@7 e3@4, ~@38 c#4@34 ~@11 c#4@42 ~@5 d4@35 ~@12 b3@22 ~@3 b3@32 ~@5 a3@38 ~@10 a3@43 ~@4 [a3,b3]@39 ~@8 a3@3]/8", // A5 F#m D5 Asus2
  B: "[e4@19 ~@5 e4@22 ~@6 [e4,a4]@32 ~@14 a4@39 ~@7 [f#4,a4]@34 ~@14 a4@19 ~@6 g#4@29 ~@7 f#4@35, ~@22 [e3,g#3]@24 ~ a2@37 ~@8 f#2@4 e4 f#4@40 ~@6 e4@34 ~@13 d4 e4@20 ~@4 d4 e4@30 ~@5 a3@37, ~@23 b3@23 ~@2 e3@36 ~@9 c#3@44 ~@2 d2@39 ~@9 f#2@60 ~@2 f#2@39, ~@49 a3@36 ~@9 a3@43 ~@4 [d3,a3]@38 ~@9 b2@58 ~@6 c#4@36, ~@50 c#4@34 ~@11 c#4@42 ~@5 d4@35 ~@12 b3@22 ~@3 b3@32 ~@4 f#3@38]/6", // A5 F#m E D5
  C: "[~@13 e4@41 ~@7 e4@21 ~@3 e4@29 ~@7 e4@60 ~@11, ~@9 d3@45 ~@3 b2@24 ~@2 [b2,g#3]@33 ~ a2@63 ~@12, ~@10 f#3@44 ~@65 [e3,a3]@62 ~@11, ~@11 a3@43 ~@4 a3@23 ~@111, ~@12 d4@42 ~@5 b3@23 ~@2 b3@31 ~@5 c#4@61 ~@11]/4", // E A5
  D: "[~@13 e4@41 ~@7 e4@21 ~@3 e4@17 ~@42, ~@9 d3@45 ~@3 b2@24 ~@2 [b2,g#3]@21 ~@40, ~@5 f#3@22 ~@45, ~@11 a3@43 ~@4 a3@23 ~@63, ~@12 d4@42 ~@5 b3@23 ~@2 b3@19 ~@41]/3", // E
  E: "~@13 f#4@35, ~@3 f#2@13, ~@5 f#3@19, ~@11 a3@37, ~ c#4@3",
  F: "[~@13 e4@41 ~@7 e4@21 ~@3 e4@29 ~@30 [e4,a4]@65 ~@31, ~@9 d3@45 ~@3 b2@24 ~@59 a2@69 ~@31, ~@10 f#3@44 ~@29 [e3,g#3]@33 ~@25 e3@68 ~@31, ~@11 a3@43 ~@4 a3@23 ~@61 a3@67 ~@31, ~@12 d4@42 ~@5 b3@23 ~@2 b3@31 ~@28 c#4@66 ~@31]/5", // A5 E
})).s("gm_orchestral_harp").gain(0.34).pan(0.4)

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

stack(bass, pad_warm, string_ensemble_2, string_ensemble_2_2, french_horn, orchestral_harp, hihat)

More by Enya