Strudelify
KeyE minorTempo117 bpm
0:00/0:00
// Relax — Frankie Goes to Hollywood
// 117 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 2 "Ch  2" Syn Bass 2 -> synth bass 2; ch 5 "Ch  5" Harmo Pan -> pad warm; ch 13 "Ch 13" Syn Mallet -> marimba; ch 14 "Ch 14" Water Bell -> fx crystal
// note: Full arrangement: all 111 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117/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.

// bass · slap bass 1 · "Ch  1"
const bass = note("<~@5 A B@34 C ~@7 A B@16 D@2 B@21 C ~ A B@4 D@11 E ~@4>".pickRestart({
  A: "~@29 e1@3", B: "~@5 e1@3 ~@5 e1@3 ~@5 e1@3 ~@5 e1@3", C: "~@5 e1@3 ~@5 e1@3 ~@5 e1@3 ~@8",
  D: "~@5 e1@4 ~@4 e1@4 ~@4 e1@4 ~@4 e1@3", E: "~@5 e1@4 ~@4 e1@4 ~@4 e1@4 ~@7",
})).s("gm_slap_bass_1").gain(0.8)

// bass · synth bass 2 · "Ch  2"
const bass_2 = note(`<
  ~@5 A B@34 C ~@7 D E F E F E F E F@8 G ~ D E F E F E F E H B@7 I E F E F E G ~ D F@3 G J@12 ~@4
>`.pickRestart({
  A: "~@29 e1 ~@2", B: "~ e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@2",
  C: "~ e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@6", D: "~@29 e2 ~@2", E: "~ e2 ~@7 e2 ~@7 e2 ~@7 e2 ~@3 e2 ~@2",
  F: "~ e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@2",
  G: "~ e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@6",
  H: "~ e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e1 ~@2",
  I: "~ e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e1 ~@3 e2 ~@2", J: "~ e2 ~@7 e2 ~@7 e2 ~@7 e2 ~@6",
})).s("gm_synth_bass_2").gain(0.8)

// chords · pad warm · "Ch  3"
const pad_warm = note("<A@5 B@8 C@6 D@3 ~@3 C@6 D@3 ~@22 E@8 ~@18 F@5 G@7 H@8 I@5 ~@4>".pickRestart({
  A: "[~ [g3,b3,d4,e4,e5]@31]/5", // Em7
  B: "[~@29 d5 ~@6 d6@43 ~@12 a4@66 ~@62 a4@37, ~@29 b4@4 g4@60 ~@64 g4@60 [f#4,d5]@39, ~@15 e5@113, ~@30 d5@59 f#4@67 ~@2 [e4,d5]@60 d4@38, ~@31 e4@59 [d4,d5]@66 ~@3 b4@61 ~@36]/8", // D E7 D
  C: "[~@29 [e4,g4,d5]@64 [d4,f#4,a4,d5]@64 [e4,g4,d5]@35]/6", D: "[~@29 [d4,f#4,a4,d5]@64 ~@3]/3",
  E: "[~@29 [e3,b3,e4,g4]@64 [e3,d4,f#4,a4]@64 [e3,c4,e4,g4]@64 [e3,d4,f#4,a4]@35]/8", // Em D C D
  F: "[~@29 [e4,g4,b4,d5]@16 [e4,a4,c#5,e5]@16 [e4,g4,b4,e5]@32 [e4,g4,b4,d5]@16 [e4,a4,c#5,e5]@16 [e4,g4,b4,e5]@32 [e4,g4,b4,d5]@3]/5", // Em7 A Em Em7 A Em Em7
  G: "[~@13 [e4,a4,c#5,e5]@16 [e4,g4,b4,e5]@32 [e4,b4,e5]@60 ~@4 [b3,e4]@99]/7", // A Em E5
  H: "[~@29 [e4,g4,b4]@64 [d4,g4,a4]@64 [e4,g4,b4]@64 [d4,g4,a4]@35]/8", I: "[~@29 [e4,g4,b4]@64 [d4,g4,a4]@64 ~@3]/5",
})).s("gm_pad_warm").gain(0.27)

// other · pad choir · "Ch  4"
const pad_choir = note("<~@5 A@8 ~@98>".pickRestart({
  A: "[~@30 e4@60 d4@67 ~@60 d4@39, ~@79 e4@31 ~@18]/8",
})).s("gm_pad_choir").gain(0.24)

