Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Leonach am Donnerstag, 24. Mai 2018, 12:33

Titel: Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: Leonach am Donnerstag, 24. Mai 2018, 12:33
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!
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: harm6 am Donnerstag, 24. Mai 2018, 15:18
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
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: chf am Montag, 14. Dezember 2020, 16:11
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
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: Arnold am Mittwoch, 16. Dezember 2020, 09:23
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
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: chf am Mittwoch, 16. Dezember 2020, 10:29
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!
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: Arnold am Mittwoch, 16. Dezember 2020, 13:13
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
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: chf am Mittwoch, 16. Dezember 2020, 15:17
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
Titel: Antw:Taktzahlen nach Wiederholungen real weiterzählen
Beitrag von: Arnold am Donnerstag, 17. Dezember 2020, 09:35
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:

Arnold