Strudelify

Fairytale

Enya

KeyC majorTempo100 bpm
0:00/0:00
// Fairytale — Enya
// 100 bpm, 2/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: ch 6 "Pizzicato" named as a string part, played on pizzicato strings (its choir aahs patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 186 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/2)

// 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(`<
  A B C@2 D E F G A B H G I J K@2 L M N@2 O E P Q R S T G U V W@2 A M C@2 O X F Y A M Z G I V AA AB AC AD AE@2 AF AG AH
  AI AJ AD AK@2 AL AG AM AN AO AP AQ AR AS AT AU@2 AO AV AW AR AS AT AX AY AC AD AE@2 AF AG AH AI AJ AD AK@2 AL AG AM AZ
  AC AD AE@2 AF AG AH AI AJ AD AK@2 AL AG AM AN AO AP AQ AR AS AT AU@2 AO AV AW AR AS AT AX AY AC AD AE@2 AF AG AH AI AJ
  AD AK@2 AL AG AM BA BB@2 BC BD BE@8 BF@8 BG@7 BH@5 BI@3 BJ@7
>`.pickRestart({
  A: "~ g3 [c4,e5] [g3,d5], c3@3 ~, e5 ~", B: "~ g3 b3 g3, b2@3 ~, g5 e5",
  C: "[~ e3 a3 e3 ~ d3 g3 d3, a2@3 ~ g2@3 ~, c5 a4@2 g4]/2", D: "~ c3 [f3,f5] [c3,d5], f2@3 ~, f5 ~",
  E: "~ d3 g3 d3, g2@3 ~, g5 f5", F: "~ g3 [c4,e5] [g3,g5], c3@3 ~, e5 ~", G: "~ d3 g3 d3, g2@3 ~, e5 d5",
  H: "~ e3 a3 e3, a2@3 ~, a5 e5", I: "~ c3 f3 c3, f2@3 ~, g5 e5", J: "~ d3 g3 d3, g2@3 ~, c5 b4",
  K: "[~ g3 c4 g3 [c3,g3,c4]@2 ~@2, c5@5 ~@3, c3@3 ~@5]/2", L: "~ g3 [c4,e5] [g3,d5], c3@3 ~, ~ e5@6 ~@9",
  M: "~ g3 b3 g3, b2@3 ~, g5@8 e5@7 ~", N: "[~ e3 a3 e3 ~ d3 g3 d3, a2@3 ~ g2@3 ~, c5@8 a4@11 ~@5 g4@7 ~]/2",
  O: "f5 c3 [f3,f5] [c3,d5], f2@3 ~", P: "~@2 g3@2 c4@2 e5 g5, c3@3 g3, e5@9 ~@7",
  Q: "f5 ~ [d3,d5]@2 [g3,c5]@2 [d3,b4]@2, g2@3 ~, ~ e5@2 ~@5", R: "~ g3 [c4,e5] [g3,d5], c3@3 ~, e5@7 ~@9",
  S: "~ g3 b3 g3, b2@3 ~, ~ g5@7 e5@8", T: "~ e3 [a3,e5] e3, a2@3 ~, a5 ~", U: "~@4 c3@4 f3@4 ~ e5@3, [f2,g5]@3 c3",
  V: "~ d3 g3 d3, g2@3 ~, c5@7 ~ b4@7 ~", W: "[~ g3 c4 g3 [c3,g3,c4]@2 ~@2, c5@23 ~@9, c3@3 ~@5]/2",
  X: "~ d3 g3 d3, g2@3 ~, g5@7 ~ f5@7 ~", Y: "~ d3 g3 d3, g2@3 ~, e5@8 d5@7 ~", Z: "~ e3 a3 e3, a2@3 ~, a5@8 e5@7 ~",
  AA: "~ g3 c4 g3, c5, c3@3 ~", AB: "[c3,g3,c4] ~", AC: "~ g2 c3 g2, c2@3 ~, c4 d4", AD: "~ g2 c3 g2, c2@3 ~, e4 f4",
  AE: "[~ d3 g3 d3 ~ d3 g3 [d3,g4], d4@3 ~, g2@3 ~ g2@3 ~]/2", AF: "g4 [c3,f4] e4 [c3,f4], f2@3 ~, ~ f3",
  AG: "~ d3 g3 d3, g2@3 ~, e4 d4", AH: "~ g3 c4 g3, e4, c3@3 ~", AI: "~ d3 g3 d3, d4, g2@3 ~",
  AJ: "~ g2 c3 g2, [c2,c4] d4", AK: "[~ f3 a#3 f3 ~ d3 g3 [d3,g4], d4@3 ~, a#2@3 ~ g2@3 ~]/2",
  AL: "g4 [c3,f4] [f3,e4] [c3,f4], f2@3 ~", AM: "~ g3 c4 g3, [c3,c4] ~", AN: "[c3,e4] g3 b2 g3, ~ g4",
  AO: "~ e3 a3 e3, a4, a2@3 ~", AP: "~ e3 a3 e3, [a2,e4] a4", AQ: "~ b2 e3 b2, g4, e2 ~",
  AR: "~ b2 e3 b2, e2@3 ~, a4 b4", AS: "~ c3 f3 c3, f2@3 ~, c5 e5", AT: "~ d3 g3 d3, g2@3 ~, d5 b4",
  AU: "[~ e3 a3 e3 ~ b2 e3 b2, a4@3 e4, a2@3 ~ e2@3 ~]/2", AV: "~ e3 a3 e3, a2@3 ~, e4 a4",
  AW: "~ b2 e3 b2, g4, e2@3 ~", AX: "~ c3 f3 c3, a4, f2@3 ~", AY: "~ d3 g3 d3, g4, g2@3 ~", AZ: "c3 ~",
  BA: "~@4 d3@4 g3@4 ~ d3@3, g2@13 ~@3", BB: "[~@6 g3@4 c4@4 ~ g3@4 ~@4 g3@4 ~ c4@4, ~ c3@9 ~@9 c3@9 ~@4]/2",
  BC: "g3@4 ~@5 g3@5 c4@2, ~@5 [c3,c5,e5]@11", BD: "~@5 f5@2 ~@4 g3@4 b3, ~@2 [g3,c5,e5]@5 [b2,e5,g5]@9, ~@2 d5 ~@5",
  BE: "[~@4 [g3,e5,g5]@4 [d5,f5]@4 ~@27 d3@4 ~@32 f5@4 f5@4 ~@25 e6@3 ~@2 e6@2 ~@4 g3@4 ~ c4@4, ~@8 a2@13 e5 e3@22 [f2,e5,c6]@17 g5@18 c3@19 g5@18 ~@12, ~@13 c5@31 ~@16 a5@2 g2@21 e5@17 c6@16 ~@12, ~@13 [e3,e5]@8 [g4,d5]@5 g2@5 d3@4 [g3,e5,c6]@9 ~@4 c3@9 [c3,b5]@6 ~@3 d3@9 d3@9 ~@4 c4@14 [d3,e6]@2 g6@2 [g3,f6]@5 [d3,d6]@5 ~@12, ~@17 a3@26 ~@10 f3@10 ~@8 g3@13 g3@9 g3@4 g2@18 [c3,f6]@13]/8", // C Dm Fmaj7 E G5 C Cmaj7 Dsus2 …
  BF: "[~@4 d6 e6@4 ~@5 [b3,c6]@4 [g3,b5]@4 ~@5 e3@4 a3@5 e3@4 ~@5 d3@4 g3@4 ~ d3@4 ~@5 c3@4 ~@5 c6@4 ~@13 [d3,c6]@4 ~@14 [g3,g5]@4 [c3,g3,c4,c5,d5,g5]@17, g3@4 ~ b2@14 ~@4 a2@14 ~@3 g2@13 ~@5 f2@19 ~@8 g3@9 g5@9 c4@8 ~@17, ~ e6@2 c6@2 ~@4 g3@4 ~@23 b5@13 ~@5 a5@23 ~@17 c6@32 ~@2, ~@2 d6@2 ~@6 d6@9 ~@3 c6@5 a5@10 ~@8 g6@17 e6@9 c3@5 [g2,d6]@17 ~@5 g3@9 e5@21, ~@45 g5@7 ~@6 c6@9 [f3,d6]@10 ~@3 d3@9 ~@5 c3@17 ~@17]/8", // Cmaj7 G D7 G Csus2 G5 Dm
  BG: "[~@13 [d6,d7] ~@9 [a3,d7]@2 e3@2 ~@16 [c3,b5,b6]@2 ~@7 [b5,b6]@2 [c3,b5,b6]@2, ~ c3@22 [g3,c6,c7]@5 [e6,e7]@9 a2@8 d6@5 [c6,c7]@22 f2@5 c3@2 [g5,g6]@2 [f3,a5,a6]@8 ~@6 d3@8 d3@9, ~@2 [g5,e6]@27 ~@3 g3@9 [e3,e6,e7]@10 ~@8 d3 a6@3 g3@26 ~@10 g3@13, ~@2 c6@13 g3@4 b2@32 ~@4 g2@22 [f5,f6]@12 ~@6 [c6,c7]@17, ~@6 g3@4 c4@18 b3@23 ~@8 a5@9 d3@21 ~ g2@22]/7", // D D5 Cmaj7 B Cmaj7 C5 E C …
  BH: "[~@5 c4@4 ~@14 e5@2 f5@2 ~@2 a5@2 ~@32 g3@4 ~@9 a3@4, g3@8 ~ g3@10 c5@6 e5@2 [d3,f5,g5]@4 c3@16 a6@2 [b2,b5,b6]@3 [c6,c7]@2 [g3,d6,d7]@2 [e6,e7]@2 [b3,f6,f7]@2 [g6,g7]@2 [a6,a7]@5 [a2,a6,a7]@13, ~ [d6,d7]@8 [c6,c7]@14 g3@8 g5@9 c4@28 ~@3 [e3,g6,g7]@9, ~@14 g2@18 ~@4 g3@9 [g3,g6]@2 a5@21 ~@12, ~@18 d3@3 d5@11 g6@13 g5@23 ~@12]/5", // G7 B C G5 E Bdim G A …
  BI: "[~@18 d3@4 ~@15 [c3,f5,a5,d6]@6 [g2,e5,g5,c6]@5, e3@22 g5@20 ~ d5@2 ~@3, ~ [e6,e7]@21 [a5,d6]@10 f3@11 b5 ~@4, ~@5 g2@18 f2@21 ~@4, ~@9 d3@5 [g3,c6,c7]@9 ~@4 c3@10 ~@11]/3", // Dm7 C E D5 C5
  BJ: "[~ d3@6 ~@9 d3@7 d6 ~@22 e5@11 ~@19 [c7,e7]@32 ~@4, ~@7 [d5,b5]@16 [g5,c6,e6]@32 ~@2 c5@17 [c3,g3,c4]@37 ~, ~@8 [g3,g5]@15 e5@22 c4@14 [c6,d6]@32 ~@21, ~@24 c3@33 ~ g3@15 e6@32 ~@7, ~@34 g3@24 [e5,g5]@17 g6@32 ~@5]/7", // C G C C5 G Csus2 Em
})).s("gm_piano").gain(0.4)

// chords · pizzicato strings · "Pizzicato"
const pizzicato_strings = note(`<
  ~@96 A B C@2 D C A C E B F C G H I ~ J K L M N O J L J K L M N O N O B P Q@2 R S P S T I F S G H U ~@43
