On 10/16/2019 8:59 PM, Paul Scott
wrote:
Is it possible to write a time signature 4 / \breve ?
This occurs in Carmina Burana.
Thank you for any ideas,
Paul
Hi Paul,
Does this help get you close to what you're looking for?
(see attached)
%%%%%%%%%%%%%%%
\version "2.19.83"
#(use-modules (ice-9 regex))
my-format-procedure =
#(define-scheme-function (parser location args)(pair?)
#{
\markup
\concat {
\number $(car args)
\raise #-0.9 \huge "/"
\small
\override #'(style . default)
\note $(cdr args) #DOWN
}
#})
%% alternative:
%{
my-format-procedure =
#(define-scheme-function (parser location args)(pair?)
#{
\markup
\override #'(baseline-skip . 0.5)
\column {
\number $(car args)
\override #'(style . default)
\note $(cdr args) #DOWN
}
#})
%}
#(define ((format-time-sig-with-note frac trim?) grob)
(let* ((num (if (pair? frac) (car frac) 4))
(den (if (pair? frac) (cdr frac) 4))
(args
(cond ((string? den)
(cons (number->string num)
den))
((and (integer? (/ num 3))
(integer? (/ den 2)))
(cons (number->string (if trim? (/ num 3) num))
(if trim?
(string-append (number->string (/ den 2))
".")
(number->string den))))
((and (integer? (/ num 2))
(integer? (/ den 2)))
(cons (number->string (if trim? (/ num 2) num))
(number->string (if trim? (/ den 2) den))))
(else
(cons (number->string num)
(number->string den))))))
(grob-interpret-markup grob #{ \my-format-procedure $args
#})))
time =
#(define-music-function (parser location trm vals)((boolean? #t)
pair?)
;; c/p from define-makups.scm
(define log2
(let ((divisor (log 2)))
(lambda (z) (inexact->exact (/ (log z) divisor)))))
;; c/p from define-makups.scm
(define (parse-simple-duration duration-string)
"Parse the `duration-string', eg ''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))))
(let* ((den (cdr vals))
(num (car vals)))
(if (string? den)
(let* ((parsed (parse-simple-duration den)))
;; TODO lazy bump ...
(cond ((and (= -1 (car parsed)) (zero? (cadr parsed)))
(set! den 1)
(set! num (* 2 num)))
((and (= -1 (car parsed)) (= 1 (cadr parsed)))
(set! den 1)
(set! num (* 3 num)))
((and (= -2 (car parsed)) (zero? (cadr parsed)))
(set! den 1)
(set! num (* 4 num)))
((and (= -2 (car parsed)) (= 1 (cadr parsed)))
(set! den 1)
(set! num (* 6 num)))
(else (ly:error "not smart enough to handle ~a"
den)))))
#{
\temporary \override Staff.TimeSignature.stencil =
#(format-time-sig-with-note vals trm)
$(make-music
'TimeSignatureMusic
'beat-structure '()
'denominator den
'numerator num)
#}))
\relative c' {
\override Staff.TimeSignature.Y-offset = 5
\time 9/4
\repeat unfold 9 c4
\time 3/4
\repeat unfold 3 c4
\time ##f 3/4
\repeat unfold 3 c4
\time 7/4
\repeat unfold 7 c4
\time 12/2
\repeat unfold 4 c1.
\time #'(3 . "breve.")
\repeat unfold 3 c\breve.
\time #'(3 . "longa")
\repeat unfold 3 c\longa
\time #'(4 . "longa.")
\repeat unfold 4 c\longa.
\time #(cons 4 "breve")
\clef bass
f\breve-> c-> d-> c->
\bar"|."
}