Notationsspezifisch > Noten für Schlagzeug
Takte zählen
harm6:
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:
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.
--- Code: ---\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
}
--- Ende Code ---
Edit: Ich benutze #:fontsize -2.1 in list-helper
Gruß
JaKLaRo
harm6:
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.
--- Ende Zitat ---
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)
--- Code: ---\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
}
}
--- Ende Code ---
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.
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln