Strudelify
The Roof cover art

Butterfly: 25th Anniversary Expanded Edition

The Roof

Mariah Carey

KeyB♭ minorTempo95 bpm
0:00/0:00
// The Roof — Mariah Carey
// 95 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 126 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 31 ms behind the beat; the grid follows it, so its parts stay together.
setcpm(95/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, A@4 for four bars: edit a riff to change every repeat.

// chords · piano
const piano = note(`<
  A@5 B@4 C D C D C D C D C D C D C D C D E F E F E F E G C D C D C D C D C D C D C D C D E F E F E F E G C D C D C D C
  D C D C D C D C D H I J@2 H I K L C D C D C D C D C D C D C D C D C D C D C D C D ~@21
>`.pickRestart({
  A: "[~@14 [c5,db5] ~@13 bb4 ~@7 db4@10 c5 db5 ~@12 bb4@2 ~@10 f5@4 f5@2 db5 ~, ~@15 c5@7 db4@8 ~@22 c4@4 f5@6 ~@6 db4@11 ~, ~@16 f3@8 f4@6 ~ c5@14 ~@3 c5@14 ~@2 [db5,eb5]@15 ~, ~@18 bb3@12 ~@2 [gb3,db5,eb5]@14 ~ f3@7 db4@8 ~@4 bb3@13 ~, ~@20 c4@10 ~@4 bb3@12 ~@4 bb3@12 ~ [gb3,c5]@16 ~]/5", // Dbmaj7 Dbsus2 Ebm7 Gbdim
  B: "[~@4 c4@8 bb4@2 ~@6 db4@10 c5 db5 ~@24 eb4@8, [f3,c5]@14 ~@2 [gb3,db5,eb5]@15 ~ f3@18 gb3@2 bb3@2 db4@10, ~@2 bb3@12 ~ c5@15 ~ c5@17 gb2@16, ~@18 bb3@13 ~@3 bb3@4 db4@2 f4@24, ~@9 c4@7]/4", // F5 Ebm7
  C: "~@2 f3@2 bb3@2 db4@2 eb4@6 f3 ~, bb2@15 ~", D: "gb3@3 bb3@3 eb4@4 db4@2 c4 db4@3, gb2",
  E: "~ gb3 bb3 db4 eb4@3 db4, gb2@7 ~", F: "c4@3 db4@3 c4@3 ~ ab3@2 f3 ab3@3, f2@13 ~@3",
  G: "c4@3 db4@3 c4@4 a3@2 f3@3 ~, f2@15 ~", H: "[gb2,gb3,bb3,db4]@15 ~", I: "[f2,f3,a3,c4]",
  J: "[[bb2,f3,bb3,db4]@15 ~]/2", K: "[eb3,gb3,bb3,eb4]@15 ~",
  L: "f3@6 f3@2 c4@2 c4@5 ~, f2@15 ~, [a3,c4]@8 [f3,a3,eb4]@7 ~", // Am F7
})).s("gm_piano").gain(0.28)

// bass · electric bass finger
const bass = note(`<
  ~@8 A B A C D E A E A E A E F E A C G H I H J K L K M C N C F O A E A E A E F E A C G H I H J K L K M C N C F O A E A
  C N C F C F O A P Q R S P T U V E A E F E A C G W A E F E A C G W A E F E A C G W A E F E A C X ~@13
>`.pickRestart({
  A: "gb1 ~ gb1@4 ~ gb1!2 ~@3 ab1@2 ~ bb1", B: "bb1 ~ bb1@5 ~ bb1 ~@6 gb1", C: "bb1 ~ bb1@4 ~ bb1 bb1@2 ~@5 gb1",
  D: "gb1 ~ gb1@4 ~ gb1 gb1@2 ~@2 ab1@2 ~ bb1", E: "bb1 ~ bb1@4 ~ bb1!2 ~@6 gb1",
  F: "gb1 ~ gb1@4 ~ gb1!2 ~@3 ab1 ~@2 bb1", G: "gb1 ~ gb1@4 ~ gb1 gb1@2 ~@2 ab1@2 ~ gb1",
  H: "gb1 ~ gb1@4 ~ gb1 gb1@2 ~@5 f1", I: "f1 ~ f1@4 ~ f1!2 ~@6 gb1", J: "f1 ~ f1@4 ~ f1!2 ~@3 ab1@2 ~ gb1",
  K: "gb1 ~ gb1@4 ~ gb1!2 ~@6 f1", L: "f1 ~ f1@3 ~@2 f1!2 ~@6 gb1", M: "f1 ~ f1@3 ~@2 f1!2 ~@3 ab1@2 ~ bb1",
  N: "gb1 ~ gb1@3 ~@2 gb1!2 ~@3 ab1@2 ~ bb1", O: "bb1 ~ bb1@5 bb1!2 ~@6 gb1", P: "gb1 ~ gb1@4 ~ gb1!2 ~@3 bb1@3 ~",
  Q: "f1 ~ f1@4 ~ f1 f1@2 ~@6", R: "bb1 ~ bb1@4 ~ bb1!2 ~@7", S: "bb1 ~ bb1@3 ~ bb1 ~ f1@2 gb1@2 ab1@2 bb1 ~",
  T: "f1 ~ f1@4 ~ f1 f1@2 ~@2 bb1@3 ~", U: "eb2 ~ eb2@4 ~ eb2!2 ~@7", V: "f1 ~ f1@4 ~ f1 f1@2 ~@2 ab1@3 ~",
  W: "[gb1,bb1] ~ bb1@4 ~ bb1!2 ~@6 gb1", X: "gb1 ~ gb1@4 ~ gb1 gb1@2 ~@2 ab1@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.33)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~@8 A@8 B ~@7 C D E F G H I J B K L M@2 N@2 M@2 ~@7 C D E F G H I J B K L M@2 K O M@2 K O M@2 K O M@2 P Q R S P T E U
  V@4 W@4 K O M@2 K O M@2 K O M@2 K O M@2 K O M@2 K O M@2 K O M@2 K O M@2 K O X@2 ~
>`.pickRestart({
  A: "[[bb3,bb4]@4 [c4,c5]@4 [db4,db5]@4 [f4,f5]@4 [bb3,bb4]@12 [c4,c5]@4 [db4,db5]@11 [ab4,ab5]@5 [f4,f5]@32 [bb3,bb4]@12 [c4,c5]@3 [db4,db5]@24 [eb4,eb5]@5 [ab4,ab5]@4, bb5]/8", // Bb C Db F Bb C Db Ab …
  B: "[f4,f5]", C: "~@2 [f3,f4] [ab3,ab4]", D: "[bb3,bb4]@3 [f4,f5]", E: "[eb4,eb5]", F: "[bb3,bb4]@11 ~ [bb4,bb5]@4",
  G: "[f4,f5] [eb4,eb5]", H: "[f3,f4]@3 [f4,f5]", I: "[eb4,eb5]@7 ~ c4@8, ~@7 c5@9", J: "[bb4,bb5]@3 [a4,a5]",
  K: "[bb3,bb4]@3 [c4,c5]", L: "[db4,db5]@3 ~ eb4@4 [f4,f5]@4 [ab4,ab5]@4, ~@3 eb5@4 ~@9", M: "[[f4,f5]@31 ~]/2",
  N: "[[bb3,bb4]@12 [c4,c5]@3 ~ db5@4 [eb4,eb5]@4 [f4,f5]@4 [ab4,ab5]@4, ~@15 db4@4 ~@13]/2", // Bb C Eb F Ab
  O: "[db4,db5] [eb4,eb5] [f4,f5] [ab4,ab5]", P: "[gb3,gb4]@3 [ab3,ab4]", Q: "[bb3,bb4] [c4,c5] [db4,db5] [eb4,eb5]",
  R: "[f4,f5]@3 [bb4,bb5]", S: "[f4,f5]@2 [eb4,eb5] [c4,c5]", T: "[bb3,bb4] [c4,c5] [db4,db5] [f4,f5]",
  U: "[bb4,bb5] [f4,f5]", // Bb F
  V: "[[bb3,bb4]@12 [c4,c5]@4 [db4,db5]@4 [eb4,eb5]@4 [f4,f5]@4 [ab4,ab5]@4 [f4,f5]@31 ~, bb6@63 ~]/4", // Bb C Db Eb F Ab F
  W: "[~@12 [c4,c5]@4 [db4,db5]@4 [eb4,eb5]@4 [f4,f5]@4 [ab4,ab5]@4 [f4,f5]@31 ~, [bb3,bb4]@3 ~@13, ~ bb6@61 ~@2]/4", // C Db Eb F Ab F Bb
  X: "[~ f5@31, f4@31 ~]/2",
})).s("gm_string_ensemble_2").gain(0.12)

// other · celesta
const celesta = note(`<
  ~@3 A B A B A B A B A B A B A B ~@16 A B A B A B A B ~@16 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B ~@16 A B A B A B A B A B A B A B A B A B A B C
>`.pickRestart({
  A: "bb5 ~ bb5 ~ f6 bb6 f6 bb6 bb5 ~ bb5 ~ f6 bb6 f6 bb6", B: "bb5 ~ bb5 ~ f6 bb6 f6 bb6 bb5 ~ f6 bb6 f6 bb6 f6 bb6",
  C: "~ bb5@2 ~@13",
})).s("gm_celesta").gain(0.1)

// other · epiano2
const epiano2 = note(`<
  ~@16 A@2 B C@2 D B E@2 F@2 G@2 H@2 I@2 J ~@6 K L M N O P Q R@5 S T U V W J X@3 Y Z AA AB AC AD@2 ~ AE AF AG ~ AH AI AJ
  AK AL AM AN@2 AO ~@7 AP@2 AQ@2 AR@2 ~ AS AT@2 AQ@2 ~@25
>`.pickRestart({
  A: "[~@9 bb3 db4 bb3 db4 bb3 eb4@9 ~@2 bb3 db4 bb3 db4 bb3 eb4@2]/2", B: "~@2 f4 ~ eb4@7 ~ db4 eb4 ~ f4",
  C: "[~ gb4@3 f4 ~ eb4 ~ db4 ~ bb3 db4 ~ eb4 ~ f4@5 eb4@5 bb3 db4 bb3 db4 bb3 eb4@2]/2",
  D: "~@2 f4@2 eb4@4 ~ bb3 db4 bb3 db4 bb3 eb4@2",
  E: "[~ gb4@3 f4@2 eb4@2 db4 ~ bb3 db4 ~ eb4 ~ f4@2 gb4@3 f4@2 eb4 ~ db4@2 c4 db4@2 c4@2 ~]/2",
  F: "[bb3@8 ~@2 c4 f4 ~ eb4 ~ db4@2 c4@3 db4@2 c4@2 db4@2 c4 eb4@5]/2",
  G: "[~@10 c4 f4 ~ eb4 ~ db4@2 c4@3 db4@2 c4@2 db4@2 c4 eb4@4 db4]/2",
  H: "[c4@8 ~@2 c4 f4 ~ eb4 ~ db4@2 c4@3 db4@2 c4@2 eb4@2 ~ c4 db4@2 c4@2, db4 ~@31]/2",
  I: "[eb4@3 db4 c4@6 bb3 f4@2 eb4@2 db4@2 c4@3 db4@2 c4@2 ~ c4@2 ~ eb4@3 db4, ~@24 db4@3 ~@5]/2", J: "bb3@3 ~@5",
  K: "~@11 ab4 bb4 eb5@2 ~", L: "c5@2 bb4@2 c5@2 bb4 ~ db5@3 c5@4 ~", M: "~@14 ab4 bb4",
  N: "db5 ~ c5 bb4 ~ ab4 ~ f4 ~ db4@2 ~ db4 ~ f4 ~", O: "f4@5 ~@5 ab4 bb4 ~ eb5@2 ~", P: "c5@3 ~ c5@3 ~ c5 ~ db5@5 ~",
  Q: "f4 ~ eb4 db4@2 c4 ~ eb4@3 ~@6",
  R: "[c5@2 bb4@2 c5@2 bb4@2 c5@2 bb4 ab4@2 f4@2 f4@2 ~ eb4 ~ eb4@2 db4 ~ db4@2 eb4 ~ f4 ~ f4@6 ~@6 c4 f4 ~ eb4@2 db4@2 c4@3 db4@2 c4@2 db4@2 c4 eb4@12 ~@3 c4 ab4 ~ f4@2 ~]/5",
  S: "db4@2 c4@2 db4@2 c4@2 db4@2 c4 eb4@2 db4@3", T: "c4@3 db4 c4@5 ~ c4 f4@2 eb4@2 ~",
  U: "db4@2 c4@2 db4@2 c4@2 db4@2 eb4 db4@2 c4@3", V: "c4@8 ~@2 c4 f4@2 eb4@3",
  W: "db4@2 c4@2 db4@2 c4@2 db4@2 c4 eb4@2 db4 ~@2",
  X: "[~@10 eb4 f4@2 ab4@2 f4@9 ~@4 db4 eb4@2 f4@2 ~ ab4 bb4@2 ab4@2 bb4 ~ c5@2 ~ eb5@2 ~@2]/3", Y: "f5@3 eb5@10 ~@3",
  Z: "~@10 eb4 f4 eb4 f4@3", AA: "db4@8 eb4@2 f4 ~@3 ab4@2", AB: "f4@6 ~@4 f4 ab4 f4 ab4@3", AC: "eb4 ~",
  AD: "[~@2 f4@2 ab4 ~ bb4@2 ~@4 f5@2 eb5@4 f5@4 eb5@7 ~@3]/2", AE: "~@10 bb4 c5 bb4 c5@3", AF: "~ bb4@9 ~@6",
  AG: "f4@2 ~ eb4@2 ~ f4@4 ~@6", AH: "~ eb5 db5 ~", AI: "~@4 f5@4 eb5@4 db5@3 ~", AJ: "~ eb5 db5 eb5",
  AK: "f5@3 ~ eb5@4 db5@4 c5@4", AL: "~@4 eb5@4 db5@3 ~@5", AM: "~@2 f5@2 eb5@2 db5 ~",
  AN: "[f5@3 ~ gb5 ~ eb5@5 ~ db5 ~ f5@5 ~ gb5 ~ eb5@4 db5@2 db5@2 c5@2]/2", AO: "bb4 ~",
  AP: "[~@8 [c4,c5]@3 [bb3,bb4]@2 ~ [db4,db5]@5 ~@13]/2", AQ: "[~@8 [eb4,eb5]@2 ~ [db4,db5]@3 [c4,c5]@6 ~@12]/2",
  AR: "[~@8 [c4,c5]@3 [bb3,bb4]@2 ~ [db4,db5]@6 ~@12]/2", AS: "~@8 [eb4,eb5]@2 ~ [db4,db5]@5",
  AT: "[~@8 [c4,c5]@2 ~ [bb3,bb4] ~@2 [db4,db5]@8 ~@10]/2", // C Bb Db
})).s("gm_epiano2").gain(0.38)

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

// drums · rim
const rim = s("rim").struct("<~@8 [~ x ~ x]!105 ~@13>").gain(0.46)

// drums · snare
const snare = s("sd").struct("<~@8 [~ x ~ x]!105 ~@13>").gain(0.46)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A B A@3 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A ~@13
>`.pickRestart({
  A: "x!8", B: "x!5 ~ x!2",
})).gain(0.37)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@9 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@14
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.37)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@8 B ~@7 B ~@7 B ~@15 B ~@7 B ~@15 B ~@7 B ~@44>".pickRestart({
  A: "~@15 x", B: "x",
})).gain(0.27)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [x!4]!2 [x!8]!5 ~@118>").gain(0.93)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~ [~ x ~ x ~ x ~ x]!2 ~@123>").gain(0.23)

stack(piano, bass, string_ensemble_2, celesta, epiano2, kick, rim, snare, hihat, open_hat, crash, cabasa, cabasa_soft)

More by Mariah Carey