This is great work! It's exactly what I need but it threw me a bunch of
errors. I'll try to put together an example to show you.

Craig


On 20 February 2016 at 22:41, Thomas Morley <thomasmorle...@gmail.com>
wrote:

> 2016-02-19 4:23 GMT+01:00 Craig Dabelstein <craig.dabelst...@gmail.com>:
> > Hi Harm,
> >
> > I discovered a problem. It works perfectly with 4/4 time but it doesn't
> work
> > with other time signatures. Can you suggest to me how I can make it work
> for
> > different time signatures?
> >
> > All the best,
> >
> > Craig
>
>
>
> I found no way to make it work with all possible \time-settings via
> \applyOutput
>
> Hence the engraver below. (Also attached.)
> Formating is done in a scheme-function `formatMMRNumber'. Thanks David
> for the hint to `translated-scale'
> Printing of the range may be enabled/disabled by setting the new
> defined context-property `printMmrRange'.
>
> Some remarks/TODOs, especially:
> Why I cannot _create_ a MultiMeasureRestText-grob via
> `ly:engraver-make-grob'?
> It works for TextScript ...
>
> \version "2.19.36"
>
> %% define the custom context-property `printMmrRange'
> #(define (define-translator-property symbol type? description)
>   (if (not (and (symbol? symbol)
>     (procedure? type?)
>     (string? description)))
>       (ly:error "error in call of define-translator-property"))
>   (if (not (equal? (object-property symbol 'translation-doc) #f))
>       (ly:error (_ "symbol ~S redefined") symbol))
>
>   (set-object-property! symbol 'translation-type? type?)
>   (set-object-property! symbol 'translation-doc description)
>   symbol)
>
> #(for-each
>   (lambda (x)
>     (apply define-translator-property x))
>     `((printMmrRange
>        ,boolean?
>        "Print range of a MultiMeasureRest")))
>
> %% define how to format `start' and `stop'
> %% for `MultiMeasureRestNumber' in the engraver
> %% TODO find a method to set the values for `translate-scaled'
> formatMMRNumber =
> #(define-scheme-function (start stop)(integer? integer?)
> #{
>   \markup
>     \center-column {
>        #(number->string (- stop start))
>        %% value found by try and error
>        \translate-scaled #'(0 . -6.5)
>        \with-dimensions #empty-interval #empty-interval
>        \halign #CENTER
>        \normal-text
>        \fontsize #-2
>        \line {
>          #(number->string (1+  start))
>          " - "
>          #(number->string stop)
>        }
>     }
> #})
>
> %% TODO
> %% I didn't manage to _create_ a MultiMeasureRestText-grob via
> %% `ly:engraver-make-grob'
> %% How to do?
> %% It worked with simple TextScript ...
> #(define (mmr-range-engraver context)
> "Print the range of a @code{MultiMeasureRest}, if the context-property
> @code{printMmrRange} is set @code{#t}."
>   (let ((m-m-r-print '()))
>     `((acknowledgers
>         (multi-measure-interface
>          . ,(lambda (engraver grob source-engraver)
>             (if (eq? (grob::name grob) 'MultiMeasureRestNumber)
>                 (set! m-m-r-print
>                   (cons
>                     (cons grob (ly:context-property context
> 'printMmrRange))
>                     m-m-r-print))))))
>       (finalize
>         .
>         ,(lambda (trans)
>           (let* ((timeSignatureFraction
>                    (ly:context-property context 'timeSignatureFraction))
>                  (fraction
>                    (/ (car timeSignatureFraction) (cdr
> timeSignatureFraction))))
>           (for-each
>             (lambda (mmr)
>               (if (and (cdr mmr) (not (null? (cdr mmr))))
>                   (let* ((m-m-r-start
>                            (/ (ly:moment-main
>                                 (grob::when (ly:spanner-bound (car mmr)
> LEFT)))
>                               fraction))
>                          (m-m-r-stop
>                            (/ (ly:moment-main
>                                 (grob::when (ly:spanner-bound (car mmr)
> RIGHT)))
>                               fraction)))
>                     (ly:grob-set-property! (car mmr) 'text
>                       (formatMMRNumber m-m-r-start m-m-r-stop)))))
>             m-m-r-print)
>           (set! m-m-r-print '())))))))
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> %% EXAMPLES
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> \layout {
>   \override Score.BarNumber.break-visibility = ##(#t #t #t)
> }
>
> \score {
>   {
>     \time 3/4
>     c'2.
>     \compressFullBarRests
>     R2.*14
>     c'2.
>     \once \unset printMmrRange
>     R2.*15
>     c'2.
>     R2.*15
>     c'2.
>   }
>   \layout {
>     \context {
>       \Voice
>       \consists #mmr-range-engraver
>       printMmrRange = ##t
>     }
>   }
> }
>
> \score {
>   {
>     \time 3/4
>     c'2.
>     \compressFullBarRests
>     R2.*14
>     c'2.
>     \once \set printMmrRange = ##t
>     R2.*15
>     c'2.
>     R2.*15
>     c'2.
>   }
>   \layout {
>     \context {
>       \Voice
>       \consists #mmr-range-engraver
>       printMmrRange = ##f
>     }
>   }
> }
>
> \score {
>   {
>     \time 3/4
>     c'2.
>     \compressFullBarRests
>     R1*3/4*14
>     c'2.
>   }
>   \layout {
>     \context {
>       \Voice
>       \consists #mmr-range-engraver
>       printMmrRange = ##t
>     }
>   }
> }
>
> \score {
>   {
>     c'1
>     \compressFullBarRests
>     R1*14
>     c'1
>   }
>   \layout {
>     \context {
>       \Voice
>       \consists #mmr-range-engraver
>       printMmrRange = ##t
>     }
>   }
> }
>
> \score {
>   {
>     \time 5/8
>     c'2 c'8
>     \compressFullBarRests
>     R1*5/8*14
>     c'2 c'8
>     R1*5/8*13
>     c'2 c'8
>   }
>   \layout {
>     \context {
>       \Voice
>       \consists #mmr-range-engraver
>       printMmrRange = ##t
>     }
>   }
> }
>
> HTH,
>   Harm
>
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to