LSR/977/code

< LSR‎ | 977
Zur Navigation springen Zur Suche springen
%by: ArnoldTheresius
% update for cooperation with poly-mark-engraver or multi-mark-engraver

% see LSR No. 976 for the poly-mark-engraver
% \include "poly-mark-engraver.ly"
% The compatibility test with the poly-mark-engraver below
% is commented out, too!

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% START of my personal include file 'double-mark.ly'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define-public (string-or-markup-or-boolean? e)
  (or (string? e) (markup? e) (boolean? e)))

#(define (music-property-description symbol type? description)
  (if (not (equal? #f (object-property symbol 'music-doc)))
      (ly:error (_ "symbol ~S redefined") symbol))
  (set-object-property! symbol 'music-type? type?)
  (set-object-property! symbol 'music-doc description)
  symbol)

#(for-each
  (lambda (x)
    (apply music-property-description x))
    `((left-label
       ,string-or-markup-or-boolean?
       "set the left part of a RehearsalMark")
      (right-label
       ,string-or-markup-or-boolean?
       "set the right part of a RehearsalMark")
       ))

#(define (double-rehearsalmark-stencil grob)
  (let*
   ((grobs-event (ly:grob-property grob 'cause '()))
    (left-label (ly:event-property grobs-event 'left-label))
    (right-label (ly:event-property grobs-event 'right-label))
    (gap (ly:grob-property grob 'gap 1.4)))
   (if (not (or (null? left-label) (null? right-label)))
    (case (ly:item-break-dir grob)
     ((-1)
      (if (boolean? left-label) empty-stencil
       (grob-interpret-markup grob
        (make-right-align-markup left-label))))
     ((1)
      (if (boolean? right-label) empty-stencil
       (grob-interpret-markup grob
        (make-left-align-markup right-label))))
     (else
      (if (boolean? left-label)
       (grob-interpret-markup grob
        (if left-label
         (make-center-align-markup right-label)
         (make-left-align-markup right-label)))
       (if (boolean? right-label)
        (grob-interpret-markup grob
         (if right-label
          (make-center-align-markup left-label)
          (make-right-align-markup left-label)))
        (ly:stencil-add
         (ly:stencil-translate
          (grob-interpret-markup grob
           (make-right-align-markup left-label))
          (cons (* -0.5 gap) 0.0))
         (ly:stencil-translate
          (grob-interpret-markup grob
           (make-left-align-markup right-label))
          (cons (* 0.5 gap) 0.0)))))))
    (begin
     (ly:warning "\"doubleMark stencil\" did not find \"doubleMark texts\".")
     (ly:warning "fallback to using \"ly:text-interface::print\".")
     (ly:text-interface::print grob)))))

doubleMark =
#(define-music-function
  (parser location left-string right-string)
  (string-or-markup-or-boolean? string-or-markup-or-boolean?)
  (if (and (boolean? left-string) (boolean? right-string))
   (ly:warning "~a \\doubleMark - at least one string or markup required" location))
  (make-music 'SequentialMusic
   'elements (list
    (make-music 'ContextSpeccedMusic
     'context-type 'Score
     'element
      (make-music 'OverrideProperty
       'symbol 'RehearsalMark
       'grob-value double-rehearsalmark-stencil
       'grob-property-path (list 'stencil)
       'pop-first #t
       'once #t))
    (make-music 'ContextSpeccedMusic
     'context-type 'Score
     'element
      (make-music 'OverrideProperty
       'symbol 'RehearsalMark
       'grob-value #f
       'grob-property-path (list 'self-alignment-X)
       'pop-first #t
       'once #t))
    (make-music 'ContextSpeccedMusic
     'context-type 'Score
     'element
      (make-music 'OverrideProperty
       'symbol 'RehearsalMark
       'grob-value `#(,(not (boolean? left-string))
                      #t
                      ,(not (boolean? right-string)))
       'grob-property-path (list 'break-visibility)
       'pop-first #t
       'once #t))
    (make-music 'MarkEvent
     'label #f
     'left-label (if (string? left-string)
                  (make-simple-markup left-string)
                  left-string)
     'right-label (if (string? right-string)
                   (make-simple-markup right-string)
                   right-string)
     'origin location))))

