Strudelify

C'est pour toi

Celine Dion

KeyE♭ minorTempo64 bpm
0:00/0:00
// C'est pour toi — Celine Dion
// 64 bpm, 4/4, key D# minor. 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: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 15 "Clean Guitar" electric guitar clean (copy of ch 14 "Steel String Guitar" acoustic guitar steel)
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/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
const bass = note("<~@12 A B C D A B C D ~@8 E F G H I J K D ~@29>".pickRestart({
  A: "eb2", B: "c2", C: "b1 db2", D: "gb1@2 ab1 bb1", E: "db3@13 ~ db3@2", F: "c3@14 c3 ~", G: "b2@8 db3@4 ~@2 f2 ~",
  H: "gb2@3 gb2 ab2@2 bb2@2", I: "eb2@13 ~ eb2 ~", J: "c2@13 ~ c2@2", K: "b1@3 b1 db2@4",
})).s("gm_fretless_bass").gain(0.23)

// bass · electric bass finger · "Fingered Bass"
const bass_2 = note("<~@20 A B C D C E F G ~@8 A B C D C E F H C E I J ~@17>".pickRestart({
  A: "ab1@7 ab1 db2@4 db2@4", B: "gb2@4 f2@4 eb2@3 eb2 f1@2 gb1@2", C: "ab1@6 ~ ab1 db2@4 db2@4",
  D: "gb1@3 gb1 ab1@2 bb1@2", E: "gb2@2 f2@2 eb2@2 ~ eb2", F: "ab1@2 bb1!2", G: "~ eb1, eb2",
  H: "eb2@6 bb1@2 eb1@3 bb1 eb2 bb1 eb1@2", I: "ab1@4 ~ ab1 ~ bb1 ~ bb1 bb1@3 ~ bb1@2",
  J: "~@2 eb2@3 bb1@3 [eb1,eb2]@8", // Eb
})).s("gm_electric_bass_finger").gain(0.24)

