Strudelify

Everlasting Love

Robert Knight

KeyA majorTempo119 bpm
0:00/0:00
// Everlasting Love — Robert Knight
// 119 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(119/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.

// chords · piano · "Ac Piano"
const piano = note(`<
  A@2 B C D E@2 F G H@2 I J K@2 L@2 M@2 N O P Q R S T U V W X Y@2 Z AA AB AC AD AE AF AG F G H@2 I J K@2 L@2 M@2 N O P Q
  R S T U V W X Y@2 Z AA AB V W X Y@2 Z AA AB AC AD AE AH
>`.pickRestart({
  A: "[a1,a2]/2", B: "[a1,a2,e3,a3,c#4]", C: "[a1,a2,f#3,b3,d4]@15 ~", D: "~@5 a3@3, [a1,a2,f3,b3,d4]",
  E: "[a3@3 ~@5 [a1,a2,a3,c#4]@8, [a1,a2,e3]@7 e4@9, c#4@3 c#4 ~@4, ~@3 a3@5 ~@8, ~@5 b3@3 ~@8]/2", // A A5
  F: "[a1,a2,b3,d4,f#4]", G: "~ b3, [a1,a2,a3,d4,f4]",
  H: "[~@6 a3 ~ [a1,a3,c#4,e4]@8, [a2,e4]@7 a2@9, a3@5 c#4@2 ~@9, c#4@3 b3@4 ~@9, ~@2 a1@5 ~@9]/2", // A A5
  I: "[a1,a2,f#3,b3,d4]", J: "b3@9 ~ a3@5 ~, [a1,a2,f3,d4]@15 ~",
  K: "[a3@3 ~@11 [a3,c#4,e4]@2, [a1,a2,e3]@7 e4@7 ~@2, c#4@6 c#4@2 ~@5 [g#3,b3]@3, ~@3 [a3,a4]@5 [a1,a2]@8, ~@5 b3@3 [a3,c#4]@6 ~@2]/2", // A A5 G#m A
  L: "[b3@5 b3@3 ~@5 e4@3, a1, [a2,d4,f#4] [a2,f4], ~@2 d4!2, ~@11 a3@5]/2", // D Dm
  M: "[e4@3 e4@2 ~@3 e4@4 [a3,c#4,e4]@4, [a1,a2,a3,c#4]@17 ~@15, ~@6 c#5@11 ~@15, ~@5 e4@3 [a1,a2]@7 ~, ~@7 a4@8 ~]/2", // A
  N: "a2@8 ~@5 [c#4,e4]@3, [a1,f#3,d4], b3@5 b3@3, ~ a2", O: "~@3 d4, [a1,a2,f4], d4@3 ~, ~@5 a3@3",
  P: "~@7 [f#3,b3], [a1,a2,c#4,e4], a3@3 [e3,a3], ~@5 [f#3,b3]@2 ~", // B5 A A5 B5
  Q: "a2@3 ~@3 [a3,c#4]@2, [a1,e3], [a3,c#4]@3 ~, ~@3 a2@5, ~@5 [g#3,b3,e4]@3", // A A5 A E
  R: "[b3,d4,f#4]@3 ~@3 b3@2, a1, a2@5 a2@3, ~@3 [d4,f#4]@5, ~@3 b3@3 ~@2", S: "a3!2, [a1,a2,d4,f4]",
  T: "[f#1,f#2,f#3,f#4]@4 [f#1,f#2,f#4,f#5]@4 [e1,e2,e4,e5] [f#1,f#2,f#4,f#5] ~@2 [f#1,f#2,f#4,f#5]@3 ~", // F# E F#
  U: "[e1,e2,e4,e5] [f#1,f#2,f#4,f#5] ~@2 [f#1,f#2,f#4,f#5]@2 [b1,b2,f#4]@4 ~@4 b2@2, ~@3 d#5@5, ~@3 b4@3 b4@2, ~@5 [b1,f#4]@3, ~@5 b2@2 ~", // E F# B5
  V: "e3@2 ~@4 [e4,g#4,b4]@2 [e2,e3] ~ [e2,e3]@2 [e4,g#4,b4]@2 [e2,e3] ~, [e5,g#5]@9 ~@7, b4@6 ~@3 e4@2 ~@5, e2 ~ [e2,e3]@6 ~@8", // E
  W: "[d#2,d#3] ~ d#3 [f#4,b4] d#3@2 d#4@2 d#3 d#4 [d#2,d#3]@2 [d#4,g#4,b4]@2 [d#2,d#3] ~, [d#4,b4]@2 ~ [g#4,b4]@2 ~@3, g#4@2 d#2@7 ~@7", // D# B5 D# G#m D# G#m
  X: "[b3,e4,g#4]@2 [c#2,c#3] [b3,e4,g#4] c#3@2 [e4,g#4,b4]@2 c#3 ~@3 [b3,e4,g#4]@3 ~, [c#2,c#3] ~@3 c#2@5 [b3,e4,g#4]@2 ~@5, ~@10 [c#2,c#3]@5 ~", // E C# E C# E C#
  Y: "[~@4 a3@2 [c#4,e4] ~ [a1,a2,c#4,e4,g#4]@3 ~ [b1,b2,d#4,f#4]@3 ~ e3@2 e3@2 [e3,b3]@2 [b3,e4,g#4,b4]@2 e3 ~ [e2,e3]@2 [b3,e4,g#4,b4]@2 [e2,e3] ~, [a3,c#4,e4]@5 ~@7 b3@7 ~@6 [b3,e4,g#4]@2 ~@5, ~@2 [f#1,f#2]@4 ~@10 [e4,g#4]@5 ~@11, ~@16 e2 ~ e2@7 ~@7]/2", // C#m Amaj7 B E5 E A E F# …
  Z: "[d#2,d#4,f#4,b4]@2 d#3 [d#4,f#4,b4] d#3@2 g#4@2 d#3 ~ [d#2,d#3]@2 ~@2 [d#2,d#3] ~, d#3 ~@3 d#2@5 f#4@2 ~@5, ~@3 [d#4,b4]@2 ~ [d#4,g#4,b4]@2", // B D# G#m
  AA: "[c#3,e4,g#4]@2 c#3 [b3,e4,g#4] c#3@2 [b3,e4,g#4]@2 ~ [b3,e4,f#4] ~@2 [b3,e4,g#4]@3 ~, [b1,c#2,b3] ~ c#2@2 c#2@4 c#3@2 [c#2,c#3]@4 ~@2", // C#m E Bsus4 E Bsus2 C#
  AB: "a3@2 f#2@2 a3@2 [f#1,f#2,c#4] ~ [a1,a2,c#4,e4,g#4]@3 ~ [b1,b2,b3,d#4,f#4]@3 ~, e4@7 ~@9, [f#1,c#4]@5 ~@11, f#2 ~@15", // F#5 Amaj7 B F#5
  AC: "[e3,b3,e4,g#4]@2 e3@2 [b3,e4,g#4]@2 e3@2 [b3,e4,g#4]@2 [e2,e3]@2 [b3,e4,g#4]@2 b2 ~, e2 ~ e2@7 ~@7", // E
  AD: "[b3,d4,f#4]@2 [b1,b2]@2 b3 ~ [b1,b2]@2 [b3,d4,f#4]@2 [b1,b2]@2 [b3,d4,f#4,b4]@2 [b1,b2] ~, [b1,b2] ~@3 [d4,f#4,b4]@4 ~@8", // Bm B Bm B Bm B Bm
  AE: "~@2 e4@2 e4@2 c3@2 [c2,c3] ~ [c2,c3]@2 ~@2 e3 ~, [g4,c5]@7 ~ e4@2 ~@2 [e4,g4,c5]@4, [c2,c3]@5 ~@11", // C C5 C
  AF: "~@2 e4 ~ [e4,g#4,b4]@2 [e2,e3]@2 [e4,e5]@2 ~@2 [e4,e5]@2 ~@2, [e2,e3]@5 ~@5 [e2,e3]@5 ~", AG: "[a1,a2,a3,c#4]",
  AH: "[e4,e5,e6] ~ [e4,e5,e6] ~ [e4,e5,e6] ~ [e4,e5,e6] ~ [e4,e5,e6] ~@7", // E
})).s("gm_piano").gain(0.4)

