Strudelify
Relax (Frankie Goes to Dreamscape) cover art

Maximum Joy

Relax (Frankie Goes to Dreamscape)

Frankie Goes to Hollywood

KeyE minorTempo122 bpm
0:00/0:00
// Relax (Frankie Goes to Dreamscape) — Frankie Goes to Hollywood
// 122 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 12 "GUITAR CL" named as a guitar, played on electric guitar clean (its slap bass 2 patch is not one)
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): HARMONIC, GUITAR DI.
setcpm(122/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 · "BASS"
const bass = note("<~@4 A@35 B ~ C ~ D E F G A@16 ~@2 A@20 ~@2 A@16 H@4 ~@3>".pickRestart({
  A: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~", B: "e2 ~@15", C: "d2 ~@15", D: "c2 ~@15", E: "~@12 d2 e2 g1 g#1",
  F: "a1@7 ~", G: "a1@3 ~ a1@2 ~@2 a1@2 ~@2 a1@3 ~", H: "e1 ~ e1 ~ e1 ~ e1 ~",
})).s("gm_slap_bass_1").gain(0.64)

// chords · synth strings 1 · "SYNTH"
const synth_strings_1 = note(`<
  A@20 ~@4 A@8 ~@7 B@2 C@2 D@2 E@2 ~@8 F@2 G@2 H@2 G@2 I@2 ~@6 F@2 G@2 F@2 G@2 J K J K J K ~@2 L@8 F@2 G@2 F@2 G@2 ~@2
  M@2 N@2 ~
>`.pickRestart({
  A: "[[e4,g4,b4,e5] [f#4,a4,d5], d4]/4", B: "[e1,e3,g4]/2", C: "[d1,d2,f#4]/2", D: "[c1,c2,e4]/2", E: "[a1,a2,c#4]/2",
  F: "[e3,e4,g4,b4]/2", G: "[d3,d4,f#4,a4]/2", H: "[c3,c4,e4,g4]/2", I: "e3/2", J: "d4 e4", K: "b3",
  L: "[e3,e4,g4,b4]/8", M: "[[e4,e5] d5 g5 a5, ~ d4@3]/2", N: "[[e2,e4]@31 ~]/2",
})).s("gm_synth_strings_1").gain(0.24).pan(0.3)

// chords · synth brass 1 · "SYNTH STA"
const synth_brass_1 = note(`<
  ~@20 A ~ A ~ B C D@2 B C D@2 ~ A ~ E ~ F ~@7 G H A ~ A ~ A ~ A ~@2 I@2 J@2 K@2 L M N A ~ A ~ A ~@9 O P O P O P Q@2 ~@2
  A ~ A ~ A ~ R S T U R S T U ~@2 V W ~@3
>`.pickRestart({
  A: "~@2 [g4,b4,d5]!4 [b4,d5] [g4,b4,d5]@3 [g4,b4,e5] ~ [a4,c#5,e5] ~@3", // G Bm G Em A
  B: "g4@2 [b4,e5] ~@3 [g4,b4,e5]!3 ~ [g4,b4,e5] ~@5", C: "g4@2 [b4,e5] ~@3 [g4,b4,e5]!3 ~ [g4,b4,e5] ~ g4 [b4,e5] ~@2",
  D: "f#4@2 [a4,d5] ~@3 [f#4,a4,d5]!3 ~ [f#4,a4,d5] ~ f#4 [a4,d5] ~@2", // D5 D D5
  E: "[g4,b4,d5] ~ [g4,b4,d5]!4 [b4,d5] [g4,b4,d5]@3 [g4,b4,e5] ~ [a4,c#5,e5] ~@3", // G Bm G Em A
  F: "~@2 [g4,b4,d5,g5]!4 [b4,d5] [g4,b4,d5,g5]@3 [g4,b4,e5,g5] ~ [a4,c#5,e5,g5] ~@3", G: "[c#5,e5]@7 ~ [c#5,e5]@6 ~@2",
  H: "[c#5,e5]@3 ~ [c#5,e5]@3 ~ [c#5,e5]@3 ~ [c#5,e5]@4", // C#m
  I: "[~@8 d5@2 ~@4 d5 f#5@2 d5 e5 ~@13, ~@5 e5 f#5 ~@9, ~@11 d5@2 e5@2 e5 ~@16]/2",
  J: "[~@8 d5@2 ~ d5@2 ~ d5 f#5@2 d5 e5 ~@13, ~@10 e5@2 ~ e5@2 e5 ~@16]/2",
  K: "[~@8 d5@2 ~@4 d5 a5@2 d5 e5 ~@13, ~@5 e5 a5 ~@9, ~@11 d5@2 e5@2 e5 ~@16]/2",
  L: "~@8 d5@2 ~@3 e5@2 a5, ~@5 e5 a5 ~, ~@11 d5@2 ~@3", M: "f#5@2 e5 ~ f#5@2 e5 ~ f#5@2 e5 ~ f#5@2 e5 ~",
  N: "~@4 [g4,b4,e5]!4 [b4,e5] [g4,b4,e5]!7", O: "d4 e4", P: "b3", Q: "[e2,b2]/2",
  R: "[e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~@3 [g4,b4,d5] [e4,g4,b4,d5]@2 ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~@3", // Em7 G Em7
  S: "[e4,g4,b4,d5] ~ [e4,g4,b4,d5] ~@3 [e4,g4,b4,d5]!3 ~ [e4,g4,b4,d5] ~ [e4,g4,b4,d5]!2 ~@2", // Em7
  T: "[d4,f#4,a4,d5] ~ [d4,f#4,a4,d5] ~@3 [f#4,a4,d5] [d4,f#4,a4,d5]@2 ~ [d4,f#4,a4,d5] ~ [d4,f#4,a4,d5] ~@3", // D
  U: "[d4,f#4,a4,d5] ~ [d4,f#4,a4,d5] ~@3 [d4,f#4,a4,d5]!3 ~ [d4,f#4,a4,d5] ~ [d4,f#4,a4,d5]!2 ~@2", // D
  V: "[e3,e4] [d3,d4]", W: "g4 a4, e3",
})).s("gm_synth_brass_1").gain(0.25).pan(0.8)

// chords · brass section · "BRASS STA"
const brass_section = note(`<
  ~@39 A@2 B@2 C@2 D@2 ~ E ~ F ~ E ~ G ~@11 F ~ E ~ G ~@17 E ~ F ~ E ~ H I ~@2 J I ~@2 J ~@4 K@2 ~
>`.pickRestart({
  A: "[e2@15 ~]/2", B: "[d2@15 ~]/2", C: "[c2@15 ~]/2", D: "a1/2",
  E: "[g4,b4,d5,e5] ~ [g4,b4,d5,e5] ~@3 [g4,b4,d5,e5]!3 ~ [g4,b4,d5,e5] ~ [g4,b4,d5,e5]!2 ~@2", // Em7
  F: "[g4,b4,d5,e5] ~ [g4,b4,d5,e5] ~@3 [g4,b4,d5,e5]!3 ~ [g4,b4,d5,e5] ~ d5 [g4,b4,d5,e5] ~@2", // Em7
  G: "[g4,b4,d5,e5,g5] ~ [g4,b4,d5,e5,g5] ~@3 [g4,b4,d5,e5,g5] [b4,d5,e5] [g4,b4,d5,e5,g5] ~ [g4,b4,d5,e5,g5] ~ [g4,b4,d5,e5,g5]!2 ~@2", // Em7 E7 Em7
  H: "[b4,d5,e5,g5] ~ [b4,d5,e5,g5] ~@3 [g4,b4,d5,e5,g5] [b4,d5,e5] [g4,b4,d5,e5,g5] ~ [g4,b4,d5,e5,g5] ~ [g4,b4,d5,e5,g5]!2 ~@2", // Em7 E7 Em7
  I: "~@3 [e5,g5,b5]", J: "~@10 [d5,f#5,a5] ~ [d5,f#5,a5]@4", K: "[[e1,e2]@15 ~]/2",
})).s("gm_brass_section").gain(0.19).pan(0.9)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@55 A@8 ~@8 B@2 C D E@2 F@2 ~@16 B@2 C D E@2 F@2 ~@7>".pickRestart({
  A: "~@2 [e4,e5,e6] ~@3 [e4,e5,e6] ~@3 [e4,e5,e6] ~@3 [e4,e5,e6] ~", // E
  B: "[g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5] ~", // Em
  C: "[a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~", // D5 D
  D: "[f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~", // D
  E: "[b4,e5,g5] ~ [b4,e5,g5] ~ [b4,e5,g5] ~ [b4,e5,g5] ~ [b4,e5,g5] ~ [b4,e5,g5] ~ [b4,e5,g5] ~ [b4,e5,g5] ~", // Em
  F: "[d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~", // D
})).s("gm_string_ensemble_1").gain(0.22).pan(0.7)

