Strudelify

Everlasting Love

Love Affair

KeyD majorTempo120 bpm
0:00/0:00
// Everlasting Love — Love Affair
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 14 "Instrumental Strings" named as a string part, played on string ensemble 1 (its piccolo patch is not one)
// note: duplicate parts dropped: ch 3 electric guitar clean (copy of ch 2 electric bass finger)
// note: Full arrangement: all 96 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 · electric bass finger
const bass = note(`<
  ~ A B C D E F G H ~@4 I@4 J I@7 J I@2 K L A B C D E F G H A B C D M N O P I@4 J I@2 K L A B C D E F G H A B C D M N O
  P ~@4 A B C D E F G H A B C D M N O P ~@5
>`.pickRestart({
  A: "d2@2 ~ d2 d2@2 ~ d2 a2!2 d2@2 a2 ~ d2 ~", B: "c#2@2 ~ c#2 c#2@2 ~ c#2 a2!2 c#2@2 a2 ~ c#2 ~",
  C: "b1@2 ~ b1 b1@2 ~ b1 g2!2 b1@2 g2 ~ b1@2", D: "e2 ~ f#2 ~ g2@2 e2@2 a1@2 b1@2 c#2@2 a1 ~",
  E: "d2@2 ~ d2 d2@2 ~ d2 a2!2 d2 ~ a2@2 d2 ~", F: "c#2@2 ~ c#2 c#2@2 ~ c#2 a2!2 c#2 ~ a2 ~ c#2 ~",
  G: "b1@2 ~ b1 b1@2 ~ b1 g2!2 b1@2 g2@2 b1@2", H: "e2@2 f#2 ~ g2@2 e2 ~ a1 ~ b1@2 c#2@2 ~@2",
  I: "g2!2 ~ g2 ~ g2 ~ g2!2 ~ g2 ~ g2 ~ d2 ~", J: "g1 g2 ~ g2 ~ g2 ~ g2!2 ~ g2 ~ g2 ~ d2 ~",
  K: "e2!2 ~ e2 ~ e2 ~ e2!2 ~ e2 ~ e2@4", L: "a1!2 ~ a1 ~ a1 ~ a1!2 ~ a1 ~ a1 b1 c#2 ~",
  M: "d2@3 ~ d2@3 ~ d2@3 d2 d2@2 c2@2", N: "a1@3 ~ a1@2 ~@2 a1@2 ~ a1!2 ~ c2@2",
  O: "a#1@3 ~ a#1@3 ~ a#1@3 ~ a#1@2 c2 ~", P: "d2@3 ~ d2@2 ~ d2 d2@4 d2@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.56)

// other · trumpet
const trumpet = note(`<
  ~ A B C D A B E F ~@19 G H A B C D A B E F ~ I J@2 K@4 ~@7 G H A B C D A B E F ~ I J@2 K@4 ~@4 A B C D A B E F ~ I J@2
  K@4 ~@5
>`.pickRestart({
  A: "~@11 [a4,d5] d5@2 ~ [c#5,e5], ~@12 a4 ~@3", B: "[c#5,e5]@10 ~ a4!2 ~@2 [b4,d5]", C: "[b4,d5]@5 ~ b4@2",
  D: "a4@4 f#4@4 d4@3 ~ e4@4", E: "[b4,d5]@11 ~ b4@4", F: "a4@3 ~ f#4@4 d4@4 e4@4", G: "b4@3 e5", H: "d5@8 c#5@7 ~",
  I: "~@4 b4@3 ~ a4@3 ~ e5@3 d5", J: "[d5@7 ~]/2", K: "d5!2 ~ d5 ~ d5 ~ d5!2 ~@7",
})).s("gm_trumpet").gain(0.49).pan(0.2)

// chords · brass section
const brass_section = note(`<
  ~ A B C D E F G H ~@19 I J A B C D E F G H K L M@2 N@4 ~@7 I J A B C D E F G H K L M@2 N@4 ~@4 A B C D E F G H K L M@2
  N@4 ~@5
>`.pickRestart({
  A: "~@11 d5 d5@2 ~ e5, [a3,a4]@7 ~", B: "e5@9 ~@2 a4!2 ~@2 d5, c#4", C: "b3@3 b4, d5@5 ~@3",
  D: "a4@4 f#4@4 d4@3 ~ e4@4", E: "~@11 d5 d5@2 ~ e5, [a3,a4]@15 ~", F: "e5@10 ~ a4!2 ~@2 d5, c#4@15 ~",
  G: "b3@3 b4, d5@11 ~@5", H: "a4@3 ~ f#4@4 d4@4 e4@4", I: "~@3 e5, [b3,e4,b4]@15 ~", J: "[d4,d5]@7 ~ [c#4,c#5]@8, e4",
  K: "[a3,a4]@7 ~", L: "~@4 b4@3 ~ a4@3 ~ e5@3 d5, c#4", M: "[d5@27 ~@5, b3@3 ~@5]/2",
  N: "[d4,a4,d5]!2 ~ [d4,a4,d5] ~ [d4,a4,d5] ~ [d4,a4,d5]!2 ~@7", // D5
})).s("gm_brass_section").gain(0.34)

// bass · trombone
const bass_2 = note(`<
  ~ A B C ~ A D C ~@20 E F A B C ~ A D C ~ A B C ~@5 G@2 ~@2 H@2 ~ E F A B C ~ A D C ~ A B C ~@9 A B C ~ A D C ~ A B C
  ~@10
>`.pickRestart({
  A: "d2@15 ~", B: "c#2@15 ~", C: "b1@13 ~@3", D: "c#2@7 ~", E: "e3@10 ~@2 e3@3 ~", F: "a2@13 ~@3", G: "[g2@21 ~@11]/2",
  H: "[g2@23 ~@9]/2",
})).s("gm_trombone").gain(0.37).pan(0.8)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A B C D A B C E ~@21 A B C D A B C D A B C D ~@5 F ~@2 G H I J K A B C D A B C D A B C D ~@4 A B L D A B C D A B C D
  A B C D ~@9
>`.pickRestart({
  A: "~@2 a5 b5", B: "a5 f#5", C: "d5@2 a5 b5", D: "a5 f#5 d5 e5", E: "a5@2 f#5@2 d5@2 e5 ~", F: "c5@11 ~@5",
  G: "~ b4 ~@2", H: "c5@5 ~@3", I: "e5 ~", J: "~@12 [e5,b5]@3 ~", K: "d5@8 c#5@7 ~, a5@15 ~", L: "~@2 a5 ~",
})).s("gm_string_ensemble_1").gain(0.64).pan(0.2)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@46 A B C D E F G H ~@19 I ~@22>".pickRestart({
  A: "~ [g4,b4] [f#4,a4] [g4,b4]", B: "a4@11 ~ [a4,c5]@2 [b4,d5]@2", C: "[c5,e5]@2 [a4,c5] [b4,d5]", D: "b4, g4@7 ~",
  E: "~ g4 [f#4,a4] [g4,b4]", F: "a4@11 ~ c5@2 [b4,d5]@2, ~@11 a4@3 ~@2", G: "c5@2 [a4,c5] [b4,d5]",
  H: "g#4@11 ~@5, b4@9 ~@7", I: "~@3 b5",
})).s("gm_string_ensemble_1").gain(0.32).pan(0.2)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A B C D E F G H ~@4 I J K I@2 J K I@2 J K I@2 J K L M N B C D E F G H N B C D O@4 I J K I@2 J K L M N B C D E F G H
  N B C D O@4 ~@4 N B C D E F G H N B C D O@4 ~@5
>`.pickRestart({
  A: "[d4,f#4,a4]@2 ~ [d4,f#4] [d4,f#4,a4] ~@3 [d4,f#4,a4]!2 ~ [d4,f#4] [d4,f#4,a4] ~@3", // D
  B: "[c#4,e4,a4]@2 ~ [c#4,e4,a4]!2 ~@3 [c#4,e4,a4]!2 ~ [c#4,e4] [c#4,e4,a4] ~@3", // A C#m A
  C: "[b3,d4,g4]@2 ~ [b3,d4,g4]!2 ~@3 [b3,d4,g4]!2 ~ d4 [b3,d4,g4] ~@3", // G
  D: "[b3,e4,g4]@2 ~ [b3,e4,g4]!2 ~@3 [c#4,e4,a4]!2 ~ [c#4,e4] [c#4,e4,a4] ~@3", // Em A C#m A
  E: "[d4,f#4,a4]@2 ~ [d4,f#4,a4]!2 ~@3 [d4,f#4] [d4,f#4,a4] ~ f#4 [d4,f#4,a4] ~@3", // D
  F: "[c#4,e4,a4]@2 ~ [c#4,e4,a4]!2 ~@3 [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~@3", // A
  G: "[b3,d4,g4]@2 ~ [b3,d4,g4]!2 ~@3 [b3,d4,g4]!2 ~ [b3,d4,g4]!2 ~@3", // G
  H: "[b3,e4,g4]@2 ~ [b3,e4] [b3,e4,g4] ~@3 [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~@3", I: "~@4 [b3,d4,g4] ~@7 [b3,d4,g4] ~@3",
  J: "~@4 [a3,e4,a4] ~@7 [a3,e4,a4] ~@3", K: "~@4 [c4,e4,a4] ~@7 [c4,e4,a4] ~@3",
  L: "[g#3,b3,e4,g#4]!2 ~ [g#3,b3,e4,g#4] ~ [g#3,b3,e4,g#4] ~ [g#3,b3,e4,g#4]!2 ~ [g#3,b3,e4,g#4] ~ [g#3,b3,e4,g#4] ~@3", // E
  M: "[a3,d4,e4,a4]!2 ~ [a3,d4,e4,a4] ~ [a3,d4,e4,a4] ~ [a3,d4,e4,a4] [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2 ~@2", // Asus4 A
  N: "[f#4,a4]@2 ~ [d4,f#4] [d4,f#4,a4] ~@3 [d4,f#4,a4]!2 ~ [d4,f#4] [d4,f#4,a4] ~@3", // F#m D
  O: "[a3,d4,a4]!2 ~ [a3,d4,a4] ~ [a3,d4,a4] ~ [a3,d4,a4]!2 ~ [a3,d4,a4] ~ [a3,d4,a4] ~@3", // D5
})).s("gm_electric_guitar_clean").gain(0.34).pan(0.8)

// other · flute
const flute = note(`<
  ~ A B C D A B C E ~@21 A B C D A B C F A B C D ~@4 G H ~@2 I J ~@3 A B C D A B C F A B C D ~@8 A B C D A B C F A B C D
  ~@9
>`.pickRestart({
  A: "~@2 a6 b6", B: "a6 f#6", C: "d6@2 a6 b6", D: "a6@4 f#6@4 d6@4 e6@3 ~", E: "a6@2 f#6@2 d6@2 e6 ~",
  F: "a6 f#6 d6 e6", G: "~@4 b5@5 ~@7", H: "c6@11 ~@3 d6@2", I: "~ b5 ~ b5", J: "c6@11 ~ c6@2 ~@2",
})).s("gm_flute").gain(0.72).pan(0.9)

// other · flute · soft notes
const flute_soft = note("<~@46 A B C D@2 E C F ~@17 G H G I ~@21>".pickRestart({
  A: "~@2 a5 b5", B: "~@11 c6@2 ~@3", C: "e6@2 c6 d6", D: "[b5@9 ~@3 a5@2 ~@2]/2", E: "~@7 d6", F: "b5@5 ~@3",
  G: "~@2 a6 b6", H: "a6 f#6", I: "a6@4 f#6@4 d6@4 e6@3 ~",
})).s("gm_flute").gain(0.4).pan(0.9)

// other · tubular bells
const tubular_bells = note("<~@71 [d6@3 ~ d6@2 ~@2 d6@2 ~@2 d6@2 ~@2] [d6 ~ d6 ~ d6 ~ d6 ~]!3 ~@21>")
  .s("gm_tubular_bells").gain(0.32)

// chords · string ensemble 1 · "Instrumental Strings" · G F#m G Am Bm C Am Bm …
const string_ensemble_1_2 = note(`<
  ~@46
  [~ [g4,b4] [f#4,a4] [g4,b4]]
  [[a4,c5]@11 ~ [a4,c5]@2 [b4,d5]@2]
  [[c5,e5]@2 [a4,c5] [b4,d5]]
  [[g4,b4]]
  [~ [g4,b4] [f#4,a4] [g4,b4]]
  [[a4,c5]@11 ~ [a4,c5]@2 [b4,d5]@2]
  ~@44
>`).s("gm_string_ensemble_1").gain(0.56).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@3 ~ A@3 B ~@4 A C@15 ~ A@3 ~ A@3 B A@3 ~ A@3 ~ C@8 ~ A@3 ~ A@3 B A@3 ~ A@3 ~@3 D ~ A@3 ~ A@3 B A@3 ~ A@3 ~@6
>`.pickRestart({
  A: "~@5 x ~ x", B: "~@5 x ~@2", C: "~@7 x", D: "x",
})).gain(0.56)

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

// drums · hihat
const hihat = s("hh").struct("<~ A@7 B ~@12 A@8 C A@7 B A@16 C A@7 B A@8 ~@4 A@7 B A@8 ~@5>".pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!6 ~@2",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct(`<
  A ~@3 A ~@5 A ~ A ~@16 A ~@3 A ~@3 A ~@3 A ~@3 A ~@8 A ~@3 A ~@3 A ~@3 A ~@5 B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~
>`.pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A ~@3 A ~@7 A ~@16 A ~@3 A ~@3 A ~@3 A ~@3 A ~@8 A ~@3 A ~@3 A ~@3 A ~@5 B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~@2 x ~",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@29 [~@4 x!2 ~@2] ~@24 [~@4 x!2 ~@2] ~@41>").gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@7 A ~@16 A ~@3 A ~@3 A ~@16 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@11 A
>`.pickRestart({
  A: "x",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B C D E B D F G ~@2 H ~@18 B C D E B D F G B C D E ~@13 B C D E B D F G B C D E ~@8 B C D E B D F G B C D E ~@6 H
  ~@2
>`.pickRestart({
  A: "~@15 x", B: "x ~@2 x!2 ~ x!3 ~ x!3 ~ x!2", C: "x ~@2 x!2 ~ x!3 ~ x!3 ~@2 x", D: "x ~ x!3 ~ x!3 ~ x!3 ~@2 x",
  E: "x ~@2 x!2 ~ x!3 ~@2 x!2 ~ x!2", F: "x ~ x!3 ~@2 x!2 ~ x!3 ~@2 x", G: "x ~ x!3 ~ x!3 ~ x!3 ~@3", H: "x",
})).gain(0.64)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~ A B C D A C E ~@22 A B C D A C E ~ A B C D ~@13 A B C D A C E ~ A B C D ~@8 A B C D A C E ~ A B C D ~@9
>`.pickRestart({
  A: "~ x ~@6", B: "~ x ~@5 x", C: "~@7 x", D: "~ x ~@3 x ~@2", E: "~@3 x ~@3 x",
})).gain(0.4)

// drums · triangle
const triangle = s("triangles:35").struct("<~@71 [x!4]!4 ~@21>").gain(6.97)

stack(
  bass, trumpet, brass_section, bass_2, string_ensemble_1, string_ensemble_1_soft, electric_guitar_clean, flute,
  flute_soft, tubular_bells, string_ensemble_1_2, kick, snare, hihat, low_tom, mid_tom, open_hat, crash, tambourine,
  tambourine_soft, triangle
)