// bass · fretless bass · "El Bass"
const bass = note("<A@25 B C D E F G D E F G H I J K A@19 B C D E F G D E F G D E F G D E F G H I J L>".pickRestart({
  A: "a2@3 a2 a2@3 a2", B: "f#2@3 ~ f#2@3 ~ e2 f#2 ~@2 f#2@3 ~", C: "e2 f#2 ~ e2 f#2 ~ b1@3 ~ b1 ~ c#2 ~ d#2 ~",
  D: "e2@2 e2@4 b1 e2@2 b1 e2@2 d#2 ~ e2@2", E: "d#2 ~ d#2@4 b1 d#2@2 b1 d#2@2 b1 ~ d#2@2",
  F: "c#2@2 c#2@3 ~ g#1 c#2@2 g#1 c#2@2 d#2 ~ e2@2", G: "f#2@2 f#2@3 ~ f#2@2 a1 ~ a1@2 b1@2 b1 ~",
  H: "e2@2 e2 ~ e2 ~ e2@2 e2 ~ e2 ~ e2 ~ e2 ~", I: "b1@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2",
  J: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2 d2@2", K: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2 e2@2 e1 ~",
  L: "e2 ~ e2 ~ e2 ~ e2 ~ e2@2 ~@6",
})).s("gm_fretless_bass").gain(0.47)