>`.pickRestart({
  A: "~@4 g4@2 ~@2 c5 ~@3 g4@2 ~@2", B: "~@2 g4 ~ c5 ~ g4 ~", C: "~@4 g4@2 ~@2 b4 ~@3 g4@2 ~@2",
  D: "~@4 f4@2 ~@2 a4 ~@3 f4 ~@3", E: "~@4 g4 ~@3 c5@2 ~@2 g4@2 ~@2", F: "~@4 f4@2 ~@2 a#4 ~@3 f4@2 ~@2",
  G: "~@4 f4@2 ~@2 a4 ~@3 f4@2 ~@2", H: "~@2 g4 ~ b4 ~ g4 ~", I: "~@4 g4 ~@3 c5 ~@3 g4@2 ~@2",
  J: "~@4 [a3,c4] ~@3 [a3,c4] ~@3 [a3,c4] ~@3", K: "[a3,c4] ~@3 [a3,c4] ~@3 [a3,c4] ~@3 [a3,c4] ~@3",
  L: "~@4 [e3,g3] ~@3 [e3,g3] ~@3 [e3,g3] ~@3", M: "[e3,g3] ~@3 [e3,g3] ~@3 [e3,g3] ~@3 [e3,g3] ~@3",
  N: "~@4 [f3,a3] ~@3 [f3,a3] ~@3 [f3,a3] ~@3", O: "~@4 [g3,b3] ~@3 [g3,b3] ~@3 [g3,b3] ~@3",
  P: "~@4 g4 ~@3 c5 ~@3 g4 ~@3", Q: "~@4 g4 ~@3 b4 ~@3 g4 ~@3", R: "~@4 f4 ~@3 a4 ~@3 f4@2 ~@2",
  S: "~@4 g4 ~@3 b4 ~@3 g4@2 ~@2", T: "~@4 g4@2 ~@2 c5 ~@3 g4 ~@3", U: "c5 ~@7",
})).s("gm_pizzicato_strings").gain(0.4).pan(0.7)

// other · harpsichord · "HAPPSI"
const harpsichord = note("<~@32 A B C@2 D E F@2 G H I@2 J K L M ~@138>".pickRestart({
  A: "e5@5 ~ e5 d5", B: "g5@8 f5@5 e5@2 ~", C: "[e5@4 d5@3 ~ c5@17 ~@7]/2", D: "f5@5 ~ f5 g5",
  E: "a5@2 g5@2 f5@4 e5@4 d5@3 ~", F: "[e5@4 c5@20 ~@4 g5 ~@3]/2", G: "e5@9 ~@3 e5@2 f5@2",
  H: "g5 ~ a5@2 b5@4 c6@4 d6@3 ~", I: "[c6@4 b5@3 ~ a5@15 ~ g5@6 ~@2]/2", J: "~@2 b5 a5 g5@2 f5@2", K: "e5@2 f5 e5",
  L: "c5@5 ~ c5 e5", M: "g5@7 ~@9",
})).s("gm_harpsichord").gain(0.19)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@48 A B C ~ D C E C A F G C H C A ~ I J K ~ H L M K I J N ~ D L O L P F C ~ D C Q C P B G C H C R@2 A B C ~ D C E C A
  F G C H C A ~ I J K ~ H L M K I J N ~ D L O L P F C ~ D C Q C P B G C H C Q S T U@8 V@2 W X@2 Y@6 Z@2 AA AB@5 AC@2
  AD@3 AE@2 AF@7
>`.pickRestart({
  A: "c3", B: "c2@3 ~", C: "g2@3 ~", D: "f2", E: "c3 c2", F: "c2", G: "a#2@3 ~", H: "f2@3 ~", I: "a2", J: "a1@3 ~",
  K: "e2", L: "g2", M: "a2 ~ a1@2", N: "e2@3 ~", O: "f2 f1", P: "c3@3 ~", Q: "c3@2 c2 ~", R: "[c3@3 ~]/2", S: "g2 ~",
  T: "~ c3@15", U: "[~@3 c3@18 c3@17 b2@17 ~ a2@17 g2@13 ~@6 f2@11 ~@3 f2@2 ~@2 g2@9 ~@4 g2@3 ~@2]/8",
  V: "[c3@19 ~@11 g2@2]/2", W: "~@3 c3@11 ~@2", X: "[~ c3@3 ~ b2@17 ~ a2@9]/2",
  Y: "[~@4 a2@3 ~ g2@12 ~@2 g2@3 ~ f2@11 ~@3 f2@3 ~ g2@10 ~@3 g2@2 ~@3 c3@22 g2@4 ~ c2@7, ~@89 d2 ~@6]/6",
  Z: "[~@2 c3@10 ~@3 c3@5 b2@10 ~@2]/2", AA: "~@5 a2@11",
  AB: "[~@2 a2@3 ~@2 g2@17 f2@11 ~@2 f2@5 ~ g2@12 g2@5 c3@19 ~]/5", AC: "[g2@11 a2@4 c3@12 ~@2 c3@3]/2",
  AD: "[~@2 b2@11 ~@2 b2@4 a2@18 g2@11]/3", AE: "[~@2 g2@3 ~@2 f2@18 ~ g2@6]/2",
  AF: "[~@7 g2@18 c2@17 c3@31 c2@33 ~@6, ~@73 d2 ~@38]/7",
})).s("gm_electric_bass_finger").gain(0.19)

