Subject: \label et barnnumber

From: Jean-Charles Malahieude <[email-masked]>
Date: Sun, 05 Jun 2011 20:08:30 +0200

Bonsoir,

Ayant vu que tu t'étais intéressé de près aux foot/end notes, je 
m'adresse directement à toi.

La commande \label #'ici permet de référencer un numéro de page.
Comment faire pour, par la même occasion, référencer le numéro de mesure 
pour ensuite faire

\markup { Correction A (page \page-ref #'correctA "0" "?"
          mesure \bar-ref #'correctA "0" "?")}

J'ai bien tenté de faire un cocktail détonnant à partir de la fonction 
telle qu'elle apparaît dans ly/music-functions-init.ly et le message
http://lists.gnu.org/archive/html/lilypond-user/2011-02/msg00219.html

mais je ne suis pas assez compétent, ni peut être assez tordu...

Cordialement,
Jean-Charles

---

From: Nicolas Sceaux <[email-masked]>
Date: Sun, 5 Jun 2011 21:36:45 +0200

Le 5 juin 2011 à 20:08, Jean-Charles Malahieude a écrit :

> Comment faire pour, par la même occasion, référencer le numéro de mesure pour ensuite faire
> 
> J'ai bien tenté de faire un cocktail détonnant à partir de la fonction telle qu'elle apparaît dans ly/music-functions-init.ly et le message

Voici une solution possible :

#(define global-bar-label-table '())

barLabel =
#(define-music-function (parser location label) (symbol?)
   (make-music
    'SequentialMusic
    'elements (list (make-music
                     'EventChord
                     'page-marker #t
                     'page-label label
                     'elements (list (make-music 'LabelEvent
                                                 'page-label label)))
                    (make-music
                     'ApplyContext
                     'origin location
                     'procedure (lambda (c)
                                  (let ((cbn (ly:context-property c 'currentBarNumber)))
                                    (set! global-bar-label-table
                                          (acons label
                                                 (if (not (number? cbn)) 0 cbn)
                                                 global-bar-label-table))))))))

#(define-markup-command (generic-label-reference layout props label table-proc next)
     (symbol? procedure? markup?)
   #:properties ((gauge-markup "000"))
  (let* ((gauge-stencil (interpret-markup layout props gauge-markup))
         (x-ext (ly:stencil-extent gauge-stencil X))
         (y-ext (ly:stencil-extent gauge-stencil Y)))
    (ly:make-stencil
     `(delay-stencil-evaluation
       ,(delay (ly:stencil-expr
                (let* ((table (table-proc))
                       (label-ref (and (list? table) (assoc label table)))
                       (ref-number (and label-ref (cdr label-ref)))
                       (ref-markup (markup #:concat ((format "~a" (or ref-number "?"))
                                                     next)))
                       (ref-stencil (interpret-markup layout props ref-markup))
                       (gap (- (interval-length x-ext)
                               (interval-length (ly:stencil-extent ref-stencil X)))))
                  (interpret-markup layout props
                                    (markup #:concat (ref-markup #:hspace gap)))))))
     x-ext
     y-ext)))

#(define-markup-command (full-page-bar-ref layout props label) (symbol?)
   (interpret-markup layout props
                     (markup "(page"
                             #:generic-label-reference
                             label
                             (lambda ()
                               (ly:output-def-lookup layout 'label-page-table))
                             #:line (" mesure " #:generic-label-reference
                                                label
                                                (lambda ()
                                                  global-bar-label-table) ")"))))

{ \barLabel #'c c'1
  \barLabel #'d d'\pageBreak
  \barLabel #'e e'
  \barLabel #'f f' }

\markup { c \full-page-bar-ref #'c }
\markup { d \full-page-bar-ref #'d }
\markup { e \full-page-bar-ref #'e }
\markup { f \full-page-bar-ref #'f }

---

From: Bertrand Bordage <[email-masked]>
Date: Sun, 5 Jun 2011 13:07:21 -0700

Bonsoir !

J'avais à l'époque fait deux commandes tout à fait similaires à ce qu'a
posté Nicolas Sceaux.
Maintenant je ferais ça plus profondément en changeant le label-event de
sorte que \bar-ref soit facile à ajouter. De même, on pourra créer aisément
d'autres commandes du genre \beat-ref.
Ainsi on évite de devoir mettre des \barLabel en plus des \label.
Ce n'est pas ma priorité tout de suite, mais je vais m'y atteler d'ici peu.
Je vous tiendrai au courant.

Bertrand