% only for use with the poly-mark-engraver, based on a
% copy of 'mark' from music-functions.ly, then extended:
doublePolyMark =
#(define-music-function
   (parser location key left-string right-string)
   (((lambda (x) (or (symbol? x)
                  (and (pair? x) (symbol? (car x))))) #f)
    (string-or-markup-or-boolean? #f) (string-or-markup-or-boolean? #f))
  "Make the music for the \\doublePolyMark command."
  (let* ((set (and (integer? label)
                   (context-spec-music (make-property-set 'rehearsalMark label)
                                       'Score)))
         (ev (make-music 'MarkEvent
                         'left-label (if (string? left-string)
                                      (make-simple-markup left-string)
                                      left-string)
                         'right-label (if (string? right-string)
                                       (make-simple-markup right-string)
                                       right-string)
                         'origin location))
         (entry-key (if (symbol? key) key
                     (if (and (list? key) (symbol? (car key))) (car key)
                      #f)))
         (add-opts (if (pair? key) (cdr key) '())))

    (if (symbol? entry-key)
      (ly:music-set-property! ev 'key entry-key))
    (ly:music-set-property! ev 'additional-options
      (acons 'stencil double-rehearsalmark-stencil
        (acons 'self-alignment-X #f
          (acons 'break-visibility `#(,(not (boolean? left-string))
                                      #t
                                      ,(not (boolean? right-string)))
            add-opts))))

    (if set
        (make-sequential-music (list set ev))
        (begin
          (set! (ly:music-property ev 'label) #f)
          ev))))


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% END of my personal include file 'double-mark.ly'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

{
  c''1
  % make the coda sign begin-of-line-invisible
  % center it, except at the end of line, there let it be right adjusted
  \doubleMark
    \markup { \musicglyph #"scripts.coda" }
    ##t
  c''
  % line breaking RehearsalMark
  % will be joined with a space of the size 'gap' of no line break occurs
  \doubleMark
    \markup { \with-color #blue { "D.C. al  " \raise #1.0 \musicglyph #"scripts.coda" "e poi" } }
    \markup { \with-color #blue "CODA" }
  \break
  c''
  % make the "Fine" begin-of-line-invisible and right adjusted
  \doubleMark
    "Fine"
    ##f
  c''
  \doubleMark
    "CODA da capo al Fine"
    ##f
  \bar "|."
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% using \doublePolyMark,
% only possible if the poly-mark-engraver is loaded
% therefore it's commented out here!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%{
  c''1
  % make the coda sign begin-of-line-invisible
  % center it, except at the end of line, there let it be right adjusted
  \polyMark #'CenterDown \markup \box \fontsize #-3 \column { "another" "polyMark" }
  \doubleMark
    \markup { \musicglyph #"scripts.coda" }
    ##t
  c''
  % line breaking RehearsalMark
  % will be joined with a space of the size 'gap' of no line break occurs
  \mark \markup \box \fontsize #-3 \column { "another" "mark" }
  \doublePolyMark #'anySymbol
    \markup { \with-color #blue { "D.C. al  " \raise #1.0 \musicglyph #"scripts.coda" "e poi" } }
    \markup { \with-color #blue "CODA" }
  \break
  c''
  % make the "Fine" begin-of-line-invisible and right adjusted
  \mark \markup \box \fontsize #-3 \column { "another" "mark" }
  \doublePolyMark #'CenterDown
    "Fine"
    ##f
  c''
  \doublePolyMark #'CenterDown
    "CODA da capo al Fine"
    ##f
  \bar "