Strudelify
My Heart Will Go On cover art

1997 · Let's Talk About Love

My Heart Will Go On

Celine Dion

KeyD majorTempo96 bpm
0:00/0:00
// My Heart Will Go On — Celine Dion
// 96 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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 · fretless bass · "Bass"
const bass = note(`<
  ~@16 A B C D E B C F@2 G H D C G C I J G H D C G C I K@2 L C D E B C F@2 B C D E B C F@2 G H D C G C I J G H D C G C I
  J L C M@2 L C I N O P G P O P G Q O P G P O P G Q O P G P O R G Q S@8 ~@2 T@3
>`.pickRestart({
  A: "~@3 a2", B: "d2", C: "a1", D: "g1@7 g1", E: "a1!2", F: "g1/2", G: "b1@7 b1", H: "a1@7 a1", I: "g1", J: "f#1 a1",
  K: "[f#1@2 a1@3 b1@3]/2", L: "b1", M: "[g1@3 a1]/2", N: "f#1", O: "d#1@7 d#1", P: "c#2", Q: "c#2!2", R: "a#1@7 a#1",
  S: "f#1/8", T: "[~@4 f#1@19 ~]/3",
})).s("gm_fretless_bass").gain(0.5)

// chords · electric guitar jazz · "Guitar"
const electric_guitar_jazz = note(`<
  ~ A@2 B@4 C@3 D E F G H@4 I@3 G J@8 K@3 L@7 M@3 I@3 G N@4 I@3 G J@8 K@3 O@8 A@2 P@4 Q@2 R@16 S@8 ~ T U ~ V@4 ~@2 W@3
>`.pickRestart({
  A: "[~@7 a3, [d4,f#4]@4 ~ a3!2 ~, b2!4 a2@4, ~ f#3@2 f#3@2 f#3@2 f#3@2 e3@2 e3@2 e3@3]/2", // D
  B: "[~@15 a3, g2@2 g2@2 a2@2 a2@2 b2!4 a2@4, ~ d3@4 d3@3 ~ e3@2 e3@2 e3@2 e3@2 f#3@2 f#3@2 f#3@2 f#3@2 e3@2 e3@2 e3@3, ~ d4@2 d4 ~@4 [d4,f#4]@4 ~@4, ~@3 g3@4 g3@2 ~ a3@4 a3@2 ~@10 a3@2 a3@2 ~@2]/4", // D
  C: "[~@2 [d3,a3,d4], g2!2 a2!2 ~@2, ~ d3@4 d3@3 ~ e3@2 e3@2 e3@2 e3@2 ~@7, ~ d4@2 d4 ~@8, ~@3 g3@4 g3@2 ~ a3@4 a3@2 ~@8]/3", // D5
  D: "c#4 d4@3, [d3,a3]", E: "~@3 d4@5, g3, ~ d3@7, ~ a3@3", F: "~ d4 ~ a3, d3 a2, ~ a3@3 ~ e3@3",
  G: "~@3 d4, d3, ~ d4@5 ~@2, ~@2 a3@3 a3@3, ~@3 f#4@5",
  H: "[~@15 d4, e3@8 g3@8 g3@8 ~@3 f#4@5, c#4@2 d4@3 d4@2 d4@3 a3@4 a3@2 ~@2 a3@4 a3@2 ~@2 a3@3 a3@3, ~ a3@2 a3@3 a3@3 d3@4 d3@3 ~ d3@4 d3@3 d3@8, ~@11 d4@4 d4@2 ~@2 d4@4 d4@2 d4@5 ~@2]/4",
  I: "[~@15 d4@2 ~ d4@2 ~@2 a3@2, c#4@2 d4@3 d4@2 d4@3 a3@4 a3@2 ~ a3@3 ~@4, ~ a3@2 a3@3 a3@3 d3@4 d3@3 ~@4 a2@4, ~@8 g3@8 ~@5 e3@3, ~@11 d4@4 ~@9]/3",
  J: "[~@63 d4, c#4@2 d4@3 d4@2 d4@3 a3@4 a3@2 ~@2 a3@4 a3@2 ~ b3@5 b3@2 a3@2 a3@4 a3@2 g3@8 ~@3 e4@4 e4@2 ~ d4@3 d4@2 ~, ~ a3@2 a3@3 a3@3 d3@4 d3@3 ~ d3@4 d3@3 b2@8 ~@9 d3@4 d3@3 ~@8 b2@8, ~@8 g3@8 g3@8 ~@3 f#4@5 ~@3 e4@4 e4@2 ~@2 d4@4 d4@2 c#4@4 c#4@3 ~ b3@5 b3@2, ~@11 d4@4 d4@2 ~@2 d4@4 d4@2 ~ d4@3 d4@2 d4@2 c#4@4 c#4@3 ~@2 a3@4 a3@2 a3@2 a3@4 a3@2 ~@3 f#4@5]/8",
  K: "[~@9 a3 ~ c#4, a3 a3@2 a3 g3@4 f#3@2 ~@2, ~ c#4@4 c#4@3 ~ d3@4 d3@3 ~@4 a2@4, ~@3 e4@4 e4@2 ~ a3@4 a3@2 ~@5 a3@3, ~@11 d4@4 d4@2 d4@3 c#4@2 ~@2]/3",
  L: "[~@55 d4, b2@8 ~@9 d3@4 d3@3 ~@8 b2@8 ~@9 d3@4 d3@3, ~ b3@5 b3@2 a3@2 a3@4 a3@2 g3@8 ~@3 e4@4 e4@2 ~@2 f#4@5 ~@3 e4@4 e4@2 ~@2 d4@4 ~, ~@2 d4@3 d4@2 d4@2 c#4@4 c#4@3 ~@2 a3@4 a3@2 a3@2 a3@4 a3@2 ~ b3@5 b3@2 a3@2 a3@4 a3@2 g3@8, ~@3 f#4@5 ~@3 e4@4 e4@2 ~@2 d4@4 d4@2 c#4@4 c#4@3 ~@2 d4@3 d4@2 d4@2 c#4@4 c#4@3 ~@2 a3@4 a3@2]/7",
  M: "[~@2 a3@2 ~@2 c#4@4 ~@6 d4 ~@5 d4@2, f#3@4 a2@6 ~@2 [a2,a3]@6 a3@3 a3@3, ~ d4@3 c#4@2 ~@4 [d4,f#4]@6 f#4@3 f#4@5, ~@5 a3@5 ~@6 [b2,d3]@8, ~@17 d4@5 ~@2]/3", // A D Bm
  N: "[~@15 d4, c#4@2 d4@3 d4@2 d4@3 a3@4 a3@2 ~@2 a3@4 a3@2 ~@2 a3@3 a3@3, ~ a3@2 a3@3 a3@3 d3@4 d3@3 ~ d3@4 d3@3 d3@8, ~@8 g3@8 g3@8 ~@3 f#4@5, ~@11 d4@4 d4@2 ~@2 d4@4 d4@2 d4@5 ~@2]/4",
  O: "[~@29 a3 ~ c#4, b2@8 ~@9 d3@4 d3@3 ~@8 b2@8 ~@9 d3@4 d3@3 ~@4 a2@4, ~ b3@5 b3@2 a3@2 a3@4 a3@2 g3@8 ~@3 e4@4 e4@2 ~@2 f#4@5 ~@3 e4@4 e4@2 ~@2 d4@4 d4@2 d4@3 c#4@2 ~@2, ~@2 d4@3 d4@2 d4@2 c#4@4 c#4@3 ~@2 a3@4 a3@2 a3@2 a3@4 a3@2 ~ b3@5 b3@2 a3@2 a3@4 a3@2 g3@8 f#3@4 ~@4, ~@3 f#4@5 ~@3 e4@4 e4@2 ~@2 d4@4 d4@2 c#4@4 c#4@3 ~@2 d4@3 d4@2 d4@2 c#4@4 c#4@3 ~@2 a3@4 a3@2 ~@5 a3@3]/8",
  P: "[~@11 d4 ~@18 a3@2, g2@2 g2@2 g2@2 a2@2 b2!4 a2@4, ~ d3@4 d3@3 ~@5 e3@2 e3@2 f#3@2 f#3@2 f#3@2 f#3@2 e3@2 e3@2 e3@3, ~@2 d4@4 d4@2 ~ d4@2 ~@5 [d4,f#4]@8 ~@8, ~@3 g3@4 g3@2 ~ a3@2 ~@2 a3@2 ~@10 a3@2 a3@2 ~@2]/4", // D
  Q: "[~@5 a3@3, g2!2 ~@2, ~ d3@4 d3@3 f#3@8, ~@2 d4@4 d4@2 ~ d4@7, ~@3 g3@4 g3@2 ~@7]/2",
  R: "[~@29 c#4 ~ f4, d#3@8 ~@9 f#3@4 f#3@3 ~@8 d#3@8 ~@9 f#3@4 f#3@3 c#3@4 c#3@4, ~ d#4@5 d#4@2 c#4@2 c#4@4 c#4@2 b3@8 ~@3 g#4@4 g#4@2 ~@2 a#4@5 ~@3 g#4@4 g#4@2 ~@2 f#4@4 f#4@2 f#4@3 f4@2 ~@2, ~@2 f#4@3 f#4@2 f#4@2 f4@4 f4@3 ~@2 c#4@4 c#4@2 c#4@2 c#4@4 c#4@2 ~ d#4@5 d#4@2 c#4@2 c#4@4 c#4@2 b3@8 ~@8, ~@3 a#4@5 ~@3 g#4@4 g#4@2 ~@2 f#4@4 f#4@2 f4@4 f4@3 ~@2 f#4@3 f#4@2 f#4@2 f4@4 f4@3 ~@2 c#4@4 c#4@2 ~@5 c#4@3]/8",
  S: "[~@55 f#4@2 ~ f#4@2 ~@2 c#4@2, d#3@8 ~@9 f#3@4 f#3@3 ~@8 d#3@8 a#2@8 ~ f#3@4 f#3@3 ~@4 c#3@4, ~ d#4@5 d#4@2 c#4@2 c#4@4 c#4@2 b3@8 ~@3 g#4@4 g#4@2 ~@2 a#4@5 ~@3 g#4@4 g#4@2 ~@2 f#4@4 ~@9, ~@2 f#4@3 f#4@2 f#4@2 f4@4 f4@3 ~@2 c#4@4 c#4@2 c#4@2 c#4@4 c#4@2 ~ d#4@5 d#4@2 ~@2 c#4@4 c#4@2 b3@8 ~@5 g#3@3, ~@3 a#4@5 ~@3 g#4@4 g#4@2 ~@2 f#4@4 f#4@2 f4@4 f4@3 ~@2 f#4@3 f#4@2 f#4@2 f4@4 f4@3 ~@2 c#4@4 c#4@2 ~ c#4@3 ~@4]/8",
  T: "g#3 c#4@3", U: "[f#3,b3]",
  V: "[~@13 f#4@5 ~@14 c#4@5 ~@17 b3@5 ~@5, f#3@18 c#3@19 b2@10 b2@10 ~@7, ~@2 f#4@11 ~@10 c#4@5 c#4@4 ~@12 b3@10 ~@10, ~@4 c#4@7 c#4@7 ~@2 g#3@5 g#3@5 g#3@7 ~@3 f#3@9 f#3@7 ~@8, ~@6 a#4@12 ~@24 f#4@10 f#4@5 ~@7]/4",
  W: "[~@4 [f#2,a#3,c#4]@19 ~]/3", // F#
})).s("gm_electric_guitar_jazz").gain(0.14).pan(0.3)