// other · lead 1 square · "SQUARE SY"
const lead_1_square = note("<~@39 A B C D E F G H I ~@31 J ~ J ~ J ~@26>".pickRestart({
  A: "e5 b4 g4 e5 b4 g4 e5 b4 g4 e5 b4 g4 e5 b4 g4 [b4,e5]", // E5
  B: "[b4,e5] [g4,b4]!2 e5 b4 g4 e5 b4 g4 e5 b4 g4 e5 b4 g4 [b4,e5]", // E5 G E5
  C: "[b4,d5] [g4,a4] [f#4,b4] d5 a4 f#4 d5 a4 f#4 d5 a4 f#4 d5 a4 f#4 [a4,d5]", // Bm Gsus2 B5 D5
  D: "[a4,d5] [f#4,a4]!2 d5 a4 f#4 d5 a4 f#4 d5 a4 f#4 d5 a4 f#4 [a4,d5]", // D5 F#m D5
  E: "[a4,c5] [f#4,g4] [e4,a4] c5 g4 e4 c5 g4 e4 c5 g4 e4 c5 g4 e4 [g4,c5]", // Am Gmaj7 A5 C5
  F: "[g4,c5] [e4,g4]!2 c5 g4 e4 c5 g4 e4 c5 g4 e4 c5 g4 e4 [g4,c5]", // C5 Em C5
  G: "[g4,a4] [e4,c#5] [g4,e5] [e4,a4] [a4,c#5] [c#5,e5] [e4,e5] [e4,a4] [a4,c#5] [c#5,e5] [e4,e5] [e4,a4] [a4,c#5] [c#5,e5] [e4,e5] [e4,a4]", // Gsus2 C#m C A5 A C#m E A5 …
  H: "[a4,c#5] [c#5,e5] [e4,e5] [e4,a4] [a4,c#5] [c#5,e5] [e4,e5] [a4,e5] c#5 [a4,e5] [e4,e5] [c#5,e5] [a4,c#5] [e4,a4] [e4,e5] c#5", // A C#m E A5 A C#m E A5 …
  I: "a4 ~@15", J: "~@2 a5 e5 g5 d5 e5 b4 a4@2 d4@2 e4@3 ~",
})).s("gm_lead_1_square").gain(0.4)

