Strudelify

Endless Love

Mariah Carey

KeyB♭ majorTempo90 bpm
0:00/0:00
// Endless Love — Mariah Carey
// 90 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 5 "lo strings" string ensemble 2 (copy of ch 6 "Strings (BB)" string ensemble 1)
// note: Full arrangement: all 106 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/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 · "Bass    (BB)"
const bass = note(`<
  ~@2 A@6 B C A@4 B C A D B E D F B E A G B E D F H I J K A@6 B E A@4 B C A D B E D F B E A G B E D F H I J K A@2 B E
  A@4 B L A@2 B E D M B E A G B E D F H N H N H I J K A O P Q A@2 R S
>`.pickRestart({
  A: "bb1@11 ~ bb1@10 f2@2", B: "eb2@11 ~ eb2@10 bb2@2", C: "f2@11 ~ f2@6 f2@6", D: "bb1@11 ~ a1@11 ~",
  E: "f2@11 ~ f2@11 ~", F: "g2@11 ~ f2@11 ~", G: "ab2@11 ~ f2@11 ~", H: "eb2@11 ~ eb2@10 bb1@2",
  I: "d2@11 ~ d2@10 a1@2", J: "c2@11 ~ c2@10 g2@2", K: "f2@23 ~", L: "f2@11 ~ f2@10 f2@2", M: "g2@11 ~ a1@11 ~",
  N: "d2@11 ~ d2@10 a2@2", O: "ab2@11 ~ ab2@10 eb2@2", P: "gb2@11 ~ gb2@10 db2@2", Q: "f2@11 ~ f2@10 c2@2",
  R: "bb1@3 f2", S: "bb1@13 ~@11",
})).s("gm_acoustic_bass").gain(0.4)