// chords · epiano1 · "Piano"
const epiano1 = note(`<
  ~ A B C@2 D E D E B F B G B ~ B H I J B G I J B@2 K L M L K L M N@2 L M L K L M O P Q J B G I J B@2 I J B G I J B@2 K
  L M L K L M N@2 L M L K L M R@2 B C@2 D E D S T U V U T U V W@2 U V U T U V W@2 U V U T U V X ~@10 Y@3
>`.pickRestart({
  A: "[b3,d4]", B: "[a3,d4]", C: "[~ a4 b4@7 a4@5 c#5 e5]/2", D: "~ [b3,d4]!2 [b3,d4]@5", E: "~ [a3,d4]!2 [a3,d4]@5",
  F: "~@3 a4 d5 c#5 a4 e4", G: "d4 c#4, a3", H: "~ a4 b4 d5 g5 [a4,a5] b4 c#5", I: "[d4,a4]", J: "c#4 d4@3, a3",
  K: "[b4,d5]", L: "[a4,c#5]", M: "[a4,d5]",
  N: "[~@4 a4 ~@3 [b4,d5]@8, ~@3 f#4@5 ~@8, ~@5 a4@3 ~@8, ~@3 b4 ~@4, ~@7 c#5@2 ~@7]/2", O: "~ [a4,c#5]@3",
  P: "~ d4@15", Q: "[b3,d4,a4]", R: "[~@4 a4 ~@3 [b3,d4]@8, ~@3 f#4@5 ~@8, ~@5 a4@3 ~@8, ~@3 b4 ~@4, ~@7 c#5@2 ~@7]/2",
  S: "[d4,f#4]", T: "[d#4,f#4]", U: "[c#4,f4]", V: "[c#4,f#4]",
  W: "[~@4 c#4 ~@3 [d#4,f#4]@8, ~@3 a#3@5 ~@8, ~@5 c#4@3 ~@8, ~@3 d#4 ~@4, ~@7 f4@2 ~@7]/2", X: "f#4 f4, c#4",
  Y: "[~@4 [c#4,f#4,a#4]@19 ~]/3", // F#
})).s("gm_epiano1").gain(0.12).pan(0.6)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~ A@8 ~@8 B@2 C D B@2 E@2 F G H G F G I@2 F G H G F G I@2 J K@3 L B@2 E@2 B@2 C D B@2 E@2 F G H G F G I@2 F G H G F G
  I@2 M@4 N@5 O P O Q O R@2 Q O P O Q O R@2 Q O P O Q S T U V@2 W@2 X@6 Y@3
