Strudelify

L'amour existe encore

Celine Dion

KeyB majorTempo108 bpm
0:00/0:00
// L'amour existe encore — Celine Dion
// 108 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 7 "PIANO RIGHT" piano (copy of ch 2 piano)
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108/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.

// chords · piano
const piano = note(`<
  A@2 B@2 C D E@2 F@3 D G@2 H@3 D A@2 I@2 J D K@2 L@2 M@2 N@2 O@2 P@2 J Q@3 R S T@4 U@2 V W X@2 Y@2 Z AA@3 AB@2 AC@2 AD
  AE@3 AF@2 AG AH AI@2 AJ AH AK@3 AL AM@4 AN@2 AO@2 AP@4 AQ@2 AR AS@4 ~
>`.pickRestart({
  A: "[~@3 e4@5, a2, ~ e3@15, ~@2 a3@3 a3@11, ~@3 b3@13]/2",
  B: "[~@3 e4@5, f#2, ~ c#3@15, ~@2 a3@3 a3@11, ~@3 b3@13]/2", C: "~@3 b3@2 a3@3, d2, ~ a2@7, ~ f#3@3",
  D: "~@2 a3 g#3@5, e2", E: "[~@2 a3 ~@3 c#4@10, a2, ~ e3@15, ~@3 b3@13, ~@5 a3@11]/2",
  F: "[~@7 a3, f#2@3 e4@5 d2@4, ~ c#3@16 a2@7, ~@2 a3@3 a3@12 ~ f#3@6, ~@3 b3@14 ~@2 b3@5]/3",
  G: "[~@3 [g#1,g#2], a2@3 e4@5, ~ e3@11 ~@4, ~@2 a3@3 a3@11, ~@3 b3@9 ~@4]/2", // G#
  H: "[~@7 a3, [f#1,f#2]@6 e4@11 a2@7, ~ e3@15 d2@8, ~@2 a3@3 a3@13 f#3@6, ~@3 b3@15 ~ b3@5]/3", // F#
  I: "[~@11 a3@5, f#2@8 ~ c#3@7, ~@2 a3@3 a3@5 f#3@6, ~@3 b3@13, ~@3 e4@5]/2",
  J: "~@5 a3@3, d2, ~ a2@7, ~ f#3@3, ~@3 b3@5", K: "[~@3 a3@5, f#2, ~ c#3@4 c#3@11, ~ a3@2 ~@5, ~@3 c#4@13]/2",
  L: "[~@5 d3@7 d3@4, d2, ~ a2@15, ~@2 d3@3 ~@11, ~@3 f#3@13]/2", M: "[~@3 a3@8 a3@5, b2 ~, ~ d3@15, ~ f#3@7]/2",
  N: "[~@3 a3 [e3,g#3]@4, [e1,e2]]/2", O: "[~@13 c#4@3, a2@11 b3@5, ~ e3@5 e4@10, ~@2 a3@3 a3@4 e3@7, ~@3 b3@7 a3@6]/2",
  P: "[~@11 a3@5, f#2, ~ c#3@5 e4@10, ~@2 a3@3 a3@5 f#3@6, ~@3 b3@13]/2",
  Q: "[~@2 a3 ~@19 f#3@2, e2@8 f#4@2 c#3 f#3 c#3@5 c#4 f#3 c#4@5, ~ e3@12 a#3@11, ~@3 g#3@11 f#3@2 f#4@8, ~ [f#2,a#4,c#5]@2]/3", // F#
  R: "a3 ~@2 f#3, [d2,f#4], d4@3 d4@5, ~@2 a3@3 a3@3", S: "e2!2, [g#3,b3,e4]",
  T: "[f#3@3 ~@26 d#4@3, f#2@9 c#4 f#3 c#4@3 f#3@2 b2@6 f#4@5 b3@5, c#4@6 f#3@2 f#4@13 b3@5 f#3@6, a#3@4 c#3@13 f#3@8 b2@7, ~@3 f#3@2 a#3@13 b3 c#4@13]/4",
  U: "[~@7 f#3, g#2@9 g#2@4 b3@3, ~ f#3@9 f#3 b3 d#4@4, ~@2 b3@3 ~ f#4@10, ~@3 c#4@13]/2",
  V: "~@3 g#3, e2, ~ e3@4 ~@3, ~ g#3@2 ~, ~@3 b3@5", W: "~@3 f#3, f#2, ~ f#3@5 ~@2, ~ b3@3, ~@3 a#3@5",
  X: "[~@15 b3, b2@6 f#4@5 b3 d#4 f#4 d#4@2, ~ f#3@5 d#4@4 f#3@6, ~@2 b3@3 b3@4 b2@7, ~@3 c#4@13]/2",
  Y: "[~@13 c#4@3, g#2@3 f#4@5, ~ f#3@8 g#2@7, ~@2 b3@3 b3@5 f#3@6, ~@3 c#4@8 b3@5]/2",
  Z: "~@3 g#3, e2, ~ g#3@2 ~, ~@3 b3@5",
  AA: "[~@11 g#3, f#2@3 d#3@5, ~ f#3@5 f#3@13 d#4@5, ~ b3@3 g#2@8, ~@3 a#3@7 g#3 b3@3 d#4@4 b3@6]/3",
  AB: "[~@7 g#3, e2, ~ e3@4 ~ e4@10, ~ g#3@4 g#3@2 ~, ~@3 b3@8 b3@5]/2",
  AC: "[~@7 g#3, c#2, ~ c#3@4 ~ e4@5 c#4@5, ~@2 g#3@7 c#3@3 e4@4, ~@3 c#4@7 g#3@4 ~@2]/2", AD: "~@3 b3@5, f#2",
  AE: "[~@7 f#4@3 a#2@2, a#3@13 b3@7 ~@4, f#3@9 f#3@11 ~@4, ~@2 b2@3 ~, ~@10 b3 c#4@9 ~@4]/3",
  AF: "[~@15 f#2, g#2@3 f#4@5, ~ f#3@15, ~@2 b3@3 b3@11, ~@3 c#4@13]/2",
  AG: "~@7 e4, e2, ~ e3@4 ~@3, ~ g#3@2 g#3, ~@3 b3@5", AH: "~@3 f#4, f#2, ~ f#3@4 f#3@3, ~ a#3@3, ~@3 c#4@5",
  AI: "[~@3 g#3@2 ~@10 g#3, g#2, ~ d#3@3 d#3@2 d#3@2, ~@5 g#3@2 g#3@2 g#3@2 g#3@2 g#3@2 ~, ~@3 d#4@2 d#4@2 d#4]/2",
  AJ: "~@3 b3, e2, g#3@5 g#3@3, ~ b3@2 ~, ~@3 e4@5",
  AK: "[~@3 g#3@2 ~@10 g#3 ~@6 e4@2, g#2@2 e2, ~@2 d#3@6 d#3@4 d#3@4 ~@2 e3@3 e3@3, ~@5 g#3@2 ~@2 g#3@2 ~@2 g#3@2 ~@4 g#3@5, ~@3 d#4@2 d#4@2 d#4@5]/3",
  AL: "~@3 c#4, f#2, ~@2 f#3@3 f#3@3, ~@3 a#3@5",
  AM: "[~@3 d#4@3 ~@5 g#3@2 ~@9 d#4@10, g#2 g#2, ~@2 g#3@3 ~ d#4@4 d#4@4 d#4@8 ~@10, ~@7 g#3@2 g#3@2 ~@2 g#3@2 g#3@3 g#3@3 g#3@11, ~@8 d#3@4 ~@7 b3@13]/4",
  AN: "[~@6 e4@8 d#2 ~, e2@7 ~, ~ e3@13 ~@2, ~@2 g#3@3 ~@11, ~@3 b3@11 ~@2]/2",
  AO: "[~@7 e4, c#2, ~ c#3@4 ~ e4@5 e4@3 ~@2, ~@2 g#3@7 ~@3 g#3@4, ~@3 c#4@7 c#4@3 c#4@3]/2",
  AP: "[~@15 a#2, f#2 b2, ~@2 f#3@6 f#3@9 f#3@5 [d#4,f#4]@10, ~@3 a#3@5 a#3@13 b3@11, ~@5 c#4@13 b3 c#4@13]/4", // D#m
  AQ: "[~@15 f#2, g#2@11 c#4@5, ~ f#3@5 [d#4,f#4]@10, ~@2 b3@3 b3@4 f#3@7, ~@3 c#4@7 b3@6]/2", // D#m
  AR: "~@3 e4, e2, ~ e3@4 ~@3, ~ g#3@3, ~@3 b3@5",
  AS: "[~@6 f#4@3 [g#2,g#3,c4,d#4]@23, f#2@9 ~@23, ~@5 a#3@14 ~@45, ~@7 c#4@11 ~@46]/4", // G#
})).s("gm_piano").gain(0.24).pan(0.3)

