Update syntax for (*location*) callbacks
[opus_libre.git] / doc / snippets / meter-equivalences.ly
blob23b2557cd2c5aea255b50f8939745913d93a121a
1 \version "2.19"
3 \header {
4 texidoc = "When switching between time signatures, it is
5 often advisable to explicitly indicate a beat equivalence
6 between two written durations."
8 tagline = ##f
11 \paper {
12 #(set-paper-size "a6")
15 #(use-modules (ice-9 regex))
17 equiv =
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]+)(\\.*)")
27 duration-string)))
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 (log2 (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))
45 (equiv-mark
46 (make-concat-markup
47 (list
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))
55 )))
56 (mark-set (context-spec-music
57 (make-property-set 'rehearsalMark equiv-mark)
58 'Score)))
59 (ly:music-set-property! mark-ev 'origin (*location*))
60 (ly:music-set-property! mark-ev 'label equiv-mark)
61 mark-ch))
63 \relative c' {
64 \time 6/8
65 d8 e f e d e |
66 \time 3/4
67 \equiv "8 = 8"
68 g4 g g