Strudelify
Relax cover art

Maximum Joy

Relax

Frankie Goes to Hollywood

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 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 43 ms ahead of the beat; the grid follows it, so its parts stay together.
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, A@4 for four bars: edit a riff to change every repeat.

// bass · slap bass 1 · "Ch  1"
const bass = note("<~@5 A@8 B@24 C@4 ~@7 A@8 B@32 D ~ A@8 B@8 D ~@4>".pickRestart({
  A: "[~@15 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1]/8",
  B: "[~@3 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1]/8",
  C: "[~@3 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@2 e1@2 ~@3]/4",
  D: "~@3 e1@2 ~@2 e1@2 ~@2 e1@2 ~@3",
})).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: "~@15 e1", B: "~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1", C: "~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~@2", D: "~@15 e2",
  E: "~ e2 ~@3 e2 ~@3 e2 ~@3 e2 ~ e2", F: "~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2",
  G: "~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~@2", H: "~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e1",
  I: "~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e2", J: "~ e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@2",
})).s("gm_synth_bass_2").gain(0.8)

// chords · pad warm · "Ch  3"
const pad_warm = note("<A@6 B@7 C@6 D@3 ~@3 C@6 D@3 ~@22 E@8 ~@18 F@5 G@7 H@8 I@5 ~@4>".pickRestart({
  A: "[~@3 [g3,b3,d4,e4,e5]@92 [b4,d5]]/6", // Em7 Bm
  B: "[~@2 d6@22 ~@6 [a4,d5]@33 ~ [e4,b4]@29 ~ a4@18, e5, e4@29 [d4,f#4]@33 ~@31 [d4,f#4,d5]@19, ~ g4@30 ~@32 [g4,d5]@31 ~@18]/7", // D5 E5 D G5
  C: "[~@15 [e4,g4,d5]@32 [d4,f#4,a4,d5]@32 [e4,g4,d5]@17]/6", D: "[~@15 [d4,f#4,a4,d5]@32 ~]/3",
  E: "[~@15 [e3,b3,e4,g4]@32 [e3,d4,f#4,a4]@32 [e3,c4,e4,g4]@32 [e3,d4,f#4,a4]@17]/8", // Em D C D
  F: "[~@15 [e4,g4,b4,d5]@8 [e4,a4,c#5,e5]@8 [e4,g4,b4,e5]@16 [e4,g4,b4,d5]@8 [e4,a4,c#5,e5]@8 [e4,g4,b4,e5]@16 [e4,g4,b4,d5]]/5", // Em7 A Em Em7 A Em Em7
  G: "[~@7 [e4,a4,c#5,e5]@8 [e4,g4,b4,e5]@16 [e4,b4,e5]@30 ~@2 [b3,e4]@49]/7", // A Em E5
  H: "[~@15 [e4,g4,b4]@32 [d4,g4,a4]@32 [e4,g4,b4]@32 [d4,g4,a4]@17]/8", I: "[~@15 [e4,g4,b4]@32 [d4,g4,a4]@32 ~]/5",
})).s("gm_pad_warm").gain(0.27)

// other · pad choir · "Ch  4"
const pad_choir = note("<~@5 A@6 B@3 ~@97>".pickRestart({
  A: "[~@15 e4@30 d4@33 ~ e4@17]/6", B: "[~@13 d4@33 ~@2]/3",
})).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: "[~@15 [e2,e3,e4,g4,b4]@32 [e2,e3,d4,f#4,a4]@32 [e2,e3,e4,g4,b4]@32 [e2,e3,d4,f#4,a4]@17]/8", // Em D Em D
  B: "[~ e2 ~@3 c#2 ~@3 d2 ~@3 d#2 ~ [e2,e3]@16 ~]/2", C: "~@9 b5!2 ~@5", D: "~ e2 ~@3 c#2 ~@3 d2 ~@3 d#2 ~ [e2,e3]",
  E: "[~@15 [e2,e4,g4,b4]@32 [e2,d4,f#4,a4]@32 [e2,e4,g4,b4]@32 [e2,d4,f#4,a4]@17]/8", // Em D Em D
  F: "[~@15 [d3,e3,g3,b3]@8 [e3,g3,a3,c#4]@8 [e3,g3,b3]@16 [d3,e3,g3,b3]@8 [e3,g3,a3,c#4]@8 [e3,g3,b3]@16 [d3,e3,g3,b3]]/5", // Em7 A7 Em Em7 A7 Em Em7
  G: "[~@7 [e3,g3,a3,c#4]@8 [e3,g3,b3]@16 [e2,e3,b3]@30 ~@2 [e2,e3]@49]/7", H: "[~@15 e6@63 ~ e6@49]/8",
  I: "[~@15 e6@49]/4", J: "[~@15 [e2,e3]@32 [e2,e3,e4]@32 ~]/5",
})).s("gm_string_ensemble_1").gain(0.29)

