lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: arranger.ly and lilypond 2.21+: error with the \note markup command


From: Aaron Hill
Subject: Re: arranger.ly and lilypond 2.21+: error with the \note markup command
Date: Fri, 15 Jan 2021 19:27:30 -0800
User-agent: Roundcube Webmail/1.4.9

On 2021-01-15 4:10 pm, Thomas Morley wrote:
Am Fr., 15. Jan. 2021 um 23:26 Uhr schrieb Stefano Troncaro
<stefanotroncaro@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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]