Strudelify

The Long Ships

Enya

KeyF majorTempo120 bpm
0:00/0:00
// The Long Ships — Enya
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 72 bars on a 32-step grid, each part at one level. 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.

// chords · string ensemble 1 · "STRINGS" · F Am Bb F Bb F
const string_ensemble_1 = note(`<
  [~@28 [a3,c4,f4] ~@3]
  [[a3,c4,f4]@7 ~@2 f4@8 ~@11 [c4,f4,a4] ~@3, ~@8 [a3,c4]@7 ~@17]
  [[d4,f4,bb4]@16 ~@12 [a3,c4,f4] ~@3]
  [[a3,c4,f4]@7 ~ [a3,c4,f4]@8 ~@12 [c4,f4,a4] ~@3]
  [~ [d4,f4,bb4]@16 ~@11 [a3,c4,f4]@2 ~@2]
  [[a3,c4,f4]@7 ~ [a3,c4,f4]@8 ~@16]
  ~@66
>`).s("gm_string_ensemble_1").gain(0.15)

// bass · string ensemble 1 · "STRINGS"
const bass = note("<~ A B C D E@2 ~@65>".pickRestart({
  A: "f2 ~@3 f2@2 ~@2 f2 ~@3 f2@2 ~@2 f2 ~@2 f2@2 ~@3 f2 ~@2 f2@2 ~@3",
  B: "f2 ~@3 f2@2 ~@2 f2@2 ~ f2@2 ~@3 f2@2 ~@2 f2@2 ~@2 f2 ~@3 f2@2 ~@2",
  C: "f2@2 ~@2 f2@2 ~@2 f2@2 ~@2 f2@2 ~@2 f2@2 ~@2 f2 ~@3 f2 ~@3 f2 ~@3",
  D: "f2@2 ~@2 f2 ~@3 f2 ~@2 f2 ~@3 f2 ~@3 f2 ~@3 f2 ~@3 f2 ~@3 f2",
  E: "[~@4 f2 ~@3 f2 ~@3 f2 ~@3 f2 ~@3 f2 ~@3 f2 ~@2 f2 ~@3 f2@16 ~@17]/2",
})).s("gm_string_ensemble_1").gain(0.35)

