lilypond-user
[Top][All Lists]
Advanced

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

Re: Smarter double measure numbers


From: Thomas Morley
Subject: Re: Smarter double measure numbers
Date: Sun, 28 Dec 2014 16:18:15 +0100

2014-12-28 4:09 GMT+01:00 Jon Arnold <address@hidden>:
> Hi-
>
> I have finally achieved a solution to the question I asked here:
> http://lists.gnu.org/archive/html/lilypond-user/2014-10/msg00851.html
>
> I'm doing this:
>
> measureFixer_One = {
>   \set Score.barNumberVisibility = #all-bar-numbers-visible
>   \bar ""
>   \override Score.BarNumber.stencil
>   = #(lambda (grob)(grob-interpret-markup grob
>                      #{ \markup {"1 (7)"}
>                      #}))
>   s1
> %etc.... etc...
>   \override Score.BarNumber.stencil
>   = #(lambda (grob)(grob-interpret-markup grob
>                      #{ \markup {"6 (12)"}
>                      #}))
>   \revert Score.BarNumber.stencil
>   \set Score.currentBarNumber = #13
>
>
> }
>
> The above works OK, especially because I am only doing this for <15 or so
> bars each time, but I would really like a smarter function that takes the
> currentBarNumber, adds a the difference as a parameter (in this case 6) and
> prints "n (n+x)"
>
> Part of the need is due to multiple editions (multimovement with contiguous
> bar numbers vs. single movements)
>
> Help?



Hi Jon,

a compilable example would have increased your chance to get an answer
earlier. ;)

Nevertheless, maybe the code below will work for you.
It works with different 'alternativeNumberingStyle' and line-breaks
mid-measure as well.


\version "2.19.15"
% works with 2.18. as well

#(define (add-parenthesized-alternative-bar-numbers number)
  (lambda (grob)
    (let* ((text (ly:grob-property grob 'text))
           ;; If the internals change this may fail.
           ;; Same, if custom overrides are applied before.
           (txt-arg (car (last text)))
           (current-bar-number
             (if (string->number txt-arg)
                 (string->number txt-arg)
                 ;; If BarNumber is not a single number, get a list where
                 ;; first sublist accumulates the numbers, second other stuff.
                 ;; Clear second list from brackets and transform the lists
                 ;; into strings.
                 ;; Maybe overkill ;)
                 (call-with-values
                   (lambda ()
                    (partition
                      string->number
                      (map string (string->list txt-arg))))
                   (lambda (a b)
                     (if (member "(" b)
                         (set! b
                           (filter
                             (lambda (s)
                               (and (not (string=? ")" s))
                                    (not (string=? "(" s))))
                             b)))
                     (map string-concatenate (list a b))))))
           (added-bar-number
             (if (number? current-bar-number)
                 (number->string (+ number current-bar-number))
                 (if (and (list? current-bar-number)
                          (string->number (car current-bar-number)))
                     (string-append
                       (number->string
                         (+ number (string->number (car current-bar-number))))
                       (cadr current-bar-number))
                     (begin
                       (ly:warning
                         (_ "\n\tnot smart enough to handle this BarNumber: ~a"
                            current-bar-number))
                       "?")))))
    (ly:grob-set-property! grob 'text
       #{
         \markup {
           $text
           \override #'(padding . 0.1)
           \parenthesize $added-bar-number
         }
       #}))))

newBarNumber =
#(define-music-function (parser location nmbr)(number?)
#{
  \override Score.BarNumber.before-line-breaking =
    #(add-parenthesized-alternative-bar-numbers nmbr)
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\layout {
  \context {
    \Score
    \override BarNumber.self-alignment-X = #CENTER
    barNumberVisibility = #all-bar-numbers-visible
  }
}

music =
\relative c'' {
  \bar ""
  \repeat volta 3 {
    c1 \break
    <>^"Testing line-break mid-measure"
    c2 \bar "" \break c2 \break
  }
  \alternative {
    {
      <>^"Testing line-break mid-measure in an alternative ending"
      d2 \bar "" \break d2 \break
    }
    { e1 \break }
    { f1 \break }
  }
  g1
  \bar "|."
}

\header {
    title =
    \markup
      \column {
        \rounded-box
          \fill-line { "Add a parenthesized number to default BarNumber" }
        \vspace #1
      }
}

\score {
  \new Staff \music
  \layout {
    \newBarNumber #4
  }
  \header {
    piece =
    \markup
     \rounded-box
     \bold
    "Adding alternative BarNumbers, 'alternativeNumberingStyle' is not set"
  }
}

\score {
  \new Staff \music
  \layout {
    \newBarNumber #5
    \context {
      \Score
      alternativeNumberingStyle = #'numbers
    }
  }
  \header {
    piece =
    \markup
     \rounded-box
     \bold
    "Adding alternative BarNumbers, 'alternativeNumberingStyle' is set 'numbers"
  }
}

\score {
  \new Staff \music
  \layout {
    \newBarNumber #6
    \context {
      \Score
      alternativeNumberingStyle = #'numbers-with-letters
    }
  }
  \header {
    piece =
    \markup
     \rounded-box
     \bold
    "Adding alternative BarNumbers, 'alternativeNumberingStyle' is set
'numbers-with-letters"
  }
}



HTH,
  Harm



reply via email to

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