lilypond-user
[Top][All Lists]
Advanced

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

Re: time signature 4 / \breve ?


From: Ben
Subject: Re: time signature 4 / \breve ?
Date: Wed, 16 Oct 2019 21:14:28 -0400
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0

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"|."
}

Attachment: carmina-test.png
Description: PNG image


reply via email to

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