Hallo JaKLaRo,
zunächst mal herzlich willkommen im Forum!
Zu Deiner Frage:
Die taktzahl-Funktion ermöglicht lediglich das Erscheinen jeder Taktzahl im spezifizierten Musikabschnitt. Dieser Abschnitt ist so wie Du den Code gestaltet hast allerdings schon nach jeweils einer Note zu Ende, deshalb gelingt es Dir auch nicht die Taktzahlen dauerhaft anzeigen zu lassen. Wenn Du den Abschnitt bei dem Du die Taktzahlen sehen möchtest mit Klammern versiehst { } funktioniert zumindest dieses.
Allerdings vermute ich mal, daß Du die Taktzahlen am liebsten zentriert über dem Takt haben willst. Die Benutzung des 'self-alignment-X-property ist in "2.14.2" allerdings noch ver-bug-t (der bug ist in den neueren Developer-Versionen behoben). Aber 'self-alignment-X ist (so denke ich zumindest) in diesem Fall sowieso nicht das richtige.
Insofern habe ich meine Funktion aus dem
center NoteColumn-Thread den aktuellen Bedürfnissen angepaßt.
Es werden drei Befehle definiert: \centerBarNumberOn, \centerBarNumberOff und \onceCenterBarNumber (\onceCenterBarNumber mit der Möglichkeit die BarNumber noch per Hand zu verschieben). Die Anwendung sollte sich aus dem Test-Snippet ergeben.
\version "2.14.2"
% Thanks to David Nalesnik
#(set-global-staff-size 20)
#(define (sort-by-X-coord sys grob-lst)
"Arranges a list of grobs in ascending order by their X-coordinates"
(let* ((X-coord (lambda (x) (ly:grob-relative-coordinate x sys X)))
(comparator (lambda (p q) (< (X-coord p) (X-coord q)))))
(sort grob-lst comparator)))
#(define (find-bounding-grobs bar-line grob-lst)
(let* ((sys (ly:grob-system bar-line))
(X-coord (lambda (n) (ly:grob-relative-coordinate n sys X)))
(bar-line-X (+ 4.8 (X-coord bar-line))))
(define (helper lst)
(if (and (< (X-coord (car lst)) bar-line-X)
(> (X-coord (cadr lst)) bar-line-X))
(cons (car lst) (cadr lst))
(if (null? (cddr lst))
(cons bar-line bar-line)
(helper (cdr lst)))))
(helper grob-lst)))
#(define (read-out ls1 ls2 ls3 symbol)
"Filters all elements of ls1 from ls2 and appends it to ls3"
(set! ls3 (append ls3 (filter (lambda (x) (eq? (car ls1) (symbol x))) ls2)))
(if (null? (cdr ls1))
ls3
(read-out (cdr ls1) ls2 ls3 symbol)))
#(define ((center-bar-number x-offs) grob)
(let* ((sys (ly:grob-system grob))
(elements-lst (ly:grob-array->list (ly:grob-object sys 'all-elements)))
(grob-name (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name)))
(X-extent (lambda (q) (ly:grob-extent q sys X)))
;; Grobs to center between
(args (list 'BarLine
'TimeSignature
'Clef
))
(grob-lst (read-out args elements-lst '() grob-name))
(new-grob-lst (remove (lambda (x) (interval-empty? (X-extent x))) grob-lst))
(sorted-grob-lst (sort-by-X-coord sys new-grob-lst))
;; Bounds
(bounds (find-bounding-grobs grob sorted-grob-lst))
(left (cdr (X-extent (car bounds))))
(right (car (X-extent (cdr bounds))))
(basic-offset
(- (average left right)
(interval-center (X-extent grob))
(* -1 x-offs)))) ;; End of Defs in let*
;; Calculation
(ly:grob-translate-axis! grob basic-offset X)))
centerBarNumberOn = {
\override Score.BarNumber #'after-line-breaking = #(center-bar-number 0)
\override Score.BarNumber #'break-visibility = ##(#f #t #t)
}
centerBarNumberOff = {
\revert Score.BarNumber #'after-line-breaking
\revert Score.BarNumber #'break-visibility
}
onceCenterBarNumber =
#(define-music-function (parser location x-offs)(number?)
#{
\once \override Score.BarNumber #'after-line-breaking = #(center-bar-number $x-offs)
\once \override Score.BarNumber #'break-visibility = ##(#f #t #t)
#})
%------------ Test
\paper {
ragged-right = ##f
}
\drums {
\time 4/4
% nur dann einzukommentieren, falls auch Taktzahl Nummer 1 gezeigt werden soll!
% \set Score.barNumberVisibility = #all-bar-numbers-visible \bar ""
bd2 bd
\centerBarNumberOn
\repeat unfold 10 { hh4 r bd8 bd r4 }
\centerBarNumberOff
bd2 r
\break
bd2 bd
bd4 r bd r
bd4 r bd r
\onceCenterBarNumber #0
bd4 r bd8 bd r4
bd2 r
}
Anmerkungen bzw Fragen:
Erstens: Taktzahl 7 des Test-Snippet ist natürlich auch verschoben. Es wäre auch möglich diese Taktzahl an der normalen Position zu belassen. Was meinst Du?
Zweitens: Ich bin mir noch nicht so ganz sicher ob es wirklich immer funktioniert, falls es irgendwo krachen, geht melde Dich!
Drittens: Es ist natürlich ein DrumStaff-Snippet. Falls jemand dran denkt, das ganze auf "normale" Notenschrift anzuwenden, so bin ich sicher, daß es nicht immer funktioniert, insbesondere wenn Wechsel von Takt und Tonart direkt aufeinander folgen (ich hab's aber noch nicht ausgetestet).
Gruß,
Harm
P.S. Nachdem ich meinen post nochmal Korrektur gelesen habe, viel mir auf, daß man Deine Frage auch anders verstehen kann, nämlich, daß Dir die Taktzahlen eigentlich egal sind und Du lediglich fortlaufende Nummern über den gleichen Takten haben willst.
Habe ich Dich also mißverstanden?