Strudelify

Everlasting Love

Howard Jones

KeyG majorTempo120 bpm
0:00/0:00
// Everlasting Love — Howard Jones
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 19, 4/4 at bar 20) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  A@8 B C D E F C D E G H I H J H I H K L M N M O P Q M R S T U V H I H J H I H K L M N M O P Q M R S T U V S T U V W M
  N M O P Q M R M R ~@8 M N M O P Q M R M N M O P Q M R X@2 ~
>`.pickRestart({
  A: "[~@8 a2@16 f2@15 ~ d2@15 ~ a#1@15 ~ a2@15 ~ f2@15 ~ d2@15 ~ a#1@8]/8", B: "~@8 f1 ~ f1@2 a1@2 c2@2",
  C: "~ g1 b1 d2 ~ c2 e2 g2", D: "c2 ~ c2@2 a1@2 g1@2 f1 ~ f1@2 a1@2 c2@2", E: "~@2 g1@2 b1@2 d2@2 e1 ~ e1@2 g1@2 e1@2",
  F: "a1 ~ a1@2 g1@3 ~ f1 ~ f1@2 a1@2 c2@2", G: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ g1@5 ~",
  H: "f1 ~ f1@2 a1@2 c2@2 ~@2 g1@2 b1@2 d2@2", I: "~@2 c2@2 e2@2 g2@2 c2 ~ c2@2 a1@2 g1@2",
  J: "e1 ~ e1@2 g1@2 e1@2 a1 ~ a1@2 g1@3 ~", K: "e1 ~ e1@2 g1@2 e1@2 a1 ~ a1 ~ a1 ~ a1 ~",
  L: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ g1@6", M: "c2 ~ c2@2 e2@2 g2 ~ f1 ~ f1@2 a1@2 c2@2",
  N: "g1 ~ g1@2 b1@2 d2@2 g1 ~ b1@2 d2@2 b1 ~", O: "g1 ~ g1@2 b1@2 d2@2 g1 ~ b1@2 d2 ~ b1 ~",
  P: "c2 ~ c2@2 e2@2 g2 ~ f1 ~ f1@2 a1@2 c2 ~", Q: "g1 ~ g1@2 b1@2 d2 ~ g1 ~ b1 ~ d2@2 b1 ~",
  R: "g1 ~ g1@2 b1@2 d2 ~ g1 ~ g1@2 b1@2 d2 ~", S: "a2", T: "f2@15 ~", U: "d2", V: "a#1@15 ~",
  W: "a#1 ~ a#1 ~ a#1 ~ a#1 ~ a#1 ~ g1@5 ~", X: "c2/2",
})).s("gm_acoustic_bass").gain(0.54)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  A@4 B@5 C D E F C D E G H I J K H I J K L M@8 N@3 O H I J K H I J K L M@8 N@3 O N@3 P Q M@10 ~@4 R S T U M@16 V@2 ~
>`.pickRestart({
  A: "[~@6 a4 ~@10 d6@2 g5@2 ~@5 d5@2 ~@2 a4@2, ~@4 [a2,a3,c4,e4]@9 e6@2 b5@4 ~@13, ~@7 a4@12 ~@9 [f4,a#4]@4, ~@9 e5@10 ~@13, ~@11 a5@8 ~@2 a5@7 ~@4]/4", // Am A#5
  B: "[~@4 g4@2 ~@20 d6@4 ~@8 g5@4 ~@10 d5@4 ~@8 g5@5 ~@5 [f3,a3,c4] ~@3 [f3,a3,c4]@2, g4@4 ~@2 a4@12 e5@2 a5@2 g5@8 c6@12 ~@2 d5@8 ~@8 f5@9 ~@11, ~@2 f4@5 ~@3 a3@21 ~@31 a5@7 ~@11, ~@12 e4@19 ~@19 f5@6 ~@2 a#5@11 ~@11, ~@14 d5@17 ~@3 a5@8 a5@14 d6@13 ~@11]/5", // F
  C: "~@2 [g3,b3,d4] ~@3 [g3,b3,d4]@2 ~@2 [g3,c4,e4] ~@3 [g3,b3,d4]@2", // G C G
  D: "~@2 [g3,c4,e4] ~@3 [g3,c4,e4]@2 ~@2 [f3,a3,b3,c4] ~@3 [f3,a3,c4]@2", // C F
  E: "~@2 [g3,b3,d4] ~@3 [g3,b3,d4] ~ [e3,g3,b3]@3 ~ [e3,g3,b3] ~ [a3,c4,e4]@2", // G Em Am
  F: "~@2 [a3,c4,e4]@3 ~ [a3,c4,e4] ~@3 [f3,a3,c4] ~@3 [f3,a3,c4]@2", // Am F
  G: "~@2 [a3,c4,e4]@3 ~ [a3,c4,e4] ~@3 [g2,g3,b3,d4,g4]@6, ~@10 g#2 ~@5", // Am G
  H: "~@2 [f3,a3,c4] ~@3 [f3,a3,c4]@2 ~@2 [g3,b3,d4] ~@3 [g3,b3,d4]@2", // F G
  I: "~@2 [g3,c4,e4] ~@3 [g3,b3,d4]@3 ~ [g3,c4,e4] ~@3 [g3,c4,e4]@2", // C G C
  J: "~@2 [f3,a3,b3,c4] ~@3 [f3,a3,c4]@2 ~@2 [g3,b3,d4] ~@3 [g3,b3,d4] ~", // F G
  K: "[e3,g3,b3]@3 ~ [e3,g3,b3] ~ [a3,c4,e4]@3 ~ [a3,c4,e4]@3 ~ [a3,c4,e4] ~", // Em Am
  L: "~@2 [a3,c4,e4] ~@3 [a3,c4,e4] ~ [a3,c4,e4] ~ [g2,g3,b3,d4]@5 ~", // Am G
  M: "[[c3,g3,c4,e4,g4]@5 ~ [f2,c3,c4,e4,g4]@7 ~ [g2,d3,b3,d4,g4]@17 ~]/2", // C G
  N: "[~@9 d6@2 ~@4 g5@2 ~@5 d5@2, a4@5 e5 a5 g5@4 c6@6 ~ d5@4 ~@2, ~@2 a3@21 ~@25, ~@4 e4@19 ~@19 f5@6, ~@6 d5@17 ~@3 a5@8 a5@14]/3",
  O: "~@8 g5@5 ~@3, d6@13 ~@3, ~@2 a#5@11 ~@3, ~@4 f5@9 ~@3, ~@6 a5@7 ~@3",
  P: "~@8 f3@2 f3@2 [a#2,f3] ~ [a#2,f3] ~, d6@8 [a#2,g5]@5 ~@3, ~@2 a#5@11 ~@3, ~@4 f5@9 ~@3, ~@6 a5@7 ~@3", // A#5 D#
  Q: "[a#2,f3] ~ [a#2,f3] ~ [a#2,f3] ~ [a#2,f3] ~ [a#2,f3] ~ [g2,d3]@5 ~", R: "[g3,c4,e4]@8 [a3,c4,f4]@7 ~",
  S: "c4@8 b3@7 ~, [g3,d4]@15 ~", T: "[g3,c4,e4]@7 ~ [a3,c4,f4]@7 ~", U: "c4@8 b3@7 ~, [g3,d4]",
  V: "[c2,c3,g3,c4,e4]/2", // C
})).s("gm_epiano1").gain(0.52)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A@8 B ~@7 C D@2 E F D@2 E G H I@8 J K L M D@2 E F D@2 E G H I@8 J K L M J K L N O I@10 ~@8 I@16 P@3
>`.pickRestart({
  A: "[~@6 [c4,c5,e5,e6] [b3,b4,d5,d6]@2 [a3,a4,c5]@3 ~@2 [a3,e4,c5,c6] [g3,d4,b4,b5]@2 [f3,c4,a4,a5]@3 ~@2 [f3,f4,a4,a5] [e3,e4,g4,g5]@2 [d4,f4,f5]@3 ~@2 [a3,a#3,f4,f5] [g3,e4,e5]@2 [f3,d4,d5]@2 ~@3 [c4,c5,e5,e6] [b3,b4,d5,d6]@2 [a3,a4,c5,c6]@3 ~@2 [a3,e4,c5,c6] [g3,d4,b4,b5]@2 [f3,c4,a4,a5]@3 ~@2 [f3,f4,a4,a5] [e3,e4,g4,g5]@2 [d4,f4,f5]@3 ~@2 [a3,a#3,f4,f5] [g3,e4,e5], ~@8 a2@16 f2@17 ~@17 f3@4 ~@8 [a3,c4]@5 ~@29 d2@10 ~@14, ~@10 e3@10 ~@6 c3@15 ~ a2@8 d3@2 ~@4 a#2@14 ~@2 a2@16 f2@17 ~@17 f3@4 ~@2, ~@18 c6@8 ~@14 d2@10 ~@24 e3@10 ~@6 c3@15 ~ a2@8 d3@2 ~@4 a#2@8]/8", // C Bm Am G F Em Dm A#maj7 …
  B: "~ [f3,d4,d5]@2 [a3,c4] ~@4", C: "~@5 [g2,g3,b3,d4,g4]@3",
  D: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@7 ~ [c4,e4,g4]@16 ~@2]/2", E: "[c4,f4,a4]@5 ~ [d4,g4,b4]@8 ~@2",
  F: "[e4,g4,b4]@6 [e4,a4,c5]@9 ~", G: "[e4,g4,b4]@6 ~@2 [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~, ~@6 [e4,a4,c5]@9 ~",
  H: "~@5 [g2,g3,b3,d4,g4]@3, ~@5 g#2 ~@2", I: "[[c4,g4,c5,e5,g5]@5 ~ [f3,c4,c5,e5,g5]@7 ~ [g3,d4,b4,d5,g5]@17 ~]/2",
  J: "[a3,c4] ~ [c4,c5,e5,e6] [b3,b4,d5,d6]@2 [a3,a4,c5,c6]@3, a2, ~ e3@5 ~@2", // Am C Bm Am
  K: "~@2 [a3,e4,c5,c6] [g3,d4,b4,b5]@2 [f3,c4,a4,a5]@3, f2, ~ c3@7", // Am G F
  L: "~@2 [f3,f4,a4,a5] [e3,e4,g4,g5]@2 [d4,f4,f5]@3, d2@5 ~@3, ~ a2@4 d3 ~@2", // F Em Dm
  M: "~@2 [a3,a#3,f4,f5] [g3,e4,e5]@2 [f3,d4,d5]@2 [a3,c4], a#2@7 ~, ~ f3@2 ~@5", // A#maj7 C Dm Am
  N: "~@4 [a3,a#3,f4,f5]@2 [g3,e4,e5]@4 [f3,d4,d5]@5 ~, a#2@7 ~, ~ f3@2 ~@5", // A#maj7 C Dm
  O: "~@10 [g2,g3,b3,d4,g4]@5 ~, ~@10 [g#2,f3] ~@5", P: "[[c2,c3,g3,c4,e4]@11 ~@5]/3",
})).s("gm_piano").gain(0.56)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@16 A B@2 C D B@2 C E F G@8 ~@4 B@2 C D B@2 C E F G@8 ~@7 H I G@10 ~@8 G@16 J@2 ~
>`.pickRestart({
  A: "[a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [g2,d3]@5 ~", // A5 G5
  B: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@7 ~ [c4,e4,g4]@16 ~@2]/2", C: "[c4,f4,a4]@5 ~ [d4,g4,b4]@8 ~@2",
  D: "[e4,g4,b4]@6 [e4,a4,c5]@9 ~", E: "[e4,g4,b4]@6 ~@2 [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~, ~@6 [e4,a4,c5]@9 ~",
  F: "[a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [g2,d3]@6", // A5 G5
  G: "[[g4,c5,e5]@5 ~ [a4,c5,f5]@6 ~@2 [c5,d5,g5]@14 ~@4]/2", H: "~@8 [a#2,f3] ~ f3 ~ [a#2,f3] ~ [a#2,f3] ~",
  I: "[a#2,f3] ~ [a#2,f3] ~ [a#2,f3] ~ [a#2,f3] ~ [a#2,f3] ~ [g2,d3]@5 ~", J: "[c3,g3]/2",
})).s("gm_electric_guitar_muted").gain(0.47)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@6 B@3 ~@8 C@2 D E F@2 G ~@2 H@8 I@2 J@2 ~@3 K L M ~@3 H@8 N@2 O P N@2 O P ~ H@10 ~@4 Q R S T H@16 ~@3
>`.pickRestart({
  A: "[~@8 [a3,c4,e4]@32 ~@16 a#3@15 ~ [a3,c4,e4]@24, ~@5 [f3,a3,d4]@4 ~@3]/6", // Am Dm
  B: "[~@8 a#3@5 ~@3, ~ [f3,a3,d4]@4 ~]/3", C: "[a5@6 b5@8 g5@9 ~@9]/2", D: "a5@5 ~ b5@8 a5@2",
  E: "~ g5@5 c6@6 b5@3 ~, ~@6 b5 ~@9", F: "[a5@5 b5@8 ~ g5@10 ~@8]/2", G: "a5@3 b5@4 ~",
  H: "[[g3,c4,e4]@6 [a3,c4,f4]@7 ~ [b3,d4,g4]@17 ~]/2", I: "[e5 c5, [a3,c4,e4]]/2",
  J: "[a4@16 [a#3,a#4]@15 ~, [f3,a3,d4]]/2", K: "~ b5 c6 d6", L: "e6@3 d6@5", M: "g5@10 a5@2 g5@2 a5 ~",
  N: "[a3,c4,e4]/2", O: "[a3,c4,d4]@15 ~", P: "[f3,a#3,d4]@15 ~", Q: "[g3,c4,e4]@8 [a3,c4,f4]@7 ~",
  R: "c4@8 b3@7 ~, [g3,d4]@15 ~", S: "[g3,c4,e4]@7 ~ [a3,c4,f4]@7 ~", T: "c4@8 b3@7 ~, [g3,d4]",
})).s("gm_synth_strings_1").gain(0.32)

// drums · kick
const kick = s("bd").struct("<~@8 A B@7 C B@8 C B@8 D E D@2 B@8 C B@8 D E D E D E D E F B@10 C@24 E ~@2>".pickRestart({
  A: "~ x", B: "x!2", C: "x ~@3 x!2 ~@2", D: "x ~@6 x", E: "x", F: "x ~@4 x ~ x",
})).gain(0.67)

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

// drums · hihat
const hihat = s("hh").struct("<A B@7 C D@7 E D@8 F D@8 B@4 D@8 F D@8 B@9 D@34 ~@3>".pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x ~ x ~@2 x ~ x", D: "~ x ~ x ~ x ~ x", E: "~ x ~ x!2 ~@3", F: "~ x ~ x ~@4",
})).gain(0.4)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@74 A B A B A B A B A B A B A B A B A B A B A B A B ~@3>".pickRestart({
  A: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", B: "x!2 ~ x!2 ~@2 x!3 ~ x!2 ~@2 x",
})).gain(0.07)

// drums · open hat
const open_hat = s("oh").struct("<~@25 A ~@20 A ~@28 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@3>".pickRestart({
  A: "~@5 x ~@2", B: "~@5 x ~@7 x ~@2",
})).gain(0.67)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@7 B C ~@7 B C ~@3 C ~@3 C@5 ~@7 B C ~@3 C ~@3 C@8 D C ~@3 C ~@13 C ~@7 C ~@7 C ~@2
>`.pickRestart({
  A: "~ x", B: "~@5 x ~@2", C: "x", D: "x ~@4 x ~@2",
})).gain(0.67)

