Re: [frogs] Changing subproperties with grob-set-property (working on bug #40) |
[ Thread Index |
Date Index
| More lilynet.net/frogs Archives
]
- To: frogs@xxxxxxxxxxx
- Subject: Re: [frogs] Changing subproperties with grob-set-property (working on bug #40)
- From: Marc Hohl <marc@xxxxxxxxxx>
- Date: Thu, 19 Nov 2009 09:34:25 +0100
- Dkim-signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1258619667; l=5517; s=domk; d=hohlart.de; h=Content-Type:In-Reply-To:References:Subject:To:MIME-Version:From: Date:X-RZG-CLASS-ID:X-RZG-AUTH; bh=uahwMoyvdfVCdolB1qyh0ZuPIAI=; b=kcesuvCuStiRaZ4Adsm3j8+TyzWsVY1bodfRZRBxE+iWggYeQUkm+U7tH6ZJp4daFdl Fv8q2cXdKshAS9uo9V94M7XrSFncw8mqMGK+JrRQ3FdzVXPB6ZHdN4VHHNgxYC2j7Qt+h qKbaAkFPAkiBjdkZlv43rbL5nY68L5FPXR0=
Neil Puttock schrieb:
[...]
Or is my approach aiming in the wrong direction?
I think it's fine for a tweak, but a better fix would involve working
directly on the code in line-spanner.cc.
(set! right-X (- right-X 30)))
You could get a compensatory value automatically by using
ly:grob-extent on the accidental.
Assuming that ly:grob-set-nested-property! will find its way into the
code, I tried to solve the accidental/glissando collision problem
in scheme first (I still feel more comfortable with scheme than with c++).
It works as expected, but there is one more thing that I want to
take into account automatically: the fingering. When fingering numbers are
on the left or on the right, the glissando line should be shortened
accordingly.
How can I get access to the fingering grob? I need its x-extent and the
orientation, but strangely, I cannot use the same mechanism as for
accidentals;
here (ly:grob-object right-bound 'accidental-grob) works, but it seems
that there
is no (ly:grob-object right-bound 'fingering).
In scm/translation-functions.scm are some routines concerning fingerings, so
I found out how to check whether there is a fingering or not, but I
still cannot
access its grob (I fear this is just an easy function call someplace,
but I just don't see
it now, and this will show my lack of deeper scheme knowledge as well :-( )
I attach my test file for sake of completeness.
Thanks in advance
Marc
Whatever you decide to do, allowing nested properties in
ly:grob-set-property! would be a useful enhancement.
Regards,
Neil
---
----
Join the Frogs!
\version "2.13.6"
\paper {
indent = 0
ragged-right = ##f
}
#(define (glissando::calc-extra-dy grob)
(let* ((original (ly:grob-original grob))
(left-bound (ly:spanner-bound original LEFT))
(right-bound (ly:spanner-bound original RIGHT))
(left-pitch (ly:event-property (event-cause left-bound) 'pitch))
(right-pitch (ly:event-property (event-cause right-bound) 'pitch)))
(if (and (= (ly:pitch-octave left-pitch) (ly:pitch-octave right-pitch))
(= (ly:pitch-notename left-pitch) (ly:pitch-notename right-pitch)))
(- (ly:pitch-alteration right-pitch) (ly:pitch-alteration left-pitch))
0 )))
#(define (glissando::print grob)
(let* ((original (ly:grob-original grob))
(right-bound (ly:spanner-bound original RIGHT))
(right-bound-info (ly:line-spanner::calc-right-bound-info grob))
(right-X (assoc-get 'X right-bound-info 0))
(accidental (ly:grob-object right-bound 'accidental-grob))
(articulations (ly:event-property (event-cause right-bound) 'articulations))
(fingering #f)
(string-number #f))
; from translation-functions.scm
(map (lambda (art)
(let* ((num (ly:event-property art 'digit)))
(if (and (eq? 'fingering-event (ly:event-property art 'class))
(number? num))
(set! fingering num))))
articulations)
(display "\nFingering: ")(display fingering)
(if (ly:grob? accidental)
(let* ((accidental-width (cdr (ly:grob-extent accidental accidental X)))
(right-X (- right-X accidental-width)))
(ly:grob-set-nested-property! grob '(bound-details right X) right-X)))
(ly:line-spanner::print grob)))
noten = \relative c {
c4 \glissando <cis-3>
c4 \glissando <cis-5>
<c\5>4 \glissando <ces\5>
c4 \glissando ces
c4 \glissando d \glissando <e-4> \glissando <f-0>
c2 \glissando c
c4 \glissando dis e \glissando ges
}
\score {
\new Staff { \clef "G_8"
\noten \break
\override Glissando #'extra-dy = #glissando::calc-extra-dy
\override Glissando #'stencil = #glissando::print
\set fingeringOrientations = #'(left)
\noten \break
\set fingeringOrientations = #'(right)
\noten }
}