>`.pickRestart({
  A: "[b3 a3 g3 a3, d4]/4", B: "[[f#3,d4]@4 [e3,c#4] [f#3,d4]@3, a3]/2", C: "c#4 d4@3, [g3,b3]",
  D: "[d4,f#4] [c#4,e4], a3", E: "[g1,b3,d4,a4]/2", F: "[b3,d4,f#4]", G: "[a3,c#4,e4]", H: "[g3,d4,a4]",
  I: "[[g3,b3]@2 f#4 [c#4,e4], d4@3 ~, ~ a3]/2", J: "d4",
  K: "[[f#3,b3]@4 [e3,c#4] f#3@3 c#4 d4@3, a3@2 [g3,b3], d4@5 d4@4 ~@3]/3", L: "f#4 [c#4,e4], [a3,d4]",
  M: "[b3@2 a3@2 g3@3 a3, d4]/4", N: "[b3 a3 g3 [f#3,f#4] [d#4,f#4,a#4], d4@4 ~, ~@3 f#5@2]/5", O: "[c#4,f4,g#4]",
  P: "[b3,f#4,c#5]", Q: "[d#4,f#4,a#4]", R: "[[b3,d#4,f#4]@3 [c#4,f4,g#4]]/2", S: "[a#1,c#4,f4,g#4]", T: "[b3,d#4,f#4]",
  U: "[f#4,a#4] [f4,g#4], c#4", V: "[[a#3,f#4] [g#3,f4], c#4]/2", W: "[~ [c#3,g#4], [b3,d#4,f#4]]/2",
  X: "[[a#3,f#4]@18 [g#3,f4]@19 [b1,b3,d#4,f#4]@58 ~, c#4@37 ~@59]/6", Y: "[~@4 [a#3,c#4,f#4]@19 ~]/3",
})).s("gm_string_ensemble_2").gain(0.12)

// chords · string ensemble 2 · "Strings" · soft notes
const string_ensemble_2_soft = note(`<
  ~@17 A B C B A B ~@2 D B C B D B C E D B C B D B C E ~ A B C B A B ~@2 A B C B A B ~@2 D B C B D B C E D B C B D B C E
  ~@8 F G D G F G H@2 F G D G F G H@2 F G D G F ~ D G I@3 ~ J@3 ~@3 K@3