// chords · piano · soft notes
const piano_soft = note(`<
  ~@20 A@2 ~ B ~@5 C ~@5 D ~@6 E ~@3 F@2 G ~@5 H ~ I@2 J@2 K@2 L M@2 ~@3 G ~@3 N ~ O@2 ~@2 P Q@3 R@2 S@2 T@3 U ~@2 G V@2
  ~@3
>`.pickRestart({
  A: "[~ f#2, ~ c#3@8 ~@7]/2", B: "~ b2@7", C: "b2", D: "~ c#3@7", E: "~ c#3 ~@2", F: "[~@5 b3@6 ~@5]/2", G: "~@5 e3@3",
  H: "~ e3@4 e3@3", I: "[~@5 g#3@4 g#3@5 ~@2]/2", J: "[~@5 e3@4 e3@4 e3@3]/2", K: "[~@5 c#3@4 ~@4 c#3@3]/2",
  L: "~ f#3@3, ~ c#3@7", M: "f#2/2", N: "~ e3", O: "[~@7 g#3@2 ~@2 g#3@2 ~@3]/2", P: "~@5 g#3@2 ~", Q: "[~ d#3@4 ~]/3",
  R: "[~@5 g#3@9 ~@2]/2", S: "[~@9 g#3@3 ~@3 c#3, ~@5 c#3@10 ~]/2", T: "[~ c#3@16 ~@7]/3", U: "~ f#3",
  V: "[~ f#3@8 ~@7]/2",
})).s("gm_piano").gain(0.12).pan(0.3)

