On 2020-09-16 4:13 pm, Aaron Hill wrote:
On 2020-09-16 12:09 pm, Lukas-Fabian Moser wrote:
I'm sure more knowledgeable people will be able to provide more
insightful answers, but for what it's worth: Looking at
lily/parser.yy, I see
tempo_event:
TEMPO steno_duration '=' tempo_range {
$$ = MAKE_SYNTAX (tempo, @$, SCM_EOL, $2, $4);
}
| TEMPO text steno_duration '=' tempo_range {
$$ = MAKE_SYNTAX (tempo, @$, $2, $3, $5);
}
| TEMPO text {
$$ = MAKE_SYNTAX (tempo, @$, $2);
} %prec ':'
;
which I take to mean: The three forms
* \tempo 4 = 96
* \tempo Crazy 4 = 260-270
* \tempo "Sluggishly slow"
are hardcoded as variants into the parser. My guess is that this might
be hard (or impossible) to accomplish in a music function.
You just need to be a little creative. Consider:
%%%%
\version "2.20.0"
#(define (tempo? arg)
(and (ly:music? arg)
(not (null? (extract-typed-music arg 'tempo-change-event)))))
doSomethingWithATempo =
#(define-void-function
(tempo)
(tempo?)
(set! tempo (first (extract-typed-music tempo 'tempo-change-event)))
(let ((tempo-unit (ly:prob-property tempo 'tempo-unit #f))
(metronome-count (ly:prob-property tempo 'metronome-count #f))
(text (ly:prob-property tempo 'text #f)))
(format #t "\nTempo: ~s"
(list (cons 'tempo-unit tempo-unit)
(cons 'metronome-count metronome-count)
(cons 'text text)))))
\doSomethingWithATempo \tempo 4 = 60
\doSomethingWithATempo \tempo "Text" 4 = 60
\doSomethingWithATempo \tempo "Text"
%%%%
====
GNU LilyPond 2.20.0
Processing `tempo-function.ly'
Parsing...
Tempo: ((tempo-unit . #<Duration 4 >) (metronome-count . 60) (text .
#f))
Tempo: ((tempo-unit . #<Duration 4 >) (metronome-count . 60) (text .
"Text"))
Tempo: ((tempo-unit . #f) (metronome-count . #f) (text . "Text"))
Success: compilation successfully completed
====
Oops, I meant to include a test case for a tempo range:
%%%%
\doSomethingWithATempo \tempo "Text" 4 = 60-75
%%%%
====
Tempo: ((tempo-unit . #<Duration 4 >) (metronome-count 60 . 75) (text .
"Text"))
====
In summary, tempo-unit is ly:duration?; metronome-count is either
number? or number-pair?; and text is markup?.
-- Aaron Hill