Autor Thema: Takte zählen  (Gelesen 4786 mal)

JaKLaRo

  • Gast
Takte zählen
« am: Donnerstag, 19. Januar 2012, 11:11 »
Hallo,
zunächst kurz zu mir. Ich spiele in einem Blasorchester Schlagwerk und Percussion. Hin und wieder muss ich mal meine Noten neu schreiben, da das Original schlecht gesetzt ist. Da in meiner Stimme oft über viele Takte hinweg das gleiche gespielt wird, helfen Nummern über den Takten. Ich kriege das auch hin, allerdings mit etwas zu viel Schreibarbeit. Daher meine Frage. Läßt sich das angefügte Beispiel kürzer schreiben? Die erste Zeile wäre der Ansatz, die zweite wie das Ergebnis aussehen sollte. Die Funktion habe ich im Internet gefunden. Mit Scheme komme ich noch nicht klar. Ich arbeite mit Debian.

\version "2.14.2"

taktzahl =
#(define-music-function (parser location musique) (ly:music?)
#{ \override Score.BarNumber #'break-visibility = ##(#f #t #t)
  $musique \revert Score.BarNumber #'break-visibility #})

\drums {
    \time 4/4
    bd2 bd
    \repeat unfold 3 { bd4 r bd4 r }
    \taktzahl bd2 r
    \break
    bd2 bd
    bd4 r ^"1" bd r
    bd4 r ^"2" bd r
    bd4 r ^"3" bd r
    \taktzahl bd2 r
}

Vielen Dank schon mal
JaKLaRo

harm6

  • Gast
Re: Takte zählen
« Antwort #1 am: Freitag, 20. Januar 2012, 01:18 »
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?

JaKLaRo

  • Gast
Re: Takte zählen
« Antwort #2 am: Freitag, 20. Januar 2012, 09:13 »
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?

Hallo Harm,
die Taktzahlen sind natürlich nicht egal. Ich brauche beides:
1. Die regulären Taktzahlen über dem Taktstrich (in meinem Beispiel die Takte 5, 6 und 10)
2. Hilfstaktzahlen zentriert über dem Takt (die Takte 7 - 9), wenn sich die Noten über längere Passagen wiederholen. Die Hilfstaktzahlen beginnen immer mit 1.

Was mir vorschwebt ist folgendes:
\repeat unfold 3 { bd4 r bd4 r }Schreibe über die drei Takte die Zahlen 1, 2, 3, aber zähle die Taktzahlen weiter. Kann man auf die 3 nach unfold zugreifen und sie dann wie in einer Schleife benutzen?
In Worten: Ermittle in der wievielten Wiederholung wir sind und schreibe die Zahl über den Takt.

Ich hoffe, dass ich mich verständlich ausgedrückt habe.

Gruß
JaKLaRo

harm6

  • Gast
Re: Takte zählen
« Antwort #3 am: Samstag, 21. Januar 2012, 22:27 »
Hallo JaKLaRo,

Zitat
Schreibe über die drei Takte die Zahlen 1, 2, 3, aber zähle die Taktzahlen weiter. Kann man auf die 3 nach unfold zugreifen und sie dann wie in einer Schleife benutzen?
In Worten: Ermittle in der wievielten Wiederholung wir sind und schreibe die Zahl über den Takt.

Ich hoffe, dass ich mich verständlich ausgedrückt habe.

Und ich hoffe, daß ich Dich auch verstanden habe.  ;)

Der Code unten definiert centerCountRepeatUnfold: Der 'repeat-count wird ausgelesen und via recursion als formatiertes und in der Regel zentriertes markup in einer temporären zweiten Stimme benutzt.

Anwendung: Einfach \centerCountRepeatUnfold ##t vor \repeat unfold setzen. Falls die Zentrierung nicht gewollt ist kann man \centerCountRepeatUnfold ##f benutzen. Dann erscheint die Zahl über der ersten Note.

