Autor Thema: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?  (Gelesen 3420 mal)

Castor

  • Member
ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« am: Sonntag, 16. Februar 2014, 21:50 »
Hallöle,

folgender Beispielcode:

\version "2.18.0"

\relative c' { 
  c4 d e f g a b c b a g f e d c b
  \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
  \once \override Score.RehearsalMark #'direction = #DOWN
  \once \override Score.RehearsalMark #'font-size = #-1
  \mark \markup { \italic { D.C. al Coda } } | \bar "||" \break 
  \key d \major
  d' e fis g a b cis d cis b a g fis e d cis \bar "|." 
}

Aaaalso, das D.C. al Coda landet leider (und komischerweise) nicht oben am ||-Taktstrich, sondern unten am Anfang der nächsten Zeile (s. Bild 1).

Zweitens: Am Anfang der nächsten Zeile soll noch das Coda zeichen hinkommen, aber wenn ich an der entsprechenden Stelle\mark \markup { \musicglyph #"scripts.coda" } einfüge, mault Lily rum von wegen 2 Marks am selben Taktstrich oder so.

Ich nehme an, die Lösung ist nicht allzu schwer, nur mir fehlen als Lilypond-eher-noch-Anfänger noch die Kenntnisse & Erfahrung, das selber hinzubiegen.
Zur Verdeutlichung noch ein 2. Bild, wie es sein soll, falls es jmd noch nicht begriffen hat, aber ihr seid ja alle schlau ;)

danke und lg Castor
« Letzte Änderung: Sonntag, 16. Februar 2014, 21:52 von Castor »

harm6

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #1 am: Sonntag, 16. Februar 2014, 22:11 »
Hallo,

dieses Problem taucht häufiger auf.
Schau mal in
https://liarchiv.joonet.de/index.php?topic=942.msg5239#msg5239
mit einem Engraver von Neil Puttock.

Sowie in
http://lsr.dsi.unimi.it/LSR/Item?u=1&id=892
Code von Arnold.
(Derzeit ist sein snippet noch nicht abgenickt.  Eigentlich sollte ich das machen. Hab aber sehr wenig Zeit ...
Außerdem ist gerade das LSR-upgrade auf 2.18. im Gange)

HTH,
  Harm

Castor

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #2 am: Sonntag, 16. Februar 2014, 23:34 »
Ach gottchen, ich kopiere also einfach diesen mega text dahin et voilà .. ok vielen Dank erstmal für Antwort und Links, ich schau mirs morgen mal an :)

lg Castor

Castor

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #3 am: Montag, 17. Februar 2014, 10:37 »
So, ich habs jetz, also einfach nur den Kram aus deinem zweiten Link kopiert, mit dem Engraver von Neil Puttock hab ichs irgendwie nicht hinbekommen ..

\version "2.18.0"

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

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

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))))

\relative c' { 
  c4 d e f g a b c b a g f e d c b \bar "||"
  \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
  \doubleMark
  \markup \fontsize #-3 \italic { D.C. al Coda }
  \markup { \musicglyph #"scripts.coda" }
  \break 
  \key d \major
  d' e fis g a b cis d cis b a g fis e d cis \bar "|." 
}

Gibt es noch eine Möglichkeit, das "D.C. al Coda" unter die Zeile zu kriegen? Wenn ich einfach \override Score.ReheasalMark.direction = #DOWN nehme, kommt das Coda-Zeichen auch mit runter, auch wenn ich \once hinzufüge. Kann ich das einfach innerhalb des Markups machen (so wie ich auch  \override Score.ReheasalMark.font-size = #-1 durch \fontsize #-3 (entspricht dem in etwa von der Größe) ersetzt habe)?

lg Castor

harm6

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #4 am: Montag, 17. Februar 2014, 11:08 »
Hi,

hab' im Moment keine Zeit da reinzuschauen, heute abend vielleicht.

Gruß,
  Harm

Castor

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #5 am: Montag, 17. Februar 2014, 11:54 »
Kein Problem, vielen Dank für deine Hilfe, es läuft ja nicht weg :)

infranator

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #6 am: Montag, 17. Februar 2014, 13:31 »
Hi Castor,

wie gut ich dieses Problem kenne ;-)
Ich benutze immer das Snippet von Neil Puttock. Für den Fall, dass das erste RehearsalMark  unter dem System stehen soll habe ich jetzt einfach folgendes gemacht:

\version "2.18.0"