// chords · epiano2 · "Rhodes"
const epiano2 = note(`<
  ~@6 A B@2 C D E F G@2 B@2 H D E F G@2 B@2 I J K L M N O P M Q R S T U A B@2 V D E F G@2 B@2 H D E F G@2 B@2 I J K L W
  N O X M Q K L M N K X M Y R S T Z
>`.pickRestart({
  A: "a3 [e4,a4,c#5] [g#4,b4] [a4,c#5]", // A G#m A
  B: "[[b4,d5]@10 ~@3 [c#5,e5]@3 ~@12 [c#5,e5]@4, a3@11 a3@5, f#4@2 d5 [b4,d5], ~@5 [b4,d5]@3 f5@8]/2", // Bm C#m Bm
  C: "~@14 e3 ~, [a3,e4,c#5]@15 ~, a4@5 a4@3, ~@6 b4@9 ~", D: "~@3 [a4,c#5], a3, ~ e4@3, ~ [a4,c#5]@2 ~, ~ [g#4,b4]",
  E: "[b4,d5]@10 ~@3 [c#5,e5]@3, f#4, ~@5 [b4,d5]@3", F: "d5@2 ~ [c#5,e5], f5, ~ [b4,d5]",
  G: "[~@7 [a4,c#5], c#5@3 c#4@2 [a4,c#5] [g#4,b4]@2, e4@5 b3@11, a4@4 a4@3 e4 a3@8, ~@3 b4@7 e4@6]/2", // A G#m
  H: "a4@6 ~@8 a3 ~, [a3,e4,c#5]@15 ~, ~@6 a4@9 ~, ~@5 b4@3", I: "[c#4,a4,f#5]@7 ~",
  J: "[c#4,a4,f#5]@3 ~ [c#4,a4,f#5] ~ [d#4,b4,f#5]@9 ~", K: "[e4,g#4,b4]", L: "[d#4,f#4,g#4,b4]", M: "[c#4,e4,g#4,b4]",
  N: "[c#4,e4,f#4,a4]@2 [c#4,e4,a4] [d#4,f#4,b4]", O: "[e4,f#4,g#4,b4]", P: "[d#4,b4], f#4@3 ~",
  Q: "[c#4,e4,f#4,a4]@2 [e4,a4,c#5] [d#4,f#4,b4]", R: "[e4,g#4,b4]@15 ~", S: "[d4,f#4,b4]", T: "[e4,g4,c5]@15 ~",
  U: "e4 [e4,e5], [g#4,b4]", V: "a4@3 ~@4 a3, [a3,e4,c#5]@15 ~, ~@6 a4@9 ~, ~@5 b4@3", W: "[c#4,e4,g#4,b4]@15 ~",
  X: "[d#4,f#4,b4]", Y: "[c#4,e4,f#4,a4]@8 [e4,a4,c#5]@4 [d#4,f#4,b4]@3 ~", Z: "[e4,g#4,b4]@4 [e4,g#4,b4] ~@3",
})).s("gm_epiano2").gain(0.29)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@2 A B C D E B C D A B C D E B C D A B C D E B C F G H I@2 J K L@2 M N O P Q E B C D A B C D E B C D A B C D E B C F
  G H R@2 J S L@2 M T R@2 J K L@2 J N U V W
