Autor Thema: Taktzahlen in Markups verwenden  (Gelesen 2311 mal)

infranator

  • Gast
Taktzahlen in Markups verwenden
« am: Freitag, 28. Februar 2014, 18:58 »
Hallo Leute,

ich würde gerne die aktuellen Taktzahlen in Markups nutzen können. Ich benutze z.B. folgendes sehr praktische Snippet um jeweils ein Rehearsal Mark am Ende einer Zeile und am Anfang der nächsten Zeile zu setzen:
http://lsr.di.unimi.it/LSR/Item?u=1&id=892

Die Funktion akzeptiert aber nur zwei Markups als Argument, also funktioniert \mark \default nicht.
Im aktuellem Handbuch habe ich den ApplyContext Befehl gefunden. In dem Beispiel wird die Taktzahl in die Terminal-Ausgabe geschrieben.
Weiter bin ich bis jetzt aber noch nicht gekommen.
http://www.lilypond.org/doc/v2.19/Documentation/extending/context-evaluation

Viele Grüße,
infranator

harm6

  • Gast
Re: Taktzahlen in Markups verwenden
« Antwort #1 am: Sonntag, 2. März 2014, 00:43 »
Hallo infranator,

mir ist noch nicht klar was Du erreichen möchtest.
Kannst Du ein Bild posten?

Gruß,
  Harm

infranator

  • Gast
Re: Taktzahlen in Markups verwenden
« Antwort #2 am: Sonntag, 2. März 2014, 17:38 »
Ich möchte ein Ergebnis wie im Screenshot, aber die Taktzahl im Reheasal Mark nicht manuell eingeben müssen.
\version "2.18.0"

{
  \clef bass
  c4 c c c
  c c c c
  \once \override Score.RehearsalMark.self-alignment-X = #LEFT
  \mark \markup {
    \bold \box 3 % will das hier nicht manuell eingeben müssen
    "irgendein Text"
  }
  c c c c
  c c c c
}



Hier gibt's ein Thread mit dem gleichen Thema:
http://lilypond.1069038.n5.nabble.com/Combine-default-rehearsal-mark-with-another-mark-td6742.html

harm6

  • Gast
Re: Taktzahlen in Markups verwenden
« Antwort #3 am: Montag, 3. März 2014, 15:23 »
Hallo infranator,

schau mal, ob Du mit dem folgenden klar kommst. Kommentare im Code:

\version "2.18.0"

