Subject: Laissez vibrer sur un arpège

From: Jean-Baptiste <[email-masked]>
Date: Fri, 3 Jun 2022 12:51:24 +0200

Bonjour à tous,

Je voudrais faire paraitre des laissez vibrer attachés à un arpège, comme on en voit parfois chez Ravel :

Pour cela j’ai utilisé des liaisons « tie » avec l’option :

\set tieWaitForNote = ##t

Et attachés à un un accord masqué :

J’ai deux problèmes :
1. la liaison du si est plus courte parce que le la et le si sont de part et d'autre de la hampe. Pourrait-on écraser temporairement cette répartition, quitte à produire une collision, puisqu'elle est ici invisible ?
2. J'aimerai faire la même chose pour les notes de la portée inférieure. Je n'arrive pas à le faire sur les deux portées, parce que je ne peux répartir l’accord vers lequel aboutissent les liaisons sur deux portées.

Si vous avez des solutions, même très différentes, ça m’intéresse…

Jean-Baptiste.

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 5 Jun 2022 20:14:05 +0200

Le 03/06/2022 à 12:51, Jean-Baptiste a écrit :
> 1. la liaison du si est plus courte parce que le la et le si sont de
> part et d'autre de la hampe. Pourrait-on écraser temporairement cette
> répartition, quitte à produire une collision, puisqu'elle est ici
> invisible ?
> 2. J'aimerai faire la même chose pour les notes de la portée
> inférieure. Je n'arrive pas à le faire sur les deux portées, parce que
> je ne peux répartir l’accord vers lequel aboutissent les liaisons sur
> deux portées.
>

Bonjour,

Une solution bricolée à la va-vite…

\version "2.22.2"

#(use-modules (ice-9 match))

multiLaissezVibrer =
#(define-music-function (music) (ly:music?)
    ;; hack, hack, hack ...
    (let ( ;; should store these in a grob, not in a closure ...
          (lvs '())
          (right #f))
      #{
        \override LaissezVibrerTie.before-line-breaking =
          #(lambda (grob)
             (set! lvs (cons grob lvs)))
        \override LaissezVibrerTie.X-extent = #empty-interval
        \override LaissezVibrerTie.Y-extent = #empty-interval
        \override LaissezVibrerTie.vertical-skylines = ##f
        \override LaissezVibrerTie.after-line-breaking =
          #(lambda (grob)
             (let ((sys (ly:grob-system grob)))
               (define (get-right lv)
                 (+ (car (fourth (ly:grob-property lv 'control-points)))
                    (ly:grob-relative-coordinate lv sys X)))
               (if (not right)
                   (set! right (apply max (map get-right lvs))))
               (let* ((cpts (ly:grob-property grob 'control-points))
                      (my-coord (ly:grob-relative-coordinate grob sys X))
                      (my-left (+ my-coord (car (first cpts))))
                      (my-right (+ my-coord (car (fourth cpts))))
                      (scale (/ (- right my-left)
                                (- my-right my-left)))
                      (first-y (cdar cpts))
                      ;; Ajuster ce nombre pour des liaisons plus ou
moins tassées.
                      (magic-factor 0.25)
                      (new-cpts (map (match-lambda
                                      ((x . y)
                                       (let* ((trx (+ x my-coord))
                                              (new-trx (+ my-left (*
scale (- trx my-left))))
                                              (new-x (- new-trx my-coord))
                                              (new-y (+ first-y (*
magic-factor scale (- y first-y)))))
                                         (cons new-x new-y
                                               ))))
                                     cpts)))
                 (ly:grob-set-property! grob 'control-points new-cpts))))
        #music
        \revert LaissezVibrerTie.before-line-breaking
        \revert LaissezVibrerTie.X-extent
        \revert LaissezVibrerTie.Y-extent
        \revert LaissezVibrerTie.vertical-skylines
        \revert LaissezVibrerTie.after-line-breaking
      #}))

lv = \laissezVibrer

voixA = \relative c' { \voiceOne <a' d f ( >2 b'2 ) }
voixB = \relative c {
     \mergeDifferentlyDottedOn
     \mergeDifferentlyHeadedOn
     \multiLaissezVibrer {
       \change Staff = "down" \voiceOne b16_\lv f'_\lv b_\lv \change
Staff = "up"  \voiceTwo d_\lv f_\lv a_\lv b\lv d\lv
     }
     s4
     <d fis> |
}
voixC = \relative c' {
     \mergeDifferentlyDottedOn
     \mergeDifferentlyHeadedOn
     \voiceTwo b,2. gis4 }

\score {
     \new PianoStaff {
         <<
             \new Staff = "up" {
                 \clef "treble"
                 <<
                     \new Voice {\voixA}
                     \new Voice {\voixB}
                 >>
             }

             \new Staff = "down" {
                 \clef "bass"
                 \new Voice {\voixC}
             }
         >>
     }
     \layout {}
}

Cordialement,
Jean

---

From: Jean-Baptiste <[email-masked]>
Date: Mon, 6 Jun 2022 10:00:00 +0200

Merci beaucoup pour ce «  bricolage », qui me dépasse un petit peu mais fait parfaitement l'affaire !

Jean-Baptiste.

> Le 5 juin 2022 à 20:14, Jean Abou Samra <[email-masked]> a écrit :
> 
> 
> 
>                      ;; Ajuster ce nombre pour des liaisons plus ou moins tassées.
>                      (magic-factor 0.25)
>                                              (new-trx (+ my-left (* scale (- trx my-left))))
>                                              (new-y (+ first-y (* magic-factor scale (- y first-y)))))
>                                         (cons new-x new-y
>                                               ))))
>                                     cpts)))
>       \change Staff = "down" \voiceOne b16_\lv f'_\lv b_\lv \change Staff = "up"  \voiceTwo d_\lv f_\lv a_\lv b\lv d\lv
>     }
>     s4
>     <d fis> |
> }
> voixC = \relative c' {