% http://old.nabble.com/Nice-workaround-for-simultaneous-rehearsal-marks-%E2%80%93-thanks-Neil!-td32212763.html
% defined by Neil Puttock

#(define (multi-mark-engraver ctx)
   (let ((texts '())
         (final-texts '())
         (events '()))

     `((start-translation-timestep
        . ,(lambda (trans)
             (set! final-texts '())))

       (listeners
        (mark-event
         . ,(lambda (trans ev)
              (set! events (cons ev events)))))

       (acknowledgers
        (break-alignment-interface
         . ,(lambda (trans grob source)
              (for-each (lambda (mark)
                          (set! (ly:grob-parent mark X) grob))
                texts))))

       (process-music
        . ,(lambda (trans)
             (for-each
              (lambda (ev)
                (let* ((mark-grob
                        (ly:engraver-make-grob trans 'RehearsalMark ev))
                       (label (ly:event-property ev 'label))
                       (formatter (ly:context-property ctx 'markFormatter)))

                  (if (and (procedure? formatter)
                           (not (markup? label)))
                      (begin
                       (if (not (number? label))
                           (set! label
                                 (ly:context-property ctx 'rehearsalMark)))

                       (if (and (integer? label)
                                (exact? label))
                           (set! (ly:context-property ctx 'rehearsalMark)
                                 (1+ label)))

                       (if (number? label)
                           (set! label (apply formatter (list label ctx)))
                           (ly:warning "rehearsalMark must have integer value"))))

                  (if (markup? label)
                      (begin
                       (set! (ly:grob-property mark-grob 'text) label)
                       (let ((dir (ly:event-property ev 'direction)))
                         (and (ly:dir? dir)
                              (set! (ly:grob-property mark-grob 'direction)
                                    dir))))
                      (ly:warning "mark label must be a markup object"))

                  (set! texts (cons mark-grob texts))))
              (reverse events))))

       (stop-translation-timestep
        . ,(lambda (trans)
             (if (pair? texts)
                 (let ((staves (ly:context-property ctx 'stavesFound))
                       (priority-index 0))
                   (for-each (lambda (grob)
                               (let ((my-priority (ly:grob-property grob 'outside-staff-priority 1500)))
                                 (for-each (lambda (stave)

                                             (ly:pointer-group-interface::add-grob grob 'side-support-elements
                                               stave))
                                   staves)
                                 (set! (ly:grob-property grob 'outside-staff-priority) (+ my-priority priority-index))
                                 (set! priority-index (1+ priority-index))
                                 (set! final-texts (cons grob final-texts))))
                     (reverse texts))
                   (set! texts '())
                   (set! events '())))))

       (finalize
        . ,(lambda (trans)
             (and (pair? final-texts)
                  (for-each (lambda (grob)
                              (set! (ly:grob-property grob 'break-visibility)
                                    end-of-line-visible))
                    final-texts)))))))

\layout {
  \context {
    \Score
    \remove "Mark_engraver"
    \consists #multi-mark-engraver
    \consists "Tweak_engraver"
  }
}
markDown =
#(define-music-function (parser location text) (markup?)
   (make-music 'MarkEvent
     'direction DOWN
     'label text))

myMark =
#(define-music-function (parser location text) (markup?)
   (make-music 'MarkEvent
     'label text))

fermate = {
  \tweak #'break-visibility #begin-of-line-invisible
  \tweak #'self-alignment-X #right
  \myMark \markup  { \musicglyph #"scripts.ufermata" }
}

%%%%%
untenRechts =
#(define-music-function (parser location text) (markup?)
   (make-music 'MarkEvent
     'direction DOWN
     'tweaks (list
              (cons
               (quote break-visibility) #(#t #t #f))
              (cons
               (quote self-alignment-X) 1))
     'label text))
%%%%%%
%%{
\relative c' { 
  c4 d e f g a b c b a g f e d c b \bar "||"
  \untenRechts
  \markup \fontsize #-3 \italic { D.C. al Coda }
  \break 
  \mark \markup { \musicglyph #"scripts.coda" }
  \key d \major
  d' e fis g a b cis d cis b a g fis e d cis \bar "|." 
}
%}


Castor

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #7 am: Montag, 17. Februar 2014, 14:49 »
Hi infranator,

vielen Dank, das sieht erstmal super aus :) Lässt sich dein \untenRechts-Befehl auch mit der Variante kombinieren, die ich verwendet habe? Die ist nämlich flexibler, was voneinander unabhängiges Verschieben der beiden Marks angeht (bei Neil Puttocks Snippet lässt sich X- und Y-offset nur auf beide Marks gleichzeitig anwenden, zumindest hab ich es nicht anders hinbekommen ^^). Ich hab es nicht hingekriegt und hab auch keine Ahnung von dem ganzen #define und Funktionszeugs ;D

danke & lg,

Castor

p.s.: bin jetz einige tage nicht da, also nicht wundern wenn von meiner seite nix zurückkommt ;)
« Letzte Änderung: Montag, 17. Februar 2014, 20:53 von Castor »

harm6

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #8 am: Dienstag, 18. Februar 2014, 01:05 »
Hi,

Zitat von: Castor
Gibt es noch eine Möglichkeit, das "D.C. al Coda" unter die Zeile zu kriegen?

ich habe mal set-mark-y-dir geschrieben.

\version "2.18.0"

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

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

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))))
 
set-mark-y-dir =
#(define-music-function (parser location ls)(list?)
"
 Sets 'direction of RehearsalMark. Depending on their break-dir.
 
 @var{ls} is supposed to be an alist with entries like
  (<break-dir of the item> . <Y-direction>)
 A full list is not needed. An empty list is possible, too, defaults to all
 items UP.
 
 Example:
 `( (,left . ,DOWN) (,center . ,DOWN) (,right . ,UP) )
 Ofcourse this is the same as:
 '((-1 . -1)(0 . -1)(1 . 1))
 "
#{
  \override Score.RehearsalMark.before-line-breaking =
    #(lambda (grob)
       (let* ((get-break-dir (ly:item-break-dir grob))
              (left-y-dir (or (assoc-get left ls) 1))
              (right-y-dir (or (assoc-get right ls) 1))
              (center-y-dir (or (assoc-get center ls) 1)))
         
         (ly:grob-set-property! grob 'direction
           (case get-break-dir
            ((-1) left-y-dir)
            ((1) right-y-dir)
            ((0) center-y-dir)
            ;; better be paranoiac
            (else 1)))))
#})
     
\relative c' { 
  \set-mark-y-dir #`( (,left . ,DOWN) (,center . ,DOWN) (,right . ,UP) )
  c4 d e f g a b c b a g f e d c b \bar "||"
  \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
  \doubleMark
  \markup \fontsize #-3 \italic { D.C. al Coda }
  \markup { \musicglyph #"scripts.coda" }
  \break 
  \key d \major
  d' e fis g a b cis d\mark "XY" cis b a g fis e d cis \bar "|." 
}

HTH,
  Harm

infranator

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #9 am: Samstag, 22. Februar 2014, 16:34 »
Zitat
ich habe mal set-mark-y-dir geschrieben.

Wahnsinnig cool, vielen Dank!

Castor

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #10 am: Donnerstag, 27. Februar 2014, 19:08 »
Super, harm, vielen Dank! Wenn ich gleich mal weiterfragen darf: Wie kann ich das erste \mark unabhängig vom zweiten verschieben? Mit \override Score.RehearsalMark.Y-offset werden beide verschoben, auch mit nem \once davor. Ist zwar nicht ganz so wichtig, Lily macht das schon ganz gut, wär aber schön, wenn ich in diesem Fall darauf zugreifen könnte. Hier nochmal der betreffende Code:

\version "2.18.0"

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

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

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))))
 