// chords · piano · "Piano 1"
const piano = note(`<
  A B C D E B F G H I J K E B F G E B F L M N O P M Q R S E B F G E B F L M N O P M Q R T U Q R S ~@7 V E B W X@3 Y@3
>`.pickRestart({
  A: "[eb4,f4,gb4,bb4]!4", B: "[c4,f4,gb4,bb4]!4", C: "[b3,eb4,gb4,bb4]!4", D: "[gb3,ab3,bb3,db4]!4",
  E: "[eb4,f4,gb4,bb4]@2 [eb4,f4,gb4,bb4]@2 [eb4,f4,gb4,bb4]@2 eb4!2, ~@3 [f4,gb4,bb4]", // Ebm Gbmaj7
  F: "[b3,eb4,gb4,bb4]!2 [db4,gb4,ab4] [db4,f4,ab4]", G: "[ab3,bb3,db4] [gb3,ab3,bb3,db4] [ab3,c4,eb4] [bb3,d4,f4]",
  H: "[eb4,f4,gb4,bb4]@2 [eb4,f4,gb4,bb4]@2 [eb4,f4,gb4,bb4]@2 eb4!2, eb3, ~@3 [f4,gb4,bb4]", // Ebm Gbmaj7
  I: "[c4,f4,gb4,bb4]!4, c3", J: "[b3,eb4,gb4,bb4]!2 [db4,gb4,ab4] [db4,f4,ab4], b2 db3",
  K: "[ab3,bb3,db4] [gb3,ab3,bb3,db4] [ab2,ab3,c4,eb4] [bb2,bb3,d4,f4], gb2 ~", // Bbm7 Gb Ab Bb
  L: "[ab3,bb3,db4]@4 [gb3,ab3,bb3,db4]@4 ab3 ~@2 eb4 bb3 ~@2 f4, ~@4 eb4 c4 [d4,f4] d4, ~@9 ab3@3 ~ bb3@3", // Bbm7 Gb Dm
  M: "[b3,eb4,gb4]@4 eb4@2 eb4@2 db4@2 ~ ab4 ab3 ~ ab3@2, ~ [gb4,b4] [f4,ab4] ~, ~@5 db4 [db4,f4]@2", // B B5 Fm Db
  N: "[bb3,db4,gb4]@4 [bb3,db4,f4]@4 bb3@2 ~ gb4 [bb3,db4,f4]@2 [bb3,db4,gb4]@2, ~@2 [eb4,gb4] ~, ~@5 bb3 ~@2", // Gb Bbm Gb Ebm
  O: "[b3,eb4,gb4]@4 eb4@2 ~ b4 db4@2 db4@2 [f4,ab4,db5]@4, ~ [gb4,b4] [f4,ab4] ~, ~@3 eb4 ~@4", // B Db B5 Fm
  P: "[db4,gb4,bb4]@2 b5 [gb5,bb5] db5 [bb4,b4] gb4 [bb3,db4] [ab3,eb4,c5]@4 [bb3,f4,d5]@4", // Gb Bmaj7 Bbm Ab Bb
  Q: "[bb3,db4,gb4] [bb3,db4,f4] [b3,eb4,gb4]@2", // Gb Bbm B
  R: "[b3,eb4,gb4]@5 ~@2 gb4 [bb3,eb4,f4]@4 [bb3,d4,f4]@4, ~@5 b3@3 ~@8, ~@3 eb4 ~@4", // B Bbsus4 Bb
  S: "~@2 [ab3,bb3,eb4]@3 [bb3,eb4,ab4]@3 [bb3,eb4,g4]@8", // Absus2 Ebsus4 Eb
  T: "~@2 [ab3,bb3,eb4]@3 [bb3,eb4,ab4]@3 [bb3,eb4,g4]@2 [g6,eb7] [bb5,eb6,g6,bb6] [g5,eb6] [bb4,eb5,g5,bb5] [g4,eb5] [eb4,g4,bb4]", // Absus2 Ebsus4 Eb Cm Eb Cm Eb Cm …
  U: "[b3,eb4,gb4]@4 eb4@2 eb4@2 db4@2 ~ ab4 ab3 ~ ab3@2, bb3 ~@3 [gb4,b4]@4 [f4,ab4]@4 ~@4, ~@5 db4 [db4,f4]@2", // B B5 Fm Db
  V: "~@8 ab3@2 ~ f2 bb3@2 bb3@2, ~@2 [f2,c4,eb4] [bb1,d4,f4], ~@5 ab3 ~@2", W: "[b3,eb4,gb4,bb4]@11 ~@5",
  X: "[~@8 [ab3,bb3,db4]@5 [ab3,bb3,db4]@4 [gb3,bb3,db4]@5 [gb3,bb3,db4]@4 [ab3,bb3,db4]@5 [ab3,bb3,db4]@4 [gb3,bb3,db4]@5 [gb3,bb3,db4]@5 [ab3,bb3,db4]@3]/3", // Bbm7 Gb Bbm7 Gb Bbm7
  Y: "[~ [ab3,bb3,db4]@5 [gb3,bb3,db4]@4 [gb3,bb3,db4]@5 [ab3,bb3,db4]@4 [ab3,bb3,db4]@5 [gb3,bb3,db4]@5 [gb3,bb3,db4]@5 ~@14]/3", // Bbm7 Gb Bbm7 Gb
})).s("gm_piano").gain(0.22).pan(0.6)

// other · harpsichord
const harpsichord = note("<~@20 A B A C A B D E ~@8 A B A C A B D E A B D ~ F ~ G H ~@13>".pickRestart({
  A: "~ eb4 gb4 eb4 b4 gb4 eb4 gb4 ~ f4 ab4 f4 db5 ab4 f4 ab4", B: "~ bb3 db4 gb4 bb4 ab4 gb4 f4 gb4 f4 eb4@6",
  C: "gb4 db4 bb3@6 ab3 c4 eb4 ab4 bb4 f4 d4 bb3", D: "~ eb4 gb4 eb4 b4 gb4 eb4 gb4 eb4@3 f4@3 d4@2",
  E: "~ ab4 eb4 bb3@9 ~@4", F: "~@8 g4 f4 eb4@6", G: "~@8 f4 eb4 db4@6", H: "~@9 c4 eb4 c4 d4 eb4 f4@2",
})).s("gm_harpsichord").gain(0.14)