// bass · acoustic bass · "BASE"
const bass = note(`<
  ~@32 A@2 B@2 C D E@2 F G H I J@2 K@2 L M J@2 K@2 L N O@2 P@2 Q@2 R S J@2 K@2 L H T@2 U V W@2 U R X@2 Y@2 Z@2 AA@2 R S
  AB@2 AC@2 L R AD@3 ~
>`.pickRestart({
  A: "[a2@31 ~]/2", B: "f#2/2", C: "d2", D: "e2", E: "[f#2@27 ~ f#2@4]/2", F: "d2@15 ~", G: "e2 e1", H: "f#1@15 ~",
  I: "f#1@3 f#2", J: "[b1@3 a#1]/2", K: "[g#1@29 ~ f#1 ~]/2", L: "e1", M: "f#1@11 ~ f#1@4", N: "f#1@11 ~ f#1@3 ~",
  O: "[g#1@26 ~@2 g#1@3 ~]/2", P: "[e1@7 e2]/2", Q: "[c#2@27 ~ c#2@4]/2", R: "f#1", S: "f#2",
  T: "[g#1@5 ~ g#1@17 ~ c2@2 ~ c#2@2 d#2@2 ~]/2", U: "e1@15 ~", V: "f#1@12 ~@2 g#1 ~",
  W: "[g#1@22 ~@2 g#2@2 ~ d#2@2 g#2@2 ~]/2", X: "[g#1@12 g#2@19 ~]/2", Y: "[g#1@27 ~ g#1@4]/2", Z: "[e1@7 d#2]/2",
  AA: "[c#2@29 ~ c#2 ~]/2", AB: "[b1@7 a#1]/2", AC: "[g#1@29 ~ f#1@2]/2", AD: "[~ g#1@23]/3",
})).s("gm_acoustic_bass").gain(0.32)

