Strudelify

Only If

Enya

KeyE♭ majorTempo118 bpm
0:00/0:00
// Only If — Enya
// 118 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 50, 4/4 at bar 50, 2/4 at bar 74, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 9 "Bass" named as a bass, played on electric bass finger (its pad choir patch is not one)
// note: ch 12 "Bass Drum" (taiko drum patch on one pitch) is played as the kit's kick
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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 · "String1"
const string_ensemble_1 = note(`<
  ~@2 A@3 B C B C D E D F D F G F G F H F I J K L M N O P Q P Q R S R T R U V U V U W U X J K L M N Y Z AA AB AC AD AE
  AF AG AF AG AF AH AF AI AJ@3 AK AL AM@2 AN AO@2 Z AP AQ AR AS AR AT AU AT AU AT AV AT AW AT AU AT AU AT AV AT AW AX
>`.pickRestart({
  A: "eb2@4 eb5 ~ eb2 ~ eb2@4 ~@2 eb2 ~", B: "eb2@4 eb5 ~ eb2 ~ eb2@5 ~@3", C: "~@4 eb5 ~@3 bb2@7 ~, ab2@7 ~@9",
  D: "eb2@4 eb5 ~ eb2 ~ eb2@7 ~", E: "~@4 eb5 ~@3 bb2@7 ~, ab2 ~", F: "~@4 eb5 ~@3 bb2@6 ~@2, ab2 ~",
  G: "eb2@4 eb5 ~ eb2 ~ eb2@6 ~@2", H: "eb2@4 eb5 ~ eb2 ~ eb2@8", I: "eb2@4 eb5 ~ eb2 ~ eb2@5 ~ eb2 ~",
  J: "[c4,g5] eb4 g4 c5 [eb5,g5] c5 g4 eb4 [g3,d5,f5] bb3 d4 g4 [d5,f5] g4 d4 bb3", // C5 Eb G7 Dm
  K: "[ab3,c5,eb5] c4 eb4 [g4,c5,eb5] c5 g4 eb4 c4 [bb3,d5,f5] d4 f4 bb4 [d5,f5] bb4 f4 d4", // Ab Cm Bb Dm
  L: "[c4,eb5,g5] eb4 g4 c5 [eb5,g5] c5 g4 eb4 [g3,d5,f5] bb3 d4 g4 [d5,f5] g4 d4 bb3", // Cm Eb G7 Dm
  M: "[ab3,c5,eb5] c4 eb4 g4 [c5,eb5] g4 eb4 c4 [bb3,d5,f5] d4 f4 bb4 [d5,f5] bb4 f4 d4", // Ab Cm Bb Dm
  N: "[ab3,c5,eb5] c4 eb4 g4 [c5,eb5] g4 eb4 c4 [bb3,d4,f4]@2 ~@6, ~@8 [d5,f5] ~@7", // Ab Cm Bb Dm
  O: "eb2@4 eb5 ~ eb2 ~ eb2@4 [eb5,g5] ~ eb2 ~, eb5 ~@7 eb5 ~@7", // Eb
  P: "eb2@4 eb5 ~ eb2 ~ eb2@4 [eb5,g5] ~@3, eb5 ~@7 eb5 ~@7", // Eb
  Q: "eb5 ~@3 eb5 ~@3 eb5 ~@3 [eb5,g5] ~@3, ab2@7 ~ bb2@7 ~", // Eb
  R: "eb2@4 eb5 ~ eb2 ~ eb5 ~@3 [eb5,g5] ~@3, eb5 ~@7 eb2@7 ~", // Eb
  S: "eb5 ~@3 eb5 ~@3 eb5 ~@3 [eb5,g5] ~@3, ab2@8 bb2@7 ~", T: "eb5 ~@3 eb5 ~@3 eb5 ~@3 [eb5,g5] ~@3, ab2@4 bb2@3 ~",
  U: "~@4 eb5 ~@7 eb5 ~@3, ab2@4 bb2@3 ~", V: "eb2@4 eb5 ~ eb2 ~@5 eb5 ~@3, ~@4 eb2@3 ~",
  W: "eb2@4 eb5 ~ eb2 ~@5 eb5 ~@3, ~ eb2", X: "eb2@4 eb5 ~ eb2 ~ eb2@4 eb5 ~ eb2 ~",
  Y: "~@8 [eb5,g5] ~@3 [eb5,g5] ~ eb2 ~, ~@2 eb2 ~", // Eb
  Z: "[eb5,g5] ~@3 [eb5,g5] ~ eb2 ~ [eb5,g5] ~@3 [eb5,g5] ~ eb2 ~, eb2 ~ eb2 ~", // Eb
  AA: "[eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3, eb2 ~ ab2@2", // Eb
  AB: "[eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~ eb2 ~, bb2@7 ~ eb2@4 ~@4", // Eb
  AC: "[eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3, eb2@7 ~ ab2@8", // Eb
  AD: "[eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~ eb2 ~, bb2@3 ~ eb2@2 ~@2", // Eb
  AE: "[eb5,g5] ~@3 [eb5,g5] ~@7 [bb4,eb5] ~@3, eb2@7 ~ ab2@8", // Eb Eb5
  AF: "~@4 [bb4,eb5] ~@3 eb2@4 [bb4,eb5] ~ eb2 ~, bb2@3 ~@5", AG: "~@4 [bb4,eb5] ~@7 [bb4,eb5] ~@3, eb2@3 ~ ab2@4",
  AH: "~@4 [bb4,eb5] ~@7 [bb4,eb5] ~@3, eb2 ab2", AI: "eb2@4 [bb4,eb5] ~ eb2 ~ eb2@4 [bb4,eb5] ~@3",
  AJ: "[~@4 [bb4,eb5] ~@3 [ab3,f4]@2 [bb3,gb4] ~ [bb3,gb4]@3 ~@2 ab3 f4 ~ [ab3,f4]@3 ~@2 gb3 eb4 ~ [gb3,eb4]@2 ~@3 ab3 f4 ~ f4@2 ~@3 bb3 gb4 ~ gb4@2 ~@2, ~@15 bb3@2 ~@6 ab3@2 ~@6 gb3@2 ~@2 ab3@2 ~@2 ab3@2 ~@2 bb3@3 ~@2, ~@8 gb4 ~@3 f4 ~@3 eb4 ~@3 f4 ~@3]/3", // Eb5 Db Ebm Db Ebm
  AK: "[bb3,gb4]@2 [ab3,f4] ~ [ab3,f4]@3 ~@2 gb3 eb4 ~ [gb3,eb4]@2 ~@2, ~@4 [ab3,f4] ~@3", // Ebm Db Ebm Db
  AL: "~ ab3 f4 ~ [ab3,f4]@2 ~@3 bb3 [gb4,bb4] ~ [gb4,bb4]@2 ~@2, [gb3,eb4]@2 ~@5 ab3@2 ~@7, ~@4 [f4,ab4] ~@3", // Db Gb Ebm Fm
  AM: "[[bb3,gb4,bb4]@2 [ab3,f4,ab4] ~ [ab3,f4,ab4]@2 ~@3 gb3 [eb4,gb4] ~ [gb3,eb4,gb4]@2 ~@3 ab3 [f4,ab4] ~ [ab3,f4,ab4]@3 ~@2 bb4 gb4 ~ [bb3,gb4]@3 ~, ~@8 [ab3,f4,ab4]@2 ~@5 gb3@2 ~@7 [ab3,f4,ab4]@2 ~@6, ~@16 [eb4,gb4]@2 ~@9 bb4@3 ~@2]/2", // Ebm Db Ebm Fm Db Ebm Db Ebm
  AN: "~ ab3 [f4,ab4] ~ [ab3,f4,ab4]@2 ~@2 [f4,ab4]@2 [gb3,eb4,gb4] ~ [gb3,eb4,gb4]@3 ~, [bb3,gb4,bb4]@2 ~@5 ab3@2 ~@7", // Fm Db Fm Ebm
  AO: "[d4@29 ~@3]/2", AP: "[eb5,g5] ~@3 [eb5,g5] ~ eb2 ~ [eb5,g5] ~@3 [eb5,g5] ~@3, eb2 ~ eb2 ~",
  AQ: "[eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3, ab2@8 bb2@7 ~", // Eb
  AR: "[eb5,g5] ~@3 [eb5,g5] ~ eb2 ~ [eb5,g5] ~@3 [eb5,g5] ~@3, eb2@4 ~@4 eb2@7 ~", // Eb
  AS: "[eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3 [eb5,g5] ~@3, ab2@4 bb2@3 ~", // Eb
  AT: "[bb4,eb5] ~@3 [bb4,eb5] ~@3 [bb4,eb5] ~@3 [bb4,eb5] ~@3, ab2@4 bb2@3 ~", // Eb5
  AU: "[bb4,eb5] ~@3 [bb4,eb5] ~ eb2 ~ [bb4,eb5] ~@3 [bb4,eb5] ~@3, eb2@2 ~@2 eb2@3 ~", // Eb5
  AV: "[bb4,eb5] ~@3 [bb4,eb5] ~ eb2 ~ [bb4,eb5] ~@3 [bb4,eb5] ~@3, eb2 ~ eb2@2", // Eb5
  AW: "[bb4,eb5] ~@3 [bb4,eb5] ~ eb2 ~ [bb4,eb5] ~@3 [bb4,eb5] ~ eb2 ~, eb2 ~ eb2 ~", AX: "[eb2,bb4,eb5] ~@15",
})).s("gm_string_ensemble_1").gain(0.22)