// other · string ensemble 1 · "VIOLIN"
const string_ensemble_1 = note("<~@113 A B@2 C@4 D E F G@2 H I@2 J@2 ~@56>".pickRestart({
  A: "c5 d5", B: "[e5@29 ~@3]/2", C: "[g5@12 f5@11 ~ e5@26 ~@10 e5 ~ [g5,a5] ~]/4", D: "c6", E: "~@2 e5 g5 c6@2 b5@2",
  F: "~ b5@15", G: "[d6@10 c6 b5 a5@2 b5@2]/2", H: "~@2 f5 g5 a5@4", I: "[~@4 f5@2 g5@2 a5@2 b5@2 c6@3 d6@9 e6@8]/2",
  J: "c6/2",
})).s("gm_string_ensemble_1").gain(0.14)

// chords · flute
const flute = note(`<
  ~@16 A B C@2 D E F G A B H G B I J@2 A B C@2 D E F G A B H G B I J@2 ~@16 K L M N O P K Q R S T@2 O U K V W@2 ~@104
>`.pickRestart({
  A: "[c6,e6]@2 [c6,e6] [b5,d6]", B: "[e6,g6] [c6,e6]", C: "[[a5,c6] a5@2 g5]/2", D: "[d6,f6]@2 [d6,f6] [b5,d6]",
  E: "[e6,g6] [d6,f6]", F: "[c6,e6]@2 [c6,e6] [e6,g6]", G: "[c6,e6] [b5,d6]", H: "[f6,a6] [c6,e6]",
  I: "[a5,c6] [g5,b5]", J: "[c6@5 ~@3]/2", K: "a5", L: "e5@7 ~ a5@8", M: "g5@15 ~", N: "a5@7 b5@8 ~", O: "c6 e6",
  P: "d6 b5", Q: "~ e5", R: "a5@7 ~", S: "e5 a5", T: "[g5@13 ~@2 a5@9 b5@8]/2", U: "d6@3 b5", V: "g5", W: "[c6@15 ~]/2",
})).s("gm_flute").gain(0.3)

