Taktzahlen nach Wiederholungen real weiterzählen

Begonnen von Leonach, Donnerstag, 24. Mai 2018, 12:33

« vorheriges - nächstes »

Leonach

Liebe Wissende,

ich möchte bei einer Wiederholung die Takte real weiterzählen lassen, d.h. dass auch die wiederholten Takte gezählt werden. Ferner wäre es schön, wenn zu Beginn der Wiederholung die Taktzahl der Wiederholung in Klammern nach der ersten Taktzahl angezeigt wird.

Die Taktzahlen sollten also z.B. so aussehen:
1 (5) | 2 | 3 | 4 :| 9

Bin dankbar für jeden Hinweis!

harm6

Hallo,

da gibts keine built-in Lösung.
Hier meine Bastelarbeit. Ist semi-manuell, Du mußt an drei Stellen eingreifen (siehe comments)

\version "2.19.81"

#(define (add-parenthesized-number number)
  (lambda (grob)
    (ly:grob-set-property! grob 'self-alignment-X CENTER)
    (ly:grob-set-property! grob 'text
    #{
        \markup \halign #CENTER {
          #(ly:grob-property grob 'text)
          \override #'(padding . 0)
          \parenthesize
          #(number->string
            (+ number
               (string->number
                 (markup->string (ly:grob-property grob 'text)))))
        }
    #})))

addParenthesizedNumber =
#(define-music-function (number)(number?)
#{
  \override Score.BarNumber.before-line-breaking =
    #(add-parenthesized-number number)
#})

{
  %% print all BarNumbers, unless end-of-line
  \override Score.BarNumber.break-visibility = ##(#f #t #t)
  \repeat unfold 3 R1
%% (1) init
  \addParenthesizedNumber #6
 
  \repeat volta 2 {
      \repeat unfold 3 R1
  }
  \alternative {
      {
%% (2) revert
          \revert Score.BarNumber.before-line-breaking
          \repeat unfold 3 R1
      }
      {
%% (3) adjust BarNumber
          \set Score.currentBarNumber = 13
          \repeat unfold 3 R1
      }
  }
  \repeat unfold 3 R1
}


HTH,
  Harm

chf

Hallo Harm,

glücklicherweise habe ich dies gefunden und mit Erfolg angewandt.
Aber: die ich rief, die Geister...

Wie kann ich diese Funktion wieder ausblenden, wenn die Zählung einfach weitergeht?

Gruß
Christa

Arnold

Hallo,

hier noch »quick and dirty« (oder vielleicht »dirty but quick«) eine Alternative:
\version "2.21.81"

% a new context property:
#(define (define-translator-property symbol type? description)
  (if (not (and (symbol? symbol)
(procedure? type?)
(string? description)))
      (ly:error "error in call of define-translator-property"))
  (if (not (equal? (object-property symbol 'translation-doc) #f))
      (ly:error (_ "symbol ~S redefined") symbol))

  (set-object-property! symbol 'translation-type? type?)
  (set-object-property! symbol 'translation-doc description)
  symbol)

#(for-each
  (lambda (x)
    (apply define-translator-property x))
    `(
      (BarNumberDelta
       ,number?
       "Delta for dual bar number display")
))

% my new Bar Number Formatter
#(define (dbnf barnum measure-pos alt-number context)
  (let ((delta (ly:context-property context 'BarNumberDelta #f)))
   (if delta
    (make-override-markup '(baseline-skip . 1.5)
     (make-column-markup (list
       (make-center-align-markup
        (robust-bar-number-function barnum measure-pos alt-number context)
       )
       (make-center-align-markup
        (string-append "["
         (robust-bar-number-function (+ barnum delta) measure-pos alt-number context)
        "]"))
    )))
    (robust-bar-number-function barnum measure-pos alt-number context)
)))

#(define (store-bar-number-delta ctx delta)
  (ly:context-set-property! ctx 'BarNumberDelta delta))

StoreBarNumberDelta =
#(define-music-function (delta) (integer?)
  (make-music 'ContextSpeccedMusic
   'context-type 'Score
   'property-operations '()
   'element (make-music 'ApplyContext
             'procedure (lambda (ctx)
                         (store-bar-number-delta
                          ctx (if (= delta 0) #f delta))))))

#(define (increment-bar-number ctx delta)
  (let ((current-bar-number (ly:context-property ctx 'currentBarNumber #f)))
   (if (number? current-bar-number)
    (ly:context-set-property! ctx 'currentBarNumber
     (+ current-bar-number delta)))))

BarNumberIncrement =
#(define-music-function (delta) (integer?)
  (make-music 'ContextSpeccedMusic
   'context-type 'Score
   'property-operations '()
   'element (make-music 'ApplyContext
             'procedure (lambda (ctx)
                         (increment-bar-number
                          ctx delta)))))

Music = {
  g1 a
  \repeat volta 2 {
    \StoreBarNumberDelta 5
    c'1 d' e'
  } \alternative {{
    \StoreBarNumberDelta 0
    g'1 a'
  }{
   \BarNumberIncrement 3
    b' c''
  }}
  d'' e''
  \bar "|."
}


{
  \override Score.BarNumber.break-visibility = #end-of-line-invisible
  \set Score.barNumberFormatter = #dbnf
  \Music
}


Bitte nicht \BarNumberIncrement in mehreren Stimmen einer Partitur aufrufen - es ist (noch) kein Gleichzeitigkeits-Filter programmiert.
Auch derzeit nur für eine zusätzliche Taktzahl implementiert.
Ein automatisches Berechnen der Inkrementwerte ist (selbst innerhalb eines Engravers) sehr problematisch, da sich die Taktlänge zwischenzeitlich ändern kann.

Arnold

chf

#4
Danke, Arnold.

Aber ich habe noch "2.20.0"

Hurra, mir sind die Augen aufgegangen: Dieses \revert Score.BarNumber.before-line-breaking
hatte ich übersehen. Sorry!

Arnold

Hallo chf,

die 2.20.0 habe ich gerade nicht greifbar.

Die 2.18.2 benötigt außer dem Hinzufügen von »parser location« in #(define-music-funktion ...), ergo zwei Mal
#(define-music-function (parser location delta) (integer?)
auch noch eine Änderung in meiner dbnf-Funktion, ca. ab Zeile 36, da wird aus
       (make-center-align-markup
        (string-append "["
         (robust-bar-number-function (+ barnum delta) measure-pos alt-number context)
        "]"))

dann
       (make-center-align-markup
        (make-concat-markup (list (make-simple-markup "[")
         (robust-bar-number-function (+ barnum delta) measure-pos alt-number context)
        (make-simple-markup "]"))))


In der 2.20.0 ist »parser location« nicht einzufügen,
ob die zweite Änderung (in dbnf) für die Version 2.20.0 nötig ist, kann ich jetzt nicht sagen. Vielleicht läuft's ja, wenn Du nur den Versionseintrag abänderst.

Und deine Frage dürfte mit dem erfolgreichen Kompilieren des Beispiels sich von selbst beantworten.
Am Anfang des Taktes 6 steht \StoreBarNumberDelta 0, denn eine zweite Taktzahl, die um Null höher ist als die erste Taktzahl, macht ja keinen Sinn.

Arnold

chf

Hallo Arnold,

eben habe ich die Antwort auf meine Frage selbst gefunden. Lesen ist manchmal nicht so einfach...

Deine Variante werde ich gelegentlich ausprobieren und vor allem gut aufheben. Danke!

Gruß Christa

Arnold

Hallo chf,

jetzt anbei noch eine überarbeitete Version, welche (zumindest bei mir) sowohl mit 2.20.0 als auch 2.21.81 läuft.

Der Hintergrund:

  • Standardmäßig ist in LILYPOND als barNumberFormatter die Funktion #robust-bar-number-function eingestellt.
  • Hier wird die eigene Funktion #dbnf als barNumberFormatter eingestellt
  • Was genau #dbnf dann macht, wird über die neue Kontextvariable BarNumberDelta gesteuert.
  • Ist BarNumberDelta nicht gesetzt (Grundzustand) oder mit #f belegt, einstellbar mit \unset Score.BarNumberDelta oder \set Score.BarNumberDelta = ##f oder \StoreBarNumberDelta 0, dann wird einzig und allein die Standardfunktion #robust-bar-number-function aufgerufen
  • Ist BarNumberDelta mit einer Ganzzahl belegt, einstellbar (hier als Beispiel der Wert 5) mit \set Score.BarNumberDelta = #5 oder \StoreBarNumberDelta 5, dann wird die Standardfunktion #robust-bar-number-function noch ein zweites Mal aufgerufen mit entsprechend erhöhter Taktzahl. Dieses wird in eckige Klammern eingepasst und als zweite Zeile an die Ausgabe hinzugefügt.
  • BarNumberDelta kann auch mit einer Liste von Ganzzahlen belegt werden, einstallbar z. Bsp. mit \set Score.BarNumberDelta = #'(7 14 21) oder \StoreMultipleBarNumberDelta #'(7 14 21), dann werden noch mehr Zusatzzeilen hinzugefügt.
  • Zusätzlich gibt es noch die Funktion \BarNumberIncrement um die Taktzahl »relativ« zu erhöhen statt den absoluten Wert eingeben zu müssen. Diese Funktion protokolliert den Zeitschritt ihrer Ausführung (Main-Moment of Current-Moment) in der Kontextvariable BarNumberDeltaIncrementMoment, damit die Taktzahl nicht mehrfach im gleichen Zeitschritt erhöht wird - damit kann diese Funktion in allen Stimmen einer Partitur stehen bleiben.

Arnold