// chords · acoustic guitar steel · "GUIT ACCOMP"
const acoustic_guitar_steel = note(`<
  ~@44 A@4 B C A@4 D C E@2 F@2 G@2 H ~ A@4 D C I@2 D C I@2 D C I@2 E@2 F@2 G@2 J@2 A@2 K@2 D L@4 ~
>`.pickRestart({
  A: "[~@3 f#4@13, f#3, ~ b3@15, ~ d#4@7]/2", B: "~@3 g#4@5, g#3, ~ b3@7, ~ e4@3",
  C: "~@3 f#4@5, f#3, ~ a#3@7, ~ c#4@3", D: "~@3 e4@5, e3, ~ g#3@7, ~ b3@3", E: "[~@3 g#4@13, g#3, ~ b3@15, ~ d#4@7]/2",
  F: "[~@3 e4@13, e3, ~ g#3@15, ~ b3@7]/2", G: "[~@3 e4@13, e3, ~ g#3@15, ~ c#4@7]/2",
  H: "~@3 f#4@5, f#3, ~ b3@7, ~ c#4@3", I: "[~@3 g#4@13, g#3, ~ c4@15, ~ d#4@7]/2",
  J: "[~@3 f#4@13, f#3, ~ a#3@15, ~ c#4@7]/2", K: "[~@3 f#4@13, g#3, ~ b3@15, ~ d#4@7]/2",
  L: "[~@7 f#4@11 [g#3,c4,d#4]@45 ~, f#3@9 ~@23, ~ a#3@8 ~@23, ~@5 c#4@14 ~@45]/4", // G#
})).s("gm_acoustic_guitar_steel").gain(0.2)

// chords · string ensemble 1 · "STRING"
const string_ensemble_1 = note(`<
  A@6 B@8 C@2 D@8 E@8 F@8 G H I@2 J@8 K@4 L@6 M@8 N@3 O P@3 Q R@4 S@2 T@4 U@5 V@4 ~
>`.pickRestart({
  A: "[~@80 e2@13 ~@3, a2@30 ~@2 f#2@31 ~ d2@14 ~@18, ~@4 a3@5 ~ a3@23 ~ c#3@10 e4@23 ~@3 [b3,e4]@26, ~@6 b3@30 a3@5 ~ a3@23 ~ a2@14 ~@16, ~@12 e4@23 ~@3 b3@30 a3@28]/6", // E5
  B: "[~@64 d2@15 ~ e2@15 ~@13 e4@20, a2@12 e4@30 a3@56 e3@29 ~, ~ e3@15 f#2@6 e4@28 ~ b3@13, ~@4 a3@5 ~ a3@24 c#3@28 ~@34 a2@31 ~, ~@6 b3@30 a3@2 b3@62 a3@5 ~ a3@22]/8",
  C: "[~@3 e4@5, f#2@31 ~, ~@2 c#3@29 ~, ~@4 a3@5 ~ a3@22, ~@3 b3@13]/2",
  D: "[~@8 e2@7 ~@41 e2@7 ~, d2@13 ~@23 a3@5 ~ a3@23 ~ c#3@10 e4@24 a3@28, ~ a2@7 ~@8 a2@6 e4@13 b3@29, ~@4 a3@29 ~ e3@30 f#2@31 ~ d2@14 ~@18, ~@6 [b3,e4]@31 ~ b3@30 a3@5 ~ a3@23 ~ d3@14 ~@16]/8", // E5
  E: "[~@3 c#4@13 d2@16 b2@16 e2@16, f#2 ~@3, ~ c#3@15 d4@32 ~@16, ~ f#3@23 ~@8, ~@3 a3@53 ~@8]/8",
  F: "[~@5 [e2,e3] [f#2,a#3,c#4]@2, a2@12 e4@30 a3@24 d3@13 ~@49, ~@2 e3@30 f#2@12 e4@53 ~@31, ~@6 b3@30 a3@2 b3@30 a3@29 ~@31, ~@10 a3@24 c#3@28 ~@2 d2@6 b3@25 ~@33]/8", // E F#
  G: "[d2,a3,d4]", H: "[e2,b3,e4], g#3@7 ~", I: "[f#2,a#3,c#4]/2",
  J: "[~@16 g#2@15 f#2 e2@8 [a#3,c#4]@8 b2@12 a#2@4, f#4, d#4@2 ~ [b3,d#4]]/8", // A#m B
  K: "[~@15 f#2 e2@8 [f#2,a#4]@8, g#4@49 ~@15]/4", L: "[~@32 e2@31 ~ c#2@32, g#4, ~ e4@2]/6",
  M: "[~@2 a#4@2 b2@3 a#2 ~@4 e2@2 [f#2,c#4]@2, f#4, f#2@16 ~@16 g#3@23 ~@9]/8", // F#5
  N: "[[g#2,c4]@2 [e2,b3,e4], g#3@47 ~]/3", O: "[f#2,c#4,f#4], a#3@7 ~",
  P: "[[g#2,d#4]@2 [e2,e4], g#4, c4@31 ~ b3@13 ~@3]/3", Q: "[f#2,f#4,a#4]", R: "[d#4, g#4 ~, g#2@15 ~@17]/4", S: "e2/2",
  T: "[c#2@2 ~ a#3, c#4, ~ f#2]/4", U: "[b2@28 a#2@4 g#2@30 f#2@3 ~ e2@14, d#4]/5",
  V: "[[f#2,c#4]@9 [g#2,g#3,c4,d#4]@23]/4", // F#5 G#
})).s("gm_string_ensemble_1").gain(0.12)

