Separar les cancel·lacions de tonalitat dels canvis d’armadura

De forma predeterminada, les alteracions accidentals que s’usen per a les cancel·lacions a les armadures es col·loquen adjacents a les que s’usen per als canvis de tonalitat. Aquest comportament es pot canviar sobreescrivint la propietat 'break-align-orders de l’objecte gràfic BreakAlignment.

El valor de 'break-align-orders és un vector de longitud 3, amb llistes entre cometes els elements de les quals són objectes que es poden dividir en un salt. Aquest exemple sols modifica la segona llista, movent key-cancellation abans de staff-bar; modificant la segona llista, el comportament d’alineació dels salts canvia en la meitat d’un sistema, no al principi ni al final.

#(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]


Fragments del LilyPond v2.25.17 (branca de desenvolupament).