// other · french horn · "Ch  7"
const french_horn = note("<~@12 A@2 ~@97>".pickRestart({
  A: "[~ [d4,d5]@9 ~@6]/2", // D
})).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 ~ F ~ A B C D A B C D G@6 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] ~@3 [e4,g4,b4,d5] g4 ~@2 [e4,g4,b4,d5]!2 ~@2 [e4,g4,b4,d5] ~@2", // Em7
  B: "~ [e4,g4,b4,d5] ~@3 [e4,g4,b4,d5] ~@3 [e4,g4,b4,d5]!5 ~@2", // Em7
  C: "~ [d4,g4,a4,d5] ~@3 [d4,g4,a4,d5] ~@3 [d4,g4,a4,d5]!2 ~@2 [d4,g4,a4,d5] ~@2", // Dsus4
  D: "~ [d4,g4,a4,d5] ~@3 [d4,g4,a4,d5] ~@3 [d4,g4,a4,d5]!5 ~@2", // Dsus4
  E: "~ [e4,g4,b4,c5,d5] [e4,g4,a#4,b4,d5] [e4,g4,b4,d5]!3 [e4,g4,b4,d5]@2 [e4,g4,b4,d5]@2 ~ [e4,g4,a4,c#5,e5]@2 [e4,g4,a4,c#5,e5]@3", // Em7 A7
  F: "~ [e4,g4,b4,c5,d5] [e4,g4,a#4,b4,d5] [e4,g4,b4,d5]!3 [e4,g4,b4,d5]@2 [e4,g4,b4,d5]@2 ~ [e4,g4,a4,c#5,e5]@2 [e4,g4,a4,c#5,e5]@2 ~", // Em7 A7
  G: "[~@15 [e4,g4,b4,d5]@2 [e4,g4,b4,c5,d5] [e4,g4,a#4,b4,d5] [e4,g4,b4,d5]!3 [e4,g4,b4,d5]@2 ~ [e4,g4,a4,c#5,e5] ~ [e4,g4,a4,c#5,e5]@4 ~]/2", // Em7 A7
  H: "[~@15 [e1,e2]@32 [d1,d2]@32 [c1,c2]@32 [a0,a1]]/7", I: "[~@7 [a0,a1]@8 [a0,a1]@16 ~]/2",
  J: "~ [e4,g4,b4,d5] [e4,g4,a#4,b4,d5] [e4,b4,d5]!3 [e4,g4,b4,d5]@2 ~ [e4,g4,a4,c#5] ~ [e4,g4,a4,c#5,e5]@3 ~@2", // Em7 E7 Em7 A7
  K: "~ [e4,g4,a4,d5]!2 ~@2 [e4,g4,a4,d5]!3 ~ [e4,g4,a4,d5]!5 ~@2", // Em7
  L: "[~ [e4,g4,a4,d5]!2 ~@2 [e4,g4,a4,d5]!3 ~ [e4,g4,a4,d5]!5 ~@3 [b4,d5,e5] ~@3 [b4,d5,e5] ~@3 [b4,d5,e5] ~@3 [b4,d5,e5]!2 ~@2 [b4,d5,e5] ~@3 [b4,d5,e5] ~@3 [b4,d5,e5]!5 ~@3 [a4,d5,e5] ~@3 [a4,d5,e5] ~@3 [a4,d5,e5] ~@3 [a4,d5,e5]!2 ~@2 [a4,d5,e5]!2 ~@2 [a4,d5,e5] ~@3 [a4,d5,e5,f5,a5,b5,e6] [a4,d5,e5] [a4,d5,e5,a5,b5,e6] [a4,d5,e5]!2 ~@3 [b4,d5,e5] ~@3 [b4,d5,e5] ~@3 [b4,d5,e5] ~@3 [b4,d5,e5]!2 ~@2 [b4,d5,e5] ~@3 [b4,d5,e5] ~@3 [b4,d5,e5]!5 ~@3 [a4,d5,e5] ~@3 [a4,d5,e5] ~@3 [a4,d5,e5] ~@3 [a4,d5,e5]!2 ~, ~@15 e2@64 e2@49]/8", // Em7 E7 Asus4 Bm7b5 Asus4 E7 Asus4
  M: "~ [a4,d5,e5]!2 ~@2 [a4,d5,e5] ~@3 [a4,d5,e5,f5,a5,b5,e6] [a4,d5,e5] [a4,d5,e5,a5,b5,e6] [a4,d5,e5]!2 ~@2", // Asus4 Bm7b5 Asus4
  N: "~ [e4,g4,a4,d5] ~@3 [e4,g4,a4,d5] ~@3 [e4,g4,a4,d5]!3 ~ [e4,g4,a4,d5] ~@2", // Em7
  O: "~ [d4,g4,a4,d5] ~@3 [d4,g4,a4,d5] ~@3 [d4,g4,a4]!2 ~@3 [e4,b4,d5] ~", // Dsus4 E7
  P: "~ [e4,g4,a4,d5]!2 ~@2 [e4,g4,a4,d5]!5 ~ [e4,g4,a4,d5]@3 ~@2", // Em7
})).s("gm_pad_poly").gain(0.64)

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

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

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

// drums · kick
const kick = s("bd").struct("<~@5 A B@59 C@2 B@21 D ~ A B@16 C@3 E>".pickRestart({
  A: "~@15 x", B: "~@3 x ~@3 x ~@3 x ~@3 x", C: "x!16", D: "~@3 x ~@3 x ~@3 x ~@4", E: "x!15 ~",
})).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: "~@15 x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@98 [~@13 x ~@2] ~@3 [~@13 x ~@2] ~@3 [~@13 x ~@2] ~@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: "~@15 x", B: "~@3 x ~@12", C: "~@11 x ~@4", D: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", E: "~ x ~ x ~ x ~ x ~@7 x",
  F: "~@7 x ~@8", G: "~@3 x ~@3 x ~@3 x ~@4", H: "~ x ~@13 x",
})).gain(0.72)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@34 A ~ A ~ A ~@27 B ~@44>".pickRestart({
  A: "~@7 x ~@8", B: "~@9 x ~ x ~ x ~@2",
})).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