Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Wabbe am Dienstag, 28. September 2021, 08:42

Titel: currentBarNumber kann man setzen, aber wohl nicht ähnlich einfach verwenden?
Beitrag von: Wabbe am Dienstag, 28. September 2021, 08:42
Liebe Leute,
im Notentext würde ich gern auf die currentBarNumber zugreifen, um die Taktnummer bei Bedarf anzuzeigen. Das scheint nicht so simpel zu sein, wie ich mir das als Laie vorgestellt hatte. Gefunden habe ich dazu bisher zwei Stellen, an denen ähnliches mal diskutiert wurde:

Mit Hilfe der zweiten Version habe ich mal ein Beispiel gemacht. Die currentBarNumber lässt sich ja per /set einfach ändern. Anzeigen lässt sich sich da nun auch. Aber eben nicht so simpel, dass man das in einem \markup verwenden könnte?
Ganz naiv hätte ich vermutet, dass als Gegenstück zum \set Befehl in Lilypond auch eine Art \get Befehl eingebaut wäre, die ich eben nur noch nicht gefunden habe.


foo =
\applyOutput Voice.TextScript
#(lambda (grob ctx c)
   (ly:grob-set-property!
    grob
    'text
    (format #f "~a"
      (ly:context-property ctx 'currentBarNumber))))

violin = \relative c'' {
  \foo a^"" c b  g
  \set Score.currentBarNumber = #11
  \foo a^"" c b  g
  \foo a^"" c b  g
}


Oder nochmal ganz direkt gefragt: die folgende Zeile funktioniert ja völlig problemlos:

c^\markup\box 3

Wieso kann ich nicht anstatt einer konstanten Zahl ("3") die Variable Score.currentBarNumber einsetzen? Denn das folgende funktioniert ja nicht:

c^\markup\box Score.currentBarNumber

Vielleicht ist es einfach eine feststehende syntaktische Vorschrift, dass nach \markup nur Konstanten stehen dürfen? Dann hat sich die Sache sozusagen von selbst erledigt, weil es eben nicht anders geht.
Titel: Antw:currentBarNumber kann man setzen, aber wohl nicht ähnlich einfach verwenden?
Beitrag von: C_E am Dienstag, 28. September 2021, 10:21
Hallo Wabbe,

Verstehe ich es richtig, dass du die Taktzahlen einfach nur anzeigen lassen willst, ohne Änderungen?

Ich konnte mit deinem Code nicht viel anfangen, weil ich wenig Ahnung von Scheme habe, habe aber aus dem Handbuch (http://lilypond.org/doc/v2.22/Documentation/notation/bars#bar-numbers (http://lilypond.org/doc/v2.22/Documentation/notation/bars#bar-numbers) mit etwas Modifikationen folgendes Minimalbeispiel erstellt:

\version "2.22.1"

\score {
  <<
    \relative c'' {
      \set Score.currentBarNumber = #11
      \bar ""
      c1 | c |
        \once \override Score.BarNumber.break-visibility = #'#(#t #t #t)
        c | c
      \break
      c1 | c | c | c
    }
  >>
}



Das \once sorgt dafür, dass sich alles danach nur auf die unmittelbar folgende mögliche Anwendung, also in diesem Fall den nächsten Takt-Anfang, bezieht. Wenn du das noch als Variable auslagerst, sowas wie showBarN = \once \override Score.BarNumber.break-visibility = #'#(#t #t #t), dann ist es auch nur sehr wenig Schreibarbeit :)


Liebe Grüße,
Caspar
Titel: Antw:currentBarNumber kann man setzen, aber wohl nicht ähnlich einfach verwenden?
Beitrag von: harm6 am Mittwoch, 29. September 2021, 00:02
Zitat
Oder nochmal ganz direkt gefragt: die folgende Zeile funktioniert ja völlig problemlos:

c^\markup\box 3

Wieso kann ich nicht anstatt einer konstanten Zahl ("3") die Variable Score.currentBarNumber einsetzen?

currentBarNumber ist ein context-property, grobs haben keinen Zugriff auf den context in dem sie sich befinden und seine properties.
Insoweit funktioniert
c^\markup\box Score.currentBarNumber
nicht.

Man kann versuchen mittels Verfahren, die Zugriff auf beides, also das grob und den context, haben, das entsprechende context-property auszulesen und dem grob in geeigneter Form mitzugeben.
Es gibt allerdings nur wenige solche Verfahren.
Eines davon hast Du ja auch verwendet: applyOutput
Dein Coding dort geht prinzipiell völlig in Ordnung.
Das umfassendste Verfahren ist der engraver.
Damit kannst Du grundsätzlich jedem TextScript die currentBarNumber mitgeben:


\version "2.22.1"

#(define Text_script-get-bar-number_engraver
  (lambda (ctx)
    (make-engraver
      (acknowledgers
        ((text-script-interface this-engraver grob source-engraver)
          (if (equal? (grob::name grob) 'TextScript)
              (ly:grob-set-nested-property! grob '(details current-barnumber)
                (ly:context-property ctx 'currentBarNumber))))))))
           
\layout {
  \context {
  \Voice
  \consists #Text_script-get-bar-number_engraver
  }
}

#(define-markup-command (bar-num layout props)()
  (interpret-markup layout props
    (format #f "~a"
            (assoc-get 'current-barnumber (chain-assoc-get 'details props)))))
 
{
  b1
  b^\markup \bar-num
  b1
  b^\markup \bar-num
  \break
  b1
  b^\markup \bar-num
}

Ich habe es als TextScript.details.current-barnumber kodiert und im markup-command bar-num lese ich es dann aus den props.

Allerdings empfinde ich das ganze als "mit Kanonen auf Spatzen schiessen".
Ist Caspars Vorschlag nicht hinreichend?

Gruß,
  Harm
Titel: Antw:currentBarNumber kann man setzen, aber wohl nicht ähnlich einfach verwenden?
Beitrag von: Wabbe am Mittwoch, 29. September 2021, 07:16
Hallo Harm und Caspar,
ganz vielen Dank für Eure erschöpfenden Antworten. Auch ich bin nicht dafür, mit Kanonen auf Spatzen zu schießen und halte mich am liebsten an den Spruch, es so einfach wie möglich zu machen (aber nicht noch einfacher :-)
Nochmal danke für Eure Zeit und beste Grüße  --  Wabbe