>`.pickRestart({
  A: "d2", B: "a1", C: "g1", D: "b1", E: "f#1 a1", F: "d#2", G: "c#2", H: "[b1@3 c#2]/2", I: "f#1/3",
  J: "[f#1@37 ~@11]/3", K: "[~@4 f#2@19 ~]/3",
})).s("gm_string_ensemble_2").gain(0.07)

// other · ocarina · "Flute"
const ocarina = note("<A B@2 C@2 D@2 E F@2 ~@64 B@2 G H D@2 I J K ~@7 K ~@17 L@3 M@3 ~@5>".pickRestart({
  A: "~@15 e5, ~@7 d5", B: "[e5 f#5@11 e5@2 c#5 ~ e5@2 a5@2 a5@8 f#5 ~ f#5@2, ~@15 d5@2 ~@12 g5@2 ~]/2",
  C: "[d5@12 ~@2 d6 e6]/2", D: "[e6 f#6@11 e6@2 c#6 ~ e6@2 a6@2 a6@8 f#6@2 a6@2, ~@15 d6@2 ~@15]/2", E: "a6",
  F: "[f#6 e6 d6@10 ~@4]/2", G: "d5", H: "~@6 d6 e6", I: "a6@3 c#7", J: "d7 e7", K: "f#7",
  L: "[f#6@22 f6 d#6 c#6@21 g#5@2 ~]/3", M: "[f#5@2 g#5@2 c#6@2 ~ c#6@29 ~@12, f5 ~@47]/3",
})).s("gm_ocarina").gain(0.4)

// other · ocarina · "Flute" · soft notes
const ocarina_soft = note("<~@3 A ~@25 B C ~@6 B C ~@23 B C ~@6 B C ~@4 A D ~@41>".pickRestart({
  A: "~ b4@3", B: "d5@4 d6 b5 f#5@2", C: "a5", D: "a4@3 ~",
})).s("gm_ocarina").gain(0.25)

// other · string ensemble 1 · "High Strings"
const string_ensemble_1 = note(`<
  ~@25 A B C D E F G@2 A B C D E F H@2 A ~@16 A B C D E F G@2 A B C D E F G@2 ~@7 I E J K L M N O@2 E J K L M N O@2 E P
  Q@2 R S@3 T@4 U@6 ~@3