>`.pickRestart({
  A: "[a2,e3,c#4]", B: "[a2,f#3,b3,d4]", C: "[a2,f3,a3,d4]", D: "[a2,e3,a3,c#4]",
  E: "[e3,a3,c#4]@2 [e3,g#3,b3] [e3,a3,c#4], a2", F: "[f#5,f#6]@3 ~ [f#5,f#6]@3 ~ [e5,e6] [f#5,f#6] ~@2 [f#5,f#6]@3 ~",
  G: "[e5,e6] [f#5,f#6] ~ [e5,e6] [f#5,f#6] ~ [b5,b6]@6 b4 [c#5,d#5] [e5,f#5] [g#5,a5]", H: "b5@8 b4@4 c#5@3 ~",
  I: "[b4@6 g#4@6 e4@11 ~ b4@4 c#5@3 ~]/2", J: "b4 c#5 e5 f#5", K: "e5@2 b4 c#5", L: "[b4@3 g#4@3 e4@6 b4@2 c#5@2]/2",
  M: "b4@4 c#5@4 e5@4 f#5@3 ~", N: "[e4,b4,g#5]", O: "[d4,a4,f#5]@15 ~", P: "[c4,g4,e5]@15 ~",
  Q: "[b3,g#4,e5]@11 ~ [e4,e5]@3 ~", R: "[b4@6 g#4@6 e4@11 ~ b4@4 c#5@4]/2", S: "e5@7 ~ b4@4 c#5@4", T: "~@2 b4 c#5",
  U: "[d4,a4,f#5]", V: "[c4,g4,e5]", W: "[g#4,e5] ~ e5@2 [g#4,e5] ~ e5@2 [g#4,e5]@2 ~@6, ~@2 g#4 ~@3 g#4 ~@9",
})).s("gm_string_ensemble_1").gain(0.25)

// chords · brass section · "Brass"
const brass_section = note("<~@18 A B C D E F G H I ~@8 J K L M ~@12 A B C D E F G H I ~@16 J K L N>".pickRestart({
  A: "[e4,c#5]", B: "[d4,b4]", C: "[f4,a4]@15 ~", D: "[c#4,a4]@13 ~@3", E: "c#5@8 b4@4 c#5@3 ~, e4",
  F: "d5@10 d5@2 ~ e5@3, f#4", G: "[a4,f5]@15 ~", H: "[f#4,f#5]@3 ~ [f#4,f#5]@3 ~ [e4,e5] [f#4,f#5] ~@2 [f#4,f#5]@3 ~",
  I: "[e4,e5] [f#4,f#5] ~ [e4,e5] [f#4,f#5] ~ [f#4,d#5,b5]@7 ~@3", // E F# E F# B
  J: "[e4,e5]@3 ~ [g#4,e5]@2 ~@2 [g#4,e5]@2 ~@2 [g#4,e5]@2 ~@2", K: "[f#4,d5] ~ [f#4,d5] ~ [f#4,d5] ~ [f#4,d5] ~",
  L: "[e4,c5]@2 ~@2 [e4,c5]@2 ~@2 [e4,c5]@2 ~@2 [e4,c5]@3 ~", M: "[e4,e5] ~ [e4,e5] ~ [e4,e5] ~ [e4,e5] ~",
  N: "[e4,e5] ~ [e4,e5] ~ [e4,e5] ~ [e4,e5] ~ [e4,e5] ~@7", // E
})).s("gm_brass_section").gain(0.32)

// other · electric guitar muted · "Mtd Gtr"
const electric_guitar_muted = note("<[a3!16]!27 ~@12 [a3!16]!21 ~@20>").s("gm_electric_guitar_muted").gain(0.19)

// other · glockenspiel · "Bell"
const glockenspiel = note(`<
  ~@2 A B C D A B C D A B C D A B C D A B C D A B C D@2 ~@12 A B C D A B C D A B C D A B C D A B C D@2 ~@20
>`.pickRestart({
  A: "~@4 a5 ~@3 g#5 ~@3 a5 ~@3", B: "b5 ~@9 b5 ~@2 c#6 ~@2", C: "d6 ~@7 b5 ~@3 c#6 ~@3", D: "a5 ~@15",
})).s("gm_glockenspiel").gain(0.22)

// drums · kick
const kick = s("bd").struct("<A@26 B C@3 D C@3 D C@3 E A@20 B C@3 D C@3 D C@3 D C@3 D C@3 F>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x ~@2 x ~@5 x ~@3", C: "x!2 ~@2 x!2 ~@2", D: "x!2 ~@2 x ~@2 x",
  E: "x ~ x ~@2 x ~@2 x ~@3 x ~@3", F: "x!5 ~@3",
})).gain(0.46)

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

// drums · hihat
const hihat = s("hh").struct("<[x!16]!26 [x!3 ~ x ~@3] ~@12 [x!16]!20 [x!3 ~ x ~@3] ~@20>").gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@26 A B ~@3 B ~@2 C B ~@2 B ~@20 A B ~@3 B ~@2 C B ~@3 B ~@2 C B ~@3>".pickRestart({
  A: "~@3 x ~@4", B: "x", C: "~ x",
})).gain(0.58)

// drums · ride
const ride = s("rd").struct("<~@27 A B@3 A B@2 C A B@2 D ~@21 A B@3 A B@2 C A B@3 A B@2 C A B@2 ~>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~ x!3", D: "~ x!6 ~",
})).gain(0.58)

// drums · tambourine
const tambourine = s("tb").struct("<~@27 [x!16]!52 [x!5 ~@3]>").gain(0.4)

stack(
  piano, bass, epiano2, string_ensemble_1, brass_section, electric_guitar_muted, glockenspiel, kick, snare, hihat,
  crash, ride, tambourine
)