// drums · ride
const ride = s("rd").struct("<~@82 [~ x!3] [x!4]!7 [~ x!3] [x!4]!7 x ~@2>").gain(0.67)

// drums · tambourine
const tambourine = s("tb").struct("<~@74 [x!4]!24 ~@3>").gain(0.67)

// drums · cowbell
const cowbell = s("cb").struct("<~@74 A B A B A B A B A B A B A B A B A B A B A B A B ~@3>".pickRestart({
  A: "~@2 x!2 ~@6 x ~@2 x ~@2", B: "~@2 x!2 ~@5 x ~@2 x ~ x ~",
})).gain(0.67)

// drums · congas
const congas = s("conga:18").struct("<~@74 A B A B A B A B A B A B A B A B A B A B A B A B ~@3>".pickRestart({
  A: "~@2 x ~@2 x ~@4 x ~@5", B: "~@2 x ~@2 x ~@4 x ~@2 x ~@2",
})).gain(2.14)

// drums · congas
const congas_2 = s("conga:33").struct("<~@74 [~@6 x!2 ~@6 x!2]!24 ~@3>").gain(2.14)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@74 [x!8]!24 ~@3>").gain(3.38)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@74 [~@3 x ~@3 x ~@3 x ~@3 x]!24 ~@3>").gain(1.02)

stack(
  bass, epiano1, piano, electric_guitar_muted, synth_strings_1, kick, snare, hihat, hihat_soft, open_hat, crash, ride,
  tambourine, cowbell, congas, congas_2, cabasa, cabasa_soft
)

More by Howard Jones