// chords · string ensemble 1 · "String1" · soft notes
const string_ensemble_1_soft = note("<~@2 A@20 ~@5 B@10 C@8 ~@24 D ~ E ~ F@2 ~@23>".pickRestart({
  A: "~@4 bb4 ~@7 [bb4,eb5] ~@3", B: "g5 ~@3 g5 ~@3 g5 ~@7", C: "~@4 bb4 ~@7 bb4 ~@3", D: "~@6 bb3 ~",
  E: "~@10 bb3 ~@5", F: "[[bb3,bb4]@29 ~@3]/2",
})).s("gm_string_ensemble_1").gain(0.13)

// chords · pizzicato strings · "Piz2"
const pizzicato_strings = note("<~@2 A@20 B C D E F A@18 B C D E F G A@14 H ~@9 A@22 ~>".pickRestart({
  A: "~@4 [eb4,g4,bb4] ~@7 [eb4,g4,bb4] ~@3", B: "~@4 [c5,eb5,g5] ~@7 [bb4,d5,f5,g5] ~@3",
  C: "~@4 [ab4,c5,eb5] ~@7 [bb4,d5,f5,g5] ~@3", D: "~@4 [c5,eb5,g5] ~@7 [bb4,d5,g5] ~@3",
  E: "~@4 [ab4,c5,eb5] ~@7 [bb4,d5,f5] ~@3", F: "~@4 [ab4,c5,eb5] ~@11", G: "~@12 [eb4,g4,bb4] ~@3",
  H: "~@4 [eb4,g4,bb4] ~@11", // Eb
})).s("gm_pizzicato_strings").gain(0.35)

