On 2021-01-15 4:10 pm, Thomas Morley wrote:
Am Fr., 15. Jan. 2021 um 23:26 Uhr schrieb Stefano Troncaro
<stefanotronc...@gmail.com>:
Hi everyone,
I started learning to use the spectacular arranger.ly library that was
mentioned in the list a while ago.
While most of it works great, I found that internally it sometimes
uses the \note markup command, that changed between versions: in 2.20
it requires an argument of type string, while from 2.21 onwards it
requires an argument of type duration. This causes an error and makes
it so that files that use arranger.ly do not compile on Lilypond 2.21
onwards.
I'm sure it'd be easy to patch. Is there an easy way to transform
strings into durations?
Iiuc, how about:
%% from define-markup-commands
#(use-modules (ice-9 regex))
#(define-public log2
(let ((divisor (log 2)))
(lambda (z) (inexact->exact (/ (log z) divisor)))))
#(define (parse-simple-duration duration-string)
"Parse the `duration-string', e.g. ''4..'' or ''breve.'',
and return a (log dots) list."
(let ((match (regexp-exec (make-regexp
"(breve|longa|maxima|[0-9]+)(\\.*)")
duration-string)))
(if (and match (string=? duration-string (match:substring match
0)))
(let ((len (match:substring match 1))
(dots (match:substring match 2)))
(list (cond ((string=? len "breve") -1)
((string=? len "longa") -2)
((string=? len "maxima") -3)
(else (log2 (string->number len))))
(if dots (string-length dots) 0)))
(ly:error (_ "not a valid duration string: ~a")
duration-string))))
%% and then:
#(define (string->duration strg)
(apply ly:make-duration (parse-simple-duration strg)))
%% test
#(display-scheme-music (string->duration "16.."))
Cheers,
Harm
Here's a back-compat patch that should allow \note to accept strings.
Could be useful until arranger.ly is updated to use ly:durations in
places where it relied on strings before.
%%%%
\version "2.22.0"
#(begin
(define (duration-or-string? arg)
(or (ly:duration? arg) (string? arg)))
(define-markup-command
(note layout props duration dir)
(duration-or-string? number?)
#:category music
#:properties (note-by-number-markup)
(if (string? duration)
(set! duration
(ly:parse-string-expression (ly:parser-clone) duration)))
(note-by-number-markup layout props
(ly:duration-log duration)
(ly:duration-dot-count duration)
dir)))
\markup {
\note { 8. } #DOWN \note "8." #DOWN
\note { \longa*2/3 } #UP \note "\longa*2/3" #UP
}
%%%%
-- Aaron Hill