// chords · piano · "Piano   (BB)"
const piano = note(`<
  ~@2 A B C D E@2 F G E@4 H I A J F K L M H N C O P Q J R P S T U C D E@2 A B H V C D E@2 F W X Y H Z L AA H AB A AC H
  AD Y AE P AF T U E@2 P AB C D E@2 P AG E@2 P N AH AI P Q X AJ F V J AK AL AF AL AM AL AM AN AO X AP AQ AR C A AS@2
>`.pickRestart({
  A: "~@11 f3, bb1 bb2, bb3!2 d4!2, ~ f3@3 f3@3 bb3@2 ~ bb3@2, ~@2 d3@3 d3@2 ~ f3@3 ~",
  B: "~@5 d3 ~@5 f3, bb1@6 ~@2 f3@3 ~, bb3!2 d4!2, ~ f3@2 ~ f3@2 ~ bb3@3 bb3@2, ~ d3 ~ bb2@3",
  C: "~@11 d3, d4, bb1@11 ~, ~ d3@2 bb3@2 d3@2 f3@2 bb3@3, ~ f3!2 bb3 d3 f3",
  D: "~@11 d3, [bb1,d4], ~ d3@3 ~ d3@2 ~ d3@2 ~@2, ~@2 f3@2 f3@2 ~ f3@2 ~ f3@2, ~@3 bb3@2 ~ bb3@2 ~ bb3@3", // Bb
  E: "[~@5 d3 ~@2 f3 ~@14 d3, bb1@3 ~@2 f3 ~ f3!2 bb2@3, ~ d3@2 bb3@3 ~ d3@2 bb3@3 ~@3 bb3@2 ~@3 f3@2 f3@2, ~ f3!2 bb2@3 bb1@3 ~@3, ~@11 d3@2 d3@2 ~@2 d3@2 d3@2 bb3@2 ~]/2",
  F: "~@11 bb3, eb2 eb3, eb4!2 g4!2, ~ bb3@3 bb3@3 eb4@2 ~ eb4@2, ~@2 g3@3 g3@2 ~ bb3@3 ~",
  G: "~@5 g3 ~@2 c4 ~@2 a3, [f2,g4]@2 f2 [f2,f4], ~ g3@3 ~@8, ~@2 bb3@2 bb3@2 ~ bb3@2 ~ c4@2, ~@3 eb4@2 ~@7", // Fsus2 F
  H: "~@11 g3, g4, eb2@11 ~, ~ g3@2 eb4@2 g3@2 bb3@2 eb4@3, ~ bb3!2 eb4 g3 bb3",
  I: "~@5 g3 ~@2 bb3 ~@2 c4, f2@2 [f2,f4] [f2,a4], ~ g3@4 ~@5 a3@2, ~@2 bb3@2 bb3@2 ~ c4@2 ~@3, ~ g4 ~@2", // F
  J: "~@5 d3 ~@5 a3, bb1@6 ~@3 f4@2 ~, bb3@3 bb3@3 ~ a3@3 ~@2, ~ f3@3 f3@2 ~@2 c4@2 c4@2, ~@2 d3@3 ~ [a2,a4]@6", // A
  K: "~@5 g3 ~@5 a3, f2!2, ~ g3@4 ~@3 c4@2 c4@2, ~@2 bb3@2 bb3@2 ~ a3@4 ~, ~ g4 ~ a4",
  L: "~@5 d3 ~@5 a3, bb1@3 ~ c4!2, ~ d3@2 bb3@3 ~ a3@3 ~@2, ~ f3!2 [a2,a4]@3, ~@9 f4@2 ~", // A
  M: "~@5 bb3 ~@5 f3, g2 f2, ~ bb3@4 ~@2 f3@2 ~@3, ~ d4!2 ~ a3!2, ~ bb4 ~ d4",
  N: "~@5 g3 ~@5 a3, [f2,g4] [f2,a4], ~ g3@3 ~@5 f4@2 ~, ~@2 bb3@2 bb3@2 ~ a3@3 ~@2, ~@3 eb4@2 ~@3 c4@2 c4@2", // Fsus2 F
  O: "~@5 ab3 ~@5 d3, ab2 f2, f4@3 f4@3 ~@2 d3@3 ~, ~ c4@3 c4@2 c4@3 c4@3, ~@2 ab3@3 ~@2 f3@3 f3@2",
  P: "~@5 g3 ~@2 bb3 ~@2 g3, eb2!2, ~ g3@4 ~@2 g3@3 ~@2, ~ bb3!2 ~@2 bb3, ~ g4 ~ g4",
  Q: "~@5 g3 ~@5 a3, f2 [f2,a4], ~ g3@4 ~@3 c4@2 c4@2, ~@2 bb3@2 bb3@2 ~ a3@3 ~@2, ~@3 g4@3 ~@3 f4@2 ~", // F
  R: "~@5 bb3 ~@5 a3, g2 [f2,a4], ~ bb3@4 ~@2 a3@3 ~@2, ~ d4!2 ~ c4!2, ~@3 bb4@3 ~@3 d4@2 ~", // F
  S: "~@11 f3, f4, d2@11 ~, ~ f3@2 c4@2 f3@2 a3@2 c4@3, ~ a3!2 c4 f3 a3",
  T: "~@5 eb3 ~@2 g3 ~@2 eb3, c2@3 ~@2 g3, ~ eb3@2 bb3@3 ~ eb3@2 bb3@3, ~ g3!2 c3@3", U: "[f2,g4]@23 ~",
  V: "~@5 g3 ~@5 a3, f2!2, eb4@3 eb4@3 ~@2 c4@2 c4@2, ~ bb3@3 bb3@2 ~ a3@4 ~, ~@2 g3@3 ~@4 a4@3",
  W: "~@5 g3 ~@2 bb3 ~@2 c4, f2@2 [f2,f4] f2, eb4!2 ~@2, ~ bb3@3 bb3@2 ~ c4@2 ~@3, ~@2 g3@3 ~@5 a3@2", // F
  X: "~@5 d3 ~@2 f3 ~@2 d3, bb1@3 ~@2 f3, ~ d3@2 bb3@3 ~ d3@2 bb3@3, ~ f3!2 bb2@3",
  Y: "~@5 d3 ~@5 a3, bb1 a1, bb3@3 bb3@3 ~ a3@4 ~, ~ f3@3 f3@2 ~@2 c4@2 c4@2, ~@2 d3@3 ~@4 a4@3",
  Z: "~@5 g3 ~@5 a3, f2 [f2,a4], eb4@3 eb4@3 ~@2 c4@2 c4@2, ~ bb3@3 bb3@2 ~ a3@3 ~@2, ~@2 g3@3 ~@4 f4@2 ~", // F
  AA: "~@5 bb3 ~@5 f3, [g2,bb4] f2, ~ bb3@3 ~@3 a3@3 a3@2, ~@2 d4@2 d4@2 d4@3 d4@3, ~@3 g4@2 ~@3 f3@3 ~", // Gm
  AB: "~@5 g3 ~@5 a3, [f2,g4] f2, ~ g3@3 ~@5 a4@3, ~@2 bb3@2 bb3@2 ~ a3@4 ~, ~@3 eb4@2 ~@3 c4@2 c4@2", // Fsus2
  AC: "~@5 ab3 ~@5 d3, [ab2,ab4] f2, ~ ab3@3 ~@3 f3@3 f3@2, ~@2 c4@2 c4@2 c4@3 c4@3, ~@3 eb4@2 ~@3 d3@3 ~", // Ab
  AD: "~@5 g3 ~@5 a3, f2!2, ~ g3@4 ~@3 a3@3 ~, ~@2 bb3@2 bb3@2 ~ c4@3 c4@2, ~ g4 f4!2",
  AE: "~@5 bb3 ~@5 a3, g2 f2, ~ bb3@4 ~@2 c4@3 c4@2, ~@2 d4@2 d4@2 f4@3 f4@3, ~@3 bb4@3 ~@2 a3@3 ~",
  AF: "~@5 f3 ~@2 a3 ~@2 f3, d2@3 ~@2 a3, ~ f3@2 c4@3 ~ f3@2 c4@3, ~ a3!2 d3@3",
  AG: "~@5 g3 ~@2 bb3 ~@2 g3, f2!2, ~ g3@4 ~@2 g3@3 ~@2, ~ bb3!2 ~@2 bb3, ~ g4 ~ g4",
  AH: "~@5 d3 ~@5 a3, bb1 a1, ~ d3@2 bb3@3 ~ a3@4 ~, ~ f3!2 ~ c4!2, ~@3 a4",
  AI: "~@5 bb3 ~@5 a3, g2 [a2,a4], g4@3 g4@3 ~@3 f4@2 ~, ~ d4@3 d4@2 ~@2 c4@2 c4@2, ~@2 bb3@3 ~@2 a3@3 ~@2", // A
  AJ: "~@5 ab3 ~@5 d3, ab2 f2, f4!2 ~@2, ~ c4@3 c4@2 ~@2 f3@2 f3@2, ~@2 ab3@3 ~@2 d3@2 ab3@3",
  AK: "~@5 bb3 ~@5 f3, g2 f2, g4@3 g4@3 ~@2 f3@3 ~, ~ d4@3 d4@2 d4@3 d4@3, ~@2 bb3@3 ~@2 a3@3 a3@2",
  AL: "~@5 eb3 ~@2 g3 ~@2 eb3, eb2!2, ~ eb3@4 ~@2 eb3@3 ~@2, ~ g3!2 ~@2 g3, ~ d4 ~ d4",
  AM: "~@11 a3, d2 d3, d4!2 f4!2, ~ a3@3 a3@3 d4@2 ~ d4@2, ~@2 f3@3 f3@2 ~ a3@3 ~",
  AN: "~@11 eb3, eb4, c2@11 ~, ~ eb3@2 bb3@2 eb3@2 g3@2 bb3@3, ~ g3!2 bb3 eb3 g3", AO: "[f2,eb4]@23 ~",
  AP: "~@11 eb4, ab2!2, ab4!2 c5!2, ~ eb4@3 eb4@3 ab4@2 ~ ab4@2, ~@2 c4@3 c4@2 ~ eb4@3 ~",
  AQ: "~@11 bb3, bb4, gb2@11 ~, ~ bb3@2 gb4@2 bb3@2 db4@2 gb4@3, ~ db4!2 gb4 bb3 db4",
  AR: "~@11 c4, f2 f3, f4!2 a4!2, ~ c4@3 c4@3 f4@2 ~ f4@2, ~@2 a3@3 a3@2 ~ c4@3 ~",
  AS: "[~@22 bb3@2 [d4,f4,bb4]@17 ~@7, bb1@5 ~, ~ d3@4 d3@5 d4@2 ~@12, ~@2 f3@2 f3@3 bb3@2 f4@3 ~@12, ~@3 bb3@3 d4@2 f3@4 ~@12]/2", // Bb
})).s("gm_piano").gain(0.3)

