A lyric problem - with one possible solution

2019-03-29 Thread Don Gingrich

These are slightly "rich" minimum examples since I've
used different colours for the verses -- in part to make the
problem with the initial example more clearly visible and to
show the desired result in the second example.

My solution can best be described as "brute force and
ignorance" and I'd be happy to see a more elegant solution.

In any case, I'd suggest that the problem is a combination
of Bob Dylan's lyrics, and my imperative of keeping scores
to no more than two pages while using a largish text size
to make it easy for aging eyes to read the text and score
from a nearly 1 metre distance. (standing with the music
stand low so that my shoulders and face are visible to
an audience.)

And, if the brute force solution is the only viable
solution, this example may prove useful to someone else
who is faced with a similar problem.


The best suggestion that I could find in the documentation
was: 
http://lilypond.org/doc/v2.19/Documentation/notation/techniques-specific-to-lyrics#divisi-lyrics


But this resulted in the lyrics "scrambling" as in:

--- min-example.ly --
\version "2.18.2"

\header {
  title = \markup{"FUBAR"}
  composer = \markup{\italic{"Bob ???"}}
}

#(set-global-staff-size 19.5)

emphasize = {
  \override Lyrics.LyricText.font-series = #'bold
  \override Lyrics.LyricText.color = #blue
}

normal= {
  \revert Lyrics.LyricText.font-family
  \revert Lyrics.LyricText.font-series
  %% \revert Lyrics.LyricText.color
}

blue = {
  \override Lyrics.LyricText.color = #blue
}

green = {
  \override Lyrics.LyricText.color = #green
}

red = {
  \override Lyrics.LyricText.color = #red
}

melody = \relative c' {
  \clef treble
  \key d \major
  \time 2/2
  \repeat volta 2{
  \partial4
  e4   |
    fis b a fis  |
    \partial2
    d2
    }
    \bar "|."

}



LyricsOne = \lyricmode{
  \set stanza = "1. "
  I have no one to meet
}

LyricsTwo = \lyricmode{
  \emphasize
  \set stanza = "2. "
  <<
    { I’m rea -- dy for to fade. }
    \new Lyrics {
      \set associatedVoice = "melody"
      \emphasize
      \blue
      In -- to my own pa -- rade,
    }
  >>
}

LyricsThree = \lyricmode{
  \set stanza = "3. "
  \red
   <<
    { of skip -- pin’ reels of rhyme }
    \new Lyrics {
      \red
      \set associatedVoice = "melody"
      "To your" tam -- bour -- ine in time
    }
    \new Lyrics {
      \red
      \set associatedVoice = "melody"
     "it’s just" a rag -- ged clown be-hind
    }
    \new Lyrics {
      \red
      \set associatedVoice = "melody"
     I woul-dn’t pay it any mind
    }
  >>
}

LyricsFour = \lyricmode{
  \emphasize
  \set stanza = "4. "
  \green
 <<
    { Sil -- houet -- ted by the sea,}
    \new Lyrics {
      \set associatedVoice = "melody"
      \emphasize\green
     circled by the cir -- cus sands
    }
    \new Lyrics {
      \set associatedVoice = "melody"
      \emphasize\green
     With all mem -- ory and fate
    }
    \new Lyrics {
      \set associatedVoice = "melody"
      \emphasize\green
     driven deep be -- neath the waves
    }
  >>
}

\score {
  <<
  \new Staff { \melody }
    \addlyrics { \LyricsOne }
    \addlyrics { \LyricsTwo }
    \addlyrics { \LyricsThree }
    \addlyrics { \LyricsFour }
    \set Score.majorSevenSymbol = \markup {maj7}
  >>
  \layout { }
  \midi { }
}

-- end min-example.ly -

Now here's where the Brut force comes in.


-- min-example2.ly -
\version "2.18.2"

\header {
  title = \markup{"FUBAR, but Better"}
  composer = \markup{\italic{"Bob ???"}}
}

#(set-global-staff-size 19.5)

emphasize = {
  \override Lyrics.LyricText.font-series = #'bold
  \override Lyrics.LyricText.color = #blue
}

