[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Laissez vibrer sur un arpège
From: |
Jean-Baptiste |
Subject: |
Re: Laissez vibrer sur un arpège |
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 <jean@abou-samra.fr> 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
>