lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: skylines and custom-code


From: Jean Abou Samra
Subject: Re: skylines and custom-code
Date: Mon, 5 Apr 2021 13:48:30 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1


Le 05/04/2021 à 12:00, Thomas Morley a écrit :
Hi Jean,

thanks for your reply, though the situation is more complex than the
initial minimal. Consider the following:

{ b'4\glissando 4 4 4 2 b'' }

The plan is to print a glissando from b' to b'' and at intermediate
NoteColumns print a Stem starting at the glissando line, i.e. the
result will be a stemmed Glissando.
(1) Obviously I need the intersection points of the y-axis of the
Stems and the Glissando.
I've coded an engraver to set the relevant pointers (from Stem to
Glissando) and use some calculations to get them. This work is done.
(2) Then I intend to move all NoteHeads of intermediate NoteColumns to
sit on the glissando line, making them transparent (or point-stencil
or omit the stencil)
This would have the advantage that LilyPond could do the rest, i.e.
print Stem, Beam, Script etc accordingly.

Obviously the calculation of the intersection points needs to be done
after the Glissando is printed, thus a simple override for
NoteHead.Y-offset will not work, afaict.
 From description in the docs about unpure-pure-containers, this is a
similar situation as for Beams and needed Stem lengths.

Alas, I never came to grips with unpure-pure-containers. Granted, the
explanations/descriptions in the docs improved over the years.
Though, we don't have working coding-examples in the docs, "working"
in the sense of "let me play with the code, testing what happens if I
do this and that":
The example in NR 5.5.6 works with and without unpure-pure-containers.
The example (sort of) in CG 10.13.3 makes no sense to me, at least I
found no situation where "bar" is called at all.
The regtest unpure-pure-container.ly is probably ok as a regtest, it
shows something is done, but why should a user do that at all. As a
user I'd say, don't move the flag if you don't want a moved flag...

That's it for the docs or did I overlook something?

Unpure-pure-containers in LSR: zero

Valentin's example works without unpure-pure-container as well.

Thus, I'm at a loss, close to abandoning the work.

Nevertheless, many thanks,
   Harm

P.S. attached an image what works so far (but don't enable skylines)

Harm,

Could you send the code you have so far? I'd like to give
fixing the skylines a try.

I totally agree that unpure-pure containers are a headache
to understand.  The docs could certainly use an update
(I'll have some news to share about that shortly).  The
problem is, it's pretty difficult to find a compelling
example for pure functions.  With, say, engravers, you
can write: here's a nice engraver that highlights part
of the music, or draws lines between any two notes, etc.
With pure functions, all you have is: this pure-unpure
container is the only way to avoid a cyclic dependency;
or: with this pure function, the spacing is slightly
snugger, observe how the second system is 1 cm higher.
It's not as exciting...

The only example I can think of is

\version "2.23.2"

% #(ly:set-option 'debug-skylines)

\new Voice \with {
  \override TextScript.Y-extent = #ly:grob::stencil-height
}
\repeat unfold 300 { c'^\markup \column { a b c d e f } }


The default for TextScript.Y-extent is
grob::always-Y-extent-from-stencil, which is defined as
(output-lib.scm):

;; Using this as a callback for a grob's Y-extent promises
;; that the grob's stencil does not depend on line-spacing.
;; We use this promise to figure the space required by Clefs
;; and such at the note-spacing stage.

(define-public grob::always-Y-extent-from-stencil
  (ly:make-unpure-pure-container ly:grob::stencil-height))

With just ly:grob::stencil-height, it is assumed that
the height of the grob might depend on line breaking.
Thus, it is not taken into account during page breaking.
This causes too many systems to be placed on the page.

Probably not overly helpful, but it was the best I could do...

Regards,
Jean




reply via email to

[Prev in Thread] Current Thread [Next in Thread]