Imprimir l’arbre genealògic d’un grob

En treballar amb les crides d’un grob, pot ser de molta utilitat entendre l’arbre genealògic d’un grob. La major part dels grobs tenen pares que influeixen en el posicionament del grob. Els pares X i Y influeixen en les posisions horitzontal i vertical del grob, respectivament. A més, cada pare pot tenir al seu cop pares.

Desafortunadament, hi ha diversos aspectes de la geneaologia d’un grob que pot portar a confusió:

* Els tipus de pare que té un grob poden dependre del context.

* Per a certs grobs, els pares X i Y són el mateix.

* Un "ancestre" concret pot estar relacionat amb un grob de més d’una manera.

* El concepte de "generacions" és enganyós.

Por exemple, el grob System pot ser tant un pare (sobre la vorfa Y) com un avi (dues vegades a la vora X) d’un grob VerticalAlignment.

Aquest macro imprimeix, en la consola, una representació textual de la genealogia d’un grob.

Quan es crida d’aquesta forma:

{ \once \override NoteHead.before-line-breaking = #display-ancestry c }

Es general la sortida següent:

NoteHead X,Y: NoteColumn X: PaperColumn X,Y: System Y: VerticalAxisGroup X: NonMusicalPaperColumn X,Y: System Y: VerticalAlignment X: NonMusicalPaperColumn X,Y: System Y: System

%% http://lsr.di.unimi.it/LSR/Item?id=622

#(define (get-ancestry grob)
  (if (not (null? (ly:grob-parent grob X)))
      (list (grob::name grob)
            (get-ancestry (ly:grob-parent grob X))
            (get-ancestry (ly:grob-parent grob Y)))
      (grob::name grob)))

#(define (format-ancestry lst padding)
   (string-append
    (symbol->string (car lst))
    "\n"
    (let ((X-ancestry
           (if (list? (cadr lst))
               (format-ancestry (cadr lst) (+ padding 3))
               (symbol->string (cadr lst))))
          (Y-ancestry
           (if (list? (caddr lst))
               (format-ancestry (caddr lst) (+ padding 3))
               (symbol->string (caddr lst)))))
      (if (equal? X-ancestry Y-ancestry)
          (string-append
           (format #f "~&")
           (make-string padding #\space)
           "X,Y: "
           (if (list? (cadr lst))
               (format-ancestry (cadr lst) (+ padding 5))
               (symbol->string (cadr lst))))
          (string-append
           (format #f "~&")
           (make-string padding #\space)
           "X: " X-ancestry
           "\n"
           (make-string padding #\space)
           "Y: " Y-ancestry
           (format #f "~&"))))
    (format #f "~&")))

#(define (display-ancestry grob)
   (format (current-error-port)
      "~3&~a~2%~a~&"
      (make-string 36 #\-)
      (if (ly:grob? grob)
          (format-ancestry (get-ancestry grob) 0)
          (format #f "~a is not a grob" grob))))

\relative c' {
  \once \override NoteHead.before-line-breaking = #display-ancestry
  f4
  \once \override Accidental.before-line-breaking = #display-ancestry
  \once \override Arpeggio.before-line-breaking = #display-ancestry
  <f as c>4\arpeggio
}

[image of music]


Fragments del LilyPond v2.25.22 (development-branch).