Strudelify

Quand on n'a que l'amour

Celine Dion

KeyG minorTempo63 bpm
0:00/0:00
// Quand on n'a que l'amour — Celine Dion
// 63 bpm, 4/4, key G minor. 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: Full arrangement: all 53 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(63/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(`<
  ~@13 A B C D A E F G H I J K L M N O P Q R S T U V W X Y Z AA AB H AC AD AE AF AG AH AI@2 AJ@2
>`.pickRestart({
  A: "g1 a1", B: "bb1 g1", C: "c2 f1", D: "bb1@2 a1 d2", E: "bb1@2 g1 f1", F: "e1@2 eb1 eb2", G: "d2@2 d1 d2",
  H: "g1@5 ~ g1 ~ g1@6 d1@2", I: "g1@5 ~ g1 ~ g1@8", J: "c2@5 ~ c2@2 f1@8", K: "bb1@5 ~ bb1@2 d2@4 c2@4", L: "bb1@15 ~",
  M: "bb1@5 ~ bb1@2 c2@5 ~ c2@2", N: "d2@5 ~ d2@2 eb2@5 ~ eb2@2", O: "c2@5 ~ c2@2 f1@5 ~ f1@2",
  P: "c2@5 ~ c2@2 f1 ~ f1@3 ~ f1@2", Q: "bb1@5 ~ bb1 ~ c2@5 ~ c2@2, c2 ~@15", R: "d2@6 d1@2 eb1@5 ~ eb1@2",
  S: "c2@5 ~ c2@2 f1 ~ f1@4 g1@2", T: "bb1@5 ~ bb1@2 a1@4 d1@4", U: "g1@5 ~ g1@2 a1 ~ a1@3 ~ a1@2",
  V: "bb1@6 a1@2 g1 ~ g1@4 d2@2", W: "c2@5 ~ c2@2 f1@6 c2@2", X: "bb1@5 ~ bb1@2 a1@4 d2@2 d1@2",
  Y: "g1@5 ~ g1@2 a1@5 ~ a1@2", Z: "bb1@3 a1 g1@2 f1@2", AA: "e1@3 e2 eb2@4", AB: "d2@3 a1 d1@3 d2",
  AC: "g1@5 ~ g1 ~ g1@6 d2@2", AD: "c2@5 ~ c2@2 f1 ~ f1@4 c2@2", AE: "bb1@5 ~ bb1@2 d2@4 d1@4",
  AF: "g1@5 ~ g1@2 d1 ~ d1@3 ~ d1 ~", AG: "g1@5 ~ g1@2 d1 ~ d1@3 ~ d1@2", AH: "g1@5 ~ g1@2 c2@5 ~ c2@2",
  AI: "[f1@2 f1 ~ f1 ~ f1 ~ f1@16 bb1@5 ~ bb1 ~]/2", AJ: "[bb1@4 f1@5 bb1@17 bb1@2 ~@4]/2",
})).s("gm_fretless_bass").gain(0.5)

// chords · piano
const piano = note(`<
  A B C D@2 E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN T AO AP AQ AR AS AT AU
  AV@2 AW@2