// chords · string ensemble 2 · "STRINGS"
const string_ensemble_2 = note("<~@164 A@2 B@8 C D E@7 F@3>".pickRestart({
  A: "[~@3 e5@16 d5@13]/2", B: "[~@5 c5@18 b4@17 a4@18 ~ b4@17 c5@26 ~@9 [c4,e5]@17, ~@51 g4@13]/8",
  C: "~ [b3,b4,d5]@15", D: "~@3 c5@13",
  E: "[~@5 [g3,b4]@17 ~ c5@19 ~ [b4,d5]@29 ~ e5@16 ~ g4@22, ~@5 g4@12 ~@5 a4@20 g3@30 ~@40]/7", F: "[~@5 c3@36 ~@7]/3",
})).s("gm_string_ensemble_2").gain(0.15)

// chords · string ensemble 2 · "STRINGS" · soft notes
const string_ensemble_2_soft = note("<~@175 A@2 B@2 ~ C@4 ~@2>".pickRestart({
  A: "[~@3 a3@18 ~@11, ~@3 a4@14 ~@15]/2", B: "[~@7 f3@20 ~@5]/2", C: "[~@4 c4@23 ~@5, ~@8 c5@37 ~@19]/4",
})).s("gm_string_ensemble_2").gain(0.05)