normal= {
  \revert Lyrics.LyricText.font-family
  \revert Lyrics.LyricText.font-series
  %% \revert Lyrics.LyricText.color
}

blue = {
  \override Lyrics.LyricText.color = #blue
}

green = {
  \override Lyrics.LyricText.color = #green
}

red = {
  \override Lyrics.LyricText.color = #red
}

melody = \relative c' {
  \clef treble
  \key d \major
  \time 2/2
  \repeat volta 2{
    \partial4
    e4   |
    fis b a fis  |
    \partial2
    d2
  }
  \bar "|."

}



LyricsOne = \lyricmode{
  \set stanza = "1. "
  I have no one to meet
}

LyricsTwo = \lyricmode{
  \emphasize
  \set stanza = "2. "
  I’m rea -- dy for to fade.
}

LyricsTwoB = \lyricmode{
  \emphasize
  \blue
  In -- to my own pa -- rade,
}


LyricsThree = \lyricmode{
  \set stanza = "3. "
  \red
  of skip -- pin’ reels of rhyme

}

LyricsThreeB = \lyricmode{
  \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1
  \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1
  \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1
  \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1
  \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1
  \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1 \skip1
  \sk

Re: Define variable only if it doesn't exist / is unbound

2019-03-29 Thread Richard Shann
On Thu, 2019-03-28 at 18:22 -0700, Aaron Hill wrote:
> On 2019-03-28 3:14 pm, Thomas Morley wrote:
> > Am Do., 28. März 2019 um 22:22 Uhr schrieb Aaron Hill
> > :
> > > 
> > > On 2019-03-28 2:18 pm, Valentin Villenave wrote:
> > > > On 3/28/19, Pedro Pessoa  wrote:
> > > > > I imagined something like:
> > > > > 
> > > > > %%% pseudo
> > > > > #(define var
> > > > > (not (is-bound? var) 0))
> > > > > %%%
> > > > 
> > > > I’d probably probably do something like
> > > > 
> > > > (null? (ly:parser-lookup 'var))
> > > > 
> > > > But I’m sure there are better ways :-)
> > > 
> > > 
> > > (if (not (defined? 'foo)) (define foo 47))
> > > 
> > > 
> > > 
> > > -- Aaron Hill
> > 
> > It's worth mentioning, the above will throw an error in guilev2:
> > 
> > error: GUILE signaled an error for the expression beginning here
> > #
> >  (if (not (defined? 'foo)) (define foo 47))
> > definition in expression context, where definitions are not allowed

This sounds like a problem I had when Denemo started running under
Guile 2  - I asked on the guile mailing list and got fixed up with
this:

;;; for guile 2.0 compatibility define the define-once procedure to
work in guile 1.8
(cond-expand
   (guile-2) ; nothing
   (else ; guile < 2.0
(define-macro (define-once sym exp)
  `(define ,sym
 (if (module-locally-bound? (current-module) ',sym)
 ,sym
 ,exp)
 
Apologies in advance if this is un-related, I've not been following
this thread :(

Richard


___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: treble and bass clef simultaneously

2019-03-29 Thread Thomas Morley
Am Do., 28. März 2019 um 23:52 Uhr schrieb Thomas Morley
:
>
> Am Do., 28. März 2019 um 08:02 Uhr schrieb Werner LEMBERG :
> >
> >
> > > here my factious approach: [...]
> >
> > Thanks a lot!  Attached is the same sample code as with Aaron's
> > solution.  Do you see a possibility to make leading skips work in the
> > second argument of \clefTst?
> >
> >
> > Werner
>
> Probably like below.
> Again: not tested beyond the given example!
>
> \version "2.19.82"
>
> \layout {
>   \context {
> \Voice
> \name "ClefVoice"
> \alias "Voice"
> \consists "Clef_engraver"
> clefGlyph = #"clefs.F"
> middleCPosition = #6
> clefPosition = #-8
> explicitClefVisibility = ##(#f #t #t)
> \override Clef.full-size-change = ##t
> \override Clef.font-size = #-4
> \override Clef.space-alist.next-note = #'(fixed-space . 2)
> \override Clef.after-line-breaking =
>   #(lambda (grob)
> (let ((col (ly:item-get-column grob)))
>   (if (eqv? (ly:item-break-dir grob) 1)
>   (ly:grob-translate-axis!
> grob
> (cdr (ly:grob-extent col col X))
> X
>   }
>   %% probably let ClefVoice be accepted by other contexts too
>   \context {
>   \Staff
>   \accepts "ClefVoice"
>   }
> }
>
>
> clefTst =
> #(define-music-function (m1 m2) (ly:music? ly:music?)
>
>
> (ly:music-set-property! m2 'elements
>  (call-with-values
>(lambda ()
>  (partition
>(lambda (m) (music-is-of-type? m 'skip-event))
>(ly:music-property m2 'elements)))
>(lambda (a b)
>  (append
>a
>(list
>  #{
>\context ClefVoice = "ClefVoice" {
>  %% Mmmh, this is a Score-override, may cause problems ...
>  \temporary \override Score.BreakAlignment.before-line-breaking =
>#(lambda (grob)
>  (if (eqv? (ly:item-break-dir grob) 0)
>  (ly:grob-set-property! grob 'break-align-orders
>  (make-vector 3 '(span-bar
>breathing-sign
>staff-bar
>key-cancellation
>key-signature
>time-signature
>clef)
> \voiceTwo
> %\set forceClef = ##t
> #(make-sequential-music b)
> \revert Score.BreakAlignment.before-line-breaking
>}
>  #})
>
> #{ << $m1 $m2 >> #})
>
>
> \new PianoStaff <<
>   \new Staff = "right" {
> \repeat unfold 8 { c'8_[ b''' b''' c'] } |
>   }
>   \new Staff = "left" \relative c'' {
> c8 g'' a g,, \clefTst {  g } { c,,,4 } a'''8 g |
> \clefTst { 8 g } { s cis,,,8 } a'''8 g c g a g |
>
> \break
>
> \clefTst { 8 g } { c,,,4 } a'''8 g c g a g |
> c8 g'' a g,, \clefTst {  g } { s ces,,,8 } a'''8 g |
>   }
> >>
>
> Cheers,
>   Harm

More robust:
clefTst =
#(define-music-function (m1 m2) (ly:music? ly:music?)
  (ly:music-set-property! m2 'elements
(let* ((m2-elts (ly:music-property m2 'elements))
   (idx
 (list-index
   (lambda (m) (or (music-is-of-type? m 'note-event)
   (music-is-of-type? m 'event-chord)))
   m2-elts)))
 (call-with-values
   (lambda () (split-at m2-elts idx))
   (lambda (a b)
 (append
   a
   (list
 #{
   \context ClefVoice = "ClefVoice" {
 %% Mmmh, this is a Score-override, may cause problems ...
 \temporary
   \override Score.BreakAlignment.before-line-breaking =
  #(lambda (grob)
(if (eqv? (ly:item-break-dir grob) 0)
(ly:grob-set-property! grob 'break-align-orders
(make-vector 3 '(span-bar
  breathing-sign
  staff-bar
  key-cancellation
  key-signature
  time-signature
  clef)
\voiceTwo
%\set forceClef = ##t
#(make-sequential-music b)
\revert Score.BreakAlignment.before-line-breaking
   }
 #}))

  #{ << $m1 $m2 >> #})

Cheers,
  Harm

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Define variable only if it doesn't exist / is unbound

2019-03-29 Thread Thomas Morley
Am Fr., 29. März 2019 um 02:23 Uhr schrieb Aaron Hill
:
>
> On 2019-03-28 3:14 pm, Thomas Morley wrote:
> > Am Do., 28. März 2019 um 22:22 Uhr schrieb Aaron Hill
> > :
> >>
> >> On 2019-03-28 2:18 pm, Valentin Villenave wrote:
> >> > On 3/28/19, Pedro Pessoa  wrote:
> >> >> I imagined something like:
> >> >>
> >> >> %%% pseudo
> >> >> #(define var
> >> >> (not (is-bound? var) 0))
> >> >> %%%
> >> >
> >> > I’d probably probably do something like
> >> >
> >> > (null? (ly:parser-lookup 'var))
> >> >
> >> > But I’m sure there are better ways :-)
> >>
> >> 
> >> (if (not (defined? 'foo)) (define foo 47))
> >> 
> >>
> >>
> >> -- Aaron Hill
> >
> > It's worth mentioning, the above will throw an error in guilev2:
> >
> > error: GUILE signaled an error for the expression beginning here
> > #
> >  (if (not (defined? 'foo)) (define foo 47))
> > definition in expression context, where definitions are not allowed
> >
> > Probably better get used to below:
> >
> > #(if (not (defined? 'foo)) (ly:parser-define! 'foo 47))
>
> Wouldn't...
>
> (define foo (if (defined? 'foo) foo 123))
>
> ...work?  Since foo is not defined (or redefined) until the S-expression
> is fully evaluated, it should be able to resolve the existing value
> should it exist.  This also keeps the define at the top-level.
>
> -- Aaron Hill

Think so.

Cheers,
  Harm

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Define variable only if it doesn't exist / is unbound

2019-03-29 Thread Thomas Morley
Am Fr., 29. März 2019 um 10:00 Uhr schrieb Richard Shann
:
>
> On Thu, 2019-03-28 at 18:22 -0700, Aaron Hill wrote:
> > On 2019-03-28 3:14 pm, Thomas Morley wrote:
> > > Am Do., 28. März 2019 um 22:22 Uhr schrieb Aaron Hill
> > > :
> > > >
> > > > On 2019-03-28 2:18 pm, Valentin Villenave wrote:
> > > > > On 3/28/19, Pedro Pessoa  wrote:
> > > > > > I imagined something like:
> > > > > >
> > > > > > %%% pseudo
> > > > > > #(define var
> > > > > > (not (is-bound? var) 0))
> > > > > > %%%
> > > > >
> > > > > I’d probably probably do something like
> > > > >
> > > > > (null? (ly:parser-lookup 'var))
> > > > >
> > > > > But I’m sure there are better ways :-)
> > > >
> > > > 
> > > > (if (not (defined? 'foo)) (define foo 47))
> > > > 
> > > >
> > > >
> > > > -- Aaron Hill
> > >
> > > It's worth mentioning, the above will throw an error in guilev2:
> > >
> > > error: GUILE signaled an error for the expression beginning here
> > > #
> > >  (if (not (defined? 'foo)) (define foo 47))
> > > definition in expression context, where definitions are not allowed
>
> This sounds like a problem I had when Denemo started running under
> Guile 2  - I asked on the guile mailing list and got fixed up with
> this:
>
> ;;; for guile 2.0 compatibility define the define-once procedure to
> work in guile 1.8
> (cond-expand
>(guile-2) ; nothing
>(else ; guile < 2.0
> (define-macro (define-once sym exp)
>   `(define ,sym
>  (if (module-locally-bound? (current-module) ',sym)
>  ,sym
>  ,exp)
>
> Apologies in advance if this is un-related, I've not been following
> this thread :(
>
> Richard

Hi Richard,

I tried to understand what you've got from the guile-list.

Thus I opened a guilev2 prompt and simply typed cond-expand:

scheme@(guile-user)> (version)
$1 = "2.2.4.9-71f536"
scheme@(guile-user)> cond-expand
While compiling expression:
Syntax error:
unknown location: source expression failed to match any pattern in
form cond-expand
scheme@(guile-user)>

Well, ok, the guile-manual says:
7.5.2 SRFI-0 - cond-expand
[...]

So I tried:

scheme@(guile-user)> (use-modules (srfi srfi-0))
While compiling expression:
no code for module (srfi srfi-0)

What am I missing?

Cheers,
  Harm

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Define variable only if it doesn't exist / is unbound

2019-03-29 Thread Aaron Hill

On 2019-03-29 3:37 am, Thomas Morley wrote:

Am Fr., 29. März 2019 um 10:00 Uhr schrieb Richard Shann
:

This sounds like a problem I had when Denemo started running under
Guile 2  - I asked on the guile mailing list and got fixed up with
this:

;;; for guile 2.0 compatibility define the define-once procedure to
work in guile 1.8
(cond-expand
   (guile-2) ; nothing
   (else ; guile < 2.0
(define-macro (define-once sym exp)
  `(define ,sym
 (if (module-locally-bound? (current-module) ',sym)
 ,sym
 ,exp)

Apologies in advance if this is un-related, I've not been following
this thread :(

Richard


Hi Richard,

I tried to understand what you've got from the guile-list.

Thus I opened a guilev2 prompt and simply typed cond-expand:

scheme@(guile-user)> (version)
$1 = "2.2.4.9-71f536"
scheme@(guile-user)> cond-expand
While compiling expression:
Syntax error:
unknown location: source expression failed to match any pattern in
form cond-expand
scheme@(guile-user)>

Well, ok, the guile-manual says:
7.5.2 SRFI-0 - cond-expand
[...]

So I tried:

scheme@(guile-user)> (use-modules (srfi srfi-0))
While compiling expression:
no code for module (srfi srfi-0)

What am I missing?


Looks like srfi-0 is built into guile 2, so there is no module to use 
anymore.


But cond-expand does work if you do something with it:

scheme@(guile-user)> (cond-expand (guile-2 'hi))
$2 = hi

-- Aaron Hill

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Tangled up in Lilypond syntax

2019-03-29 Thread David Kastrup
Aaron Hill  writes:

> On 2019-03-27 4:19 pm, Kieren MacMillan wrote:
>> That’s great… But essentially all of the documentation has \relative
>> at the top-level. So what is a newbie to think, other than "My code
>> should look like
>>
>> \paper { … }
>>
>> \header {…}
>>
>> \relative c' { … }
>>
>> But then they start to cut and paste code bits, or switch the order of
>> voices, or any of a dozen other natural and intuitive operations that
>> don’t imply ‘I’m destructive!!’… and then wonder why their music goes
>> off the deep end.
>
> Truly it is not "destructive", to be fair.  It at best is "chaotic",
> where there is a perfectly deterministic behavior behind the scenes
> that simply is not obvious at first glance.
>
> And, that's a fault of the documentation but also the end user.  As
> with most things with computers, it is ultimately the responsibility*
> of the user to be willing to understand how a system works.

An electrician cannot state "end user responsibility" when he leaves
blank wires sticking out of sockets.  It's the job of the documentation
and templates to teach useful patterns at a time before the user
understands what the patterns' details are about.

> \relative is documented clearly enough that anyone who asks "Why is my
> music switching octaves?" is not honoring their side of the contract.
> The notes shift because \relative depends on context; and
> cutting-and-pasting is going to change that context.

We don't demand that musicians refrain from using an instrument until
they understand its physics.  LilyPond is a musician's tool, not a
programmer's tool.

> That said, I fully agree with advising folks who intend on moving
> music around more fluidly to avoid \relative since it adds a
> maintenance chore that would otherwise impede the creative process.
> And there does seem to be an over-reliance on \relative in the
> documentation, to the extent that folks are certainly biased to use
> it.

Well, yes.  We had that discussion a few years ago.  It lead to the
introduction of \fixed and \absolute and some changes in the
documentation to stop \relative from being the only explained and
recommended way of note entry.  But the documentation is a large
document with a large history: until such changes are pervasive enough
to change the "lore", it takes a lot of work and time.

> Largely, I adopted \relative simply because pitches on the treble
> staff would otherwise require at least one apostrophe.  I have
> considered dropping \relative in my own works, replacing it with
> something like "\transpose c c'" so that I can at least minimize the
> use of octave punctuation.

You know \fixed?

-- 
David Kastrup

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Define variable only if it doesn't exist / is unbound

2019-03-29 Thread Thomas Morley
Am Fr., 29. März 2019 um 11:48 Uhr schrieb Aaron Hill
:
>
> On 2019-03-29 3:37 am, Thomas Morley wrote:
> > Am Fr., 29. März 2019 um 10:00 Uhr schrieb Richard Shann
> > :
> >> This sounds like a problem I had when Denemo started running under
> >> Guile 2  - I asked on the guile mailing list and got fixed up with
> >> this:
> >>
> >> ;;; for guile 2.0 compatibility define the define-once procedure to
> >> work in guile 1.8
> >> (cond-expand
> >>(guile-2) ; nothing
> >>(else ; guile < 2.0
> >> (define-macro (define-once sym exp)
> >>   `(define ,sym
> >>  (if (module-locally-bound? (current-module) ',sym)
> >>  ,sym
> >>  ,exp)
> >>
> >> Apologies in advance if this is un-related, I've not been following
> >> this thread :(
> >>
> >> Richard
> >
> > Hi Richard,
> >
> > I tried to understand what you've got from the guile-list.
> >
> > Thus I opened a guilev2 prompt and simply typed cond-expand:
> >
> > scheme@(guile-user)> (version)
> > $1 = "2.2.4.9-71f536"
> > scheme@(guile-user)> cond-expand
> > While compiling expression:
> > Syntax error:
> > unknown location: source expression failed to match any pattern in
> > form cond-expand
> > scheme@(guile-user)>
> >
> > Well, ok, the guile-manual says:
> > 7.5.2 SRFI-0 - cond-expand
> > [...]
> >
> > So I tried:
> >
> > scheme@(guile-user)> (use-modules (srfi srfi-0))
> > While compiling expression:
> > no code for module (srfi srfi-0)
> >
> > What am I missing?
>
> Looks like srfi-0 is built into guile 2, so there is no module to use
> anymore.
>
> But cond-expand does work if you do something with it:
>
> scheme@(guile-user)> (cond-expand (guile-2 'hi))
> $2 = hi
>
> -- Aaron Hill

Yeah, I should have read a little more:
7.5.2 SRFI-0 - cond-expand
[...] There’s no module to load, this is in the Guile core.

Though, then I'd expect
scheme@(guile-user)> cond-expand
not returning an error.

But surely my expectations are wong.
Even
scheme@(guile-user)> if
errors.


:(
Harm

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Define variable only if it doesn't exist / is unbound

2019-03-29 Thread David Kastrup
Pedro Pessoa  writes:

> Hello,
> I want to init a variable only if it isn't bound. This seems a simple
> matter, I was surpised I couldn't do it.
> The thing is that it throws an 'unbound variable error' with anything I try.
> I imagined something like:
>
> %%% pseudo
> #(define var
> (not (is-bound? var) 0))
> %%%

var = 0

Does it need to be in Scheme?

-- 
David Kastrup

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Markup wrap at the end of the line

2019-03-29 Thread edes

el 2019-03-17 a las 11:33 Andrew Bernard escribió:

> Sorry, not the specific answer to your question.

hi, thank you for your answer, and excuse my delayed response.

leaving aside considerations if what i'm asking for is a good practice or
not, should i understand that there's no way to allow a line break in a
markup?



--



___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Markup wrap at the end of the line

2019-03-29 Thread edes

el 2019-03-16 a las 19:23 Saul Tobin escribió:

> I agree that when a long markup stretches the measure at the end of a
> line, it suggests that there may be better ways of laying out the line
> breaks.
> 
> Perhaps there should be a penalty for stretched measures due to markup in
> Lilypond's line breaking algorithm?

it seems to me that this should be taken into account, definitely.
specially if everyone agrees in the previous statement.




--


___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Markup wrap at the end of the line

2019-03-29 Thread David Kastrup
edes  writes:

> el 2019-03-16 a las 19:23 Saul Tobin escribió:
>
>> I agree that when a long markup stretches the measure at the end of a
>> line, it suggests that there may be better ways of laying out the line
>> breaks.
>> 
>> Perhaps there should be a penalty for stretched measures due to markup in
>> Lilypond's line breaking algorithm?
>
> it seems to me that this should be taken into account, definitely.
> specially if everyone agrees in the previous statement.

Agreement does not buy a whole lot when there is nobody who can or will
do the job.  There are a number of LilyPond subsystems where the
existing expertise is mostly in the hands or rather heads of programmers
who are mostly withdrawn from active development.

I have taken efforts in some regions to restructure code and operation
in manners that have quite a lower barrier to entry (in my opinion) but
of course the short-term effects are such that the main source of
expertise is myself which does not exactly increase the robustness
against resource starvation.

There have also been several refactoring projects by several people who
have used that opportunity as a launch pad into more extensive changes
but the process tends to have drained their energy to a degree where
larger followup projects were not really within the scope of what they
ended up to be able to invest themselves in.

Breaking LilyPond's code more open to manipulation here, in a first step
to C++ programming but ultimately also open to adaptation in Scheme,
would certainly be desirable.

-- 
David Kastrup

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


a curious workaround for flabby rounded-boxes

2019-03-29 Thread Robin Bannister

Hallo there


I was looking to revamp my DIY fingering functions in the light of 
features available when moving from 2.18 to 2.20,  e.g. I can get 
tighter positioning via TextScript.parent-alignment-X.


There is a 'ringed' function for fingerings which need highlighting. 
Its bulbous \circle now seems rather wasteful of width, so I thought I 
could try \rounded-box instead.  Well, it could certainly made be 
narrower and still readable, but it has spurious padding which wastes 
width too.


This padding bug was found a year ago
http://lists.gnu.org/archive/html/bug-lilypond/2018-03/msg00022.html
and it should be gone by 2.21.0.
https://sourceforge.net/p/testlilyissues/issues/5307/



My workaround involved using \with-dimensions-from to apply the extents 
of a throwaway corner-radius_0 version to the wanted rounded version.

This was ugly but effective.
Today I inadvertently changed that 0 to 1 and it still worked!


So here is a compact workaround - attached, as \rounded-boxx.


It uses the rounded version to correctly crop itself.
This is beyond the extent of my explanatory powers.
Note that \pad-x 0 is ineffective, presumably because it sets the 
extents in a different way.



Cheers,
Robin
\version "2.18.2"

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

% needed before 2_19_37
#(define-markup-command (with-dimensions-from layout props arg1 arg2)
  (markup? markup?)
  (let* ((stil1 (interpret-markup layout props arg1))
(x (ly:stencil-extent stil1 0))
(y (ly:stencil-extent stil1 1)))
(interpret-markup layout props (markup #:with-dimensions x y arg2

% workaround
#(define-markup-command (rounded-boxx layout props args) (markup?)
  (let * ((m (make-rounded-box-markup (markup args
   (interpret-markup layout props (markup #:with-dimensions-from m m


{
%  \override TextScript.stencil =
%  #(make-stencil-boxer 0.03 0 ly:text-interface::print)
  \textLengthOn
  s1
  s1_\markup \rounded-box "-box"
  s1_\markup \rounded-boxx "-boxx"
%  s1_\markup \pad-x #0 \rounded-box "pad-x"
}
___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Markup wrap at the end of the line

2019-03-29 Thread Urs Liska


Am 29.03.19 um 15:19 schrieb edes:

el 2019-03-17 a las 11:33 Andrew Bernard escribió:


Sorry, not the specific answer to your question.

hi, thank you for your answer, and excuse my delayed response.

leaving aside considerations if what i'm asking for is a good practice or
not, should i understand that there's no way to allow a line break in a
markup?



Not sure if I'm misunderstanding you, but in

  -\markup "Something long"

there may not be any line break, but there are constructs like

 -\markup \override #(line-width . 20) \wordwrap { This will be wrapped 
to some line-width }


will produce line breaks (and there are a few other commands).

HTH
Urs


___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: Markup wrap at the end of the line

2019-03-29 Thread Urs Liska


Am 29.03.19 um 21:01 schrieb Urs Liska:
 -\markup \override #(line-width . 20) \wordwrap { This will be 
wrapped to some line-width }



Sorry, that must read #'(line-width . 20)


___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user