Strudelify

China Roses

Enya

KeyF majorTempo60 bpm
0:00/0:00
// China Roses — Enya
// 60 bpm, 6/8, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 63 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A@2 B C B D B E B D B C B D B E B D B C F G H I J K L@2 M N O@2 M N G P Q R S T@2 U V W X Y Z AA AB AC AB AD AB AC AB
  AE AB AC AF ~@4
>`.pickRestart({
  A: "[[f3,a3,c4,f4]@3 [c3,g3,c4,e4]]/2", B: "[f3,a3,c4,f4] [c3,g3,c4,e4]", C: "[f3,a3,c4,f4]",
  D: "[d3,a3,d4,f4]@3 [bb2,f3,d4,f4]@2 [c3,g3,c4,e4]", E: "[bb2,f3,d4,f4]@5 [c3,g3,c4,e4]",
  F: "[d3,f3,a3,d4] [a2,e3,a3,c4]", G: "[c3,g3,c4,e4] [f3,a3,c4,f4]", H: "[d3,f3,a3,d4] [bb2,f3,bb3,d4]",
  I: "[c3,e3,g3,c4,e4] [d3,f3,a3,d4]", J: "[a2,e3,a3,c4] [c3,g3,c4,e4]", K: "[f3,a3,c4,f4] [d3,f3,a3,d4]",
  L: "[[bb2,f3,bb3,d4] [c3,e3,g3,c4,e4]@2 [f3,a3,c4,f4]]/2", M: "[c3,g3,c4,e4] [d3,a3,d4,f4]",
  N: "[bb2,f3,d4,f4]@2 [c3,g3,c4,e4] [f3,a3,c4,f4]@3", // Bb C F
  O: "[[c3,g3,c4,e4]@3 [bb2,f3,d4,f4]@5 [c3,g3,c4,e4] [f3,a3,c4,f4]@3]/2", P: "[db3,f3,ab3,db4,f4] [f3,a3,c4,f4]",
  Q: "[db3,f3,ab3,db4,f4] [gb2,gb3,bb3,db4,gb4]", R: "[db3,f3,ab3,db4] [eb3,gb3,bb3,eb4]",
  S: "[e3,ab3,b3,e4] [b2,gb3,b3,eb4]", T: "[b2,gb3,b3,eb4] [bb2,gb3,bb3,db4]", U: "[b2,gb3,b3,eb4] [db3,ab3,db4,f4]",
  V: "[gb2,gb3,bb3,db4,gb4] [db3,f3,ab3,db4]", W: "[eb3,gb3,bb3,eb4] [e3,ab3,b3,e4]", X: "[b2,gb3,b3,eb4]!2",
  Y: "[bb2,gb3,bb3,db4] [eb2,gb3,bb3,eb4]", Z: "[ab2,eb3,ab3,c4,eb4] [db3,ab3,db4,f4]", AA: "[gb2,gb3,bb3,db4,gb4]",
  AB: "[gb3,bb3,db4,gb4] [db3,ab3,db4,f4]", AC: "[eb3,bb3,eb4,gb4]@3 [b2,gb3,eb4,gb4]@2 [db3,ab3,db4,f4]",
  AD: "[b2,gb3,eb4,gb4]@5 [db3,ab3,db4,f4]", AE: "[eb3,gb3,bb3,eb4]@3 [eb3,gb3,b3,eb4]@2 [db3,ab3,db4,f4]",
  AF: "[gb3,bb3,db4,gb4] ~", // Gb
})).s("gm_string_ensemble_2").gain(0.27)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes · Db B Db Gb Db Ebm B Db …
const string_ensemble_2_soft = note(`<
  ~@58
  [~ [db3,ab3,db4,f4]]
  [[b2,gb3,eb4,gb4]@5 [db3,ab3,db4,f4]]
  [[gb3,bb3,db4,gb4] [db3,ab3,db4,f4]]
  [[eb3,bb3,eb4,gb4]@3 [b2,gb3,eb4,gb4]@2 [db3,ab3,db4,f4]]
  [[gb3,bb3,db4,gb4] [db3,ab3,db4,f4]]