// chords · string ensemble 2 · "Slow Strings"
const string_ensemble_2 = note(`<
  A B C D@2 ~@7 E F G H E F G I J K L M N O P Q R@2 ~@2 E F G I J K L M N O P Q N O P Q ~@4 S T U V W@2 ~ X@6
>`.pickRestart({
  A: "[eb4,bb4,gb5]", B: "[c4,bb4,gb5]", C: "[b3,bb4,eb5]", D: "[db4,bb4,gb5]/2", E: "[eb4,gb4,bb4]", F: "[c4,gb4,bb4]",
  G: "[b3,eb4,bb4]@2 [db4,gb4,ab4] [db4,f4,ab4]", H: "[db4,gb4,ab4] [db4,gb4,bb4] [c4,eb4,ab4] [d4,f4,bb4]",
  I: "[db4,gb4,ab4] [db4,gb4,bb4] [c4,ab4,eb5] [d4,bb4,f5]", J: "[eb4,eb5,eb6]@2 [gb4,gb5,gb6] [f4,f5,f6]",
  K: "[db4,db5,db6]", L: "[eb4,eb5,eb6]@2 [bb4,bb5,bb6] [ab4,ab5,ab6]", M: "[db4,db5,db6]@2 [eb4,eb5,eb6] [f4,f5,f6]",
  N: "[eb4,gb5,gb6]@2 [gb4,bb5,bb6] [f4,ab5,ab6]", O: "[gb3,gb4] [f3,f4] [eb3,eb4,b5,b6]@2, [bb5,bb6] ~",
  P: "[eb3,eb4]@2 ~ [d5,d6], [eb5,eb6]@3 ~, ~ [bb2,bb3]", Q: "[f5,ab6] [eb5,g6], [eb3,eb4]", R: "[bb4,gb5,eb6]/2",
  S: "~@3 [g4,g6]@5", T: "~@3 ab3@13, [ab4,ab6]", U: "[db4,db6]", V: "[gb4,gb6] [f4,f6]", W: "[eb4,eb6]/2",
  X: "[~@8 [gb2,gb3,bb4,ab5,db6]@73 ~@15]/6", // Gb
})).s("gm_string_ensemble_2").gain(0.12)

// chords · piano · "Honkey Tonk Piano"
const piano_2 = note("<~@48 A B C D E B C F ~@9>".pickRestart({
  A: "[eb3,bb3,eb4,g4]@3 ~ [bb3,eb4,g4]@8 [eb2,eb3,g4,g5] [f2,f3,ab4,ab5] [g2,g3,bb4,bb5]@2, eb2@3 ~, ~@3 eb3@9 ~@4", // Eb Fm Gm
  B: "[bb4,g5,bb5]@3 [b4,ab5,b5]@9 [ab2,ab3,ab4,ab5] [gb2,gb3,bb4,bb5] [f2,f3] [eb2,eb3], [ab2,ab3]@6 ~ [b4,b5]", // Eb E Ab Gb F Eb Ab B
  C: "[db2,db3,f4,f5]@4 [f2,f3,db4] [eb2,eb3,eb4] [db2,db3,f4]@6 [db2,db3,f4,f5] [eb2,eb3,gb4,gb5] [f2,f3,ab4,ab5]@2", // Db Eb Db Ebm Fm
  D: "[ab4,f5,ab5]@3 [bb4,gb5,bb5]@5 ab3@2 ~ f2 bb3@2 bb3@2, [gb2,gb3]@2 [f2,c4,eb4] [bb1,d4,f4], ~@5 ab3 ~@2", // Db Ebm Gb F7 Bb
  E: "[eb3,eb4,g4]@3 ~ [bb3,eb4,g4]@8 [eb2,eb3,g4,g5] [f2,f3,ab4,ab5] [g2,g3,bb4,bb5]@2, eb2@3 ~, ~@3 eb3@9 ~@4", // Eb Fm Gm
  F: "[ab4,f5,ab5]@3 [bb4,gb5,bb5]@5 ~@8, [gb2,gb3] ~", // Db Ebm Gb
})).s("gm_piano").gain(0.24)