#(define*
 ((format-mark-barnumbers-plus-text reverse? #:optional (text #f)) mark context)
 ;; Formats @code{RehearsalMark}
 ;; Printing the @code{BarNumber} bold in a box, the optional @var{text} is
 ;; printed left or right of the @code{BarNumber}, depending on @var{reverse?}
   (let* ((bar-number-markup
            (make-box-markup
              (make-bold-markup
                (number->string
                  (ly:context-property context 'currentBarNumber)))))
          (text-markup (if text text ""))
          (mrkp-ls (list bar-number-markup text-markup)))
   (make-line-markup (if reverse? (reverse mrkp-ls) mrkp-ls))))
   
barnumberRehearsalMarkPlusText =
#(define-music-function (parser location reverse? mrkp)((boolean? #f) markup?)
"
 Sets the @code{markFormatter} to
 @proc{(format-mark-barnumbers-plus-text reverse? mrkp)} and centers the
 @code{BarNumber}-part of the @code{RehearsalMark} on the @code{BarLine}.
 @var{reverse?} determines if @var{mrkp} is printed to the left or to the right.
 Uugh, for unknown reasons @code{reverse?} must be explicitely stated, if
 @var{mrkp} is not a simple string, but a markup, although it is made optional.
"

  (define (center-rehearsal-mark-at-barnumber reverse? mrkp)
  ;; Sets @code{'self-alignment-X}
  ;; The @code{RehearsalMark} is printed with the @code{BarNumber} centered on
  ;; the @code{BarLine}.
  ;; @code{reverse?} determines if the @code{BarNumber} is supposed to be on
  ;; the left or right side in the @code{RehearsalMark}
    (lambda (grob)
      (let* ((txt-stil (grob-interpret-markup grob mrkp))
             (txt-length (interval-length (ly:stencil-extent txt-stil X)))
             (stil (ly:grob-property grob 'stencil))
             (stil-length (interval-length (ly:stencil-extent stil X)))
             (layout (ly:grob-layout grob))
             (props
               (ly:grob-alist-chain
                  grob
                  (ly:output-def-lookup layout 'text-font-defaults)))
             (word-space
               (if (= 0 txt-length)
                   0
                   (ly:chain-assoc-get 'word-space props)))
             (break-dir (ly:item-break-dir grob)))
      (ly:grob-set-property! grob 'self-alignment-X
        (if (or reverse? (= break-dir -1))     
            (/ (+ txt-length word-space) stil-length)
            (/ (+ txt-length word-space) (- stil-length)))))))
     
  #{
    \once \set Score.markFormatter =
      #(format-mark-barnumbers-plus-text reverse? mrkp)
    \once \override Score.RehearsalMark.before-line-breaking =
      #(center-rehearsal-mark-at-barnumber reverse? mrkp)
  #})
 
%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%
 
%% Print bold, boxed BarNumbers as RehearsalMark as default
\layout {
  \set Score.markFormatter = #format-mark-box-barnumbers
  indent = 0
}
 
\relative c' {
  c1
  \barnumberRehearsalMarkPlusText "Text"
  \mark\default
 
  d
  \mark\default
 
  e
  \barnumberRehearsalMarkPlusText "mehr Text"
  \mark\default
 
  f
 
  fis
 
  %% If a line-break and the ReheasalMark at end-of-line is wanted, ##t should
  %% be used.
  %% Always needed to specify, if the additional text uses \markup
  g
  \break
  \once \override Score.RehearsalMark.break-visibility = ##(#t #f #f)
  \barnumberRehearsalMarkPlusText ##t
    \markup \with-color #red "\"Zeilenumbruch\"" 
  \mark\default
 
  a
  \barnumberRehearsalMarkPlusText ##t
    \markup
    \fontsize #-3
    \override #'(baseline-skip . 2)
    \dir-column {
        "links der BarNumber"
        "in einer column"
        \fontsize #-4 \scale #'(2 . 1) \italic "irgendein Text"
    }
  \mark\default
 
  b
  \barnumberRehearsalMarkPlusText ##f
    \markup
    \fontsize #-3
    \override #'(baseline-skip . 2)
    \dir-column {
        "rechts der BarNumber"
        "in einer column"
        \fontsize #-4 \scale #'(2 . 1) \italic "irgendein Text"
    }
  \mark\default
 
  c
  \bar "|."
}

HTH,
  Harm

infranator

  • Gast
Re: Taktzahlen in Markups verwenden
« Antwort #4 am: Donnerstag, 6. März 2014, 15:47 »
Super, damit komme ich klar. Vielen Dank für die Mühe!
Aber rein Interessehalber: Warum ist es nicht möglich die Konstruktion
#(number->string
                  (ly:context-property context 'currentBarNumber))
direkt im markup zu verwenden?
vg,
infranator

Arnold

  • Gast
Re: Taktzahlen in Markups verwenden
« Antwort #5 am: Freitag, 7. März 2014, 12:46 »
Hallo,

um deine Hintergrund-Frage zu beantworten:
Zitat
Aber rein Interessehalber: Warum ist es nicht möglich die Konstruktion
#(number->string (ly:context-property context 'currentBarNumber))
direkt im markup zu verwenden?
Es kommt auf den Zeitpunkt der Ausführung an.

Wird en Markup "vorher" definiert, kann es die Taktzahl, an welcher es platziert wird, noch nicht wissen.
Also muß ein "Callback" ran, eine Scheme-Funktion welche erst zu einem späteren Zeitpunkt den dann definierten Wert aus dem Context ausliest.
Der markFormatter ist solch ein vordefinierter Einhägepunkt für solch eine Funktion.

Und applyContext ist mit den Engravern eng verknüpft: Der erste aller Engraver (je Context) führt die mit applyContext übergebene Scheme-Prozedur aus. Sollte diese Prozedur gleich das Markup erstellen, dann müßte sie also nicht nur den Markup-Text formatiern, sondern auch noch das GROB des Markup-Textes erstellen und in das GROB-Netzwerk korrekt einhängen.

Arnold