set-mark-y-dir =
#(define-music-function (parser location ls)(list?)
"
 Sets 'direction of RehearsalMark. Depending on their break-dir.
 
 @var{ls} is supposed to be an alist with entries like
  (<break-dir of the item> . <Y-direction>)
 A full list is not needed. An empty list is possible, too, defaults to all
 items UP.
 
 Example:
 `( (,left . ,DOWN) (,center . ,DOWN) (,right . ,UP) )
 Ofcourse this is the same as:
 '((-1 . -1)(0 . -1)(1 . 1))
 "
#{
  \override Score.RehearsalMark.before-line-breaking =
    #(lambda (grob)
       (let* ((get-break-dir (ly:item-break-dir grob))
              (left-y-dir (or (assoc-get left ls) 1))
              (right-y-dir (or (assoc-get right ls) 1))
              (center-y-dir (or (assoc-get center ls) 1)))
         
         (ly:grob-set-property! grob 'direction
           (case get-break-dir
            ((-1) left-y-dir)
            ((1) right-y-dir)
            ((0) center-y-dir)
            ;; better be paranoiac
            (else 1)))))
#})
     
\relative c' { 
  \set-mark-y-dir #`( (,left . ,DOWN) (,center . ,DOWN) (,right . ,UP) )
  c4 d e f g a b c b a g f e d c b \bar "||"
  \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
  \doubleMark
  \markup \fontsize #-3 \italic { D.C. al Coda }
  \markup { \musicglyph #"scripts.coda" }
  \break 
  \key d \major
  d' e fis g a b cis d cis b a g fis e d cis \bar "|." 
}

