4 texidoc
= "When switching between time signatures, it is
5 often advisable to explicitly indicate a beat equivalence
6 between two written durations."
12 #(set-paper-size
"a6")
15 #(use-modules
(ice-
9 regex
))
18 #(define-music-function
(str
) (string?
)
20 (define
(parse-my-duration duration-string
)
21 "Parse the `duration-string', e.g. ''4..'' or ''breve.'',
22 and return a (log dots) list.
23 Unlike the original `parse-simple-duration',
24 this function is whitespace-insensitive."
25 (let
* ((duration-string
(string-trim-both duration-string
))
26 (match
(regexp-exec
(make-regexp
"(breve|longa|maxima|[0-9]+)(\\.*)")
28 (if
(and match
(string
=? duration-string
(match
:substring match
0)))
29 (let
((len
(match
:substring match
1))
30 (dots
(match
:substring match
2)))
31 (list
(cond
((string
=? len
"breve") -
1)
32 ((string
=? len
"longa") -
2)
33 ((string
=? len
"maxima") -
3)
34 (else
(log
2 (string-
>number len
))))
35 (if dots
(string-length dots
) 0)))
36 (ly
:error
(_ "not a valid duration string: ~a") duration-string
))))
38 (let
* ((mark-ev
(make-music
'MarkEvent
))
39 (mark-ch
(make-event-chord
(list mark-ev
)))
40 (equiv-lst
(string-split str
#\
= ))
41 (before
(parse-my-duration
(car equiv-lst
)))
42 (after
(parse-my-duration
(cadr equiv-lst
)))
43 (before-mark
(make-note-by-number-markup
(car before
) (cadr before
) 1))
44 (after-mark
(make-note-by-number-markup
(car after
) (cadr after
) 1))
48 (make-general-align-markup Y DOWN
49 (make-smaller-markup before-mark
))
50 (make-simple-markup
" ")
51 (make-simple-markup
"=")
52 (make-simple-markup
" ")
53 (make-general-align-markup Y DOWN
54 (make-smaller-markup after-mark
))
56 (mark-set
(context-spec-music
57 (make-property-set
'rehearsalMark equiv-mark
)
59 (ly
:music-set-property
! mark-ev
'origin
(*location
*))
60 (ly
:music-set-property
! mark-ev
'label equiv-mark
)