Klammern um Taktzahlen

Begonnen von C_E, Montag, 15. Juni 2020, 23:52

« vorheriges - nächstes »

C_E

Ich würde gerne eine Taktzahl umklammern.

Ich habe eine Kadenz eines Soloinstruments, die über mehrere Zeilen geht. Vor allem in der Orchesterpartitur (die die Kadenz anzeigen soll), wäre es unpraktisch, wenn durch die Kadenz an einem Zeilenanfang keine Taktzahl steht.
Bei anderen Sachen habe ich es schon gesehen, dass Objekte, die vor Zeilenanfang gestartet sind, am Zeilenanfang nochmal in Erinnerung gerufen wurden, zB eine cresc-Linie:
          cresc. _ _ _ _ _
(cresc) _ _ .

Und ich würde mich freuen, wenn das mit Taktzahlen auch so einfach ginge

Ich finde es schwierig, das in Worte zu fassen, wie man vielleicht merkt. Aber für Code-Beispiele fehlt noch viel mehr. Trotzdem auf einer Basis von rgree ein sehr sinnloses Code-Beispiel

\version "2.20.0"
MyCadenza = \relative {
  c'4 d16 e f \bar "" \break g g4 f2 g4 \bar "" \break g32[ g  g g] %
}

\new GrandStaff <<
  \new Staff {
    \override Score.BarNumber \bracket{Standardverhalten}
    \cadenzaOn
    \MyCadenza
    \cadenzaOff
    c'1
  }
  \new Staff {
    \override Score.BarNumber \bracket{Standardverhalten}
    #(skip-of-length MyCadenza)
    c'1
  }
>>

C_E

#1
Eigentlich würde schon ein Markup reichen. Da die Taktzahl immer gleich bleibt in einer Kadenz, könnte man einfach in der Kadenz die Ausgabe der Zahl mit dem Markup {(Zahl) } ersetzen.
Aber wie mache ich das?

Hier wieder ein Beispiel, das wahrscheinlich ähnlich sinnlos ist wie das obere :)

\version "2.20.0"


MyCadenza = \relative {
  c'4 d16 e f \bar "" \break g g4 f2 g4 \bar "" \break g32[ g  g g] %
}

Klammertakt = \markup { \tiny (1) }

\new GrandStaff <<
  \new Staff {
    \override Score.BarNumber \Klammertakt
    \CadenzaOn
    \MyCadenza
    \CadenzaOff
    \bar "|"
    c1 \bar "|."
  }
  \new Staff {
    \override Score.BarNumber  \Klammertakt
    #(skip-of-length MyCadenza)
    \bar "|"
    c'1 \bar "|."
  }
>>



Mir fehlt enormes Wissen, und ich habe nicht den Eindruck, dass ich das durch die Dokumentation erlangen kann. Gibt es irgendwelche Tipps? Kann ich mir zum Beispiel anschauen, wie und wo \markup definiert ist, und kann ich daraus lernen?

Ich habe noch nicht aufgegeben, liebe Grüße
Caspar


Update:

Okay, der Bar_number_engraver ist vermutlich wichtig für mich.
ich dachte, ich hätte das richtige gefunden mit
\override Score.alternativeNumberingStyle = "(1)" %aber das war wohl zu einfach

Wo ich gerade dabei bin, was ist der Unterschied zwischen set und override? wenn ich override verwende, wird die Partitur erfolgreich abgeschlossen (Error: Kein Name für grob), wenn ich set nehme klappt gar nichts

rgree

Hallo Caspar,

vielleicht hilft Dir das Beispiel, wie man einen TextSpanner,
der die Wiederholung am Zeilenanfang von Haus aus hat,
zur Lösung Deines Problems nutzen kann:

\version "2.20.0"