>`.pickRestart({
  A: "d6", B: "e6@3 a5", C: "a6@2 g6 f#6", D: "e6@2 f#6 g6", E: "f#6", F: "e6", G: "[d6@10 ~ f#5 a5@2 b5 c#6]/2",
  H: "[d6@6 b5 a5]/2", I: "[f#4,f#5,f#6]", J: "g#6@3 c#6", K: "c#7@2 b6 a#6", L: "g#6@2 a#6 b6", M: "a#6", N: "c#7",
  O: "[d#7@10 ~ a#5 c#6@2 d#6 f6]/2", P: "f6", Q: "c#7/2", R: "d#7", S: "c#7/3", T: "f#6/4", U: "[f#6@95 ~]/6",
})).s("gm_string_ensemble_1").gain(0.18)

// other · timpani
const timpani = note("<~@81 A B ~@7 C ~@14 D E ~@12>".pickRestart({
  A: "f#2!16", B: "[d#2,f#2]@3 ~@13", C: "d#2@3 ~@13", D: "c#2!16", E: "[c#2,f#2]@3 ~@13",
})).s("gm_timpani").gain(0.32)

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

// drums · snare
const snare = s("sd").struct("<~@81 x [~ x]!7 [~ x ~@2 x ~@3] [~ x]!7 [~ x ~@2 x ~@3] [~ x]!8 ~@13>").gain(0.8)

// drums · low tom
const low_tom = s("lt").struct("<~@81 A ~@7 B ~@7 B ~@7 C ~@13>".pickRestart({
  A: "~@3 x!2 ~ x ~", B: "~@6 x!2", C: "~@3 x",
})).gain(0.72)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@16 C B@7 C B@7 C B@8 C B@7 C B@7 C B@7 C B@7 C B@7 D E@7 D E@7 D E@7 C B@4 F ~@7
>`.pickRestart({
  A: "x!4", B: "x!2", C: "~ x", D: "~ x!7", E: "x!8", F: "~ x ~@4 x ~",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@81 A ~@7 B ~@7 B ~@7 C ~@13>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@8 x ~ x!2 ~@4", C: "~@5 x ~@2",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@81 [~ x ~@6] ~@7 [~ x ~@6] ~@7 [~ x ~@6] ~@21>").gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@3 A ~@7 A ~@7 A ~@7 A ~@8 A ~@7 A ~@7 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~@9 B ~@2
>`.pickRestart({
  A: "x", B: "~ x",
})).gain(0.48)

stack(
  bass, electric_guitar_jazz, epiano1, string_ensemble_2, string_ensemble_2_soft, ocarina, ocarina_soft,
  string_ensemble_1, timpani, kick, snare, low_tom, hihat, mid_tom, high_tom, crash
)

More by Celine Dion