// chords · vibraphone · "vibes"
const vibraphone = note(`<
  ~@2 A B A B A B C D A B A B E D F G H I G J E K L M N O P Q H R S T U V A B A B N O A B U V H W F X H K G Y N O L Z H
  AA P AB H R S T U V N AA U V A B E N A B C K AC AD N I U Z E K X Y AE AF AG AH AE AF AI AJ U AK AL AM AN@2 AO AP
>`.pickRestart({
  A: "~@2 f3@9 ~, [d4,f4]@11 ~, ~ bb3@10 ~", B: "~ f3@5, [d4,f4], ~ bb3@11",
  C: "g4@9 ~@2 g3, [g3,bb3]@11 ~, eb4@5 eb4, ~@3 g4", D: "[g3,bb3,eb4,g4]@2 [bb3,c4,f4,bb4] [a3,c4,f4,a4]",
  E: "~ [bb3,eb4]@5, g4, ~ g3@11", F: "f4@3 ~@2 f3@7, d4, f3@5 ~@7, bb3 bb3@2, ~ f4@3",
  G: "~ f3@2 ~ a3@2, [d4,f4] [f4,a4], ~ bb3@5 ~ c4@5", H: "[g3,bb3,eb4,g4]@7 ~",
  I: "~ g3@2 [a3,c4,f4,a4]@3, [eb4,g4] ~, ~ bb3@5 ~@6", J: "[bb3,d4,g4,bb4] [a3,d4,f4,a4]",
  K: "[g3,bb3,eb4,g4] [a3,c4,f4,a4]", L: "~ [bb3,d4]@5, f4, ~ f3@11",
  M: "[f3,ab3,c4,eb4]@3 ~ f3@2, ~ [c4,d4], ~@7 ab3@5", N: "g4@3 ~@2 g3@7, eb4, g3@5 ~@7, bb3 bb3@2, ~ g4@3",
  O: "[g3,bb3,eb4,g4]@3 ~ a3@2, ~ [f4,a4], ~@7 c4@5", P: "[f3,bb3,d4,f4] [a3,c4,f4,a4]",
  Q: "[bb3,d4,g4,bb4]@3 ~ f3@2, ~ [c4,d4], ~@7 a3@5", R: "f4@3 ~@2 a3@7, d4, a3@5 ~@7, c4 c4@2, ~ f4@3",
  S: "[g3,bb3,c4,eb4]@7 ~", T: "[g3,bb3,eb4,g4]@23 ~", U: "[f3,bb3,d4,f4]@7 ~", V: "[f3,bb3,d4,f4]",
  W: "[g3,bb3,eb4,g4]@6 ~@2 bb3 [a3,c4,f4,a4]@3, ~@2 [f4,bb4] ~, ~@7 c4@2 ~@3", // Eb F Bb5
  X: "~ f3@2 [a3,c4,f4,a4]@3, [d4,f4] ~, ~ bb3@5 ~@6", Y: "~ bb3@2 [a3,d4,f4,a4]@3, [g4,bb4] ~, ~ d4@5 ~@6",
  Z: "[f3,ab3,c4,eb4] [f3,ab3,c4,d4]", AA: "~ g3@2 ~ a3@2, [eb4,g4] [f4,a4], ~ bb3@5 ~ c4@5",
  AB: "[bb3,d4,g4,bb4] [f3,a3,c4,d4]", AC: "[f3,bb3,d4,f4]@3 ~ a3@2, ~ [f4,a4], ~@7 c4@5",
  AD: "[g3,bb3,d4,f4] [a3,c4,f4,a4]", AE: "[eb3,g3,bb3,d4]@7 ~", AF: "[a3,c4,d4,f4]@7 ~",
  AG: "d4@3 ~@2 eb3@7, bb3, eb3@5 ~@7, g3 g3@2, ~ d4@3", AH: "~ [c4,d4]@5, f4, ~ a3@11",
  AI: "~ [bb3,c4]@5, eb4, ~ g3@11", AJ: "[eb4,g4]@23 ~", AK: "~ [eb4,ab4]@5, c5, ~ c4@11",
  AL: "bb4@3 ~@2 bb3@7, gb4, bb3@5 ~@7, db4 db4@2, ~ bb4@3", AM: "a4@9 ~@2 a3, [a3,c4]@11 ~, f4@5 f4, ~@3 a4",
  AN: "f4@9 ~@2 f3, [f3,bb3]@11 ~, d4@5 d4, ~@3 f4", AO: "[f4,d5] [d4,f4,d5]", AP: "[f4,d5]@5 ~@3",
})).s("gm_vibraphone").gain(0.22)

