Separar las cancelaciones de tonalidad de los cambios de armadura

De forma predeterminada, las alteraciones accidentales que se usan para las cancelaciones en las armaduras se colocan adyacentes a las que se usan para los cambios de tonalidad. Este comportamiento se puede cambiar sobreescribiendo la propiedad break-align-orders del objeto gráfico BreakAlignment.

El valor de break-align-orders es un vector de longitud 3, con listas entrecomilladas cuyos elementos con objetos que se pueden dividir en un salto. Cada lista describe el orden predeterminado de material preliminar al final, en medio y al comienzo de una línea, respectivamente. Solo nos interesa cambiar el comportamiento en el medio de la línea.

Si busca la definición de break-align-orders en la Referencia de funcionamiento interno de LilyPond (véase el objeto gráfico BreakAlignment), verá el orden siguiente en el segundo elemento:

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

Queremos modificar eso, trasladando key-cancellation a antes de staff-bar. Para que esto ocurra, usamos la función grob-transformer, que nos da acceso al vector oricinal como segundo argumento de la función lambda, llamada aquí orig (no necesitamos el primer argumento, grob). Devolvemos un nuevo vector, sin ningún cambio en los elementos primero y último. Para el elemento central, en primer lugar eliminamos key-cancellation de la lista, y después lo añadimos de nuevo antes de 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.30 (development-branch).