// chords · overdriven guitar · "SFX"
const overdriven_guitar = note("<~@86 A@2 ~ A@2 ~ A@2 ~@16>".pickRestart({
  A: "[~@15 [g3,a3,d4]@17]/2", // Gsus2
})).s("gm_overdriven_guitar").gain(0.4).pan(0)

// other · acoustic guitar nylon · "SFX"
const acoustic_guitar_nylon = note("<~@103 A@4 ~@3>".pickRestart({
  A: "[c4@15 ~]/4",
})).s("gm_acoustic_guitar_nylon").gain(0.5)

// other · acoustic guitar steel · "SFX"
const acoustic_guitar_steel = note("<~@107 A@2 ~>".pickRestart({
  A: "g4/2",
})).s("gm_acoustic_guitar_steel").gain(0.5)

// other · electric guitar clean · "GUITAR CL"
const electric_guitar_clean = note(`<
  ~ A ~@7 B ~@11 C ~ D@2 ~@7 C ~ D@2 C ~ C ~@8 C ~ D@2 E F G ~@4 H ~@6 I J K@2 L@2 ~@16 I J K@2 L@2 ~@17
>`.pickRestart({
  A: "e3 ~@3", B: "e4 ~@3 e4 ~@3", C: "d#4@4 c#4@4 d4@5 ~@3", D: "[d#4@2 c#4@2 d4@11 ~]/2", E: "d#3@4 c#3@4 d3@5 ~@3",
  F: "~@10 [e4,b4] ~ [e4,b4]!3 ~", G: "d#4@4 c#4@3 ~ d4@5 ~@3", H: "~@12 b4 ~@3", I: "d#4@3 ~ c#4@3 ~ d4@5 ~@3",
  J: "~ d4@2 e4 d#4@2 a#3@2", K: "[d#3@4 c#3@4 d3@5 ~ f#3@4 e3 ~ f#3 ~ f#3 ~ f#3 ~ f#3@4 e3 ~]/2",
  L: "[d#4@3 ~ c#4@4 d4@12 ~@12]/2",
})).s("gm_electric_guitar_clean").gain(0.31).pan(0.1)