Im Beispiel siehts ja super aus, aber in dem spezifischen Stück habe ich über dem "D.C. al Coda" direkt einen Balken und hätte einfach gerne das erste \mark (also "D.C. al Coda") noch ein Mü nach unten gerückt.

Danke nochmal an harm und infranator!

lg Castor

harm6

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #11 am: Sonntag, 2. März 2014, 00:37 »
Hallo,

im wesentlichen das gleiche Prinzip:
Man spricht die Objekte vor und nach dem Zeilenumbruch bzw. in der Mitte der Zeile separat an.
Sie sind anhand ihrer item-break-dir unterscheidbar.
Mancher override funktioniert direkt, manchmal muß man via 'before-line-breaking gehen.

\version "2.18.0"

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

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

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))))
 
set-mark-y-dir =
#(define-music-function (parser location ls)(list?)
"
 Sets 'direction of RehearsalMark. Depending on their break-dir.
 
 @var{ls} is supposed to be an alist with entries like
  (<break-dir of the item> . <Y-direction>)
 A full list is not needed. An empty list is possible, too, defaults to all
 items UP.
 
 Example:
 `( (,left . ,DOWN) (,center . ,DOWN) (,right . ,UP) )
 Ofcourse this is the same as:
 '((-1 . -1)(0 . -1)(1 . 1))
 "
#{
  \override Score.RehearsalMark.before-line-breaking =
    #(lambda (grob)
       (let* ((get-break-dir (ly:item-break-dir grob))
              (left-y-dir (or (assoc-get left ls) 1))
              (right-y-dir (or (assoc-get right ls) 1))
              (center-y-dir (or (assoc-get center ls) 1)))
         
         (ly:grob-set-property! grob 'direction
           (case get-break-dir
            ((-1) left-y-dir)
            ((1) right-y-dir)
            ((0) center-y-dir)
            ;; better be paranoiac
            (else 1)))))
#})

set-broken-mark-padding =
#(define-music-function (parser location ls)(list?)
#{
  \override Score.RehearsalMark.padding =
    #(lambda (grob)
       (let* ((get-break-dir (ly:item-break-dir grob))
              (y-off #f)
              (left-y-off (assoc-get left ls))
              (right-y-off (assoc-get right ls))
              (center-y-off (assoc-get center ls))
              )
         
           (case get-break-dir
            ((-1) left-y-off)
            ((1) right-y-off)
            ((0) center-y-off)
            ;; better be paranoiac
            (else 0))
            ))
#})
     
\relative c' { 
  \set-mark-y-dir #`( (,left . ,DOWN) (,center . ,DOWN)  )
  \set-broken-mark-padding #`( (,left . 3) (,right . 1))
 
  c4 d e f g a b c b a g f e d c b \bar "||"
  \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
  \doubleMark
  \markup \fontsize #-3 \italic { D.C. al Coda }
  \markup { \musicglyph #"scripts.coda" }
  \break 
  \key d \major
  d' e fis g a b cis d cis b a g fis e d cis \bar "|." 
}

HTH,
  Harm

Castor

  • Member
Re: ReheasalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #12 am: Sonntag, 2. März 2014, 09:47 »
wow danke :D

fugenkomponist

  • Member
Re: RehearsalMark vor Zeilenumbruch + Codazeichen danach ..?
« Antwort #13 am: Donnerstag, 13. August 2015, 19:22 »
Ich schreibe diesen Beitrag nur, damit er als Ergebnis auftaucht, wenn man nach RehearsalMark sucht (Tippfehler im ursprünglichen Threadtitel). In diesem Thread geht es um die Positionierung von Da-Capo- und Coda-Zeichen.

Edit: Da hab ich nen Denkfehler gemacht. Die Suche nach Wörtern in Titeln schaut nur auf die Titel der ersten Posts von Threads …
« Letzte Änderung: Donnerstag, 13. August 2015, 19:24 von fugenkomponist »