// chords · string ensemble 1 · "Ch  5"
const string_ensemble_1 = note("<~@13 A@8 ~@4 A@8 ~@16 B@8 ~@3 C ~@6 B@6 D E@8 F@5 G@7 H@8 I@4 J@5>".pickRestart({
  A: "[~@29 [e2,e3,e4,g4,b4]@64 [e2,e3,d4,f#4,a4]@64 [e2,e3,e4,g4,b4]@64 [e2,e3,d4,f#4,a4]@35]/8", // Em D Em D
  B: "[~ e2 ~@7 c#2 ~@7 d2 ~@7 d#2 ~@3 [e2,e3]@32 ~@3]/2", C: "~@17 b5 ~ b5 ~@12",
  D: "~ e2 ~@7 c#2 ~@7 d2 ~@7 d#2 ~@3 [e2,e3]@3", // E
  E: "[~@29 [e2,e4,g4,b4]@64 [e2,d4,f#4,a4]@64 [e2,e4,g4,b4]@64 [e2,d4,f#4,a4]@35]/8", // Em D Em D
  F: "[~@29 [d3,e3,g3,b3]@16 [e3,g3,a3,c#4]@16 [e3,g3,b3]@32 [d3,e3,g3,b3]@16 [e3,g3,a3,c#4]@16 [e3,g3,b3]@32 [d3,e3,g3,b3]@3]/5", // Em7 A7 Em Em7 A7 Em Em7
  G: "[~@13 [e3,g3,a3,c#4]@16 [e3,g3,b3]@32 [e2,e3,b3]@60 ~@4 [e2,e3]@99]/7", H: "[~@30 e6@127 ~ e6@98]/8",
  I: "[~@15 e6@49]/4", J: "[~@29 [e2,e3]@64 [e2,e3,e4]@64 ~@3]/5",
})).s("gm_string_ensemble_1").gain(0.29)

// other · french horn · "Ch  7"
const french_horn = note("<~@12 A@2 ~@97>".pickRestart({
  A: "[~@3 d5@36 ~@25, ~ d4@18 ~@13]/2",
})).s("gm_french_horn").gain(0.08)

// chords · pad poly · "Ch  7"
const pad_poly = note(`<
  ~@14 A B C D A B C D E ~ E ~ A B C D A B C D F G F G F G H@7 I@2 J K J K J K J K ~@10 J K J K J K J L@8 M ~@8 N@2 J N
  J K O P J K O P J K O P ~@4
>`.pickRestart({
  A: "~ [e4,g4,b4,d5] ~@7 [e4,g4,b4,d5] ~ g4 ~@5 [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~@5 [e4,g4,b4,d5] ~@6", // Em7
  B: "~ [e4,g4,b4,d5] ~@7 [e4,g4,b4,d5] ~@7 [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~@6", // Em7
  C: "~ [d4,g4,a4,d5] ~@7 [d4,g4,a4,d5] ~@7 [d4,g4,a4,d5] ~ [d4,g4,a4,d5] ~@5 [d4,g4,a4,d5] ~@6", // Dsus4
  D: "~ [d4,g4,a4,d5] ~@7 [d4,g4,a4,d5] ~@7 [d4,g4,a4,d5] ~ [d4,g4,a4,d5] ~ [d4,g4,a4,d5] ~ [d4,g4,a4,d5] ~ [d4,g4,a4,d5] ~@6", // Dsus4
  E: "~ [e4,g4,b4,c5,d5] ~ [e4,g4,a#4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5]@4 [e4,g4,b4,d5]@4 ~@2 [e4,g4,a4,c#5,e5]@4 [e4,g4,a4,c#5,e5]@5 ~@2", // Em7 A7
  F: "~@29 [e4,g4,b4,d5]@3", // Em7
  G: "~ [e4,g4,b4,c5,d5] ~ [e4,g4,a#4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5]@4 ~@2 [e4,g4,a4,c#5,e5] ~@3 [e4,g4,a4,c#5,e5]@7 ~@4", // Em7 A7
  H: "[~@29 [e1,e2]@63 ~ [d1,d2]@63 ~ [c1,c2]@63 ~ [a0,a1]@3]/7", I: "[~@13 [a0,a1]@16 [a0,a1]@32 ~@3]/2",
  J: "~ [e4,g4,b4,d5] ~ [e4,g4,a#4,b4,d5] ~ [e4,b4,d5] ~ [e4,b4,d5] ~ [e4,b4,d5] ~ [e4,g4,b4,d5]@4 ~@2 [e4,g4,a4,c#5] ~@3 [e4,g4,a4,c#5,e5]@6 ~@5", // Em7 E7 Em7 A7
  K: "~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@5 [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@3 [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@6", // Em7
  L: "[~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@5 [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@3 [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~ [b4,d5,e5] ~@5 [b4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~ [b4,d5,e5] ~ [b4,d5,e5] ~ [b4,d5,e5] ~ [b4,d5,e5] ~@7 [a4,d5,e5] ~@7 [a4,d5,e5] ~@7 [a4,d5,e5] ~@7 [a4,d5,e5] ~ [a4,d5,e5] ~@5 [a4,d5,e5] ~ [a4,d5,e5] ~@5 [a4,d5,e5] ~@7 [f5,a5,b5,e6]@2 [a4,d5,e5] ~ [a4,d5,e5] ~ [a4,d5,e5] ~ [a4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~ [b4,d5,e5] ~@5 [b4,d5,e5] ~@7 [b4,d5,e5] ~@7 [b4,d5,e5] ~ [b4,d5,e5] ~ [b4,d5,e5] ~ [b4,d5,e5] ~ [b4,d5,e5] ~@7 [a4,d5,e5] ~@7 [a4,d5,e5] ~@7 [a4,d5,e5] ~@7 [a4,d5,e5] ~ [a4,d5,e5] ~@4, ~@29 e2@127 ~ e2@99, ~@145 [a4,d5,e5] ~@4 [a5,b5,e6]@2 ~@104]/8", // Em7 E7 Asus4 Fmaj7 Asus4 E7 Asus4 Asus2
  M: "~ [a4,d5,e5] ~ [a4,d5,e5] ~@5 [a4,d5,e5] ~@7 [f5,a5,b5,e6]@2 [a4,d5,e5] ~ [a4,d5,e5] ~ [a4,d5,e5] ~ [a4,d5,e5] ~@6, ~@17 [a4,d5,e5] ~@4 [a5,b5,e6]@2 ~@8", // Asus4 Fmaj7 Asus4 Asus2
  N: "~ [e4,g4,a4,d5] ~@7 [e4,g4,a4,d5] ~@7 [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@3 [e4,g4,a4,d5] ~@6", // Em7
  O: "~ [d4,g4,a4,d5] ~@7 [d4,g4,a4,d5] ~@7 [d4,g4,a4] ~ [d4,g4,a4] ~@7 [e4,b4,d5] ~@4", // Dsus4 E7
  P: "~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@5 [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~ [e4,g4,a4,d5] ~@3 [e4,g4,a4,d5]@7 ~@4", // Em7
})).s("gm_pad_poly").gain(0.64)