>`).s("gm_string_ensemble_2").gain(0.1)

// other · piano · "A.PIANO 1"
const piano = note(`<
  ~@3 A B C B D B C B A B C B D B C B A ~@7 E F G H G F G I J K ~@11 L M L N L M L O L M P ~@4
>`.pickRestart({
  A: "f3 c4 f4 a4 f4 c4 f3 c4 f4 a4 f4 c4", B: "f3 c4 f4 a4 f4 c4 c3 c4 e4 g4 e4 c4",
  C: "d3 a3 d4 f4 d4 a3 bb3 d4 f4 bb4 f4 c4", D: "bb3 d4 f4 bb4 f4 d4 bb3 d4 f4 bb4 f4 c4", E: "~@6 f3 c4 f4 a4 f4 c4",
  F: "c3 c4 e4 g4 e4 c4 d3 a3 d4 f4 d4 a3", G: "bb3 d4 f4 bb4 f4 c4 f3 c4 f4 a4 f4 c4",
  H: "c3 c4 e4 g4 e4 c4 bb3 d4 f4 bb4 f4 d4", I: "c3 c4 e4 g4 e4 c4 f3 c4 f4 a4 f4 c4",
  J: "f3 db4 f4 bb4 f4 db4 f3 c4 f4 a4 f4 c4", K: "f3 db4 f4 bb4 f4 db4 ~@6",
  L: "gb3 db4 gb4 bb4 gb4 db4 db3 db4 f4 ab4 f4 db4", M: "eb3 bb3 eb4 gb4 eb4 bb3 b3 eb4 gb4 b4 gb4 db4",
  N: "b3 eb4 gb4 b4 gb4 eb4 b3 eb4 gb4 b4 gb4 db4", O: "eb3 bb3 eb4 gb4 eb4 bb3 [b2,b3] eb4 gb4 b4 gb4 db4",
  P: "gb3 db4 gb4 bb4 gb4 db4 ~@6",
})).s("gm_piano").gain(0.05)

// other · piano · "A.PIANO 1" · soft notes
const piano_soft = note(`<
  ~@58
  [~@6 db3 db4 f4 ab4 f4 db4]
  [b3 eb4 gb4 b4 gb4 eb4 b3 eb4 gb4 b4 gb4 db4]
  [gb3 db4 gb4 bb4 gb4 db4 db3 db4 f4 ab4 f4 db4]
  [eb3 bb3 eb4 gb4 eb4 bb3 b3 eb4 gb4 b4 gb4 db4]
  [gb3 db4 gb4 bb4 gb4 db4 db3 db4 f4 ab4 f4 ~]
