LSR/977

< LSR
Zur Navigation springen Zur Suche springen
PD Der Inhalt dieser Seite wurde aus dem LilyPond Snippet Repository übernommen und steht unter folgender Lizenz: CC0.
See Public Domain Help Pages for more info.
PD
Line breaking rehearsal mark

LSR Snippet Nr. 977

Beschreibung

If you need at a line break at the same time step two rehearsal marks, one rehearsal mark at the end of the line with right aligned text, and another rehearsal mark at the beginning of the next line with left aligned text, but if there is no line break these two marks should be concatenated with a space between, try this \doubleMark command. It takes two arguments (string or markup).

Additionally one of the two arguments may be the boolean ##f to indicate a begin-of-line-invisible and right alinged resp. a end-of-line-invisible and left aligned rehearsal mark, and if one of the two arguments is the boolean value ##t then the remaining text will be centered if it occurs within the line. Override the value of gap in Score.RehearsalMark if you need a different spacing between the two text markups. Handicaps: An argument \default is not supported. Also providing some functions to separately address RehearsalMarks depending on their break-direction, to tweak direction and padding. And for compatibility when using the poly-mark-engraver (LSR No. 976) a \doublePolyMark command is provided (which otherwise will not work).

auto

Lilypond-Code

%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 "

Unterseiten