>`.pickRestart({
  A: "~@3 bb4 ~@3 d4, [bb2,f3], d4 eb4, ~ bb4@2 ~@3 g3@2, ~@2 a4@2 ~ d4@2 ~", // Bb5
  B: "eb4 bb4 ~ bb4 f4 [g3,eb4] ~ [eb3,c4], [c3,eb3,g3,bb3]@2 ~ [f3,d4], ~ a4 ~@2", // Cm Cm7 Dm
  C: "~@3 a5 ~@3 g5, [bb2,d5]@4 ~ bb3@3, ~ [f3,f5]@3 g5@3 ~, ~ [bb3,bb5] eb5@2, ~@3 f5", // Bb F Bb
  D: "[~@6 eb5@2 [f3,c4,eb4,g4,c5]@15 ~@9, [c3,g4,bb4] ~@3, ~ g3@3 ~@12, ~ d5 ~@6]/2", // Cm C7
  E: "~ bb5 ~ bb5 g3@2 ~ bb4, d5 [bb2,d3,f3,a5] eb5@2", // Bbmaj7
  F: "~ f5 ~ f5 eb3@2 ~ bb4, [d3,f3,d5]@2 [d3,eb5]@2 bb4@3 ~, ~@3 eb3", // Dm Ebmaj7
  G: "[eb3,g3]@2 ~@3 bb4 ~ f4, c5@3 ~, ~@2 eb3 [c3,f3,a4]", H: "~@2 f3@2 ~ f4 ~ f4, g4@3 eb4, ~@2 eb3 ~",
  I: "d3@2 ~ bb4 [c3,eb3,g3]@2 ~ g4, d4 bb4", J: "[d3,f3,bb3]@2 ~ c5 [g3,bb3]@2 ~ bb4, bb4 d5, ~ [d3,f3] ~ g3",
  K: "[eb3,g3]@2 ~ c5 [f3,a3]@2 ~ f4, bb4 a4, ~ [eb3,g3] ~ g4", // Eb F Eb
  L: "[bb2,d3,f3]@2 ~ c4 a3!4, f4 ~, ~ d3 [a2,c4,d4,gb4] [d2,c4,d4]", // Bb D7
  M: "[g3,bb3,d4]@2 ~ g3 [d4,g4]@2 a3!2, [g2,g4] ~, ~@2 [bb3,d4]@2 a3 ~ [d4,gb4]@2", // Gm G5 G Bb D
  N: "[bb3,d4,g4]@2 [d4,g4]@2 [bb3,d4,bb4]@2 bb3!2, ~@2 bb3 ~@3 [d4,g4]@2", // Gm G5 Bb G5
  O: "[bb3,eb4,g4] [eb4,g4] a3!2, ~ f4, ~@4 c4@3 ~", P: "[bb3,d4]@2 f3!2 g3!2 gb3!2, ~ [bb3,d4] [a3,d4]!2",
  Q: "[g3,bb3,d4]@2 g3!2 [g3,a3,d4]@2 gb3!2, g2 a2, ~ [bb3,d4] ~ [a3,d4]", // Gm Gsus2 Bb D5
  R: "[g3,bb3,d4]@2 g3!2 [g2,g3,bb3,d4]@2 g3!2, bb2@2 ~ [f2,bb3,d4], ~ [bb3,d4] ~@2", // Gm Bb
  S: "[g3,bb3,d4]@2 g3!2 g3@2 ~ eb4, e2 [eb2,bb3], ~@2 [bb3,d4,g4]@2 eb4@3 ~, ~@3 g3", // Gm Eb5 Gm
  T: "[g3,a3,d4]@2 g3!2 [gb3,a3,d4]@2 gb3!2, d2!2, ~ [a3,d4] ~ [a3,d4]", // Gsus2 D D5
  U: "[g3,bb3,d4]@2 ~ g4 [gb3,bb3,d4,gb4]@2 gb3!2, g2!2, ~ [g3,bb3,d4] ~ [bb3,d4,gb4]", // Gm Gbaug Gm Bbaug
  V: "[f3,bb3,d4,f4]@2 f3!2 [e3,bb3,d4]@2 e3!2, g2 [g2,e4], ~ [bb3,d4,f4] ~ [bb3,d4]", // Bb Em7b5 C Bb
  W: "[g3,bb3,eb4]@2 g3!2 [a3,c4,f4]@2 a3!2, [c2,c3] f2, g2 ~@3 [bb3,eb4]@4 ~@4 [c4,f4]@4", // Eb F C Eb5 F5
  X: "[f3,bb3,d4]@2 f3 [bb2,f3] gb3!4, bb2@3 ~ [d2,d3,a3,d4]@2 [c3,a3,d4]@2, f2 ~@3 [bb3,d4]@4 ~@8", // Bb Bb5 D5 D7 Bb
  Y: "[bb2,f3,c4,d4]", Z: "~@2 f3 [f3,bb3,d4] g3!2 ~ g4, bb2 c3, [bb3,d4]@3 ~ [bb3,eb4]@2 [g3,bb3,eb4]@2",
  AA: "[f3,bb3,d4]@2 ~ f3 g3@2 ~ bb3, [d3,f4] [eb3,d4], ~@2 [bb3,d4]@2 bb3@3 ~, ~@3 g3", // Bb Dm Ebmaj7 Bb
  AB: "[c3,bb3]@3 [c3,bb3] a3 ~@2 [f2,f4], eb4@2 c4!2, g3@2 ~@2 [f2,f4]@3 ~, ~@5 a3@3", // C7 F
  AC: "g3@4 ~@2 bb3@2 f3 ~@5 eb4@2, [c3,eb4] [f2,a3,c4], bb3@3 ~@3 f4@2, ~ g3 ~@2", // Cm F
  AD: "[f3,bb3,d4]@2 f3!2 bb3@2 ~ [c3,g4], bb2@4 c3@3 ~, ~ [bb3,d4] eb4@2, ~@4 g3 ~ bb3@2", // Bb C5 Bb
  AE: "[bb3,d4]@2 ~ f3 bb3@2 ~ [eb3,g4], [d3,f4]@4 eb3@3 ~, ~ [bb3,d4] d4@2, ~@4 g3 ~ bb3@2", // Bb Eb Dm Bb
  AF: "[g3,bb3,eb4]@2 g3!2 [a3,c4,f4]@2 a3!2, c3@3 ~ f2@4, ~ [bb3,eb4] ~ [c4,f4]", // Eb F Eb5 F5
  AG: "[f3,bb3,d4]@2 f3 [bb2,f3] gb3!4, bb2@3 ~ [a2,a3,d4]@2 [d2,a3,d4]@2, ~ [bb3,d4] ~@2", // Bb Bb5 D5 Bb
  AH: "[g3,bb3,d4]@2 g3!2 d4@2 a3!2, g2 [a2,g4], ~@2 [bb3,d4,g4]@2 a3 ~ [d4,gb4]@2", // Gm A7 Gm D
  AI: "[g3,bb3,d4,g4]@2 g3!2 g3@2 ~ [g2,bb3], bb2@4 [g2,bb3]@3 ~, ~ [bb3,d4,g4] [d4,g4]@2, ~@3 g3", // Gm G5
  AJ: "[g3,bb3,eb4]@2 g3!2 a3@2 ~ [f2,f4], [c2,c3]@4 [f2,f4]@3 ~, ~ [bb3,eb4] c4@2, ~@8 c3 ~@3 a3@4", // Eb F C F Eb5
  AK: "bb3@2 ~ [bb2,d4] [a2,a3,d4]@2 gb3!2, f3@4 g3 ~@3, [bb2,d4]@3 ~@3 [d2,a3,d4]@2, ~ bb3 ~@2", // Bb D5 Bb D5
  AL: "[g3,bb3,d4]@2 g3!4 gb3!2, g2 a2, ~ [bb3,d4] [a3,d4]!2", // Gm Bb D5
  AM: "[g3,bb3,d4]@2 g3!2 [g2,g3,bb3,d4]@2 [f2,g3,bb3,d4]@2, bb2 ~, ~ [bb3,d4] ~@2", // Gm Gm7 Bb
  AN: "[g3,bb3,d4]@2 g3 [e2,g3] [g3,bb3,eb4]@2 g3!2, e2@3 ~ eb2@4, ~ [bb3,d4] ~ [bb3,eb4]", // Gm Em Eb Bb Eb5
  AO: "[g3,bb3,d4]@2 g3!2 [gb3,bb3,d4,gb4]@2 gb3!2, g2!2, ~ [bb3,d4,g4] ~ [bb3,d4,gb4]", // Gm Gbaug Gm Bbaug
  AP: "[f3,bb3,d4,f4]@2 f3!2 [g3,bb3,d4,e4]@2 g3!2, g2!2, ~ [bb3,d4,f4] ~ [bb3,d4,e4]", // Bb Em7b5 Bb Em7b5
  AQ: "[g3,bb3,eb4]@2 g3 [c3,g3] [a3,c4,f4]@2 a3 [f2,a3], c3@3 ~ f2@3 ~, ~ [bb3,eb4] ~ [c4,f4]", // Eb C5 F Eb5 F5
  AR: "[f3,bb3,d4]@2 f3!2 gb3!2 [c3,a3,d4]@2, bb2@3 ~ [d3,a3,d4]@2 gb3 ~, ~ [bb3,d4] ~@2", // Bb D7 D5 Bb
  AS: "[g3,bb3,d4]@2 g3!2 [gb3,a3,d4]@2 ~ d2, g2@4 d2@3 ~, ~ [bb3,d4] ~ [gb3,a3,d4]", // Gm D Bb D
  AT: "[g3,bb3]@2 ~ g2 [gb3,a3,d4]@2 ~ d2, g2@3 ~ d2@3 ~, ~ [g3,bb3,d4] ~ [gb3,a3,d4]", // Gm D Gm D
  AU: "[g3,bb3,d4]@2 g3 [g2,g3] [g3,bb3,eb4]@2 g3 [c2,g3], g2@3 ~ c2@3 ~, ~ [bb3,d4] ~ [bb3,eb4]", // Gm G Eb C5 Bb Eb5
  AV: "[[f2,a3,c4] [f2,f3,a3,c4]!3 [f2,f3,a3,c4]@8 [f3,bb3,d4]@2 f3 [bb2,f3], ~@12 bb2@3 ~, ~@7 [bb3,d4]]/2", // F Bb Bb5 Bb
  AW: "[bb3@4 [bb3,c4]@5 [bb2,f3,bb3,d4]@19 ~@4, [bb2,d4]@9 ~@23, f3 ~ f3 ~@13]/2", // Bbsus2 Bb
})).s("gm_piano").gain(0.44)

// chords · piano · soft notes
const piano_soft = note(`<
  A B C D ~ E F G H I J K L M N O ~@10 P Q R S T U V ~ W ~@2 X ~@7 Y ~ Z ~ AA ~ AB ~