// chords · string ensemble 1 · "Strings (BB)"
const string_ensemble_1 = note(`<
  ~@18 A B C D A B E F A B C G A H I J ~@24 A B C G A H I J ~@12 A B C K A B E F A B C D L H L H L H I J E M N O E@2 P@2
>`.pickRestart({
  A: "[bb3,eb4,g4]", B: "[bb3,eb4,g4] [c4,f4,a4]", C: "[bb3,d4,bb4] [c4,f4,a4]", D: "[d4,g4,bb4] [d4,f4,d5]",
  E: "[bb3,d4,bb4]", F: "[c4,eb4,ab4] [c4,d4,ab4]", G: "[d4,g4,bb4] [c4,d4,a4]", H: "[d4,f4,c5]", I: "[c4,eb4,bb4]",
  J: "[bb3,eb4,g4]@23 ~", K: "[d4,f4,bb4] [c4,f4,a4]", L: "[bb3,d4,g4]", M: "[eb4,ab4,c5]", N: "[db4,gb4,bb4]",
  O: "[c4,f4,a4]", P: "[[d4,bb4]@3 ~]/2",
})).s("gm_string_ensemble_1").gain(0.25)

// other · brass section · "brass"
const brass_section = note("<~@67 A B@2 C@2 ~ D E@2 C@2 ~@28>".pickRestart({
  A: "~@12 d5@4 eb5@3 ~ f5@3 ~", B: "[f5@9 ~ d5@2 eb5@20 c5@3 ~ c5@4 c5@4 ~ c5@3, ~@9 eb5@2 ~@37]/2",
  C: "[c5@3 d5@3 ~ d5@30 ~@11]/2", D: "~@12 d5@4 ~ eb5@3 f5@3 ~", E: "[f5@8 eb5@2 d5@2 eb5@20 c5@3 ~ c5@4 c5@4 c5@4]/2",
})).s("gm_brass_section").gain(0.6).pan(0)

