Strudelify

Forever

Mariah Carey

KeyA♭ majorTempo65 bpm
0:00/0:00
// Forever — Mariah Carey
// 65 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 51 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(65/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"
const bass = note(`<
  A@3 B C D A B C D E F E F E F A@2 B C D A B C D E F E F E F A C@2 A G C@2 E H I J I J I J I J K ~@2
>`.pickRestart({
  A: "ab2@11 ~ ab2@10 eb2@2", B: "c2@11 ~ f2@11 ~", C: "db2@11 ~ db2@10 ab2@2", D: "eb2@11 ~ eb2@10 bb2@2",
  E: "ab2@11 ~ f2@11 ~", F: "db2@11 ~ db2@11 ~", G: "f2@11 ~ f2@10 c2@2", H: "bb1@11 ~ eb2@11 ~", I: "a1@11 ~ gb2@11 ~",
  J: "d2@11 ~ d2@11 ~", K: "a1@11 ~ a1@10 ~@2",
})).s("gm_acoustic_bass").gain(0.2)

// chords · piano
const piano = note(`<
  A@2 B C D E F G H I J K L M N M O B P H E F Q H E R S J T R U B V W O X D Y L Z AA AB AC AD AE AB AE AB AF ~@2
>`.pickRestart({
  A: "[~@5 c4 ~@2 eb4 ~@2 c4@2 ~@10 c4, ab2 ab2@2 ab2, ~ c4@4 ~@2 c4@3 ~@3 c4@4 c4@2 c4@4 ~, ~ eb4!2 ~@2 eb4 ~ eb4!2 ~ eb4!2, ~@3 c5@3 ~@3 c5@6 c5@4 ~@2 c5@3]/2",
  B: "~@5 c4 ~@2 eb4 ~@2 c4, ab2!2, ~ c4@4 ~@2 c4@3 ~@2, ~ eb4!2 ~@2 eb4, ~ c5 ~ c5",
  C: "~@5 e3 ~@5 ab3, c2 f2, c4@3 c4@3 ~@2 c4@2 c4@2, ~ g3@3 g3@2 ~ ab3@4 ~, ~@2 e3@3 ~@4 ab4@3",
  D: "~@11 ab3, db2 db3, db4!2 f4!2, ~ ab3@3 ab3@3 db4@2 ~ db4@2, ~@2 f3@3 f3@2 ~ ab3@3 ~",
  E: "~@11 g3, g4, eb2@11 ~, ~ g3@2 eb4@2 g3@2 bb3@2 eb4@3, ~ bb3!2 eb4 g3 bb3",
  F: "~@11 c4, c5, ab2@11 ~, ~ c4@2 ab4@2 c4@2 eb4@2 ab4@3, ~ eb4!2 ab4 c4 eb4",
  G: "~@5 e3 ~@5 ab3, [c2,e4] [f2,ab4], ~ e3@3 ~@5 f4@2 ~, ~@2 g3@2 g3@2 ~ ab3@3 ~@2, ~@3 c4@2 ~@3 c4@2 c4@2", // C Fm
  H: "~@5 f3 ~@2 ab3 ~@2 f3, db2@3 ~@2 ab3, ~ f3@2 db4@3 ~ f3@2 db4@3, ~ ab3!2 db3@3",
  I: "~@11 bb3, eb2 eb3, eb4!2 g4!2, ~ bb3@3 bb3@3 eb4@2 ~ eb4@2, ~@2 g3@3 g3@2 ~ bb3@3 ~",
  J: "~@5 c4 ~@5 ab3, [ab2,c5] [f2,ab4], ~ c4@3 ~@3 ab3@3 ~@2, ~ eb4!2 ~ c4!2, ~@3 ab4@2 ~@4 f4@2 ~", // Ab Fm
  K: "~@5 f3 ~@5 e3, db2 [db2,e4], db4@3 db4@3 ~@3 db4@2 ~, ~ ab3@3 ab3@2 ~@2 ab3@2 ab3@2, ~@2 f3@3 ~@2 e3@3 ~@2", // Dbm
  L: "~@5 c4 ~@5 ab3, ab2 f2, ~ c4@4 ~@2 c4@3 c4@2, ~@2 eb4@2 eb4@2 f4@3 f4@3, ~@3 c5@3 ~@2 ab3@3 ~",
  M: "~@5 f3 ~@5 e3, db2!2, db4!4, ~ ab3@3 ab3@2 ~ ab3@3 ab3@2, ~@2 f3@3 ~@3 e3@3 ~",
  N: "~@5 c4 ~@5 ab3, ab2 f2, ~ c4@4 ~@2 ab3@4 ~, ~ eb4!2 ~ c4!2, ~ c5 ~ ab4",
  O: "~@11 eb4, ab2!2, ab4!2 c5!2, ~ eb4@3 eb4@3 ab4@2 ~ ab4@2, ~@2 c4@3 c4@2 ~ eb4@3 ~",
  P: "~@5 e3 ~@5 ab3, c2 [f2,ab4], ~ e3@2 c4@3 ~@2 c4@2 c4@2, ~@2 g3@2 g3@2 ~ ab3@3 ~@2, ~@9 f4@2 ~", // Fm
  Q: "~@5 e3 ~@5 ab3, [c2,e4] f2, ~ e3@3 ~@5 ab4@3, ~@2 g3@2 g3@2 ~ ab3@4 ~, ~@3 c4@2 ~@3 c4@2 c4@2", // C
  R: "~@5 c4 ~@5 ab3, ab2 f2, ab4@3 ab4@3 ~@2 ab3@3 ~, ~ eb4@3 eb4@2 f4@3 f4@3, ~@2 c4@3 ~@2 c4@3 c4@2",
  S: "~@5 f3 ~@5 e3, [db2,f4] db2, ~ f3@3 ~@3 e3@2 ~@3, ~ ab3!2 ~ ab3!2, ~@3 db4@2 ~@4 db4@3", // Db
  T: "~@5 f3 ~@5 e3, db2!2, db4!2 ~ db4, ~ ab3@3 ab3@2 ~@2 ab3@2 ab3@2, ~@2 f3@3 ~@2 e3@2 ~@3",
  U: "~@5 f3 ~@5 e3, db2 [db2,e4], ~ f3@2 db4@3 ~@2 ab3@2 ab3@2, ~@2 ab3@2 ab3@2 ~ e3@3 ~@2, ~@9 db4@2 ~", // Dbm
  V: "~@11 f3, f4, db2@11 ~, ~ f3@2 db4@2 f3@2 ab3@2 db4@3, ~ ab3!2 db4 f3 ab3",
  W: "~@11 ab3, db2 db3, db4!2 e4!2, ~ ab3@3 ab3@3 db4@2 ~ db4@2, ~@2 e3@3 e3@2 ~ ab3@3 ~",
  X: "~@11 c4, f2 f3, f4!2 ab4!2, ~ c4@3 c4@3 f4@2 ~ f4@2, ~@2 ab3@3 ab3@2 ~ c4@3 ~",
  Y: "~@5 e3 ~@2 ab3 ~@2 e3, db2@3 ~@2 ab3, ~ e3@2 db4@3 ~ e3@2 db4@3, ~ ab3!2 db3@3",
  Z: "~@5 d3 ~@5 g3, bb1 [eb2,g4], bb3@3 bb3@3 ~@2 bb3@2 bb3@2, ~ f3@3 f3@2 ~ g3@3 ~@2, ~@2 d3@3 ~@4 db4@2 ~", // Eb
  AA: "~@5 db3 ~@5 a3, a2 [gb2,a4], a3@3 a3@3 ~ a3@3 ~@2, ~ e3@3 e3@2 ~@2 db4@2 db4@2, ~@2 db3@3 ~@4 gb4@2 ~", // Gbm
  AB: "~@5 gb3 ~@5 f3, d2!2, ~ gb3@2 d4@3 d4@3 d4@3, ~@2 a3@2 a3@2 ~ a3@3 a3@2, ~@8 f3@3 ~",
  AC: "~@5 db3 ~@5 a3, a2 gb2, a3!2 gb4!2, ~ e3@3 e3@2 ~ db4@3 db4@2, ~@2 db3@3 ~@3 a3@3 ~",
  AD: "~@5 gb3 ~@5 f3, d2!2, ~ gb3@2 d4@3 ~@2 a3@2 a3@2, ~@2 a3@2 a3@2 ~ f3@2 d4@3",
  AE: "~@5 db3 ~@5 a3, [a2,db4] [gb2,a4], ~ db3@3 ~@5 gb4@2 ~, ~ e3!2 ~ db4!2, ~@3 a3@2 ~@2 a3@3 ~@2", // A Gbm
  AF: "~@5 a3, a2!2, a3!2 db4!2, ~ e3@3 e3@3 a3@2 ~@3, ~@2 db3@3 db3@2 ~ e3@3 ~",
})).s("gm_piano").gain(0.19)