>`.pickRestart({
  A: "c4", B: "~@4 a3 ~@3", C: "~@3 eb4, ~ eb3", D: "~ bb3 ~@2", E: "[bb2,d3,f3] ~ eb3 [eb3,g3], ~ c3",
  F: "bb3 [f3,bb3] [g3,bb3]!2", G: "c3 [c3,f3,a3] [c3,g3] a3", H: "[c3,eb3,g3] [c3,a3] [c3,g3] [c3,f3,a3]",
  I: "[bb2,f3] [bb2,d3,f3] ~ [c3,eb3,g3]", J: "~ bb3 [eb3,d4] [eb3,bb3,d4]", K: "[c3,bb3]!2 c3 [c3,f3,a3]",
  L: "~ [bb2,f3] ~@2", M: "~@2 g3 ~@2 a3 ~@2", N: "~@3 bb3 ~@4", O: "~@2 bb3!2 ~@3 c4", P: "f3 ~@3", Q: "~@2 f3 ~@5",
  R: "~ g3 ~@2", S: "~@5 f3@3", T: "~@5 g3@3", U: "~@2 f3 ~@2 g3@3", V: "~@3 c3 ~@4", W: "~@5 a3 ~@2", X: "~@5 g3 ~@2",
  Y: "~@3 bb2 ~@3 gb3", Z: "d4 ~@3", AA: "f3 ~@7", AB: "~@2 f3@2 ~@3 f3@2 ~@7",
})).s("gm_piano").gain(0.27)

// chords · distortion guitar · "Distortio"
const distortion_guitar = note("<~@34 A B C D A E F G H I J K L@2 M N@4>".pickRestart({
  A: "[g2,d3] a2", B: "bb2 [g2,d3]", C: "[c3,g3] [f2,c3,f3]", D: "[bb2,f3]@4 ~@3 d2, ~ d3", E: "bb2@2 g2 f2",
  F: "e2 [eb2,eb3]", G: "[d2,d3] d3", H: "[g2,d3] [g2,gb3]", I: "[g2,f3] [g2,e3]", J: "c3 [f2,c3]",
  K: "[bb2,f3] [d3,a3]", L: "[g2,d3] [d3,a3]", M: "[g2,d3] [c3,g3]",
  N: "[[f2,c3,f3]@2 [f2,c3,f3]@2 [f2,c3,f3]@2 [f2,c3,f3]@2 [f2,c3,f3]@16 ~@15 f2@2 [bb2,f3]@17 [bb2,f3]@2 ~@4, ~@24 [bb2,f3]@17 ~@23]/4", // F5 Bb5
})).s("gm_distortion_guitar").gain(0.45)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@13 A@2 B@8 C D@2 E F G H@2 I J K@6 L@3 M@2 N O@8>".pickRestart({
  A: "[bb3@7 ~@5 gb3@4 g3@8 g4@8, d4, g3@3 ~@5, ~ a3 bb3@2]/2",
  B: "[[g3,eb4]@2 f4@4 g4 gb4 [bb3,g4]@2 ~ gb3 [g3,bb3]@3 d4 e4@2 ~@4 gb4@2 g4@2 gb4@2 f4@2 e4@2, ~@8 a3@8 ~@8 d4@35 ~ g4@28 ~@40, ~@6 a3@2 ~@2 a3@2 ~@3 bb3@5 a3@4 bb3@8, ~@9 d4@7]/8", // Cm Eb Gm
  C: "[g3,eb4] [a3,f4], c4", D: "[[f3,bb3]@8 a3@8 [f3,bb3]@15 ~, d4@31 ~]/2", E: "~@3 [g3,eb4]", F: "[bb3,d4]",
  G: "eb4 [a3,f4]", H: "[[bb3,eb4,g4]@2 a4@2 ~ d4 eb4 g4, ~@2 f4@3 ~@3, ~ bb3]/2", I: "f4 [bb3,g4], d4",
  J: "g3 [a3,f4], c4", // Dm
  K: "[[f3,bb3]@2 [a3,gb4]@2 bb3@2 ~ gb4 bb3@2 bb4@2 c5@3 [c4,a4] bb4@2 g4 gb4 bb3 ~@2 gb4, d4@12 ~@4 d4@5 d5@3, ~@4 g4@3 ~ g4@7 f4@3 ~@2 g4@3 ~, ~@3 a3 ~@5 a3 ~ a4]/6", // Bb5 D F
  L: "[d4@3 ~@7 gb4@2, g4@5 ~, bb4@2 a4, ~ d5@3]/3",
  M: "[d4 g5 [gb4,gb5]@2 [f4,f5]@2 [e4,e5]@2, bb4@25 ~@7, g4 d5@2 ~]/2", N: "[eb4,eb5] [f4,f5]",
  O: "[~@8 [gb4,a4]@8 [g4,bb4]@8 [gb4,a4]@8 [g4,bb4]@8 [gb4,a4]@8 bb4@8 eb4@8 [c4,f4,a4]@24 ~@17 d5@18 ~@5, d4@56 c5@32 ~@8 [f4,bb4]@27 ~@5, d5@12 g4@4 ~@7 d4@3 ~@6]/8", // Gbm Gm Gbm Gm Gbm F Bb5
})).s("gm_string_ensemble_1").gain(0.33)

// chords · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~@15 A B C ~@9 D@2 E F ~ G ~@3 H ~@16>".pickRestart({
  A: "c4@15 ~", B: "[bb3,d4] ~", C: "~@2 g3 ~", D: "[f4 ~ c4@2, ~ g3@2 ~]/2", E: "~ c4", F: "d4 ~@3", G: "eb4 ~",
  H: "eb4@3 ~",
})).s("gm_string_ensemble_1").gain(0.16)

// other · timpani
const timpani = note("<~@46 [~@14 d3 ~] [g2@3 ~@11 d3 ~] [g2@2 ~@12 c3 ~] [f2 ~ f2 ~ f2 ~ f2 ~ f2@6 ~@2] ~@3>")
  .s("gm_timpani").gain(0.5)

// drums · kick
const kick = s("bd").struct(`<
  ~@21
  [x ~@2 x!2 ~@3]!4
  x
  [x ~@2 x!2 ~@3]!23
  [x!5 ~@3]
  [~@4 x ~@2 x]
  [x ~@8 x ~@6]
  [~@5 x ~@2]
>`).gain(0.56)

// drums · snare
const snare = s("sd").struct("<~@21 [~ x ~ x]!4 ~ [~ x ~ x]!23 [x!4 ~@4] [~@3 x] [~ x ~@2] ~>").gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~@41 [~@7 x] ~@11>").gain(0.48)

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@33 [~@3 x ~@4] ~@7 [~@3 x ~@2 x ~] ~@3 [~@3 x ~@4] ~@7>").gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@20 A ~@12 A ~@7 B ~@3 A ~@7>".pickRestart({
  A: "~@5 x ~@2", B: "~ x!2 ~ x ~@2 x!2 ~@7",
})).gain(0.64)

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

stack(
  bass, piano, piano_soft, distortion_guitar, string_ensemble_1, string_ensemble_1_soft, timpani, kick, snare, low_tom,
  hihat, mid_tom, open_hat, high_tom, crash
)

More by Celine Dion