// other · pizzicato strings · "Piz1"
const pizzicato_strings_2 = note(`<
  ~@5 A B C D A E A F ~ G H I J K H G L ~@6 A B C D A E A F ~ G H I J K H G L ~@7 M N O N ~ P ~ Q ~ R ~ S ~@12 A E A F ~
  G H I J K H G L G H I J K H G L ~
>`.pickRestart({
  A: "~@8 bb4 ~ c5 ~ eb5 ~ f5@2", B: "~@2 g5 ~ [bb4,eb5] ~@3 bb4 ~ c5 ~ f5 ~ [bb4,eb5]@2",
  C: "~@8 bb4 ~ c5 ~ eb5 ~ f5 ~", D: "~@2 g5 ~ [eb5,bb5] ~@3 bb4 ~ c5 ~ f5 ~ [bb4,eb5]@2",
  E: "~@2 g5 ~ [bb4,eb5] ~@3 bb4 ~ c5 ~ f5 ~ [bb4,eb5] ~", F: "~@2 g5 ~ [eb5,bb5] ~@3 bb4 ~ c5 ~ f5 ~ [bb4,eb5] ~",
  G: "~@8 f5 ~ eb5@3 ~ f5@2", H: "~@2 g5 ~ [eb5,g5] ~@11", I: "~@8 f5 ~ eb5@2 ~@2 f5@2", J: "~@2 g5 ~ [bb4,eb5] ~@11",
  K: "~@8 f5 ~ eb5 ~@3 f5@2", L: "~@2 g5 ~ bb4@2 ~@10, ~@4 eb5 ~@11", M: "bb4 ~ c5 ~ eb5 ~ f5@3 ~ g5 ~ [bb4,eb5] ~@3",
  N: "bb4 ~ c5 ~ f5 ~ [bb4,eb5] ~@9", O: "bb4 ~ c5 ~ eb5 ~ f5@3 ~ g5 ~ [eb5,bb5] ~@3",
  P: "f5 ~ eb5@3 ~ f5@3 ~ g5 ~ [eb5,g5] ~@3", Q: "f5 ~ eb5@2 ~@2 f5@3 ~ g5 ~ [bb4,eb5] ~@3",
  R: "f5 ~ eb5 ~@3 f5@2 ~@2 g5 ~ [eb5,g5] ~@3", S: "f5 ~ eb5@3 ~ f5@3 ~ g5 ~ bb4@2 ~@2, ~@12 eb5 ~@3",
})).s("gm_pizzicato_strings").gain(0.25)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@2 A B A C D E D F D B D G H I H I H I H I J D J D K B A D E D F D L D G H I H I H I H I J D J D M@2 B N O P O Q O R
  O R O R S T U V W X W X W X Y@2 B A D L D G H I H I H I H Z H I H I H I H Z ~
