lilypond-user
[Top][All Lists]
Advanced

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

Re: lilypond: merging rests in polyphonic staff


From: Thomas Morley
Subject: Re: lilypond: merging rests in polyphonic staff
Date: Wed, 2 Sep 2015 01:49:09 +0200

2015-09-01 22:59 GMT+02:00 Martin Lejeune <address@hidden>:
> Hi Everybody,
> here's a newbie question.
> I tried to configure "merging automatically" of rests in polyphonic staffs
> (piano) with a snipped, which I found in the manual.

You likely mean
http://lsr.di.unimi.it/LSR/Item?id=336

Though, please note, it's the "LilyPond Snippet Repository", LSR
The LSR is _not_ part of the manuals.
A lot of snippets are taken from the LSR and included in the snippets-manual.
That's not exactly the same, though ;)

> It doesn't work.

It does.

> What's the mistake, any idea?

If you use a snippet, you have to include the _whole_ snippet into your file!!!!
You deleted the entire definition of `merge-rests-on-positioning'!!!
Additionally, there are several mistakes in your code of the snippet.

Again, if you want to try a snippet copy and paste it in your file
_without_ any changes!
Try it and _afterwards_ you may try to apply changes.

Read the description:
"[...] Please note that multi-measure rests are not automatically combined"


There are engravers on the list you may want to try, affecting simple
rests and MultiMeasureRests, though they are not perfect, either:
http://www.mail-archive.com/lilypond-user%40gnu.org/msg69703.html


>
> Thanks very much!
>
> Cheers
> Martin
>
> PS:
>
> My example:

Your example could be then:

#(define has-one-or-less (lambda (lst) (or (null? lst) (null? (cdr lst)))))
#(define has-at-least-two (lambda (lst) (not (has-one-or-less lst))))
#(define (all-equal lst pred)
  (or (has-one-or-less lst)
      (and (pred (car lst) (cadr lst)) (all-equal (cdr lst) pred))))

#(define merge-rests-engraver
   (lambda (context)
     (let ((rest-same-length
             (lambda (rest-a rest-b)
               (eq? (ly:grob-property rest-a 'duration-log)
(ly:grob-property rest-b 'duration-log))))
           (rests '()))
     `((start-translation-timestep . ,(lambda (trans)
                                        (set! rests '())))
       (stop-translation-timestep . ,(lambda (trans)
                                       (if (and (has-at-least-two rests)
                                             (all-equal rests rest-same-length))
                                         (for-each
                                           (lambda (rest)
(ly:grob-set-property! rest 'Y-offset 0))
                                           rests))))
       (acknowledgers
         (rest-interface . ,(lambda (engraver grob source-engraver)
                              (if (eq? 'Rest (assoc-ref
(ly:grob-property grob 'meta) 'name))
                                (set! rests (cons grob rests))))))))))

#(define merge-mmrests-engraver
   (lambda (context)
     (let* ((mmrest-same-length
              (lambda (rest-a rest-b)
                (eq? (ly:grob-property rest-a 'measure-count)
                     (ly:grob-property rest-b 'measure-count))))
            (merge-mmrests
              (lambda (rests)
                (if (all-equal rests mmrest-same-length)
                  (let ((offset
                          (if
                           (eq? (ly:grob-property (car rests) 'measure-count) 1)
                           1 0)))
                    (for-each
                      (lambda (rest)
                        (ly:grob-set-property! rest 'Y-offset offset))
                      rests)))))
            (curr-rests '())
            (rests '()))
     `((start-translation-timestep . ,(lambda (trans)
                                        (set! curr-rests '())))
       (stop-translation-timestep . ,(lambda (trans)
                                       (if (has-at-least-two curr-rests)
                                         (set! rests (cons curr-rests rests)))))
       (finalize . ,(lambda (translator)
                      (for-each merge-mmrests rests)))
       (acknowledgers
         (rest-interface . ,(lambda (engraver grob source-engraver)
                              (if (eq? 'MultiMeasureRest (assoc-ref
(ly:grob-property grob 'meta) 'name))
                                (set! curr-rests (cons grob curr-rests))))))))))

\version "2.18.2"

\header {
  title = "merging rests"
}

global = { \time 4/4 }
Key = { \key g\major }

%% ------ Piano ------
rhUpper = \relative c''
{
  \voiceOne
  \Key
  R1*4
g4 r8 g r2 |
}

rhLower = \relative c' {
  \voiceTwo
  \Key
R1*4
b4 r8 b r2 |
}

lhUpper = \relative c' {
  \voiceOne
  \Key
  R1*4 |
  g4 r8 g r2 |
}
lhLower = \relative c {
  \voiceTwo
  \Key
  R1*4|
  d4 r8 d r2 |
}

PianoRH = {
  \clef treble
  \global
  \set Staff.midiInstrument = #"acoustic grand"
  <<
    \new Voice = "one" \rhUpper
    \new Voice = "two" \rhLower
  >>
}
PianoLH = {
  \clef bass
  \global
  \set Staff.midiInstrument = #"acoustic grand"
  <<
    \new Voice = "one" \lhUpper
    \new Voice = "two" \lhLower
  >>
}

piano = {
  <<
    \set PianoStaff.instrumentName = #"Piano"

    \new Staff = "upper" \PianoRH
    \new Staff = "lower" \PianoLH
     \set Staff.shortInstrumentName = #"p"
  >>
}


\score {
  <<
   \new PianoStaff = "piano" \piano
    >>

  \layout {
    \context {
      \Staff
      \RemoveEmptyStaves
      \consists #merge-mmrests-engraver
      \consists #merge-rests-engraver
    }
    \context {
      \Score
      \override BarNumber.padding = #3
      skipBars = ##t
    }
  }
}


HTH,
  Harm



reply via email to

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