Laissez vibrer sur un arpège

Bonjour à tous,

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

Arpège-image.pdf (16.4 KB)

Arpège.ly (1.2 KB)

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.

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 = &quot;down&quot; \{
             \\clef &quot;bass&quot;
             \\new Voice \{\\voixC\}
         \}
     &gt;&gt;
 \}
 \\layout \{\}

}

Cordialement,
Jean

···

Le 03/06/2022 à 12:51, Jean-Baptiste a écrit :

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 <****@****> a écrit :

Le 03/06/2022 à 12:51, Jean-Baptiste a écrit :

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.

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