// other · piccolo
const piccolo = note("<~@24 A B C D E ~ F G@2 H I ~@17 J K L M N O@2 P@2 Q R S@2 T@2 U@2 V@3>".pickRestart({
  A: "~@4 a4@3 c5@4 a4@3 ~@4 a4@3 ~ c5@3 a4@3 ~@4", B: "~ a4@2 c5@2 a4@2 ~@9",
  C: "~@3 a4@4 c5@4 a4@4 ~@4 a4@3 c5@4 a4@3 ~@3", D: "~@3 a4@3 c5@4 a4@5 bb4@3 ~ bb4@2 ~@2 bb4@2 ~@2 bb4@3 ~@2",
  E: "~@3 a4@4 c5@4 a4@3 ~@4 bb4@4 d5@4 bb4@4 ~@2", F: "~@19 a4@4 c5@4 a4@3 ~@2",
  G: "[~@3 a4@4 c5@3 a4@4 ~@5 a4@4 c5@3 ~ a4@4 bb4@2 ~@3 bb4@2 ~ bb4@2 ~@2 bb4@2 ~@7 a4@3 c5@4 a4@3 ~@2]/2",
  H: "~@3 a4@4 c5@4 a4@3 ~@5 a4@4 c5@3 ~ a4@3 ~@2", I: "~@3 a4@4 c5@4 a4@4 ~@17",
  J: "~@4 a4@3 c5@4 a4@3 ~@5 a4@4 c5@3 a4@3 ~@3", K: "~@2 a4@4 c5@4 a4@5 ~@17",
  L: "~@4 a4@4 c5@4 a4@3 ~@4 a4@4 c5@4 a4@3 ~@2", M: "~@3 a4@4 c5@4 a4@4 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@3",
  N: "~@3 a4@4 c5@4 a4@3 ~@5 bb4@3 ~ d5@4 bb4@4 ~",
  O: "[~@31 bb4@2 ~@2 bb4@2 ~@2 bb4 ~@2 bb4@2 ~@7 a4@4 c5@3 a4@3 ~@3]/2",
  P: "[~@3 a4@4 c5@4 a4@3 ~@6 a4@3 c5@4 a4@4 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@6 a4@4 c5@4 a4@3 ~@2]/2",
  Q: "~@3 a4@4 c5@4 a4@3 ~@6 a4@4 c5@3 a4@4 ~", R: "bb4@2 ~ bb4 ~@3 bb4 ~@3 bb4@2 ~@6 a4@3 c5@4 a4@3 ~@3",
  S: "[~@2 a4@4 c5@4 a4@3 ~@6 a4@3 c5@3 ~ a4@5 bb4@2 ~@2 bb4@2 ~@2 bb4 ~@3 bb4@2 ~@5 a4@4 c5@4 a4@3 ~@3]/2",
  T: "[~@2 a4@4 c5@4 ~ a4@3 ~@5 a4@4 c5@4 a4@4 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@6 a4@4 c5@4 a4@3 ~@2]/2",
  U: "[~@3 a4@4 c5@4 a4@3 ~@6 a4@4 c5@3 a4@4 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@2 bb4@2 ~@6 a4@4 c5@4 a4@3 ~@2]/2",
  V: "[~@3 a4@4 c5@3 a4@3 ~@6 a4@4 c5@3 ~ a4@4 bb4@2 ~@2 bb4 ~@3 bb4 ~@3 bb4 ~@3 a4@36 ~@13]/3",
})).s("gm_piccolo").gain(0.35)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  ~@15 A B C D E F G H@2 I J@2 K L@2 M N O P@2 ~@8 Q@3 R S T U V W X@3 Y@5 Z@2 AA@8 AB@2
>`.pickRestart({
  A: "d3@11 ~ d3@4 bb2@10 ~ bb2@4 ~", B: "c3@11 ~ c3@4 f2@16", C: "db3@12 db3@4 bb2@11 ~@2 bb2@3",
  D: "~ c3@11 ~ c3@2 ~@2 c3@15", E: "d3@10 ~@2 d3@4 bb2@11 ~ bb2@4", F: "~ c3@11 ~ c3@4 f2@15",
  G: "db3@10 ~@2 db3@4 bb2@11 ~ bb2@3 ~", H: "[c3@10 ~ c3@2 ~@2 c3@15 ~ c3@10 ~@2 c3@2 ~@2 c3@16 ~]/2",
  I: "f2@5 ~ f2@9 ~", J: "[f2@9 ~@2 f2@4 ~ c3@15 f2@31 ~@2]/2", K: "f2@10 ~ f2@3 ~ g2@17",
  L: "[a2@10 ~@5 bb2@15 ~ d3@11 ~ d3@2 ~@2 d3@17, ~@12 a2@5 ~@47]/2",
  M: "bb2@11 ~ bb2@2 ~ f2@12 ~ f2@2 ~@2, ~@15 g2@3 ~@14", N: "f2@14 ~ f2@11 ~@2 f2@4", O: "bb2@8 f2@5 ~ f2 ~",
  P: "[f2@14 ~@2 f2@10 ~@2 f2@2 ~ f2@18 ~@15]/2",
  Q: "[d3@10 ~ d3@4 bb2@10 ~@2 bb2@4 c3@11 ~ c3@5 f2@15 db3@10 ~@2 db3@4 bb2@11 ~ bb2@4 ~]/3",
  R: "c3@11 ~ c3@2 ~@2 c3@16", S: "d3@11 ~ d3@4 bb2@11 ~ bb2@4", T: "~ c3@10 ~ c3@3 f2@16 ~",
  U: "db3@11 ~ db3@3 ~ bb2@16", V: "c3@10 ~@2 c3@2 ~ c3@14 ~@3", W: "c3@9 ~@2 c3@2 ~@2 c3@16 ~",
  X: "[f2@11 ~ f2@18 ~ f2@10 ~@2 f2@4 ~ c3@15 f2@31 ~@2]/3",
  Y: "[f2@10 ~ f2@3 ~ g2@16 a2@11 ~ a2@4 bb2@15 d3@10 ~@2 d3@2 ~@3 d3@16 bb2@10 ~@2 bb2@4 f2@10 ~@2 f2@2 ~@2 f2@15 ~ f2@10 ~@2 f2@3 ~@2]/5",
  Z: "[bb2@15 f2@10 ~@3 f2@2 ~ f2@15 ~ f2@11 ~ f2@5]/2",
  AA: "[bb2@15 f2@11 ~ f2 ~@3 f2@14 ~@2 f2@11 ~ f2@4 bb2@16 f2@11 ~ f2@2 ~ f2@15 ~ f2@11 ~@2 f2@4 bb2@16 f2@11 ~ f2@2 ~@2 f2@15 ~ f2@11 ~@2 f2@2 ~@2 bb2@15 f2@11 ~@2 f2 ~@2 f2@15 ~@2 f2@10 ~ f2@5, ~@191 f2@2 ~@63]/8",
  AB: "[bb2@7 f2@18 ~@7]/2",
})).s("gm_string_ensemble_1").gain(0.4)

stack(string_ensemble_1, bass, piccolo, string_ensemble_1_2)

More by Enya