Thank you for your help!
As you supposed \new TabVoice can handle this construct. I experimented
a bit and found that one can define even one finger for a chord. That is
important for Banjo played clawhammer style there single strings are hit
and the chords are brushed with the back of the fingernail with I or M
depending on the taste of the player. The drone is plucked by P. The
warning or error message is not nice, but as long as it compiles
correctly ...
\version "2.19.80"
\layout {
\context {
\TabVoice
\override StrokeFinger.digit-names = ##("P" "I" "M" "A" "X")
%\consists #Test_engraver
\consists "New_fingering_engraver"
\consists "Fingering_engraver"
\consists "Script_column_engraver"
\consists "Fingering_column_engraver"
}
}
#(define RH rightHandFinger)
mus = \relative c {
\set strokeFingerOrientations = #'(left up )
c-\RH #1 e-\RH #2 g-\RH #3 c-\RH #4
%\set strokeFingerOrientations = #'(down right up )
\set strokeFingerOrientations = #'(down )
< c-\RH #1 e-\RH #2 g-\RH #3 > 4
< c-\RH #2 e-\RH #2 g-\RH #2 > 4
< c-\RH #2 e g > 4
}
<<
\new Voice \mus
\new TabVoice \mus
Am 29.01.2018 00:58, schrieb Thomas Morley:
Hi,
2018-01-28 19:52 GMT+01:00 Blöchl Bernhard
<b_120902342...@telecolumbus.net>:
I experimente with this fingering notation:
\version "2.19.80"
\layout {
\context {
\TabStaff
This should go into TabVoice not TabStaff, imho
\override StrokeFinger.digit-names = ##("P" "I" "M" "A" "X")
\consists New_fingering_engraver
strokeFingerOrientations = #'(down )
}
%{
The finger characters under the chord are written one above the
other and
therefore unredable. To change this, I think there is some change in
the
source by the developers necessary.
Nope.
Some change by the user ;)
If you consist New_fingering_engraver you should also include
Script_column_engraver.
I'd go for Fingering_engraver and Fingering_column_engraver as well.
Tshe finger characters "upper case" are correct you see with this
"\set
strokeFingerOrientations = #'(right)" example.
The warnings show, that this case of fingering of of chords "down"
is not
considered.
%}
Not exactly.
Including the engravers building "column" already helps a bit.
Though, you're right in so far as TabStaff is usually regarded as a
notation where already is shown what to _do_.
Thus, fingerings, stroke-finger, string-numbers are superfluous.
That said, I think printing of stroke-fingerings should work if
actually desired.
I didn't figure why lilypond complains about unset side-axis in
TabVoice, though.
But I tried a proof-of-concept-engraver.
Please note the printed message :))
\version "2.19.65"
#(define Test_engraver
(lambda (ctx)
(let ((stroke-fingers '())
(str-fingr-or '()))
(ly:message
"\n\tTHIS CODE IS A PROOF OF CONCEPT. NOT TESTED. USE AT OWN
RISK.\n\n")
(make-engraver
((start-translation-timestep trans)
(set! stroke-fingers '()))
(acknowledgers
((stroke-finger-interface engraver grob source-engraver)
(set! stroke-fingers (cons grob stroke-fingers))
;; To prevent LilyPond complaining, side-axis is set here
;; It may be reset in `stop-translation-timestep'
(ly:grob-set-property! grob 'side-axis X)))
((stop-translation-timestep trans)
(let* ((str-f-or
(ly:context-property ctx 'strokeFingerOrientations
'(right)))
(cleaned-str-f-or
(if (and (member 'left str-f-or) (member 'right
str-f-or))
(filter
(lambda (e)
(not (eq? 'left e)))
str-f-or)
str-f-or))
(sorted-str-f-or
(sort cleaned-str-f-or (lambda (p q) (symbol<? p q))))
(rev-str-f (reverse stroke-fingers))
(alist
;; what a clumsy coding :((
(cond ((null? rev-str-f)
'())
((= (length sorted-str-f-or) 1)
(list (cons (car sorted-str-f-or) rev-str-f)))
((equal? sorted-str-f-or '(down up))
(list
(cons
(car sorted-str-f-or)
(list-head rev-str-f
(round (/ (length rev-str-f)
2))))
(cons
(cadr sorted-str-f-or)
(list-tail rev-str-f
(round (/ (length rev-str-f)
2))))))
((or (equal? sorted-str-f-or '(down left))
(equal? sorted-str-f-or '(down right)))
(list
(cons
(car sorted-str-f-or)
(car rev-str-f))
(cons
(cadr sorted-str-f-or)
(cdr rev-str-f))))
((or (equal? sorted-str-f-or '(left up))
(equal? sorted-str-f-or '(right up)))
(list
(cons
(car (last-pair sorted-str-f-or))
(car (last-pair rev-str-f)))
(cons
(car sorted-str-f-or)
(cdr (reverse rev-str-f)))))
((or (equal? sorted-str-f-or '(down left up))
(equal? sorted-str-f-or '(down right up)))
(cond ((= 1 (length rev-str-f))
(list (cons 'up rev-str-f)))
((= 2 (length rev-str-f))
(list
(cons 'down (car rev-str-f))
(cons 'up (cadr rev-str-f))))
(else '()
(list
(cons 'down (car rev-str-f))
(cons
(cadr sorted-str-f-or)
(cdr (reverse (cdr rev-str-f))))
(cons 'up (car (last-pair
rev-str-f)))))))
(else '()))))
(if (pair? alist)
(for-each
(lambda (x)
(let ((cdr-x (if (list? (cdr x)) (cdr x) (list (cdr
x)))))
(if (member (car x) '(left right))
(for-each
(lambda (g)
(ly:grob-set-property! g 'side-axis X)
(ly:grob-set-property! g 'X-offset
ly:side-position-interface::x-aligned-side))
cdr-x)
(for-each
(lambda (g)
(ly:grob-set-property! g 'side-axis Y)
(ly:grob-set-property! g 'Y-offset
ly:side-position-interface::y-aligned-side))
cdr-x))))
alist))))))))
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%
\layout {
\context {
\TabVoice
\override StrokeFinger.digit-names = ##("P" "I" "M" "A" "X")
\consists #Test_engraver
\consists "New_fingering_engraver"
\consists "Fingering_engraver"
\consists "Script_column_engraver"
\consists "Fingering_column_engraver"
}
}
#(define RH rightHandFinger)
mus = \relative c {
\set strokeFingerOrientations = #'(left up )
c-\RH #1 e-\RH #2 g-\RH #3 c-\RH #4
\set strokeFingerOrientations = #'(down right up )
< c-\RH #1 e-\RH #2 g-\RH #3 > 4
}
<<
\new Voice \mus
\new TabVoice \mus
Cheers,
Harm
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user