Hi Pierre, Sylvius,
I did some tests to get a better understanding of lilypond's handling
of markup. Below is an even more condensed version and also an
iterative solution in comparison for anybody interested in scheme
programming: Both functions should create the same result; the first
is somewhat more sexy not needing (re)assignment, but the second
version might be easier to understand for people not familiar with
functional expressions like "fold".
Sorry for the continued noise, but I thought I'd post it in case it is
helpful for somebody on the list.
--
Orm
%circled-pattern
#(define-markup-command
(circled-pattern layout props radius angle num arg)
(number? number? number? markup?)
(interpret-markup layout props
(let ((rep (abs num)))
(cond
((= num 0) (markup ""))
((= num 1) arg)
(#t (fold
(lambda (i prev)
(markup
(#:combine
(#:rotate
(* i (/ angle rep))
(#:concat (#:null #:hspace radius arg)))
prev)))
(markup (#:null))
(iota (1+ rep))))))))
#(define-markup-command
(circled-pattern-iterative layout props radius angle num arg)
(number? number? number? markup?)
(interpret-markup layout props
(let ((rep (abs num)))
(cond
((= num 0) (markup ""))
((= num 1) arg)
(#t (do ((i 0 (1+ i))
(res (markup (#:null))
(markup
(#:combine
(#:rotate
(* i (/ angle rep))
(#:concat (#:null #:hspace radius arg)))
res))))
((= i (1+ rep)) res)))))))
testOne = \markup "."
testTwo = \markup { "!" }
\markup\circled-pattern-iterative #5 #180 #15 \testOne
\markup\circled-pattern #5 #-180 #15 \testOne
\markup\circled-pattern #5 #180 #2 \testOne
\markup\circled-pattern #5 #180 #1 \testOne
\markup\circled-pattern #5 #180 #0 \testOne
\markup\circled-pattern #5 #180 #6 \testTwo
Am Samstag, den 07. Juli 2018 um 17:45:58 Uhr (+0200) schrieb sylvius:
> This is brilliant!
>
> Thanks to all for the various solutions!
>
> > On 7. Jul 2018, at 16:18, Pierre Perol-Schneider
> > <[email protected]> wrote:
> >
> > But of course !! Thanks very much Orm !
> > Cheers,
> > Pierre
> >
> > 2018-07-07 16:15 GMT+02:00 Orm Finnendahl
> > <[email protected]>:
> > Hi Pierre,
> >
> > Am Samstag, den 07. Juli 2018 um 15:54:41 Uhr (+0200) schrieb Pierre
> > Perol-Schneider:
> > > Plus : any idea why 'testTwo does not work ?
> >
> > because the argument type of "arg" was string?. Below is the updated
> > version:
> >
> > --
> > Orm
> >
> >
> > %circled-pattern
> > #(define-markup-command
> > (circled-pattern layout props radius angle num arg)
> > (number? number? number? markup?)
> > (interpret-markup layout props
> > (let ((rep (abs num)))
> > (cond
> > ((= num 0) (markup ""))
> > ((= num 1) (markup arg))
> > (#t (markup
> > (#:combine
> > (#:null)
> > (fold
> > (lambda (i prev)
> > (markup
> > (#:combine
> > (#:rotate
> > (* i (/ angle rep))
> > (#:concat (#:null #:hspace radius arg)))
> > prev)))
> > (markup (#:null))
> > (iota (1+ rep))))))))))
> >
> > testOne = \markup "."
> > testTwo = \markup { \rotate #45 "!" }
> >
> > \markup\circled-pattern #5 #180 #15 \testOne
> > \markup\circled-pattern #5 #-180 #15 \testOne
> > \markup\circled-pattern #5 #180 #2 \testOne
> > \markup\circled-pattern #5 #180 #1 \testOne
> > \markup\circled-pattern #5 #180 #0 \testOne
> >
> > \markup\circled-pattern #5 #360 #5 \testTwo
> >
> >
> > _______________________________________________
> > lilypond-user mailing list
> > [email protected]
> > https://lists.gnu.org/mailman/listinfo/lilypond-user
>
>
> _______________________________________________
> lilypond-user mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/lilypond-user
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user