Séparation entre altérations annulées et nouvelle armure

Les altérations supprimées lors d’un changement de tonalité sont par défaut accolées à la nouvelle armure. Ce comportement peut s’adapter grâce à la propriété break-align-orders de l’objet BreakAlignment.

La valeur de break-align-orders est constituée d’un vecteur à trois composantes listant l’ordre des éléments à l’occasion d’une rupture. Chaque composante liste l’ordre par défaut des éléments selon qu’ils intervennent en fin, en cours, et au début d’une ligne. Seule la deuxième liste nous intéresse ici,

Si l’on se réfère à la référence des propriétés internes à propos de l’objet break-align-orders, l’ordre du deuxième élément est :

...
staff-bar
key-cancellation
key-signature
...

C’est ce que nous voulons modifier, en déplaçant key-cancellation avant staff-bar. Nous nous appuyons sur la fonction grob-transformer qui nous donne accès au vecteur original en tant que second argument de la fonction labmda, ici appelé orig (nous n’avons pas besoin du premier argument grob). Nous retournons un nouveau vecteur dont les premier et dernier éléments restent inchangés. Pour l’élément du milieu, nous supprimons key-cancellation de la liste puis le réinsérons avant staff-bar.

#(define (insert-before where what lst)
   (cond
    ((null? lst)           ; If the list is empty,
     (list what))          ; return a single-element list.
    ((eq? where (car lst)) ; If we find symbol `where`,
     (cons what lst))      ; insert `what` before curr. position.
    (else                  ; Otherwise keep building the list by
     (cons (car lst)       ; adding the current element and
                           ; recursing with the next element.
           (insert-before where what (cdr lst))))))

cancellationFirst =
\override Score.BreakAlignment.break-align-orders =
#(grob-transformer
  'break-align-orders
  (lambda (grob orig)
    (let* ((middle (vector-ref orig 1))
           (middle (delq 'key-cancellation middle))
           (middle (insert-before
                    'staff-bar 'key-cancellation middle)))
      (vector
       ;; end of line
       (vector-ref orig 0)
       ;; middle of line
       middle
       ;; beginning of line
       (vector-ref orig 2)))))

music = { \key es \major d'1 \bar "||"
          \key a \major d'1 }

{ <>^\markup "default"
  \music }

{ <>^\markup "cancellation first"
  \cancellationFirst
  \music }

\paper { tagline = ##f }

[image of music]


LilyPond snippets v2.25.15 (branche de développement).