>`.pickRestart({
  A: "eb1@4 ~@2 eb1 ~ eb1@5 ~ eb1 ~", B: "eb1@4 ~@2 eb1 ~ eb1@4 ~@2 eb1 ~", C: "eb1@5 ~ eb1 ~ eb1@5 ~@3",
  D: "ab1@4 ~@2 ab1 ~ bb1@4 ~@2 bb1 ~", E: "eb1@3 ~@3 eb1 ~ eb1@4 ~@2 eb1 ~", F: "eb1@4 ~@2 eb1 ~ eb1@4 ~@2 eb1@2",
  G: "eb1@4 ~@2 eb1 ~ eb1@5 ~@3", H: "ab1@5 ~ ab1 ~ bb1@4 ~@2 bb1 ~", I: "eb1@4 ~@2 eb1 ~ eb1@6 ~@2",
  J: "c2@5 ~ c2 ~ g1@5 ~ g1 ~", K: "ab1@5 ~ ab1 ~ bb1@8", L: "eb1@4 ~@2 eb1 ~ eb1@6 eb1 ~",
  M: "[ab1@5 ~ ab1 ~ bb1@15 ~ eb1@4 ~@2 eb1 ~]/2", N: "eb1@5 ~ eb1 ~ ab1@4 ~@2 ab1 ~",
  O: "bb1@4 ~@2 bb1 ~ eb1@4 ~@2 eb1 ~", P: "eb1@6 eb1 ~ ab1@4 ~@2 ab1 ~", Q: "eb1@5 ~@3 ab1@5 ~ ab1 ~",
  R: "eb1@6 ~@2 ab1@5 ~ ab1 ~", S: "bb1@4 ~@2 bb1 ~ eb2@4 ~@2 eb2 ~", T: "eb2@6 eb2 ~ eb2@5 ~ eb2 ~",
  U: "eb2@2 ~@2 f2@2 ~@2 gb2@3 ~ gb2@2 ~@2", V: "db2@2 ~@2 db2@3 ~ b1@3 ~ b1@3 ~", W: "db2 ~ f2 ~ gb2 ~ gb2 ~",
  X: "db2 ~ db2 ~ b1 ~ b1 ~", Y: "bb1/2", Z: "eb2@4 ~@2 eb2 ~ eb2@6 eb2 ~",
})).s("gm_acoustic_bass").gain(0.4).pan(0.8)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  ~@2 A B A C D E D F D B D G H I H I H I H I J D J D K B A D E D F D L D G H I H I H I H I J D J D M@2 B N O P O Q O R
  O R O R O S T U V W V W V W X@2 B A D L D G H I H I H I H I H I H I H I H I ~
>`.pickRestart({
  A: "eb2@4 ~@2 eb2 ~ eb2@5 ~ eb2 ~", B: "eb2@4 ~@2 eb2 ~ eb2@4 ~@2 eb2 ~", C: "eb2@5 ~ eb2 ~ eb2@5 ~@3",
  D: "ab2@4 ~@2 ab2 ~ bb2@4 ~@2 bb2 ~", E: "eb2@3 ~@3 eb2 ~ eb2@4 ~@2 eb2 ~", F: "eb2@4 ~@2 eb2 ~ eb2@4 ~@2 eb2@2",
  G: "eb2@4 ~@2 eb2 ~ eb2@5 ~@3", H: "ab2@5 ~ ab2 ~ bb2@4 ~@2 bb2 ~", I: "eb2@4 ~@2 eb2 ~ eb2@6 ~@2",
  J: "c3@5 ~ c3 ~ g2@5 ~ g2 ~", K: "ab2@5 ~ ab2 ~ bb2@8", L: "eb2@4 ~@2 eb2 ~ eb2@6 eb2 ~",
  M: "[ab2@5 ~ ab2 ~ bb2@15 ~ eb2@4 ~@2 eb2 ~]/2", N: "eb2@5 ~ eb2 ~ ab2@4 ~@2 ab2 ~",
  O: "bb2@4 ~@2 bb2 ~ eb2@4 ~@2 eb2 ~", P: "eb2@6 eb2 ~ ab2@4 ~@2 ab2 ~", Q: "eb2@5 ~@3 ab2@5 ~ ab2 ~",
  R: "eb2@6 ~@2 ab2@5 ~ ab2 ~", S: "eb2@6 ~@2 eb2@4 ~@2 eb2 ~", T: "eb2@2 f2@2 ~@2 gb2 ~",
  U: "db2@2 ~@2 db2@3 ~ b1@3 ~ b1@3 ~", V: "db2 ~ f2 ~ gb2 ~ gb2 ~", W: "db2 ~ db2 ~ b1 ~ b1 ~", X: "bb1/2",
})).s("gm_electric_bass_finger").gain(0.19).pan(0.2)

// other · timpani
const timpani = note(`<
  ~@13 A B A B A B A B ~@15 A B A B A B A B ~@12 C ~ C ~ C ~ C ~@17 A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "~@14 bb1 eb2", B: "eb2 ~@3, bb1 ~@15", C: "~@6 bb1 eb2 eb2@4 ~@4, ~@8 bb1 ~@7",
})).s("gm_timpani").gain(0.48)

// drums · kick
const kick = s("bd").struct("<~@2 A@20 ~@5 A@18 ~@5 B A@14 C ~@9 A@22 ~>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "~@4 x ~@2 x", C: "x ~@2 x ~@4",
})).gain(0.16)

stack(string_ensemble_1, string_ensemble_1_soft, pizzicato_strings, pizzicato_strings_2, bass, bass_2, timpani, kick)

More by Enya