lilypond-user
[Top][All Lists]
Advanced

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

Re: Multi-rest with automatic bar number before and after it


From: Thomas Morley
Subject: Re: Multi-rest with automatic bar number before and after it
Date: Sun, 7 Aug 2016 21:21:29 +0200

Hi Arne,

2016-08-07 12:54 GMT+02:00 arnepe <address@hidden>:
> hello,
>
> in my case, Lily throws an errror when compiling music starting with a
> \partial.
> Otherwise it compiles fine.
>
> see attached file
> debug-mmr.txt
> <http://lilypond.1069038.n5.nabble.com/file/n193523/debug-mmr.txt>
>
> /(hope that the file uploads correctly - haven't tried it before...)/
>
> greetings
> Arne Peters



thanks for testing.
I now come up with:

\version "2.19.45"

%% 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 start)
         " - "
         #(number->string (1- stop))
       }
    }
#})

#(define (mmr-range-engraver context)
"Print the range of a @code{MultiMeasureRest}, if the context-property
@code{printMmrRange} is set @code{#t}."
  (let ((print-mmr-nmbr-list '())
        (mmr-bar-numbr-list '()))

    `((acknowledgers
        (multi-measure-interface
         .
         ,(lambda (engraver grob source-engraver)
            (if (eq? (grob::name grob) 'MultiMeasureRestNumber)
                (set! print-mmr-nmbr-list
                  (cons
                    (cons
                      grob
                      (ly:context-property context 'printMmrRange #f))
                    print-mmr-nmbr-list)))
            (if (eq? (grob::name grob) 'MultiMeasureRest)
                (begin
                  (set! mmr-bar-numbr-list
                    (cons
                      (cons
                        grob
                        (ly:context-property context 'currentBarNumber))
                      mmr-bar-numbr-list)))))))
      (finalize
        .
        ,(lambda (trans)
          (for-each
            (lambda (mmr mmr-nmbr)
              (let ((measure-count (ly:grob-property (car mmr) 'measure-count)))
                (if (and (cdr mmr-nmbr) (> measure-count 1))
                    (ly:grob-set-property! (car mmr-nmbr) 'text
                      (formatMMRNumber
                        (cdr mmr)
                        (+ measure-count (cdr mmr)))))))
            mmr-bar-numbr-list
            print-mmr-nmbr-list)
          (set! print-mmr-nmbr-list '())
          (set! mmr-bar-numbr-list '()))))))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 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
      \partial 4 c'4
    c'2 c'8
    \compressFullBarRests
    R1*5/8*15
    c'2 c'8
    R1*5/8*13
    c'2 cis'8
  }
  \layout {
    \context {
      \Voice
      \consists #mmr-range-engraver
      printMmrRange = ##t
    }
  }
}


I didn't manage to completely find my way through the hints David K gave here:
http://lists.gnu.org/archive/html/lilypond-user/2016-08/msg00033.html
At least it works now with upbeats and looks generel more robust.

Though, there still may be issues.

@all: Please test. I need the feed-back.


Cheers,
  Harm

Attachment: print-MMR-range-engraver-02.ly
Description: Text Data


reply via email to

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