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: Stefano Troncaro
Subject: Re: arranger.ly and lilypond 2.21+: error with the \note markup command
Date: Sat, 16 Jan 2021 20:03:31 -0300

Harm, Aaron, thank you both for your answers. Both are great solutions!

El sáb, 16 ene 2021 a las 0:27, Aaron Hill (<lilypond@hillvisions.com>) escribió:
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]