// other · french horn
const french_horn = note("<~@67 A B@2 C@2 ~ D E@2 F@2 ~@28>".pickRestart({
  A: "~@13 d6@4 eb6@3 f6@3 ~", B: "[f6@8 eb6@2 d6@2 eb6@24 c6@8 ~ c6@3]/2", C: "[c6@3 d6@3 ~ d6@30 ~@11]/2",
  D: "~@12 d7@4 eb7@3 ~ f7@3 ~", E: "[f7@8 eb7@2 d7@2 eb7@21 c7@3 ~ c7@3 c7@4 ~ c7@3]/2",
  F: "[c7@3 d7@3 ~ d7@30 ~@11]/2",
})).s("gm_french_horn").gain(0.6).pan(1)

// other · trombone
const trombone = note("<~@67 A B@2 C@2 ~ D E@2 F@2 ~@28>".pickRestart({
  A: "~@12 d5@4 ~ eb5@3 f5@3 ~", B: "[f5@8 eb5 ~ d5@2 eb5@21 c5@2 ~ c5@3 ~ c5@5 c5@2 ~]/2",
  C: "[c5@3 d5@2 ~@2 d5@25 ~@16]/2", D: "~@12 d6@4 eb6@3 ~ f6@2 ~@2",
  E: "[f6@8 eb6 ~ d6 eb6@21 ~ c6@3 c6@3 ~ c6@3 ~@2 c6@3]/2", F: "[c6@3 ~ d6@2 ~ d6@20 ~@21]/2",
})).s("gm_trombone").gain(0.6).pan(0)