>`).s("gm_piano").gain(0.02)

// chords · recorder
const recorder = note("<~ A B C ~@16 D E F G H I J ~@36>".pickRestart({
  A: "f5 c6", B: "f5 g5", C: "f5 ~", D: "[f5,a5] a4 [f5,a5] a4 [f5,a5] ~@2 a4 [e5,g5] a4 [e5,g5] a4",
  E: "[e5,g5] c5 [e5,g5] c5 [e5,g5] c5 ~ f4 [c5,f5] f4 [c5,f5] f4", // Em F5
  F: "[f5,a5] a4 [f5,a5] a4 [f5,a5] a4 ~ bb4 [f5,bb5] bb4 [f5,bb5] bb4", // F Bb5
  G: "[e5,g5] c5 [e5,g5] c5 [e5,g5] c5 ~ a4 [f5,a5] a4 [f5,a5] a4", // Em F
  H: "~ a4 [e5,g5] a4 [e5,g5] a4 ~ c5 [e5,g5] c5 [e5,g5] c5", // Em
  I: "~ f4 [c5,f5] f4 [c5,f5] f4 ~ a4 [f5,a5] a4 [f5,a5] a4", // F5 F
  J: "~ bb4 [f5,bb5] bb4 [f5,bb5] bb4 ~ c5 [e5,g5] c5 [e5,g5] c5", // Bb5 Em
})).s("gm_recorder").gain(0.16)

// other · harpsichord · "HARPSICHRD"
const harpsichord = note("<~@12 A B A C A B A D ~@7 E F G H G F G I ~@13 J K J L J K J K J K M ~@4>".pickRestart({
  A: "f3 c4 f4 a4 f4 c4 c3 c4 e4 g4 e4 c4", B: "d3 a3 d4 f4 d4 a3 bb3 d4 f4 bb4 f4 c4",
  C: "bb3 d4 f4 bb4 f4 d4 bb3 d4 f4 bb4 f4 c4", D: "f3 c4 f4 a4 f4 c4 f3 c4 f4 a4 f4 c4", E: "~@6 f3 c4 f4 a4 f4 c4",
  F: "c3 c4 e4 g4 e4 c4 d3 a3 d4 f4 d4 a3", G: "bb3 d4 f4 bb4 f4 c4 f3 c4 f4 a4 f4 c4",
  H: "c3 c4 e4 g4 e4 c4 bb3 d4 f4 bb4 f4 d4", I: "c3 c4 e4 g4 e4 c4 f3 c4 f4 a4 f4 c4",
  J: "gb3 db4 gb4 bb4 gb4 db4 db3 db4 f4 ab4 f4 db4", K: "eb3 bb3 eb4 gb4 eb4 bb3 b3 eb4 gb4 b4 gb4 db4",
  L: "b3 eb4 gb4 b4 gb4 eb4 b3 eb4 gb4 b4 gb4 db4", M: "gb3 db4 gb4 bb4 gb4 db4 ~@6",
})).s("gm_harpsichord").gain(0.01)

// other · harpsichord · "HARPSICHRD" · soft notes
const harpsichord_soft = note("<~@35 A B ~@21 C D E F G>".pickRestart({
  A: "f3 db4 f4 bb4 f4 db4 f3 c4 f4 a4 f4 c4", B: "f3 db4 f4 bb4 f4 db4 ~@6", C: "~@6 db3 db4 f4 ab4 f4 db4",
  D: "b3 eb4 gb4 b4 gb4 eb4 b3 eb4 gb4 b4 gb4 db4", E: "gb3 db4 gb4 bb4 gb4 db4 db3 db4 f4 ab4 f4 db4",
  F: "eb3 bb3 eb4 gb4 eb4 bb3 b3 eb4 gb4 b4 gb4 db4", G: "gb3 db4 gb4 bb4 gb4 db4 db3 db4 f4 ab4 f4 ~",
})).s("gm_harpsichord").gain(0)

// bass · viola
const bass = note(`<
  ~@12 A B A C A D A E F G H I J K L@2 I M N O I O P Q R S T U@2 V W X Y Z AA AB W AC W AD W AE W AE W AC AF ~@4