// chords · pad warm · "Warm Pad"
const pad_warm = note("<~@8 A@4 ~@16 A@4 ~@24 B@2 ~@7>".pickRestart({
  A: "[eb4@4 c4@4 b3@2 ~ f4 ~ bb4 [c4,eb4,ab4] [d4,f4,bb4], gb4@11 ~ gb4@2 ~@2, bb4@5 db4@2 ~, ~@10 ab4@3 ~@3]/4", // Ab Bb
  B: "[eb4 c4, [gb4,bb4]]/2", // Gb
})).s("gm_pad_warm").gain(0.09)

// other · taiko drum
const taiko_drum = note("<~@15 A ~@3 A ~@11 A ~@3 A ~@29>".pickRestart({
  A: "~@8 d6 ~@2 d5 ~@4",
})).s("gm_taiko_drum").gain(0.18)

// other · taiko drum · soft notes
const taiko_drum_soft = note("<~@15 A ~@3 A ~@11 A ~@3 A ~@29>".pickRestart({
  A: "~@14 d4 ~",
})).s("gm_taiko_drum").gain(0.12)

// other · acoustic guitar steel · "Steel String Guitar"
const acoustic_guitar_steel = note("<~@20 A B C D C E F G ~@8 A B C D C E F H C E I J ~@17>".pickRestart({
  A: "ab2@7 ab2 db3@4 db3@4", B: "gb3@4 f3@4 eb3@3 eb3 f2@2 gb2@2", C: "ab2@6 ~ ab2 db3@4 db3@4",
  D: "gb2@3 gb2 ab2@2 bb2@2", E: "gb3@2 f3@2 eb3@2 ~ eb3", F: "ab2@2 bb2!2", G: "eb3",
  H: "eb3@6 bb2@2 eb2@3 bb2 eb3 bb2 eb2@2", I: "ab2@4 ~ ab2 ~ bb2 ~ bb2 bb2@3 ~ bb2@2", J: "~@2 eb3@3 bb2@3 eb3@8",
})).s("gm_acoustic_guitar_steel").gain(0.06).pan(0.1)

// bass · acoustic bass
const bass_3 = note("<~@12 A B C D A B C D E F G H G I J A K L M N O P Q D E F G H G I J R G I S T ~@17>".pickRestart({
  A: "eb2", B: "c2", C: "b1 db2", D: "gb1@2 ab1 bb1", E: "ab1@7 ab1 db2@4 db2@4", F: "gb2@4 f2@4 eb2@3 eb2 f1@2 gb1@2",
  G: "ab1@6 ~ ab1 db2@4 db2@4", H: "gb1@3 gb1 ab1@2 bb1@2", I: "gb2@2 f2@2 eb2@2 ~ eb2", J: "ab1@2 bb1!2",
  K: "db3@13 ~ db3@2", L: "c3@14 c3 ~", M: "b2@8 db3@4 ~@2 f2 ~", N: "gb2@3 gb2 ab2@2 bb2@2", O: "eb2@13 ~ eb2 ~",
  P: "c2@13 ~ c2@2", Q: "b1@3 b1 db2@4", R: "eb2@6 bb1@2 eb1@3 bb1 eb2 bb1 eb1@2",
  S: "ab1@4 ~ ab1 ~ bb1 ~ bb1 bb1@3 ~ bb1@2", T: "~@2 eb2@3 bb1@3 eb2@8",
})).s("gm_acoustic_bass").gain(0.06)

// drums · rim
const rim = s("rim").struct("<~@28 [~@3 x]!3 [~ x ~ x]!4 ~@30>").gain(0.5)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@28 [~@3 x]!3 [~ x ~ x]!4 ~@30>").gain(0.25)

