Strudelify

Millenium Prayer

Cliff Richard

KeyD majorTempo95 bpm
0:00/0:00
// Millenium Prayer — Cliff Richard
// 95 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 104 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(95/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · fretless bass · "Bass"
const bass = note(`<
  ~ A B C D E F G A H I E G E J K H E L C M N O K P ~ Q A J Q R P J S C H O N T N I G E A I A M P L M P C I P T H U T C
  Q L E R A F S C H B P R E F G E ~@8 A U A M A I D E Q U Q D A J M E C E ~@3
>`.pickRestart({
  A: "d2@6 d3 ~@5 d2@17 ~ d2 ~", B: "a1@4 ~@2 a1 ~@5 a1@14 a2 ~@3 a1 ~", C: "d2@5 ~ d2 ~@5 d2@16 d2@2 d2 ~",
  D: "g2@5 ~ g2 ~@5 g2@14 d2@2 g2@2 g2 ~", E: "d2@4 ~@2 d2 ~@5 d2@16 d2@2 a1 ~", F: "a1@4 ~@2 a1 ~@5 a1@16 a1@2 e1 ~",
  G: "g2@4 ~@2 g2 ~@5 g2@16 g2@2 d2 ~", H: "d2@5 ~ d2 ~@5 d2@14 a1@2 d2@2 d2 ~", I: "a1@6 a2 ~@5 a1@17 ~ a1 ~",
  J: "a1 ~@5 a1 ~@5 a1@14 e1@2 a1@2 a1 ~", K: "g1@5 ~ g1 ~@5 g1@16 g1@2 g1 ~", L: "a1@5 ~ a1 ~@5 a1@14 e1@2 a1@2 a1 ~",
  M: "g1@6 g2 ~@5 g1@17 ~ g1 ~", N: "d2@5 ~ d2 ~@5 d2@18 d2 ~", O: "a1@5 ~ a1 ~@5 a1@16 a1@2 a1 ~",
  P: "d2 ~@5 d2 ~@5 d2@14 a1@2 d2@2 d2 ~", Q: "d2@4 ~@2 d2 ~@5 d2@14 d3 ~@3 d2 ~",
  R: "g1@4 ~@2 g1 ~@5 g1@14 g2 ~@3 g1 ~", S: "g2 ~@5 g2 ~@5 g2@14 d2@2 g2@2 g2 ~", T: "g1@5 ~ g1 ~@5 g1@18 g1 ~",
  U: "a1@5 ~ a1 ~@5 a1@18 a1 ~",
})).s("gm_fretless_bass").gain(0.25)

// chords · string ensemble 2 · "Slow Strings"
const string_ensemble_2 = note(`<
  ~ A B C D A B D C@2 B A D A B D C@2 B C D C B D C ~ C A E C D A B D A C E A D C B F C A E C D C E D C A E A D C B F
  A@2 B C D C E F C@2 B C F C G F C ~@8 H G C F H B D I C J A K I J K A C@3 ~@2
>`.pickRestart({
  A: "[f#4,d5]", B: "[a4,e5]", C: "[d5,a5]", D: "[d5,b5]", E: "[c#4,a4]", F: "[g4,d5]", G: "~ e5@31, a4",
  H: "~ a5@31, d5", I: "~ [d5,a5]@31", J: "~ [a4,e5]@31", K: "~ [d5,b5]@31",
})).s("gm_string_ensemble_2").gain(0.1)

// other · french horn
const french_horn = note(`<
  ~@27 A B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A ~@8 A B A C A B C
  A@2 B A C A B C A@3 ~@3
>`.pickRestart({
  A: "~ d3@31", B: "~ a2@31", C: "~ g2@31",
})).s("gm_french_horn").gain(0.2)

// other · french horn · soft notes
const french_horn_soft = note("<~ A B C D E B F C@2 G H I A G D H A G E I H J K H ~@79>".pickRestart({
  A: "[d4,a4]", B: "[a3,c#4]", C: "[d4,f#4]", D: "[g4,b4]", E: "[f#4,a4]", F: "[d4,g4]", G: "[a3,e4]",
  H: "~ d4@31, f#4", I: "[d4,b4]", J: "~ a3@31, c#4", K: "~ d4@31, g4",
})).s("gm_french_horn").gain(0.12)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@27 A B C D E B D A F G E H E B H C A B E H E I D C F I C J C B K C E G C H C I K F C I C K A L M A ~@8 C N O H C B M
  F P G O K O B J C F A ~@3