// chords · string ensemble 1 · "STRING" · soft notes
const string_ensemble_1_soft = note(`<
  A@2 ~@9 B ~@5 C ~@4 D@3 ~@5 E@2 F ~@5 G@3 ~ H@7 I ~@2 J@4 K@8 L@5 M N@2 ~@5 O P@2 Q@6 R@8 ~@4
>`.pickRestart({
  A: "[~ e3@14 ~]/2", B: "~@2 b2@13 ~", C: "~ b2@6 ~", D: "[~@3 e4@14 ~@7]/3", E: "[~ g#3, [b3,e4]]/2", F: "~ a3 ~@2",
  G: "[f#3@47 ~]/3", H: "[~@16 b2@12 a#2@4 ~@16 g#3@7 ~, f#3@31 ~@25, ~@2 b3@5]/7", I: "f#2",
  J: "[g#2@15 ~ f#4@16, b4@47 ~@17]/4", K: "[[g#2,d#4]@32 ~@76 c#4@19 ~, b4@7 ~]/8",
  L: "[~@16 g#2@15 f#2 ~@8, b3, d#4@4 ~]/5", M: "a#3@13 ~@3", N: "d#4/2", O: "c#4@15 ~", P: "[c4@15 ~]/2",
  Q: "[g#2 e4@2, g#3@47 ~, b3@2 ~]/6", R: "[~@7 a#3, f#3@63 ~@3 f#3@62, ~@16 b3@39 ~@9]/8",
})).s("gm_string_ensemble_1").gain(0.04)

// chords · synth brass 2 · "BRASS PAD"
const synth_brass_2 = note("<~@12 A@2 ~@10 B@6 C@2 ~@24 D@6 E@7 F G@3 F H@4 I@8 J@6 K L@4 ~>".pickRestart({
  A: "[b3,c#4,e4]/2", B: "[c#4 d4@2, f#3, a3@47 ~]/6", C: "[a3@16 g#3@15 ~, [b3,e4]@15 ~]/2",
  D: "[d#4 e4@2, [g#3,b3]]/6", E: "[~@16 a#3@16 ~@32 g#3@31 ~ [g#3,e4]@16, f#3@4 ~@3, c#4@2 b3@5, ~@2 d#4@4 ~]/7",
  F: "[f#3,a#3,c#4]", G: "[[c4,d#4]@2 [b3,e4], g#3]/3", H: "[[c4,d#4]@2 [e3,b3] [f#3,a#3,c#4], g#3@49 ~@15]/4",
  I: "[[c4,d#4]@32 d#4@32 g#3@31 ~ [g#3,c#4]@32, g#3@63 ~ e4@64, ~ b3@2 ~]/8", // Cm C#5
  J: "[b3 a#3 [b3,d#4]@4, f#3@95 ~, c#4@31 ~@65]/6", K: "[e3,g#3,b3]", L: "[[f#3,a#3,c#4]@9 [g#3,c4,d#4]@23]/4",
})).s("gm_synth_brass_2").gain(0.24).pan(0.6)

stack(piano, piano_soft, bass, acoustic_guitar_steel, string_ensemble_1, string_ensemble_1_soft, synth_brass_2)

More by Celine Dion