Subject: manipuler les VoiceFollowers

From: Éditions IN NOMINE<[email-masked]>
Date: Fri, 24 Jun 2011 12:16:36 +0200

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

\version "2.13"

ligne = #(define-music-function (parser location sequential-music)
                                     (ly:music?)
  "modifie les positions de spoints d'attache des lignes de suivi des voix VoiceFollower"
  (let ((result-sequential-music (ly:music-deep-copy sequential-music)))
    (set! (ly:music-property result-sequential-music 'elements)
          (cons (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))
                (ly:music-property result-sequential-music 'elements)))
    result-sequential-music))

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 %{\ligneQuiMarche%} g, c c }}
\new Staff = "down" << \clef F \relative c {c1} >>

---

From: Gilles <[email-masked]>
Date: Fri, 24 Jun 2011 14:53:48 +0200

> \relative c{...} au passage... ça doit vraiment être une histoire de
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 }}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

---

From: Bertrand Bordage <[email-masked]>
Date: Fri, 24 Jun 2011 16:02:06 +0200

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 }}

Bertrand

---

From: Éditions IN NOMINE<[email-masked]>
Date: Fri, 24 Jun 2011 16:07:49 +0200

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