>`.pickRestart({
  A: "~@4 [a3,d4,f#4]@2 ~@2 [a3,d4,f#4]@2 ~@2 [a3,d4,f#4]@2 ~@6 [a3,d4,f#4]@2 ~@2 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~@3, d3", // D
  B: "~@4 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@2 ~@6 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4] ~@3 [a3,c#4,e4] ~@3, a2", // A
  C: "d3@16 d3@6 ~@2 [d3,d4,a4,f#5,a5]@3 ~@5, [f#4,a4,d5,f#5]@3 ~", D: "~ [g2,b3,b4]@31, d5", E: "~ [d3,a3,a4]@31, d5",
  F: "[d3,d4,a4,f#5]@9 ~@3 [d3,d4,a4] ~@3 [d4,a4,f#5]@3 ~@5 [d3,a3,a4,d5,a5]@3 ~@5, ~@12 f#5@2 ~@2 d3 ~@15", // D D5 D D5
  G: "a2@16 a2@6 ~@2 [a2,a3,e4,c#5,e5]@3 ~@5, [c#4,e4,a4,c#5]@3 ~", // A
  H: "[g2,d4,b4,g5]@9 ~@3 [g2,d4,b4] ~@3 [d4,b4,g5]@3 ~@5 [g2,b3,b4,d5,b5]@3 ~@5, ~@12 g5@2 ~@2 g2 ~@15", // G
  I: "~ [a2,e3,e4]@31, a4", // A5
  J: "~@4 [g3,b3,d4]@2 ~@2 [g3,b3,d4]@2 ~@2 [g3,b3,d4]@2 ~@6 [g3,b3,d4]@2 ~@2 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3, g2", // G
  K: "g2@16 g2@6 ~@2 [g2,d4,b4,g5,b5]@3 ~@5, [g4,b4,d5,g5]@3 ~", // G
  L: "[a2,a3,e4,c#5]@9 ~@3 [a2,a3,e4] ~@3 [a3,e4,c#5]@3 ~@5 [a2,e3,e4,a4,e5]@3 ~@5, ~@12 c#5@2 ~@2 a2 ~@15", // A A5 A A5
  M: "~ [g2,b3,b4,d5]@31", N: "~ [a2,e3,e4,a4]@31", O: "~ [d3,a3,a4,d5]@31",
  P: "~@4 [f#3,a3,d4]@2 ~@2 [f#3,a3,d4]@2 ~@2 [f#3,a3,d4]@2 ~@6 [f#3,a3,d4]@2 ~@2 [f#3,a3,d4] ~@3 [f#3,a3,d4] ~@3, d3", // D
})).s("gm_string_ensemble_1").gain(0.2)

// chords · church organ
const church_organ = note(`<
  ~@27 A B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A ~@8 A B A C A B C
  A@2 B A C A B C A@3 ~@3
>`.pickRestart({
  A: "[d3,a3,d4,f#4]", B: "[a2,e3,a3,c#4]", C: "[g2,d3,g3,b3]",
})).s("gm_church_organ").gain(0.15)

// chords · tremolo strings
const tremolo_strings = note(`<
  ~@27 A B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A@2 B A C A B C A ~@8 A B A C A B C
  D@2 E D F D E F D@3 G ~@2
>`.pickRestart({
  A: "~@4 a3@3 ~ d4@2 ~@2 a3@2 ~@2 d4@2 ~@2 a3@3 ~ d4@3 ~ a3@2 ~@2, a4",
  B: "~@4 e3@3 ~ a3@2 ~@2 e3@2 ~@2 a3@2 ~@2 e3@3 ~ a3@3 ~ e3@2 ~@2, e4",
  C: "~@4 b3@3 ~ d4@2 ~@2 b3@2 ~@2 d4@2 ~@2 b3@3 ~ d4@3 ~ b3@2 ~@2, b4",
  D: "~@4 a3@3 ~ d4@2 ~@2 a3@2 ~@2 d4@2 ~@2 a3@3 ~ d4@3 ~ a3@2 ~@2, ~ a4@31",
  E: "~@4 e3@3 ~ a3@2 ~@2 e3@2 ~@2 a3@2 ~@2 e3@3 ~ a3@3 ~ e3@2 ~@2, ~ e4@31",
  F: "~@4 b3@3 ~ d4@2 ~@2 b3@2 ~@2 d4@2 ~@2 b3@3 ~ d4@3 ~ b3@2 ~@2, ~ b4@31", G: "~ [a3,d4,a4]@31",
})).s("gm_tremolo_strings").gain(0.15)

// chords · french horn
const french_horn_2 = note(`<
  ~@27 A B A C D B E A@2 F G H A I H D G F D H D F C G A F D H D B E A D B A E G F H D A B D E G B H G ~@8 D B G E A B H
  J K L M N M L O M@3 ~@3