// drums · kick
const kick = s("bd").struct(`<
  ~@12 A B C D A B C E F@3 G F H B C B@2 I J@3 C E F@3 G F H B K L H M N ~@17
>`.pickRestart({
  A: "x", B: "x ~@6 x", C: "x!2", D: "x ~@7 x ~@2 x!2 ~@3", E: "x ~@6 x!2 ~ x!2 ~@4", F: "x ~@6 x!2 ~@3 x ~@3",
  G: "x ~@6 x!2 ~ x!3 ~@3", H: "x ~@2 x!2 ~ x!2", I: "x ~@3 x ~@2 x", J: "x ~@2 x!2 ~@3", K: "x ~@3 x ~@2 x ~@8",
  L: "x ~@6 x!2 ~@3 x ~ x ~", M: "x ~@4 x ~ x ~ x!2 ~ x ~ x ~", N: "x ~ x ~@2 x ~@2 x ~@7",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@19 A B@3 C B@2 D ~@8 A B@3 C B@2 D E B@3 F ~@17>".pickRestart({
  A: "~@4 x ~@4 x ~@2 x ~@3", B: "~ x ~ x", C: "~@4 x ~@4 x ~@2 x ~ x!2", D: "~ x", E: "~ x!2 ~", F: "~ x ~@2",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@12 A@3 B A@3 C D@6 ~@2 A@3 E A@3 C D@6 ~ D@4 F ~@17>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~ x ~ x ~@2 x", D: "x!8", E: "x ~ x ~@2 x!3", F: "x!4 ~@4",
})).gain(0.45)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@20 A B A@3 B ~@2 C@3 D C@3 E A B A@3 B ~@2 A B F G ~@17>".pickRestart({
  A: "~ x ~ x ~@3 x ~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~ x",
  D: "~@2 x ~@3 x!2 ~@7 x", E: "~ x ~ x ~ x ~@2", F: "~ x ~ x ~@5 x ~ x ~ x ~ x", G: "~ x ~ x ~ x ~ x ~@8",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@19 [~@15 x] ~@15 [~@15 x] ~@7 [~@10 x!2 ~@3 x] ~@21>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 [~@7 x] ~@15 [~@7 x] ~@7 [~@10 x!2 ~@2 x ~] ~@21>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@15 A ~@3 A B ~ B@3 ~@6 C ~@3 D B ~ B@3 ~@3 B ~ E ~@18>".pickRestart({
  A: "~@3 x", B: "~@5 x ~@10", C: "~@8 x ~@4 x ~@2", D: "~@5 x ~@7 x ~@2", E: "~@5 x ~ x ~@8",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct("<~@43 [~@12 x!2 ~@2] ~@21>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@12 A ~@7 A ~@3 A ~@11 A ~@2 B C ~@3 A ~@2 B ~@17>".pickRestart({
  A: "x", B: "~ x", C: "x!2 ~@2",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@20
  [~ x ~ x ~ x ~ x]!6
  ~@10
  [~ x ~ x ~ x ~ x]!6
  ~@2
  [~ x ~ x ~ x ~ x]!3
  [~ x ~ x ~@4]
  ~@17
>`).gain(0.45)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@26
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]
  [x!2 ~@2 x!2 ~@2 x ~@7]
  ~@14
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]
  ~@22
>`).gain(1.01)

// drums · shaker
const shaker = s("sh").struct("<~@20 A@6 B C ~@8 A@6 B ~ A@3 D ~@17>".pickRestart({
  A: "~@3 x ~@7 x ~@4", B: "~ x ~ x ~ x ~ x", C: "~ x ~ x ~@4", D: "~@3 x ~@12",
})).gain(0.3)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@20 [~@3 x]!6 ~@10 [~@3 x]!6 ~@2 [~@3 x]!3 ~@18>").gain(0.2)

// drums · triangle
const triangle = s("triangles:30").struct(`<
  ~@20
  [~@4 x ~@4 x!2 ~@4 x]!7
  [x ~@2 x ~@12]
// … 25 more lines

More by Celine Dion