lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Laissez vibrer sur un arpège


From: Jean Abou Samra
Subject: Re: Laissez vibrer sur un arpège
Date: Sun, 5 Jun 2022 20:14:05 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1



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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]