In the attached file, I made a macro \count such that
a^\count a^\count a^\count is understood as a^"1" a^"2" a^"3"...
I also wrote a macro \repeatWithCount such that
\repeatWithCount 3 { a^\acount } also evaluates to a^"1" a^"2" a^"3".
However, (for aesthetic reasons!) I would prefer to use \count in both
situations. Is it possible to modify the \repeatWithCount function so
that it basically says
(set! count count-auto)
(do the \repeatWithCount work)
(set! count count-manual)
?
If I directly define
repeatWithCount = #(define-music-function (parser location n music) ...)
then the 'music' parameter is evaluated before repeatWithCount gets
its chance to redefine \count. If this were TeX, I could say something like
\def\repeatWithCount{\def\count\countAuto \RealRepeatWithCount}
\def\RealRepeatWithCount#1#2{ % do the work, then
\def\count\countManual}
However, trying something like this (i.e. returning
#{ \RealRepeatWithoutCount #}) does not work in Lilypond. Is there a
way to do this?
Thanks,
--
Jérôme
\version "2.18.2"
% Counting notes %<<<
#(begin
; manual counting
(define music-note-count 0)
(define czero (define-music-function (parser location) ()
(set! music-note-count 0) #{ #}))
(define cset (define-music-function (parser location x) (number?)
(set! music-note-count x) #{ #} ))
(define (make-count-markup n)
(markup #:fontsize -1 #:bold #:sans (number->string n)))
(define counter-manual (define-music-function (parser location) ()
(set! music-note-count (+ 1 music-note-count))
(make-music 'TextScriptEvent 'direction 1 'text
(make-count-markup music-note-count))
))
; automatic counting
(define counter-symbol 'Counter)
(define counter-auto (make-music 'TextScriptEvent 'direction 1
'text counter-symbol))
(define acount counter-auto)
(define count counter-manual)
(define (substitute-count music n)
(let* (
(name (ly:music-property music 'name))
(prop (ly:music-mutable-properties music))
(out (list name))
(add-out! (lambda (s v) (set! out (append! out (list s v)))))
) (map (lambda (x) (let* (
(s (car x))
(v (cdr x))
) ; inner let*
(if (eq? s 'element)
(set! v (substitute-count v n)))
(if (member s '(elements articulations))
(set! v (map (lambda (y) (substitute-count y n)) v)))
(if (and (eq? name 'TextScriptEvent) (eq? s 'text) (eq? v counter-symbol))
(set! v (make-count-markup n)))
(add-out! s v))) ; lambda
prop)
(apply make-music out)
))
(define (repeat-with-count n music)
(make-music 'SequentialMusic 'elements
(map (lambda (i) (substitute-count music (+ 1 i))) (iota n))
)
)
(define repeatWithCount (define-music-function (parser location n music)
(number? ly:music?)
(make-music 'SequentialMusic 'elements
(map (lambda (i) (substitute-count music (+ 1 i))) (iota n))
)
))
) % begin
%>>>
foo = { a4^\count a^\count a^\count }
qux = \repeatWithCount 5 { c'^\acount }
\foo \qux
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user