// chords · vibraphone
const vibraphone = note(`<
  A B C D E F C D G H I J I K L K C@2 M E N O M P F L K Q R L K C E S C T P S I U V W X Y Z AA AB AA AC ~@2
>`.pickRestart({
  A: "~@2 c4@9 ~, [ab4,c5]@11 ~, ~ eb4@10 ~", B: "~ c4@5, [ab4,c5], ~ eb4@11",
  C: "c5@9 ~@2 c4, [c4,eb4]@11 ~, ab4@5 ab4, ~@3 c5", D: "~ g3@2 [ab3,c4,f4,ab4]@3, [e4,g4] ~, ~ c4@5 ~@6",
  E: "[ab3,db4,f4,ab4]@7 ~", F: "[g3,bb3,eb4,g4]@7 ~", G: "ab4@9 ~@2 ab3, [ab3,db4]@11 ~, f4@5 f4, ~@3 ab4",
  H: "g4@9 ~@2 g3, [g3,bb3]@11 ~, eb4@5 eb4, ~@3 g4", I: "~ c4@2 ~ ab3@2, [ab4,c5]@6 ~ c4@5, ~ eb4@5 [f4,ab4]@6",
  J: "~ ab3@2 [ab3,db4,e4,ab4]@3, [f4,ab4] ~, ~ db4@5 ~@6", K: "[ab3,db4,f4,ab4]@3 ~ ab3@2, ~ [e4,ab4], ~@7 db4@5",
  L: "[c4,eb4,ab4,c5]@3 ~ ab3@2, ~ [f4,ab4], ~@7 c4@5", M: "[g3,c4,e4,g4] [ab3,c4,f4,ab4]",
  N: "g4@3 ~@2 g3@7, eb4, g3@5 ~@7, bb3 bb3@2, ~ g4@3", O: "~ [eb4,ab4]@5, c5, ~ c4@11",
  P: "ab4@3 ~@2 ab3@7, f4, ab3@5 ~@7, db4 db4@2, ~ ab4@3", Q: "[c4,eb4,ab4,c5] [ab3,c4,f4,ab4]",
  R: "~ ab3@2 ~ ab3@2, [f4,ab4] [e4,ab4], ~ db4@5 ~ db4@5", S: "~ [db4,e4]@5, ab4, ~ ab3@11",
  T: "ab4@9 ~@2 ab3, [ab3,c4]@11 ~, f4@5 f4, ~@3 ab4", U: "[f3,ab3,bb3,d4] [eb3,g3,bb3,db4]",
  V: "[e3,a3,db4,e4]@3 ~ a3@2, ~ [gb4,a4], ~@7 db4@5", W: "~ a3@2 [a3,d4,f4,a4]@3, [gb4,a4] ~, ~ d4@5 ~@6",
  X: "~ e3@2 ~ a3@2, [db4,e4] [gb4,a4], ~ a3@5 ~ db4@5", Y: "~ a3@2 ~ a3@2, [gb4,a4] [f4,a4], ~ d4@5 ~ d4@5",
  Z: "~ e3@2 [a3,db4,gb4,a4]@3, [db4,e4] ~, ~ a3@5 ~@6", AA: "[a3,d4,gb4,a4] [a3,d4,f4,a4]",
  AB: "[e3,a3,db4,e4] [a3,db4,gb4,a4]", AC: "[e3,a3,db4,e4]@7 ~",
})).s("gm_vibraphone").gain(0.12)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~ A@2 B C D E B C D F G H G I G J E B C D E B C D F G I G I G K ~@8 L M N M N M N M O@2 ~
>`.pickRestart({
  A: "[~@3 [ab4,c5,eb5,ab5]@17 ~ [c4,eb4,c5,eb5] ~@26, ~@21 [ab3,ab4]@26 ~]/2", B: "[g3,c4,e4,g4] [f3,ab3,c4,f4]",
  C: "[f3,ab3,db4,f4]", D: "[eb3,g3,bb3,eb4]", E: "[ab3,c4,eb4,ab4]", F: "[ab3,c4,eb4,ab4] [f3,ab3,c4,f4]",
  G: "[f3,ab3,db4,f4] [e3,ab3,db4,e4]", H: "[eb3,ab3,c4,eb4]@12 [f3,ab3,c4,f4]@11 ~",
  I: "[eb3,ab3,c4,eb4] [f3,ab3,c4,f4]", J: "[eb3,ab3,c4,eb4]", K: "[eb3,ab3,c4,eb4]@17 ~@7",
  L: "~@12 [gb3,a3,db4,gb4]@11 ~", M: "[gb3,a3,d4,gb4] [f3,a3,d4,f4]", N: "[e3,a3,db4,e4] [gb3,a3,db4,gb4]",
  O: "[[e3,a3,db4,e4]@13 ~@11]/2", // A
})).s("gm_string_ensemble_1").gain(0.06)

// chords · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~ A@2 ~@48>".pickRestart({
  A: "[~@20 [gb4,c5,eb5,gb5] [bb3,db4,bb4,db5] [c4,eb4]@26, ~@22 [gb3,gb4] ~@25]/2", // Cdim Bbm Cm Gb
})).s("gm_string_ensemble_1").gain(0.03)

// drums · kick
const kick = s("bd").struct("<[x!2]!32 [x ~@2 x ~ x] [x!2]!15 [x ~@2 x ~ x] ~@2>").gain(0.4)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<[~@5 x ~@6]!49 ~@2>").gain(0.16)

// drums · rim
const rim = s("rim").struct("<[~ x ~ x]!49 ~@2>").gain(0.32)

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

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

stack(bass, piano, vibraphone, string_ensemble_1, string_ensemble_1_soft, kick, kick_soft, rim, hihat, open_hat)

More by Mariah Carey