Re: Oval stencil and oval markup suggestions

2019-04-04 Thread Thomas Morley
Am Do., 4. Apr. 2019 um 17:34 Uhr schrieb Pierre Perol-Schneider
:
>
> Hi Dev Team,
> Here's some thougts:
>
> %%
> \version "2.19.83"
>
> %% The oval stencil commands uses beziers curves that cause some side
> effects:
> \markuplist {
>   \line\vcenter {
> "Circle, radius = 2 : "
> \stencil #(make-circle-stencil 2 .13 #f)
>   }
>   \line\vcenter {
> "Oval, x-radius = y-radius = 2 : "
> \stencil #(make-oval-stencil 2 2 .13 #f)
>   }
>   \line\vcenter {
> "Oval extents, x-radius = y-radius = 2 : "
> \box\stencil #(make-oval-stencil 2 2 .13 #f)
>   }
> }
>
> %% Here's a suggestion with a corrected y-radius in order to reach a quasi
> circle:
[...]

Hi Pierre,

current `make-oval-stencil´, used via `oval-stencil´ in the
`oval´-markup-command uses beziers, yes.
Though, you will never get a perfect circle using beziers. I don't
understand why you see this as an issue.
Maybe the naming x-radius/y-radius is misleading, because x-radius
mirrors the final x-extent, but y-radius the y-extent of the
control-points, not of the final oval.
Ofcourse this has impact an the final dimensions, which you
demonstrated by applying \box.
If we think this is a problem I'd rather suggest to do:

#(define-public (make-oval-stencil-harm x-radius y-radius thickness fill)
  "Make an oval from two Bezier curves, of x@tie{}radius @var{x-radius},
y@tie{}radius @code{y-radius}, and thickness @var{thickness} with fill
defined by @code{fill}."
  (let*
  ((x-out-radius (+ x-radius (/ thickness 2.0)))
   (y-out-radius (+ y-radius (/ thickness 2.0)))
   (x-max x-radius)
   (x-min (- x-radius))
   (y-max y-radius)
   (y-min (- y-radius))
   (commands `(,(list 'moveto x-max 0)
   ,(list 'curveto x-max y-max x-min y-max x-min 0)
   ,(list 'curveto x-min y-min x-max y-min x-max 0)
   ,(list 'closepath)))
   (command-list (fold-right append '() commands)))
;(ly:make-stencil
; `(path ,thickness `(,@',command-list) 'round 'round ,fill)
; (cons (- x-out-radius) x-out-radius)
; (cons (- y-out-radius) y-out-radius))
(make-path-stencil
  command-list
  thickness 1 1 fill)))

Cheers,
  Harm

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


Re: Oval stencil and oval markup suggestions

2019-04-04 Thread Pierre Perol-Schneider
Or even an oval stencil with 4 control points:

%%
#(define-public (make-oval-stencil-var x-radius y-radius thickness fill)
  "Make an oval from two Bezier curves, of x@tie{}radius @var{x-radius},
  y@tie{}radius @code{y-radius}, and thickness @var{thickness} with fill
  defined by @code{fill}."
(let*
((x-out-radius (+ x-radius (/ thickness 2.0)))
 (y-out-radius (+ y-radius (/ thickness 2.0)))
 (x-max x-radius)
 (x-min (- x-radius))
 (y-max y-radius)
 (y-min (- y-radius))
 (commands `(,(list 'moveto x-max 0)
 ,(list 'curveto x-max (/ y-max 1.8) (/ x-max 1.8)
y-max 0 y-max)
 ,(list 'curveto (/ x-min 1.8) y-max x-min (/ y-max
1.8) x-min 0)
 ,(list 'curveto x-min (/ y-min 1.8) (/ x-min 1.8)
y-min 0 y-min)
 ,(list 'curveto (/ x-max 1.8) y-min x-max (/ y-min
1.8) x-max 0)
 ,(list 'closepath)))
 (command-list (fold-right append '() commands)))
  (ly:make-stencil
   `(path ,thickness `(,@',command-list) 'round 'round ,fill)
   (cons (- x-out-radius) x-out-radius)
   (cons (- y-out-radius) y-out-radius
%%

Cheers,
Pierre

Le jeu. 4 avr. 2019 à 17:33, Pierre Perol-Schneider <
pierre.schneider.pa...@gmail.com> a écrit :

> Hi Dev Team,
> Here's some thougts:
>
> %%
> \version "2.19.83"
>
> %% The oval stencil commands uses beziers curves that cause some side
> effects:
> \markuplist {
>   \line\vcenter {
> "Circle, radius = 2 : "
> \stencil #(make-circle-stencil 2 .13 #f)
>   }
>   \line\vcenter {
> "Oval, x-radius = y-radius = 2 : "
> \stencil #(make-oval-stencil 2 2 .13 #f)
>   }
>   \line\vcenter {
> "Oval extents, x-radius = y-radius = 2 : "
> \box\stencil #(make-oval-stencil 2 2 .13 #f)
>   }
> }
>
> %% Here's a suggestion with a corrected y-radius in order to reach a quasi
> circle:
> #(define-public (make-oval-stencil-var x-radius y-radius thickness fill)
>   "Make an oval from two Bezier curves, of x@tie{}radius @var{x-radius},
>   y@tie{}radius @code{y-radius}, and thickness @var{thickness} with fill
>   defined by @code{fill}."
> (let*
> ((x-out-radius (+ x-radius (/ thickness 2.0)))
>  (y-out-radius (+ y-radius (/ thickness 2.0)))
>  (x-max x-radius)
>  (x-min (- x-radius))
>  (y-max (* y-radius (+ 1 (/ 1 3 ; <= max deviation < 1%
>  (y-min (* (- y-radius) (+ 1 (/ 1 3 ; <= max deviation < 1%
>  (commands `(,(list 'moveto x-max 0)
>  ,(list 'curveto x-max y-max x-min y-max x-min 0)
>  ,(list 'curveto x-min y-min x-max y-min x-max 0)
>  ,(list 'closepath)
>  ))
>  (command-list (fold-right append '() commands)))
>   (ly:make-stencil
>`(path ,thickness `(,@',command-list) 'round 'round ,fill)
>(cons (- x-out-radius) x-out-radius)
>(cons (- y-out-radius) y-out-radius
>
>
> \markuplist {
>   % Test #1:
>   \line\vcenter {
> "make-oval-stencil-var: "
> \box\stencil #(make-oval-stencil-var 2 2 .13 #f)
> " v.s. make-circle-stencil: "
> \box\stencil #(make-circle-stencil 2 .13 #f)
>   }
>   % Test #2:
>   \vspace #1 "make-oval-stencil-var & make-circle-stencil combined:"
> \vspace #.3
>   \translate #'(8 . 0)
>   \line {
> \scale #'(5 . 5) {
>   \combine
>   \with-color #blue
>   \draw-circle #2 #.13 ##f
>   \with-color #red
>   \stencil #(make-oval-stencil-var 2 2 .13 #f)
> }
> \scale #'(5 . 5) {
>   \combine
>   \with-color #red
>   \stencil #(make-oval-stencil-var 2 2 .13 #f)
>   \with-color #blue
>   \draw-circle #2 #.13 ##f
> }
>   }
>   \vspace #1
> }
>
> %% Here comes a suggestion for the markup command:
> #(define-public (oval-stencil-var stencil thickness x-padding y-padding)
>   "Add an oval around @code{stencil}, padded by the padding pair,
> producing a var stencil."
>   (let* ((x-ext (ly:stencil-extent stencil X))
>  (y-ext (ly:stencil-extent stencil Y))
>  (x-length (+ (interval-length x-ext) x-padding thickness))
>  (y-length (+ (interval-length y-ext) y-padding thickness))
>  (x-radius (* 0.707 x-length) )
>  (y-radius (* 0.707 y-length) )
>  (oval (make-oval-stencil-var x-radius y-radius thickness #f)))
>
> (ly:stencil-add
>  stencil
>  (ly:stencil-translate oval
>(cons
> (interval-center x-ext)
> (interval-center y-ext))
>
> #(define-markup-command (oval-var layout props arg)
>   (markup?)
>   #:category graphic
>   #:properties ((thickness 1)
> (font-size 0)
> (x-padding .1) ; <= possible corrected padding
> (y-padding .1)) ; <= possible corrected padding
>   "
> @cindex drawing oval around text
>
> Draw an oval around @var{arg}.  Use 

Oval stencil and oval markup suggestions

2019-04-04 Thread Pierre Perol-Schneider
Hi Dev Team,
Here's some thougts:

%%
\version "2.19.83"

%% The oval stencil commands uses beziers curves that cause some side
effects:
\markuplist {
  \line\vcenter {
"Circle, radius = 2 : "
\stencil #(make-circle-stencil 2 .13 #f)
  }
  \line\vcenter {
"Oval, x-radius = y-radius = 2 : "
\stencil #(make-oval-stencil 2 2 .13 #f)
  }
  \line\vcenter {
"Oval extents, x-radius = y-radius = 2 : "
\box\stencil #(make-oval-stencil 2 2 .13 #f)
  }
}

%% Here's a suggestion with a corrected y-radius in order to reach a quasi
circle:
#(define-public (make-oval-stencil-var x-radius y-radius thickness fill)
  "Make an oval from two Bezier curves, of x@tie{}radius @var{x-radius},
  y@tie{}radius @code{y-radius}, and thickness @var{thickness} with fill
  defined by @code{fill}."
(let*
((x-out-radius (+ x-radius (/ thickness 2.0)))
 (y-out-radius (+ y-radius (/ thickness 2.0)))
 (x-max x-radius)
 (x-min (- x-radius))
 (y-max (* y-radius (+ 1 (/ 1 3 ; <= max deviation < 1%
 (y-min (* (- y-radius) (+ 1 (/ 1 3 ; <= max deviation < 1%
 (commands `(,(list 'moveto x-max 0)
 ,(list 'curveto x-max y-max x-min y-max x-min 0)
 ,(list 'curveto x-min y-min x-max y-min x-max 0)
 ,(list 'closepath)
 ))
 (command-list (fold-right append '() commands)))
  (ly:make-stencil
   `(path ,thickness `(,@',command-list) 'round 'round ,fill)
   (cons (- x-out-radius) x-out-radius)
   (cons (- y-out-radius) y-out-radius


\markuplist {
  % Test #1:
  \line\vcenter {
"make-oval-stencil-var: "
\box\stencil #(make-oval-stencil-var 2 2 .13 #f)
" v.s. make-circle-stencil: "
\box\stencil #(make-circle-stencil 2 .13 #f)
  }
  % Test #2:
  \vspace #1 "make-oval-stencil-var & make-circle-stencil combined:"
\vspace #.3
  \translate #'(8 . 0)
  \line {
\scale #'(5 . 5) {
  \combine
  \with-color #blue
  \draw-circle #2 #.13 ##f
  \with-color #red
  \stencil #(make-oval-stencil-var 2 2 .13 #f)
}
\scale #'(5 . 5) {
  \combine
  \with-color #red
  \stencil #(make-oval-stencil-var 2 2 .13 #f)
  \with-color #blue
  \draw-circle #2 #.13 ##f
}
  }
  \vspace #1
}

%% Here comes a suggestion for the markup command:
#(define-public (oval-stencil-var stencil thickness x-padding y-padding)
  "Add an oval around @code{stencil}, padded by the padding pair,
producing a var stencil."
  (let* ((x-ext (ly:stencil-extent stencil X))
 (y-ext (ly:stencil-extent stencil Y))
 (x-length (+ (interval-length x-ext) x-padding thickness))
 (y-length (+ (interval-length y-ext) y-padding thickness))
 (x-radius (* 0.707 x-length) )
 (y-radius (* 0.707 y-length) )
 (oval (make-oval-stencil-var x-radius y-radius thickness #f)))

(ly:stencil-add
 stencil
 (ly:stencil-translate oval
   (cons
(interval-center x-ext)
(interval-center y-ext))

#(define-markup-command (oval-var layout props arg)
  (markup?)
  #:category graphic
  #:properties ((thickness 1)
(font-size 0)
(x-padding .1) ; <= possible corrected padding
(y-padding .1)) ; <= possible corrected padding
  "
@cindex drawing oval around text

Draw an oval around @var{arg}.  Use @code{thickness},
@code{x-padding}, @code{x-padding} and @code{font-size} properties to
determine
line thickness and padding around the markup.

@lilypond[verbatim,quote]
\\markup {
  \\oval-var {
Hi
  }
}
@end lilypond"
  (let ((th (* (ly:output-def-lookup layout 'line-thickness)
   thickness))
(pad-x (* (magstep font-size) x-padding))
(pad-y (* (magstep font-size) y-padding))
(m (interpret-markup layout props arg)))
(oval-stencil-var m th pad-x pad-y)))


%% Comparative test:
\markup {
  "oval: "
  \box\oval "Hi"
  " v.s. oval-var markups: "
  \box\oval-var "Hi"
}

%

Cheers,
Pierre
___
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel


Re: GSoC in contemporary notations

2019-04-04 Thread Urs Liska

Hi Tsz Kiu,

Am 03.04.19 um 13:48 schrieb Tsz Kiu Pang:

Hi Urs,

Whether or not I'll be suitable to participate in GSoC, I am keen to 
dive into openlilylib.



That would be great!




On Thu, 21 Mar 2019 at 17:58, Urs Liska > wrote:



What you should do now is:

  * [of course dive more into Scheme]
  * get an understanding of openLilyLib with
    a) https://github.com/openlilylib/oll-core/wiki
    b) the code in that repository
    c) looking at how other openLilyLib packages are built within that
    infrastructure
  * Form an idea how a contemporary notation package could be
approached
    and discuss that with us
  * Find some small things you could do to openLilyLib package(s)
to a)
    practice and b) give us an opportunity to assess your work. If we
    have some idea about your current familiarity with the matter
we can
    find some suggestions for that.

I was looking at the issues page on oll-core and there were a couple 
that you opened two weeks ago.
Also, it seems like there is quite a number of TODOs in the codes (in 
oll-core/scheme, oll-core/util, and oll-core/internal).
I am just wondering would these be "some small things" that I can do 
to the oll package?



Most of the items on the issue tracker don't look like suitable 
first-time tasks. But there are actually two issues you could have a 
look at, both having to do with module loading. This may not be as 
attractive as adding shiny new features, but I think it is a good way to 
get a better understanding of how things are working in there.


https://github.com/openlilylib/oll-core/issues/43
https://github.com/openlilylib/oll-core/issues/39

43 is actually a "current" idea, but 39 is a limitation that really 
should be removed - especially since just last week someone else 
stumbled over the problem.


Both issues could be tackled by looking at the module handling code.

Handling metadata (issue 43) is done within \loadPackage, so you can 
follow the procedure calls to see how that package.cnf file is processed 
and metadata registered. \loadModule would then have to check not only 
(as it currently does) whether the entry file is found on disk but also 
(and before) whether the requested module is registered in the package's 
metadata.


Preloading package/module options would basically work by integrating a 
workaround. Currently options are set after a package or module has been 
successfully loaded. This means that *while loading* the package or 
module the user option is not available yet. Essentially using the \with 
{} clause to set options is currently only a nice way to do the 
package/module configuration for a user file, but user-provided options 
can't be used to control the way the package/module is *loaded*. I see 
two appraoches on how to solve the problem, and both are described in 
the issue on Github. [Edit: Actually I think the approach I just thought 
of and added as a comment there is the way to go]


Having thought of all this and doing some investigation *while* writing 
this email I came to the conclusion that looking into issue 39 with the 
approach described in 
https://github.com/openlilylib/oll-core/issues/39#issuecomment-479813636 
should be a good idea to start with, both getting a good idea how things 
work in oll-core and providing some very valuable improvement.


Best
Urs



Kind regards,
Tsz Kiu


HTH
Urs

>
> Kind regards,
> Tsz-Kiu
> ___
> lilypond-devel mailing list
> lilypond-devel@gnu.org 
> https://lists.gnu.org/mailman/listinfo/lilypond-devel
___
lilypond-devel mailing list
lilypond-devel@gnu.org 
https://lists.gnu.org/mailman/listinfo/lilypond-devel


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