\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 (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-text-script 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)))
            (lst-1 (filter (lambda (x) (eq? 'BarLine (grob-name x))) elements-lst))
            (add (cdr (ly:grob-property (car lst-1) 'X-extent)))
      ;; Grobs to center between
            (args (list 'BarLine
                      'TimeSignature
                      'KeySignature
                      'KeyCancellation
                      '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)
                 (* -1 add)
                 (interval-center (X-extent grob))
                 (* -1 x-offs)))) ;; End of Defs in let*   
   ;; Calculation
     (ly:grob-translate-axis! grob basic-offset X)))

centerTextScriptOn = {
        \override TextScript #'after-line-breaking = #(center-text-script 0)
}

centerTextScriptOff = {
        \revert TextScript #'after-line-breaking
}

onceCenterTextScript =
#(define-music-function (parser location x-offs)(number?)
#{
        \once \override TextScript #'after-line-breaking = #(center-text-script $x-offs)
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (number->integer-list integer)

  (define (helper number ls)
    (set! ls (cons number ls))
      (if (= (- number 1) 0)
        ls
      (helper (- number 1) ls)))
     
 (if (and (integer? integer) (> integer 0))
  (helper integer '())
  (begin
   (newline)
   (display "__________Argument is not integer or not greater than 0__________")
   (newline))))

#(define (list-helper ls1 ls2 ls3)
 (let ((text (make-music
                   'TextScriptEvent
                   'direction 1
                   'text
                   (markup #:fontsize -5 #:number (string-append " " (number->string (car ls2))))
                   )))
 (set! ls3 (cons (car ls1) (cons text ls3)))
    (if (null? (cdr ls2))
      (reverse ls3)
      (list-helper ls1 (cdr ls2) ls3))))

barCount = #(define-music-function (parser location music) (ly:music?)
 (let* ((repeat-count (if (eq? 'UnfoldedRepeatedMusic (ly:music-property music 'name))
                (ly:music-property music 'repeat-count)
                (display "no 'UnfoldedRepeatedMusic")))
        (mus-len (ly:music-length  music))
        (num (ly:moment-main-numerator mus-len))
        (denom (ly:moment-main-denominator mus-len))
        (skip (list #{ \scaleDurations #(cons (/ $num $repeat-count) $denom) s1 #} ))
        (lst (list-helper skip (number->integer-list repeat-count) '()))
        (skip-music (make-sequential-music lst)))
 (make-sequential-music
   (list (make-music
           'SimultaneousMusic
           'elements
           (list
             music
             skip-music))))))
             
centerCountRepeatUnfold =
#(define-music-function (parser location center? music)(boolean? ly:music?)
(if center?
#{
        \override TextScript #'padding = #1
        \centerTextScriptOn
        \barCount
        $music
        \centerTextScriptOff
#}
#{
        \override TextScript #'padding = #1
        \barCount
        $music
        \centerTextScriptOff
#}))
             
%----------- test

\drums {
    \time 5/8
    \set Staff.instrumentName = "Example 1 "
    \centerCountRepeatUnfold ##f
\repeat unfold 3 { hh2 r8 }
}

\drums {
    \time 4/4
    \set Staff.instrumentName = "Example 2 "
    bd2 bd
    \centerCountRepeatUnfold ##t
    \repeat unfold 10 { hh4 r bd16 bd bd bd r4 }
    bd2 r
}

\relative c' {
        \set Staff.instrumentName = "Example 3 "
        \centerCountRepeatUnfold ##f
        \repeat unfold 10 { c1 }
        \key cis\major
        \time 8/8
        \centerCountRepeatUnfold ##t
        \repeat unfold 4 { <<{ a''8 [a a a]  a [a a a]}\\{a,,2 a}>> \noBreak }
        \break
        \key ces\major
        \time 4/4
        \centerCountRepeatUnfold ##f
        \repeat unfold 10 { ees'1 }
       
}

Ich bin aber noch nicht so ganz zufrieden mit dem output. Ich denk' mal weiter drüber nach.

HTH,
  Harm


JaKLaRo

  • Gast
Re: Takte zählen
« Antwort #4 am: Sonntag, 22. Januar 2012, 10:35 »
Hallo Harm,
vielen Dank für Deine Bemühungen. /centerCountRepeatUnfold macht genau das, was ich mir vorgestellt habe. Ich werde das noch etwas testen und mich gegebenenfalls noch mal melden bzw. den Beitrag auf gelöst setzen.

Gruß
JaKLaRo

harm6

  • Gast
Re: Takte zählen
« Antwort #5 am: Sonntag, 22. Januar 2012, 11:04 »
Hallo JaKLaRo,

ich würde einen Thread nie schließen. Schon allein der Versionswechselei wegen, ergeben sich immer wieder neue Aspekte und wenn es dann damit Schwierigkeiten gibt kann der jeweilige Thread wieder aufgegriffen und fortgeführt werden.
Im konkreten Fall habe ich ja schon geschrieben, daß ich noch nicht 100%-ig zufrieden bin. Insofern habe ich das Problem und meinen bisherigen Lösungsansatz auf der internationalen Liste gepostet. Falls da dann noch substantielle Verbesserungen vorgeschlagen werden, würde ich gern die Möglichkeit haben sie auch noch hier vorzustellen.

Gruß,
  Harm

JaKLaRo

  • Gast
Re: Takte zählen
« Antwort #6 am: Sonntag, 22. Januar 2012, 13:25 »
Hallo Harm,
ich lasse den Thread dann mal offen. Mir ist aufgefallen, dass der vertikale Abstand zu den Notenlinien von
/centerCountRepeatUnfold und /countPercentRepeats unterschiedlich ist. Das ist für meine Bedürfnisse nicht wichtig, aber für professionelle Ansprüche schon.

\version "2.14.2"

\include "/home/Pfad_anpassen/centerCountRepeatUnfold.ly"

\drums {
\time 4/4
bd2 bd
\centerCountRepeatUnfold ##t
\repeat unfold 3 { bd4 r bd4 r }
bd2 r
\break
\set countPercentRepeats = ##t
\repeat percent 3 { bd4 r bd4 r }
bd2 r
}

Edit: Ich benutze  #:fontsize -2.1 in list-helper

Gruß
JaKLaRo

harm6

  • Gast
Re: Takte zählen
« Antwort #7 am: Mittwoch, 25. Januar 2012, 23:49 »
Hallo,

ich habe noch ein paar Sachen geändert:

- Die Zentrierung arbeitet (so weit ich getestet habe) jetzt in jeder Situation überzeugend.
- Ich habe die Möglichkeit eingebaut die Zählung mit einer anderen Zahl als "1" zu beginnen.
- Mit Hilfe von David Nalesnik ist es gelungen, bei mehr als einstelligen Zahlen, die an den Anfang des Taktes kommen sollen, die Zentrierung über der NoteColumn zu    verbessern.

Das einzige Problem ist, das die Zahlen in bestimmten Fällen zu tief erscheinen. Dann muß man mit \override TextScript #'padding = #y nachhelfen, wobei "y" dann noch zu ermitteln ist. (Example 3, Takt 20 ff)

Anwendung:
In \centerCountRepeatUnfold ##t #3 bedeutet ##f (Taktzentrierung? Ja?/Nein?) und #3 (Startzahl? hier: "3")

Zitat
Mir ist aufgefallen, dass der vertikale Abstand zu den Notenlinien von /centerCountRepeatUnfold und /countPercentRepeats unterschiedlich ist. Das ist für meine Bedürfnisse nicht wichtig, aber für professionelle Ansprüche schon.

Professionell oder nicht, das sei mal dahingestellt. Mir waren die Abstände zu klein, deshalb hatte ich sie vergrößert. Aber das kann man ja ändern. (Hab' ich jetzt mal gemacht)

\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 my-grob grob-lst)
   (let* ((sys (ly:grob-system my-grob))
          (X-coord (lambda (n) (ly:grob-relative-coordinate n sys X)))
          (my-grob-X (X-coord my-grob)))
   
      (define (helper lst)
        (if (and (< (X-coord (car lst)) my-grob-X)
                 (> (X-coord (cadr lst)) my-grob-X))
            (cons (car lst) (cadr lst))
            (if (null? (cddr lst))
                (cons my-grob my-grob)
                (helper (cdr lst)))))
               
      (helper grob-lst)))       
     
#(define (list-helper-2 ls obj)
  "Search the first element of the lst, which is greater than obj by their X-coord.
  ls is supposed to be sorted list '(small ... great)"
  (let* ((sys (ly:grob-system obj))
        (X-coord (lambda (n) (ly:grob-relative-coordinate n sys X))))
          (if (> (X-coord (car ls)) (X-coord obj))
              (car ls)
              (if (null? (cdr ls))
                  (begin
                    (display "no member of the list is greater than the object")
                    (newline))
                  (list-helper-2 (cdr ls) obj)))))
                 
#(define (list-helper-3 ls obj)
  "Search the first element of the lst, which is smaller than obj by their X-coord.
  ls is supposed to be sorted list '(great ... small)"
  (let* ((sys (ly:grob-system obj))
        (X-coord (lambda (n) (ly:grob-relative-coordinate n sys X))))
          (if (< (X-coord (car ls)) (X-coord obj))
              (car ls)
              (if (null? (cdr ls))
                  (begin
                    (display "no member of the list is smaller than the object")
                    (newline))
                  (list-helper-3 (cdr ls) obj)))))

#(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-text-script 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)))
            (lst-1 (filter (lambda (x) (eq? 'BarLine (grob-name x))) elements-lst))
            (add (cdr (ly:grob-property (car lst-1) 'X-extent)))
      ;; Grobs to center between
            (args (list 'BarLine
                      'TimeSignature
                      'KeySignature
                      'KeyCancellation
                      '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))
      ;; NoteColumns
            (note-column-lst (read-out (list 'NoteColumn) elements-lst '() grob-name))
            (new-note-column-lst (remove (lambda (x) (interval-empty? (X-extent x))) note-column-lst))
            (sorted-note-column-lst (sort-by-X-coord sys new-note-column-lst))
      ;; Bounds
            (bounds (find-bounding-grobs grob sorted-grob-lst))
            (left-bound (list-helper-2 sorted-note-column-lst (car bounds)))
            (right-bound (list-helper-3 (reverse sorted-note-column-lst) (cdr bounds)))
            (left (cdr (X-extent left-bound)))
            (right (car (X-extent right-bound)))
           
            (basic-offset
              (- (average left right)
                 (* -1 add)
                 (interval-center (X-extent grob))
                 (* -1 x-offs)))) ;; End of Defs in let*   
   ;; Calculation
     (ly:grob-translate-axis! grob basic-offset X)))

centerTextScriptOn = {
        \override TextScript #'after-line-breaking = #(center-text-script 0)
}

centerTextScriptOff = {
        \revert TextScript #'after-line-breaking
}

onceCenterTextScript =
#(define-music-function (parser location x-offs)(number?)
#{
        \once \override TextScript #'after-line-breaking = #(center-text-script $x-offs)
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (number->integer-list integer)

  (define (helper number ls)
    (set! ls (cons number ls))
      (if (= (- number 1) 0)
        ls
      (helper (- number 1) ls)))
     
 (if (and (integer? integer) (> integer 0))
  (helper integer '())
  (begin
   (newline)
   (display "__________Argument is not integer or not greater than 0__________")
   (newline))))

#(define (list-helper ls1 ls2 ls3 center?)
 (let ((text (make-music
                   'TextScriptEvent
                   'direction 1
                   'text
                   (markup #:fontsize -2.1 #:number
                   (if center?
                     (string-append "  " (number->string (car ls2)))
                     (number->string (car ls2)))))))
 (set! ls3 (cons (car ls1) (cons text ls3)))
    (if (null? (cdr ls2))
      (reverse ls3)
      (list-helper ls1 (cdr ls2) ls3 center?))))

barCount = #(define-music-function (parser location center? number music)
(boolean? number? ly:music?)
 (let* ((repeat-count (if (eq? 'UnfoldedRepeatedMusic (ly:music-property music 'name))
                (ly:music-property music 'repeat-count)
                (display "no 'UnfoldedRepeatedMusic")))
        (mus-len (ly:music-length  music))
        (num (ly:moment-main-numerator mus-len))
        (denom (ly:moment-main-denominator mus-len))
        (skip (list #{ \scaleDurations #(cons (/ $num $repeat-count) $denom) s1 #} ))
        (ls (number->integer-list repeat-count))
        (new-ls (map (lambda (x) (+ x number -1)) ls))
        (lst (list-helper skip new-ls '() center?))
        (skip-music (make-sequential-music lst)))
 (make-sequential-music
   (list (make-music
           'SimultaneousMusic
           'elements
           (list
             music
             skip-music))))))
             
centerCountRepeatUnfold =
#(define-music-function (parser location center? number music)(boolean? number? ly:music?)
(if center?
#{
        \override TextScript #'Y-extent = #'(0.25 . 1)
        \centerTextScriptOn
        \barCount ##t #$number
        $music
        \centerTextScriptOff
#}
#{
        \override TextScript #'Y-extent = #'(0.25 . 1)
        \override TextScript #'X-offset =
        #ly:self-alignment-interface::aligned-on-x-parent
        \override TextScript #'self-alignment-X = #CENTER
        \barCount ##f #$number
        $music
        \centerTextScriptOff
#}))

#(define (Text_align_engraver ctx)
  (let ((scripts '())
        (note-column #f))

    `((acknowledgers
       (note-column-interface
        . ,(lambda (trans grob source)
             ;; cache NoteColumn in this Voice context
             (set! note-column grob)))

       (text-script-interface
        . ,(lambda (trans grob source)
             ;; whenever a TextScript is acknowledged,
             ;; add it to `scripts' list
             (set! scripts (cons grob scripts)))))

      (stop-translation-timestep
       . ,(lambda (trans)
            ;; if any TextScript grobs exist,
            ;; set NoteColumn as X-parent
            (and (pair? scripts)
                 (for-each (lambda (script)
                             (set! (ly:grob-parent script X) note-column))
                           scripts))
            ;; clear scripts ready for next timestep
            (set! scripts '()))))))
             
%----------- test

\drums {
    \time 5/8
    \set Staff.instrumentName = "Example 1 "
    hh2 r8
    hh2 r8
    \centerCountRepeatUnfold ##f #3
    \repeat unfold 3 { hh2 r8 }
}

\drums {
    \time 4/4
    \set Staff.instrumentName = "Example 2 "
    bd2 bd
    \centerCountRepeatUnfold ##t #1
    \repeat unfold 10 { hh4 r bd16 bd bd bd r4 }
    bd2 r
}

\relative c' {
        \set Staff.instrumentName = "Example 3 "
        \centerCountRepeatUnfold ##f #1
        \repeat unfold 10 { c1 }
        \key cis\major
        \time 8/8
        \centerCountRepeatUnfold ##t #1
        \repeat unfold 4 { <<{ a''8 [a a a]  a [a a a]}\\{a,,2 a}>> \noBreak }
        \break
        \key ces\major
        \time 6/8
        \centerCountRepeatUnfold ##t #1
        \repeat unfold 5 { <<{ a''8 [a a] a [a a]}\\{a,,2.}>> \noBreak }
        \break
        \override TextScript #'padding = #3
        \centerCountRepeatUnfold ##t #1
        \repeat unfold 5 { <<{ a''2 a4 }\\{a,,2.}>> \noBreak }
       
}


\layout {
  \context {
    \Score
    \consists #Text_align_engraver
  }
}

Gruß,
  Harm

P.S. Es gibt übrigens auch LSR-Snippet 473. Aber davon habe ich erst erfahren nachdem die Arbeit praktisch beendet war. Zu meiner Schande muß ich gestehen das LSR nicht vorher abgesucht zu haben.