{
         \omit Score.BarNumber
         \override TextSpanner.bound-details.left.text = "(1)"
         \override TextSpanner.style = #'none
         c'4 \startTextSpan
         \repeat unfold 10 { \break c'4 }
         c'4 \stopTextSpan
         
}


Gruß,
Reinhard

harm6

ZitatMir fehlt enormes Wissen,
So ging es uns allen...

Zitatund ich habe nicht den Eindruck, dass ich das durch die Dokumentation erlangen kann.
Kommt darauf an in welche Tiefen Du eintauchen möchtest. Für vieles reicht die Doku jedoch aus.
Z.B.
NR 5.5.3 Modifying stencils
erklärt eine simple Methode einen anderen stencil zu erhalten.
Diese Methode funktioniert meistens, es sei denn es gibt noch andere Faktoren die den stencil beinflussen. Das ist bei der BarNumber so.
Um das Ziel trotzdem zu erreichen muß man hier zuerst über ein anderes property gehen:

{
  \set Score.barNumberVisibility = #all-bar-numbers-visible
  \override Score.BarNumber.break-visibility = ##(#f #f #t)
  b1
  \bar "||"
  \cadenzaOn
  b1 b2
  \bar "" \break
  \once \override Score.BarNumber.before-line-breaking =
    #(lambda (grob) (ly:grob-set-property! grob 'text "(2)"))
  b2
  \cadenzaOff
  \bar "||"
  b1
  \break
  b1
}


Natürlich ist das ein punktueller, manueller Eingriff.

Ein automatisiertes Verfahren ist aufwendiger.
Das Problem ist, daß in der Kadenz 'timing ausgeschaltet ist, also weiß die BarNumber nicht ob sie eventuell in der Mitte eines Taktes (mit Klammern) geschrieben werden soll, sondern "denkt" immer, daß sie sich am Taktanfang befindet, also keine Klammern.

Unten habe ich einen engraver geschrieben, der einerseits Buch führt welche Taktzahlen aktuell sind und andererseits die BarNumber einklammert, falls sie am Anfang einer Zeile steht und vorher bereits existierte.


\layout {
  \context {
    \Score
    \consists
      #(lambda (ctx)
         (let ((barnum #f))
           (make-engraver
             (acknowledgers
               ((break-alignable-interface engraver grob source-engraver)
                (if (eq? (grob::name grob) 'BarNumber)
                    (let ((curr (ly:context-property ctx 'currentBarNumber)))
                      (if (eqv? barnum curr)
                          (ly:grob-set-property! grob 'before-line-breaking
                            (lambda (grob)
                              (if (> (ly:item-break-dir grob) 0)
                                  (ly:grob-set-property! grob 'text
                                     (format #f "(~a)" curr))))))
                      (set! barnum curr))))))))
  }
}

{
  \set Score.barNumberVisibility = #all-bar-numbers-visible
   
  \override Score.BarNumber.break-visibility = ##(#f #t #t)
  b1
  \bar "||"
  \cadenzaOn
  b1 b2 \bar "" \break b2
  \cadenzaOff
  \bar "||"
  \set Score.currentBarNumber = 3
  b1
  \bar "||"
  \cadenzaOn 
  b1 b2 \bar "" \break b2
  \cadenzaOff
  \bar "||"
  \context Score
  \applyContext
    #(lambda (ctx)
       (ly:context-set-property! ctx 'currentBarNumber
         (1+ (ly:context-property ctx 'currentBarNumber))))
  b1
  \break
  b1
}


Engraver schreiben ist allerdings was für Fortgeschrittene...
Zusätzlich habe ich zwei Methoden geschrieben die 'currentBarNumber zu verändern. Punktuel/manuell und halb-automatisch.
Voll automatisiert wäre:
cadenzaOff = {
  \set Timing.timing = ##t
  \context Timing
  \applyContext
    #(lambda (ctx)
       (ly:context-set-property! ctx 'currentBarNumber
         (1+ (ly:context-property ctx 'currentBarNumber))))
}

Ich weiß aber nicht, ob Du überhaupt die 'currentBarNumber am Schluß der Kadenz verändern möchtest, also habe ich das erstmal nicht ins Beispiel gesetzt.

Gruß,
  Harm

P.S.
Zitat
Wo ich gerade dabei bin, was ist der Unterschied zwischen set und override?
Siehe NR 5.3.5 \set vs. \override
In Kürze: \set für context-properties, \override für grob-properties
Aber, bitte öffne für einen neuen Thread Fragen, die nichts mehr mit dem Thema zu tun haben

ZitatKann ich mir zum Beispiel anschauen, wie und wo \markup definiert ist, und kann ich daraus lernen?
In markup.scm, markup-macros.scm und define-markup-commands.scm.
Aber solange Du nicht sehr viel vertrauter mit LilyPond geworden bist halte ich das nicht für sinnvoll.
Du mußt erst lernen wie Du \markup und die markup-commands einsetzen kannst...
Ansonsten wieder: neuer Thread!



C_E

Vielen vielen Dank.
Erstmal an dich Reinhard, deine Lösung hat funktioniert bis darauf, dass die Taktzahl nicht in der entsprechenden Schriftart und -größe war. Jetzt bin ich froh, dass ich nicht die Zeit hatte, mir das manuell zurecht zu basteln, ich werde mich direkt in harms Codes stürzen, danke!

Vor allem für die verschiedenen Möglichkeiten, und die vielen Tipps. ich werde mir alles Stück für Stück anschauen.

... und bei neuen Fragen dann auch einen neuen Thread starten :)

harm6

Eine Sache habe ich vergessen.
Wenn man schon Buch führt, dann sollte der erreichte Wert für `barnum' auch wieder zurückgesetzt werden.
Wahrscheinlich überflüssig, aber als alter Paranoiker...

Führt zu:

\layout {
  \context {
    \Score
    \consists
      #(lambda (ctx)
         (let ((barnum #f))
           (make-engraver
             (acknowledgers
               ((break-alignable-interface engraver grob source-engraver)
                (if (eq? (grob::name grob) 'BarNumber)
                    (let ((curr (ly:context-property ctx 'currentBarNumber)))
                      (if (eqv? barnum curr)
                          (ly:grob-set-property! grob 'before-line-breaking
                            (lambda (grob)
                              (if (> (ly:item-break-dir grob) 0)
                                  (ly:grob-set-property! grob 'text
                                     (format #f "(~a)" curr))))))
                      (set! barnum curr)))))
             ((finalize engraver)
              (set! barnum #f)))))
  }
}


Gruß,
  Harm