// other · synth brass 1 · "synth brass"
const synth_brass_1 = note("<~@67 A B@2 C@2 ~ D E@2 F@2 ~@28>".pickRestart({
  A: "~@13 d5@3 eb5@3 ~ f5@3 ~", B: "[f5@8 ~@2 d5@2 eb5@21 c5@3 c5@3 ~ c5@3 ~@2 c5@3, ~@9 eb5@2 ~@37]/2",
  C: "[c5 d5 d5@8 ~@6]/2", D: "~@12 d6@4 eb6@3 ~ f6@3 ~", E: "[f6@8 eb6@2 d6@2 eb6@21 c6@3 ~ c6@3 c6@3 ~@2 c6@3]/2",
  F: "[c6@3 d6@3 d6@35 ~@7]/2",
})).s("gm_synth_brass_1").gain(0.6).pan(1)

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

// drums · rim
const rim = s("rim").struct(`<
  A B C@19 ~ C@3 ~ C@3 ~ C@3 ~ C@15 ~ C@3 ~ C@3 ~ C@3 ~@3 C ~ C@15 ~ C@3 ~ C@3 ~ C@3 ~ C@3 ~@5 C ~@3
>`.pickRestart({
  A: "x!2", B: "x!4", C: "~ x ~ x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@18 A@15 ~@13 A@19 ~@13 A@19 ~ A@7 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@105 [~@10 x!2 ~@12]>").gain(0.71)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A@2 B A B A@5 B A B@3 A C B@3 C B@3 C B@6 D A@2 B A B A B A B@2 A@2 C B@18 D A@4 B A B@3 A B A C B@3 C B@14 D B@4
  C B@2 ~
>`.pickRestart({
  A: "x!11 ~", B: "x!12", C: "~ x!11", D: "x",
})).gain(0.57)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A@2 ~ A ~ A@5 ~ A ~@3 A ~@16 A@2 ~ A ~ A ~ A ~@2 A@2 ~@20 A@4 ~ A ~@3 A ~ A ~@27 B
>`.pickRestart({
  A: "~@11 x", B: "x",
})).gain(0.57)

// drums · crash
const crash = s("cr").struct("<~@18 A ~@3 A ~@3 A ~@19 A ~@31 A ~@3 A ~@19 A ~@3>".pickRestart({
  A: "x",
})).gain(0.5)

stack(
  bass, piano, vibraphone, string_ensemble_1, brass_section, french_horn, trombone, synth_brass_1, kick, rim, snare,
  low_tom, hihat, open_hat, crash
)

More by Mariah Carey