// other · electric guitar clean · "GUITAR CL" · soft notes
const electric_guitar_clean_2 = note("<~ A B@2 ~@5 C@2 ~@41 D ~@5 E ~@51>".pickRestart({
  A: "~ e3!3", B: "[e3 ~ e3 b4 ~@4 e5@2 ~@6, ~@2 e5!2 ~@4, ~@5 b4@2 b4@2 ~@7]/2",
  C: "[b3@2 [b3,e4]!2 ~ [b3,e4] ~ [b3,e4] b3@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@10 ~@8]/2", D: "~@11 [e4,b4] ~@4",
  E: "~@10 b4!2 ~@4",
})).s("gm_electric_guitar_clean").gain(0.17).pan(0.1)

// other · pad sweep · "WOW SYNTH"
const pad_sweep = note("<~ A@3 B@4 C@4 ~@9 D ~ D ~@15 E@2 F@2 G@2 H@2 ~@60 I@2 ~>".pickRestart({
  A: "[~ [e6,b6]@3]/3", B: "[~@24 a4@37 ~@3, ~@4 d5@9 ~@19]/4", C: "[~@32 a4@31 ~, ~@4 d5@9 ~@19, ~@11 e5@9 ~@12]/4",
  D: "~@7 d3@5 ~@4", E: "[e2,e4]/2", F: "[d2,d4]/2", G: "[c2,c4]/2", H: "a2/2", I: "[~ e3@15, e2]/2",
})).s("gm_pad_sweep").gain(0.48).pan(0.2)

// other · bagpipe · "SYNTH"
const bagpipe = note("<~@10 [~ e1 b1 e2 ~@4] ~@99>").s("gm_bagpipe").gain(0.25).pan(0.9)

// bass · lead 8 bass lead · "SYNTH"
const bass_2 = note(`<
  ~@21 A ~ A ~@8 A ~ A ~ A ~ A B@2 C@2 D@2 E F A ~ A ~ G ~ A ~@11 A ~ G ~ A ~@15 H@2 A ~ I ~ A ~ J ~@13 H@2 ~
>`.pickRestart({
  A: "[e1,e2] [c#1,c#2] [d1,d2] ~", B: "e2/2", C: "d2/2", D: "[c2@27 ~ d2 e2 g1 g#1]/2", E: "a1@7 ~",
  F: "a1@3 ~ a1@2 ~@2 a1@2 ~@2 a1@3 ~", G: "[e1,e2]@3 ~ [c#1,c#2]@3 ~ [d1,d2]@4 ~@4", H: "e0/2",
  I: "[e1,e2]@4 [c#1,c#2]@4 [d1,d2]@3 ~@5", J: "[e1,e2]@3 ~ [c#1,c#2]@4 [d1,d2]@4 ~@4",
})).s("gm_lead_8_bass_lead").gain(0.45).pan(0.9)