>`.pickRestart({
  A: "~ [a3,f#4,a4]", B: "[e3,c#4,e4]", C: "[b3,g4,b4]", D: "[a3,f#4,a4]", E: "~ [b3,g4,b4]", F: "~ [e3,c#4,e4]",
  G: "~ [f#4,a4], a3", H: "~ [g4,b4], b3", I: "~ [c#4,e4], e3", J: "~@17 f#4@15, a3, ~ a4", K: "~ f#4@31, [a3,a4]",
  L: "~@17 c#4@15, e3, ~ e4", M: "~@17 f#4@15, ~ [a3,a4]", N: "~@17 g4@15, b3, ~ b4", O: "~@17 g4@15, ~ [b3,b4]",
})).s("gm_french_horn").gain(0.24)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1_2 = note(`<
  ~@27 A B A C A B C A@2 B A C A B C A@2 B A C A B C D@2 E D F D E F D@2 E D F D E F D@2 E D G H I G H ~@8 H I H G H I G
  J@2 K J L J K L J@3 ~@3
>`.pickRestart({
  A: "[d2,f#3,a3,d4]", B: "[a2,c#3,e3,a3]", C: "[g2,g3,b3,d4]", D: "~ f#3@31, [d2,a3,d4]", E: "~ c#3@31, [a2,e3,a3]",
  F: "~ g3@31, [g2,b3,d4]", G: "~ [g3,b3]@31, [g2,d4]", H: "~ [f#3,a3]@31, [d2,d4]", I: "~ [c#3,e3]@31, [a2,a3]",
  J: "~ [f#3,a3,d4]@31, d2", K: "~ [c#3,e3,a3]@31, a2", L: "~ [g3,b3,d4]@31, g2",
})).s("gm_string_ensemble_1").gain(0.2)

// other · timpani
const timpani = note(`<
  ~@27 A B A C A B D E A B A C A B D E A B A C A B D E A B A C A B D E A B A C A B D E A B A C A B D E ~@8 A B A C A B D
  E A B A C A B D E A@2 ~@3
>`.pickRestart({
  A: "d3@13 ~ d3 ~", B: "a2@9 ~@3 a2@2 ~@2", C: "g2@9 ~@3 g2@2 ~@2", D: "g2@13 ~ g2 ~", E: "d3@9 ~@3 d3@2 ~@2",
})).s("gm_timpani").gain(0.35)

// other · trumpet
const trumpet = note("<~@67 A B C D E F G H ~@8 A B C D E F G H A B C I E J G H ~@5>".pickRestart({
  A: "~@5 d4@2 e4 ~ f#4@16 ~@3 e4 ~ d4@2", B: "e4 ~@3 a4 ~@3 a4@14 ~@2 a4@3 b4 ~@4",
  C: "a4@10 ~@2 d5 ~@3 d5@11 ~ b4@2 ~@2", D: "d5@4 b4 ~@3 a4 ~@2 a4@2 ~@3 g4@12 a4@2 g4@2, ~@5 b4 ~@10",
  E: "f#4@2 ~@3 a4 ~@2 a4 b4 a4 b4 a4!2 b4 a4 b4 a4!2 b4 a4 b4 a4 ~@5 g4 ~ f#4 ~", F: "e4 ~@3 a4 ~@3 a4@17 ~@3 d5 ~@3",
  G: "d5@12 b4 ~@3 b4@11 ~ a4@2 g4@2", H: "~ f#4@4 d4 ~@3 d4@23", I: "d5@4 b4 ~@3 a4 ~ b4@2 a4@2 ~@2 g4@12 a4@2 g4@2",
  J: "~ e4 ~@2 a4 ~@3 a4@17 ~@3 d5 ~@3",
})).s("gm_trumpet").gain(0.28)

// drums · kick
const kick = s("bd").struct("<~@103 [~ x]>").gain(0.36)

// drums · snare
const snare = s("sd").struct(`<
  A B C D E F G H E I C J E K L M L C@2 N G O C P E Q R N L S E Q T S E U C V E F R U E W C X G Y R Z E AA AB AC E M R
  AD E AE R AF E H C Y E AG C AH G AI C AJ E AK AL AA E AM C AK T AN L AO E AP L AQ E H G H E AD G A E AR Y P AS AT
