lilypond-user
[Top][All Lists]
Advanced

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

Re: Need multiple \mark entries over the same barline


From: Thomas Morley
Subject: Re: Need multiple \mark entries over the same barline
Date: Wed, 30 Jul 2014 14:09:21 +0200

Hi David,

may I ask you to have a look?

There's an optional argument failing with a single use-case and I've
no clue why.
Did I something wrong?

(You may want to skip most of the mail and go to the REMARK)

Thanks,
  Harm

2014-07-30 9:09 GMT+02:00 Pierre Perol-Schneider
<address@hidden>:
> Hi James,
>
> 2014-07-30 1:49 GMT+02:00 James Harkins <address@hidden>:
>
>> In some places, I have a \markup-style mark over the same barline, and at
>> the same barline, I also want a rehearsal mark (produced by \mark \default).
>> Unfortunately it seems only one \mark is allowed at any given moment.
>>
>> This is a type of markup-style marking I mean:
>>

This looks more like a MetronomeMark

>>  \mark \markup { \fontsize #-2 { \note #"4." #1 "=" \note #"2" #1 } }

It should be possible to stack MetronomeMark and RehearsalMark in some manner.
Something at the lines of:

mus = \new Staff {
     \key d \major
     \override Score.MetronomeMark.break-align-symbols =
       #'(staff-bar key-signature clef)
     \override Score.MetronomeMark.self-alignment-X = #0
     c''1
     \tempo \markup { \fontsize #-2 { \note #"4." #1 "=" \note #"2" #1 } }
     \mark \default
     c''1
}

\new StaffGroup << \mus \mus >>

Though, the behaviour of both is not consistent in all cases.
I have to admit that I did not dig deeper in it, but followed another
approach, see below.

>>
>> ... where you wouldn't want the score to print the duration equivalence
>> over every staff, just at the top. And of course rehearsal marks shouldn't
>> go over every staff either.
>>
>> Is there any workaround?
>
>
> A mini example would have been great here...
> Maybe this snippet could help ? http://lsr.di.unimi.it/LSR/Item?id=202

There's also Neils multi-mark-engraver
http://lists.gnu.org/archive/html/lilypond-user/2011-08/msg00157.html
and
http://lsr.di.unimi.it/LSR/Item?id=892
although this snippet can't deal with \mark \default

>
>
> Somerhing like :
>
> \version "2.18.2"
>
> #(define (format-mark-box-letters-markup-style mark context)
>   (markup #:line
>     (#:center-column
>       (#:line
>         (#:fontsize -2 (#:note "4." 1)
>          #:fontsize -2 "="
>          #:fontsize -2 (#:note "2" 1))
>         #:bold #:box (#:markletter (- (ly:context-property context
> 'rehearsalMark) 2))
>         ))))
>
> markDefaultMarkupStyle = {
>   \set Score.markFormatter = #format-mark-box-letters-markup-style
>   \once\override Score.RehearsalMark.baseline-skip = #4
>   \mark\default
> }
>
> myMusic = \relative c'' {
>   \repeat unfold 4 a
>   \markDefaultMarkupStyle
>   \repeat unfold 4 a
> }
>
> \new StaffGroup <<
>   \myMusic
>   \myMusic
>   \myMusic
>>>
>
> HTH,
> Pierre


This works ofcourse, though, it's not very flexible. Too much hardcoded.
Even adding optional arguments does not convince me.

The following function is able to combine a custom-markup and \mark
\default in various ways:

\version "2.18.0"

% #(ly:set-option 'debug-skylines #t)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% definition of the new combined stencil
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (combine-markup-default-rehearsal-mark alist text)
   (lambda (grob)
     (let* ((default-stencil (ly:grob-property grob 'stencil))
            (other-axis (lambda (a) (remainder (+ a 1) 2)))
            (markup-stencil (grob-interpret-markup grob text))
            (axis (or (assoc-ref alist 'axis) Y))
            (order (or (assoc-ref alist 'order) 1))
            (align-direction (or (assoc-ref alist 'align-direction) CENTER))
            (center-on-first-stencil (assoc-ref alist 'center-on-first-stencil))
            (stil-lst (list markup-stencil default-stencil))
            (stencil-list (if (= order 1) stil-lst (reverse stil-lst)))
            (new-stencil
              (ly:stencil-combine-at-edge
                (ly:stencil-aligned-to
                  (car stencil-list)
                  (other-axis axis)
                  align-direction)
                axis
                RIGHT
                (ly:stencil-aligned-to
                  (cadr stencil-list)
                  (other-axis axis)
                  align-direction)
                1))
            (first-stencil-length
              (interval-length (ly:stencil-extent (car stencil-list) X)))
            (new-stencil-length
              (interval-length (ly:stencil-extent new-stencil X))))

     (if (and (eq? axis X) center-on-first-stencil)
       (ly:grob-set-property! grob 'self-alignment-X
            (/ (- new-stencil-length first-stencil-length)
               (* -1 new-stencil-length))))

     (ly:grob-set-property! grob 'stencil new-stencil))))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% definition of a music-function to use the new stencil
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% REMARK
%% Something buggy with optional arguments?
%% See other REMARK below

#(define (alist? x)
  (and (list? x) (every pair? x)))

addMarkupToDefaultRehearsalMark =
#(define-music-function (parser location alist mrkp)
(((lambda (x) (and (list? x) (every pair? x))) '()) markup?)
;((alist? '()) markup?)
"
 Add a markup a @code{RehearsalMark} called with @code{\\default}

 If the optional @var{alist} is specified the following settings are possible:
   axis: stack the arguments horizontal or vertical
         possible values: X or Y, default is Y.
   order: in which order should the arguments be printed
          default is 1, will lead to print in entered order, every other value
          will reverse the order.
   align-direction: how should the arguments be aligned to each other
                    useful values are: LEFT, RIGHT, CENTER, UP, DOWN
                    other numerical are possibel, though
                    default is CENTER.
   center-on-first-stencil: if axis is X, setting center-on-first-stencil #t
                            will align the new RehearsalMark centered on
                            the first argument.

 Example:

 \\addMarkupToDefaultRehearsalMark
   #`((axis . ,X)
      (order . -1)
      (align-direction . ,CENTER)
      (center-on-first-stencil . #t))
   \\markup { \\musicglyph #"\"scripts.segno"\" }
   \\mark \\default
"
#{
        \once \override Score.RehearsalMark #'before-line-breaking =
          #(combine-markup-default-rehearsal-mark alist mrkp)
#})


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ----- TEST ----
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

tempoMarkup =
  \markup { \fontsize #-4 { \note #"4." #1 "=" \note #"2" #1 } }

\relative c' {
     \set Score.markFormatter = #format-mark-box-alphabet

     \mark \default  % A
     c'1

     \addMarkupToDefaultRehearsalMark
       \tempoMarkup
       \mark \default % B
     b4-. \mf a2.
     \break

     \addMarkupToDefaultRehearsalMark
       #`((axis . ,X))  % or #'((axis . 0))
       \tempoMarkup
       \mark \default % C
     a1

     \addMarkupToDefaultRehearsalMark
       #'((order . -1))
       \tempoMarkup
       \mark \default % D
     g
     \break

     \addMarkupToDefaultRehearsalMark
       #`((align-direction . ,LEFT)) % or #'((align-direction . -1))
       \tempoMarkup
       \mark \default % E
     f1

     \addMarkupToDefaultRehearsalMark
       #`((axis . ,X))
       \tempoMarkup
       \mark \default % F
     e

     \addMarkupToDefaultRehearsalMark
       #`((axis . ,X)
          (center-on-first-stencil . #t))
       \tempoMarkup
       \mark \default % G
     e
     \break

%% REMARK:

% This fails for unknown reason!
%{
     \addMarkupToDefaultRehearsalMark
       \markup { \musicglyph #"scripts.segno" }
       \mark \default
%}
% This works of course
%%{
     \addMarkupToDefaultRehearsalMark #'()
       \markup { \musicglyph #"scripts.segno" }
       \mark \default
%}
% This as well (!):
%{
     \addMarkupToDefaultRehearsalMark
       #(markup #:musicglyph "scripts.segno")
       \mark \default % H
%}
% Something buggy with optional argument?

     d1

     \addMarkupToDefaultRehearsalMark
       #`((axis . ,X)
          (order . -1)
          (center-on-first-stencil . #t)
          )
       \markup { \musicglyph #"scripts.segno" }
       \mark \default % I
     e
}

HTH,
  Harm



reply via email to

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