manipuler les VoiceFollowers

Bonjour à toute la liste !

Je souhaite manipuler les positions des points d'attache des VoiceFollowers pour éviter des collisions avec les hampes.

"Rien de plus facile" avec : \once \override VoiceFollower #'bound-details = #'((right (attach-dir . 0) (padding . a)) (left (attach-dir . 0) (padding . b)))

...mais ça encombre pas mal le code.

Donc idée géniale : encapsuler cela dans une fonction qui s'utiliserait comme ceci \ligne #'(a . b) ou \ligne #a #b

Je consulte donc le Scheme Tutorial, et en particulier l'exemple 1.3.4. Je me pastille le snippet suivant :

\displayMusic{
\new PianoStaff <<
\new Staff = "up" <<
  \new Voice {\relative c'' {\voiceOne c1}}
  \new Voice {\relative c'' {\voiceTwo g4 \change Staff = "down" \showStaffSwitch g, c c }}
    >>
\new Staff = "down" << \clef F \relative c {c1} >>
>>
}

puis le même avec le \once \override cité plus haut.

Je compare les deux fichiers (à ce propos, sous Linux, le très efficace tkdiff, qui souligne les différences entre deux fichiers texte !) et je trouve le code qui correspond au \once \override. J'indique au passage que j'ai raccroché le (make-music ...) correspondant à la liste des 'elements du niveau supérieur, qui se trouve aux alentours de la ligne 288, (make-music 'SequentialMusic 'elements ...). Peut-être mon erreur vient-elle de là ?

C'est là que ça se gâte, parce qu'autant le \once \override ... fonctionne bien (on le voit avec a=3 et b=-4), autant l'équivalent en Scheme ne faire strictement aucun effet... à part de m'annuler le \relative c{...} au passage... ça doit vraiment être une histoire de niveau d'arborescence...

J'ai joint le fonction.ly pour ne pas encombrer le message.

Auriez-vous une idée, ô Schemistes ?

Merci d'avance !
JMarc

fonction.ly (1.79 KB)

C'est là que ça se gâte, parce qu'autant le \once \override ...
fonctionne bien (on le voit avec a=3 et b=-4), autant l'équivalent en
Scheme ne faire strictement aucun effet... à part de m'annuler le
\relative c{...} au passage... ça doit vraiment être une histoire de
niveau d'arborescence...

Comme tu l'as programmé, tu ajoutes l'override à l'intérieur du
sequential-music qui se trouve être dans l'exemple donné une note (un
EventChord exactement).
Apparemment ce genre d'override à l'intérieur d'un accord, Lilypond ne le
comprends pas.
Si j'ai bien compris ce que tu voulais, tu n'as pas besoin de paramètre
sequential-music

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ligne = #(define-music-function (parser location )()
"modifie les positions de spoints d'attache des lignes de suivi des voix VoiceFollower"
   (make-music 'ContextSpeccedMusic
               'context-type
               'Bottom
               'element
               (make-music
                    'OverrideProperty
                    'pop-first #t
                    'grob-property-path (list 'bound-details)
                    'grob-value (list (list 'right
                                            (cons 'attach-dir 0)
                                            (cons 'padding 3))
                                      (list 'left
                                            (cons 'attach-dir 0)
                                            (cons 'padding -4))
                                )
                     'once #t
                    'symbol 'VoiceFollower)))

ligneQuiMarche = \once \override VoiceFollower #'bound-details = #'((right (attach-dir . 0) (padding . 3)) (left (attach-dir . 0) (padding . -4)))

\new PianoStaff <<
\new Staff = "up" <<
   \new Voice {\relative c'' {\voiceOne c1}}
   \new Voice {\relative c'' {\voiceTwo g4 \change Staff = "down"
           \showStaffSwitch \ligne
          % \displayMusic \ligneQuiMarche
           g, c c }}
     >>
\new Staff = "down" << \clef F \relative c {c1} >>

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Voilà un solution qui devrait convenir :

paddingsTrait =
#(define-music-function (parser location pl pr) (number? number?)
#{
\once \override VoiceFollower #'bound-details =
#`((right (attach-dir . 0) (padding . ,$pr))
(left (attach-dir . 0) (padding . ,$pl)))
#})

\new PianoStaff <<
\new Staff = "up" <<
\new Voice {\relative c'' {\voiceOne c1}}
\new Voice {\relative c'' {\voiceTwo g4 \change Staff = "down" \showStaffSwitch \paddingsTrait #2 #2 g, c c }}

\new Staff = "down" << \clef F \relative c {c1} >>

Bertrand

Braaaavooooo !
Merci à Gilles et à toi de m'avoir aidé si rapidement !

Bénédictions éternelles jusqu'à la 14ème génération (après, on verra.) !

JMarc

Bertrand Bordage a écrit :

···

Voilà un solution qui devrait convenir :

paddingsTrait =
#(define-music-function (parser location pl pr) (number? number?)
   #{
     \once \override VoiceFollower #'bound-details =
       #`((right (attach-dir . 0) (padding . ,$pr))
          (left (attach-dir . 0) (padding . ,$pl)))
   #})

\new PianoStaff <<
\new Staff = "up" <<
\new Voice {\relative c'' {\voiceOne c1}}
\new Voice {\relative c'' {\voiceTwo g4 \change Staff = "down" \showStaffSwitch \paddingsTrait #2 #2 g, c c }}
  >>
\new Staff = "down" << \clef F \relative c {c1} >>
>>

Bertrand