// other · timpani
const timpani = note("<~@95 A B ~ C D E F G H B ~ I D E F J G ~@74>".pickRestart({
  A: "c2!15 ~", B: "c3 ~@3", C: "~@12 g2 ~@3", D: "g2 ~@11 g2 ~ g2 ~", E: "f2 ~@11 f2 ~@3", F: "g2 ~@11 g2 ~@3",
  G: "c3 ~@15", H: "c2!16", I: "~@6 a#2 ~", J: "c3 ~@11 c3 ~ c3 ~",
})).s("gm_timpani").gain(0.18)

// drums · snare
const snare = s("sd").struct(`<
  ~@47 A B C B D B C B D B C B D B C B D B C B D B C B D B C B D B C B D B C B D B C B D B C B D B C B ~@2 C B D B C B D
  B C B D B C B D ~@16 B C B D B C B D B C B D B C B E F ~@41
>`.pickRestart({
  A: "~@2 x!14", B: "x ~ x!3 ~ x ~", C: "~@2 x ~ x ~ x!2", D: "~@4 x ~@3 x!8", E: "~@4 x ~@3 x!2 ~ x!5", F: "x",
})).gain(0.1)

// drums · ride
const ride = s("rd").struct(`<
  ~@48 A ~@15 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@45
>`.pickRestart({
  A: "x",
})).gain(0.17)

// drums · crash
const crash = s("cr").struct("<~@96 x ~@7 x ~@40 [~@3 x ~@12] ~@40>").gain(0.13)

stack(
  piano, pizzicato_strings, harpsichord, bass, string_ensemble_1, flute, string_ensemble_2, string_ensemble_2_soft,
  timpani, snare, ride, crash
)

More by Enya