// other · pad bowed · "Ch 11"
const pad_bowed = note("<~@13 [~@2 e5@4 d5@5 ~@21] ~@97>").s("gm_pad_bowed").gain(0.43)

// bass · lead 8 bass lead · "Ch 12"
const bass_3 = note("<~@33 A@6 ~@9 B@8 ~@10 B@8 ~@37>".pickRestart({
  A: "[~@29 e1@6 ~@2 c#1@6 ~@2 d1@6 ~@13]/2", B: "[~@29 e1@5 ~@4 c#1@5 ~@2 d1@5 ~@14]/2",
})).s("gm_lead_8_bass_lead").gain(0.41)

// chords · marimba · "Ch 13"
const marimba = note("<~@82 A@7 ~@22>".pickRestart({
  A: "[~@33 a5 ~@3 g5 ~@3 e5 ~ b4 ~ a4 ~@3 d4 ~@3 e4@3 ~@5 b3@32 ~@4 a5 ~@3 g5 ~@3 e5 ~ b4 ~ a4 ~@3 d4 ~@3 e4@3 ~@5 b3@32 ~@4 a5 ~@3 g5 ~@3 e5 ~ b4 ~ a4 ~@3 d4 ~@3 e4@3 ~@5 b3@32 ~@3, ~@29 g3@15 ~ a3@16 ~@32 g3@15 ~ a3@16 ~@32 g3@15 ~ a3@16 ~@35]/7",
})).s("gm_marimba").gain(0.69)

// drums · kick
const kick = s("bd").struct("<~@5 A B@28 C B C B C B@25 D E F B@21 G ~ A B@15 D E@3 H>".pickRestart({
  A: "~@29 x ~@2", B: "~@5 x ~@7 x ~@7 x ~@7 x ~@2", C: "~@5 x ~@7 x ~@7 x ~@8 x ~", D: "~@5 x ~@7 x ~@7 x ~@7 x ~ x",
  E: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  F: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2", G: "~@5 x ~@7 x ~@7 x ~@10",
  H: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@4",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~@5 A B@58 C ~ A B@21 C ~ A B@15 C ~@4>".pickRestart({
  A: "~@29 x ~@2", B: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2",
  C: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@6",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@98 [~@25 x ~@6] ~@3 [~@25 x ~@6] ~@3 [~@25 x ~@6] ~@4>").gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@22 A B A B ~@7 A B A B A B ~@9 A C A C A C A C ~@8 A D E C A C A C A C A ~@3 A ~@11 A C F ~ A G H ~ A G H ~ A G H
  ~@6
>`.pickRestart({
  A: "~@29 x ~@2", B: "~@5 x ~@26", C: "~@21 x ~@10", D: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2",
  E: "~ x ~@3 x ~@3 x ~@3 x ~@15 x ~@2", F: "~@13 x ~@18", G: "~@5 x ~@7 x ~@7 x ~@10", H: "~ x ~@27 x ~@2",
})).gain(0.72)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@34 A ~ A ~ A ~@27 B ~@44>".pickRestart({
  A: "~@13 x ~@18", B: "~@17 x ~@3 x ~@3 x ~@6",
})).gain(0.4)

stack(
  bass, bass_2, pad_warm, pad_choir, string_ensemble_1, french_horn, pad_poly, pad_bowed, bass_3, marimba, kick, hihat,
  low_tom, crash, crash_soft
)

More by Frankie Goes to Hollywood