// other · guitar harmonics · "HARMONIC"
const guitar_harmonics = note("<~@44 A B@2 ~@63>".pickRestart({
  A: "[g3,c4]", B: "[~@8 a4@21 ~@3]/2",
})).s("gm_guitar_harmonics").gain(0).pan(0.1)

// other · distortion guitar · "GUITAR DI"
const distortion_guitar = note("<~@39 A@2 B@2 C@2 D@2 ~@63>".pickRestart({
  A: "[[e3,b3]@31 ~]/2", B: "[d3,a3]/2", C: "[[c3,g3]@31 ~]/2", D: "[a2@7 ~, e3@25 ~@7]/2",
})).s("gm_distortion_guitar").gain(0.12).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~@4 A@16 ~@4 A@39 B@2 A@20 ~@2 A@16 B@4 ~@3>".pickRestart({
  A: "x!4", B: "x!16",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@44 [~@13 x!3] ~@19 [~@4 x!12] ~@45>").gain(0.64)

// drums · clap
const clap = s("cp").struct("<~@12 A B C B C B C B ~@4 C B C B C B C B ~@78>".pickRestart({
  A: "~@2 x ~ x!3 ~", B: "x ~ x ~ x ~ x ~@3 x!4 ~@2", C: "x ~ x ~ x!3 ~",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@47 A@7 B C ~@9 A@6 C ~@15 A@8 C ~@14>".pickRestart({
  A: "~@3 x ~@3 x", B: "~@3 x ~@2 x!2", C: "x",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@47 A@3 B@4 C ~@10 B@5 D ~@16 B@8 ~@15>".pickRestart({
  A: "x!3 ~ x!2 ~ x ~ x!2 ~ x!2 ~ x", B: "~ x!2 ~ x!2 ~ x ~ x!2 ~ x!2 ~ x", C: "x!3 ~ x!2 ~ x ~ x!2 ~@2 x ~ x",
  D: "~ x!2 ~ x!2 ~ x ~ x!2 ~ x!4",
})).gain(0.24)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@47
  [x ~@2 x ~@4 x ~@2 x ~@4]!8
  ~@10
  [x ~@2 x ~@4 x ~@2 x ~@4]!6
  ~@16
  [x ~@2 x ~@4 x ~@2 x ~@4]!8
  ~@15
>`).gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~@12 A ~@3 A ~@4 B ~ B A ~@3 A ~@3 C ~ C ~ C ~ C A ~ A ~ A ~ D A C ~ C ~ C ~ C ~@9 E A C ~ C ~ C ~@17 C ~ C ~ C ~ C
  ~@13 A ~@2
>`.pickRestart({
  A: "x", B: "x!3 ~", C: "x!2 ~@2", D: "x!2", E: "x!4",
})).gain(0.56)

// drums · cowbell
const cowbell = s("cb").struct("<~@12 A B C B C B C B ~@4 C B C B C B C B ~@78>".pickRestart({
  A: "~@2 x ~@4 x!2 ~ x ~ x ~@3", B: "x ~ x ~@4 x!2 ~ x ~ x!2 ~@2", C: "x ~ x ~@4 x!2 ~ x ~ x ~@3",
})).gain(0.8)

// drums · shaker
const shaker = s("sh").struct("<~@4 A@8 B A@28 B A B A C B D A B A@13 ~@2 A@20 ~@2 A@6 B A@9 ~@7>".pickRestart({
  A: "x!8", B: "~ x!7", C: "~ x!3 ~ x!3", D: "~ x ~ x!5",
})).gain(0.64)

stack(
// … 4 more lines

More by Frankie Goes to Hollywood