>`.pickRestart({
  A: "f2 c2", B: "d2 bb1", C: "bb1@3 bb1@2 c2", D: "d2@3 bb1@2 c2", E: "f2", F: "d2 a1", G: "c2 f1", H: "d2@3 bb1@2 g1",
  I: "c2 d2", J: "a1 c2", K: "f1 d2", L: "[bb1@2 g1 c2@6 f2@3]/2", M: "bb1 f2", N: "c2 bb1", O: "bb1@2 c2 f2@3",
  P: "c2 f2", Q: "db2 f2", R: "db2 gb2", S: "db2 eb2", T: "e2 b1", U: "b1 bb1", V: "b1 db2", W: "gb2 db2", X: "eb2 e2",
  Y: "b1!2", Z: "bb1 eb2", AA: "c2 db2", AB: "gb2", AC: "eb2 b1", AD: "b1@3 b1@2 db2", AE: "eb2@3 b1@2 db2",
  AF: "gb2 ~",
})).s("gm_electric_bass_finger").gain(0.64)

// bass · viola · soft notes
const bass_soft = note("<~@58 [~ db2] [b1@3 b1@2 db2] [gb2 db2] [eb2@3 b1@2 db2] [gb2 db2]>")
  .s("gm_electric_bass_finger").gain(0.24)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@36 A B C D E F G H I J K L ~@8 M N O ~@4>".pickRestart({
  A: "~@8 [gb3,bb3,db4] gb3 [gb3,bb3,db4] gb3", // Gb
  B: "~@2 [db3,f3,ab3,db4] db3 [db3,f3,ab3,db4] db3 ~@2 [eb3,gb3,bb3,eb4] eb3 [eb3,gb3,bb3,eb4] eb3", // Db Ebm
  C: "~@2 [e3,ab3,b3,e4] e3 [e3,ab3,b3,e4] e3 ~@2 [b2,gb3,b3,eb4] b2 [b2,gb3,b3,eb4] b2", // E B
  D: "~@2 [b2,gb3,b3,eb4] b2 [b2,gb3,b3,eb4] b2 ~@2 [bb2,gb3,bb3,db4] bb2 [bb2,gb3,bb3,db4] bb2", // B Gb
  E: "~@2 [gb3,b3,eb4] b2 [gb3,b3,eb4] b2 ~@2 [gb3,bb3,db4] bb2 [gb3,bb3,db4] bb2", // B Gb
  F: "~@2 [gb3,b3,eb4] b2 [gb3,b3,eb4] b2 ~@2 [ab3,db4,f4] db3 [ab3,db4,f4] db3", // B Db
  G: "~@2 [gb3,bb3,db4] gb3 [gb3,bb3,db4] gb3 ~@2 [db3,f3,ab3,db4] db3 [db3,f3,ab3,db4] db3", // Gb Db
  H: "~@2 [eb3,gb3,bb3,eb4] eb3 [eb3,gb3,bb3,eb4] eb3 ~@2 [e3,ab3,b3,e4] e3 [e3,ab3,b3,e4] e3", // Ebm E
  I: "~@2 [b2,gb3,b3,eb4] b2 [b2,gb3,b3,eb4] b2 ~@2 [b2,gb3,b3,eb4] b2 [b2,gb3,b3,eb4] b2", // B
  J: "~@2 [bb2,gb3,bb3,db4] bb2 [bb2,gb3,bb3,db4] bb2 ~@2 [gb3,bb3,eb4] eb3 [gb3,bb3,eb4] eb3", // Gb Ebm
  K: "~@2 [c3,ab3,c4] c3 [c3,ab3,c4] c3 ~@2 [f3,ab3,db4] db3 [f3,ab3,db4] db3", // Fm Db
  L: "~@2 [gb3,bb3,db4] gb3 [gb3,bb3,db4] gb3 ~@2 [gb3,bb3,db4] gb3 [gb3,bb3,db4] gb3", M: "[bb3,db4] [db4,f4]",
  N: "[eb4,gb4]@3 [b3,eb4]@2 [db4,f4]", O: "[bb3,db4,gb4] [db4,f4]",
})).s("gm_string_ensemble_1").gain(0.21)

// chords · string ensemble 1 · "STRINGS" · soft notes · B B5 Db Bbm Db Ebm B Db …
const string_ensemble_1_soft = note(`<
  ~@59
  [[b3,eb4]@3 [b3,gb4]@2 [db4,f4]]
  [[bb3,db4] [db4,f4]]
  [[eb4,gb4]@3 [b3,eb4]@2 [db4,f4]]
  [[bb3,db4,gb4] [db4,f4]]
>`).s("gm_string_ensemble_1").gain(0.07)

stack(
  string_ensemble_2, string_ensemble_2_soft, piano, piano_soft, recorder, harpsichord, harpsichord_soft, bass,
  bass_soft, string_ensemble_1, string_ensemble_1_soft
)

More by Enya