>`.pickRestart({
  A: "x ~@2 x!4 ~ x ~@3 x ~ x ~", B: "x ~@2 x!4 ~ x ~ x ~ x ~ x ~", C: "x ~ x ~ x!3 ~ x ~ x ~ x ~@3",
  D: "x ~@2 x!2 ~ x!3 ~ x ~ x ~ x ~", E: "x ~@3 x!3 ~ x ~@3 x ~@3", F: "x ~@2 x!2 ~ x ~ x ~@3 x ~@3", G: "x!7 ~",
  H: "x ~ x!7 ~ x ~ x ~ x ~", I: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", J: "x ~ x!3 ~ x!3 ~@3 x ~@3",
  K: "x ~@3 x ~ x!3 ~ x ~ x ~@3", L: "x ~@3 x!3 ~ x ~ x ~ x ~@3", M: "x ~ x!6", N: "x ~@2 x!2 ~ x!3 ~ x ~ x ~@3",
  O: "x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~", P: "x ~ x!5 ~ x ~ x ~ x ~@3", Q: "x ~@3 x!2 ~@2 x ~ x ~ x ~ x ~",
  R: "x ~ x ~ x!3 ~ x ~@3 x ~@3", S: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~", T: "x ~ x!3 ~ x ~",
  U: "x ~ x ~ x ~ x!3 ~ x ~ x ~@3", V: "x ~ x ~ x!5 ~@3 x ~@3", W: "x ~@2 x!6 ~@3 x ~ x ~",
  X: "x ~ x ~ x!2 ~ x!2 ~ x ~ x ~ x ~", Y: "x ~ x ~ x!5 ~ x ~ x ~@3", Z: "x ~ x!3 ~ x!3 ~@3 x ~ x ~",
  AA: "x ~ x!3 ~ x!3 ~ x ~ x ~ x ~", AB: "x!5 ~ x ~", AC: "x ~ x!5 ~", AD: "x ~@2 x!6 ~ x ~ x ~ x ~",
  AE: "x ~@2 x!4 ~ x ~ x ~ x ~@3", AF: "x ~ x!3 ~ x!3 ~ x ~ x ~@3", AG: "x ~ x!3 ~ x ~ x ~ x ~ x ~@3",
  AH: "x ~@2 x!6 ~@3 x ~@3", AI: "x ~@3 x!5 ~ x ~ x ~@3", AJ: "x ~@2 x!3 ~ x!2 ~@3 x ~ x ~",
  AK: "x ~@3 x!5 ~ x ~ x ~ x ~", AL: "x ~@3 x!2 ~ x!2 ~@3 x ~ x ~", AM: "x ~@3 x!2 ~ x!2 ~ x ~ x ~ x ~",
  AN: "x ~@2 x!3 ~@2 x ~ x ~ x ~ x ~", AO: "x!3 ~ x ~ x!2", AP: "x ~ x!4 ~@2 x ~ x ~ x ~ x ~",
  AQ: "x ~ x!7 ~ x ~ x ~@3", AR: "x ~@3 x ~ x!3 ~@3 x ~ x ~", AS: "x!8", AT: "x!2 ~@6 x ~@7",
})).gain(0.24)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@2 A ~ B ~ C ~ B ~ D ~ B ~ C ~ B ~ A ~ B ~ E ~ B ~ D ~ D ~ B ~ B ~ B ~ B ~ B ~ F ~ B ~ A ~ F ~ A ~ B ~ D ~ B ~ F ~ B
  ~ E ~ B ~ A ~ B ~ C ~ B ~ A ~ B ~@3 B ~ A ~ C ~ C ~ B ~ E ~ B ~ C ~ B ~ D ~ B ~@4 G
>`.pickRestart({
  A: "~@14 x!2", B: "~@7 x ~@6 x!2", C: "~@7 x ~@6 x ~", D: "~@7 x ~@7 x", E: "~@7 x", F: "~@15 x", G: "~@2 x!6 ~@8",
})).gain(0.12)

// drums · crash
const crash = s("cr").struct(`<
  A@2 ~ A@3 ~ A@9 ~ A@3 ~ A ~ A@9 ~ A@11 ~ A ~ A ~ A@15 ~ A@13 ~ A ~ A@21 B C
>`.pickRestart({
  A: "x", B: "x!2", C: "~ x",
})).gain(0.36)

stack(
  bass, string_ensemble_2, french_horn, french_horn_soft, string_ensemble_1, church_organ, tremolo_strings,
  french_horn_2, string_ensemble_1_2, timpani, trumpet, kick, snare, snare_soft, crash
)

More by Cliff Richard