lilypond-user
[Top][All Lists]
Advanced

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

Making staff-padding work in a custom marks context


From: Trevor Bača
Subject: Making staff-padding work in a custom marks context
Date: Sat, 16 Aug 2014 19:15:02 -0400

Hi,

I use a custom context (TimeSignatureContext) to house time signatures, rehearsal marks and metronome marks.

My TimeSignatureContext is essentially the same as Kieren's custom ScoreMarks context, which Kieren has described here ...

http://lists.gnu.org/archive/html/lilypond-user/2013-11/msg00930.html

... (and in a couple of other threads, too).

I've recently extended my custom TimeSignatureContext to engrave markup and text spanners. (Primary reason being to notate accelerando and ritardando spanners.) But TextScript.staff-padding and TextSpanner.staff-padding are ignored in this custom context.

Here's an example that includes markup (but without staff padding):

%%% EXAMPLE 1: no staff-padding %%%

\version "2.19.11"

\layout {
    \context {
        \name TimeSignatureContext
        \type Engraver_group
        \consists Axis_group_engraver
        \consists Mark_engraver
        \consists Metronome_mark_engraver
        \consists Text_engraver
        \consists Text_spanner_engraver
        \consists Time_signature_engraver
        \override MetronomeMark.X-extent = #'(0 . 0)
        \override MetronomeMark.Y-extent = #'(0 . 0)
        \override MetronomeMark.break-align-symbols = #'(left-edge)
        \override MetronomeMark.extra-offset = #'(0 . 4)
        \override MetronomeMark.font-size = 3
        \override RehearsalMark.X-extent = #'(0 . 0)
        \override RehearsalMark.Y-offset = -2.25
        \override RehearsalMark.X-offset = 8
        \override RehearsalMark.break-align-symbols = #'(time-signature)
        \override RehearsalMark.break-visibility = #end-of-line-invisible
        \override RehearsalMark.font-name = "Didot"
        \override RehearsalMark.font-size = 10
        \override RehearsalMark.outside-staff-priority = 500
        \override RehearsalMark.self-alignment-X = #center
        \override TextScript.outside-staff-priority = 600
        \override TextScript.staff-padding = 8 % <== ignored
        \override TextSpanner.staff-padding = 8.75 <== ignored
        \override TimeSignature.X-extent = #'(0 . 0)
        \override TimeSignature.break-align-symbol = #'left-edge
        \override TimeSignature.break-visibility = #end-of-line-invisible
        \override TimeSignature.space-alist.clef = #'(extra-space . 0.5)
        \override TimeSignature.style = #'numbered
        \override VerticalAxisGroup.default-staff-staff-spacing = #'(
            (basic-distance . 0)
            (minimum-distance . 8)
            (padding . 0)
            (stretchability . 0)
        )
    }
    \context {
        \Staff
        \remove Time_signature_engraver
    }
    \context {
        \Score
        \accepts TimeSignatureContext
        \remove Mark_engraver
        \remove Metronome_mark_engraver
    }
}

\new Score <<
    \new TimeSignatureContext {
        \time 2/4
        \once \override TextSpanner.arrow-width = 0.25
        \once \override TextSpanner.bound-details.left.stencil-align-dir-y = -0.5
        \once \override TextSpanner.bound-details.left.text = \markup {
            \smaller
                \general-align
                    #Y
                    #DOWN
                    \note-by-number
                        #2
                        #0
                        #1
            \upright
                " = 67.5"
            }
        \once \override TextSpanner.bound-details.right.arrow = ##t
        \once \override TextSpanner.bound-details.right.padding = 2
        \once \override TextSpanner.bound-details.right.text = ##f
        \once \override TextSpanner.dash-fraction = 0.25
        \once \override TextSpanner.dash-period = 1.5
        s1 * 2/4 \startTextSpan
        \time 3/4
        s1 * 3/4
        \time 2/4
        s1 * 2/4 \stopTextSpan ^ \markup {
            \smaller
                \general-align
                    #Y
                    #DOWN
                    \note-by-number
                        #2
                        #0
                        #1
            \upright
                " = 135"
            }
    }
    \new Staff {
        \time 2/4
        c'4
        d'4
        \time 3/4
        c'4
        d'4
        e'4
        \time 2/4
        c'4
        d'4
    }
>>

%%% END %%%

You can see that the problem here is that the text "falls" to less than elegant places on the page. (Image included as example-1.png.) 

Some experimenting proves that extending the custom context with a Staff_symbol_engraver fixes the staff-padding problem. (Logically enough: staff-padding isn't respected unless there's a staff to pad against.)

We don't want the staff symbol to show, however, and so I've set StaffSymbol to transparent. Now everything looks almost perfect:

%%% EXAMPLE 2: transparent staff symbol & staff padding %%%

\version "2.19.11"

\layout {
    \context {
        \name TimeSignatureContext
        \type Engraver_group
        \consists Axis_group_engraver
        \consists Mark_engraver
        \consists Metronome_mark_engraver
        \consists Staff_symbol_engraver % <== this is new
        \consists Text_engraver
        \consists Text_spanner_engraver
        \consists Time_signature_engraver
        \override MetronomeMark.X-extent = #'(0 . 0)
        \override MetronomeMark.Y-extent = #'(0 . 0)
        \override MetronomeMark.break-align-symbols = #'(left-edge)
        \override MetronomeMark.extra-offset = #'(0 . 4)
        \override MetronomeMark.font-size = 3
        \override RehearsalMark.X-extent = #'(0 . 0)
        \override RehearsalMark.Y-offset = -2.25
        \override RehearsalMark.X-offset = 8
        \override RehearsalMark.break-align-symbols = #'(time-signature)
        \override RehearsalMark.break-visibility = #end-of-line-invisible
        \override RehearsalMark.font-name = "Didot"
        \override RehearsalMark.font-size = 10
        \override RehearsalMark.outside-staff-priority = 500
        \override RehearsalMark.self-alignment-X = #center
        \override StaffSymbol.transparent = ##t % <== this is new
        \override TextScript.outside-staff-priority = 600
        \override TextScript.staff-padding = 8 % <== now this is respected
        \override TextSpanner.staff-padding = 8.75 % <== now this is respected
        \override TimeSignature.X-extent = #'(0 . 0)
        \override TimeSignature.break-align-symbol = #'left-edge
        \override TimeSignature.break-visibility = #end-of-line-invisible
        \override TimeSignature.space-alist.clef = #'(extra-space . 0.5)
        \override TimeSignature.style = #'numbered
        \override VerticalAxisGroup.default-staff-staff-spacing = #'(
            (basic-distance . 0)
            (minimum-distance . 8)
            (padding . 0)
            (stretchability . 0)
        )
    }
    \context {
        \Staff
        \remove Time_signature_engraver
    }
    \context {
        \Score
        \accepts TimeSignatureContext
        \remove Mark_engraver
        \remove Metronome_mark_engraver
    }
}

\new Score <<
    \new TimeSignatureContext {
        \time 2/4
        \once \override TextSpanner.arrow-width = 0.25
        \once \override TextSpanner.bound-details.left.stencil-align-dir-y = -0.5
        \once \override TextSpanner.bound-details.left.text = \markup {
            \smaller
                \general-align
                    #Y
                    #DOWN
                    \note-by-number
                        #2
                        #0
                        #1
            \upright
                " = 67.5"
            }
        \once \override TextSpanner.bound-details.right.arrow = ##t
        \once \override TextSpanner.bound-details.right.padding = 2
        \once \override TextSpanner.bound-details.right.text = ##f
        \once \override TextSpanner.dash-fraction = 0.25
        \once \override TextSpanner.dash-period = 1.5
        s1 * 2/4 \startTextSpan
        \time 3/4
        s1 * 3/4
        \time 2/4
        s1 * 2/4 \stopTextSpan ^ \markup {
            \smaller
                \general-align
                    #Y
                    #DOWN
                    \note-by-number
                        #2
                        #0
                        #1
            \upright
                " = 135"
            }
    }
    \new Staff {
        \time 2/4
        c'4
        d'4
        \time 3/4
        c'4
        d'4
        e'4
        \time 2/4
        c'4
        d'4
    }
>>

%%% END %%%

Output is included as example-2.png.

QUESTION: The one remaining problem now is that the system start bar is visible at the beginning of the custom context (as shown in example-2.png). Any ideas as to how hide the system start bar before the custom TimeSignatureContext?

I've tried all sorts of overrides (and moving around System_start_delimiter_engraver) and the presence of the system start bar seems to be an all-or-nothing affair handled at the score level.

I've also tried lots of different ways of removing the Staff_symbol_engraver (which nicely causes the system start bar to disappear). But I'm absolutely stumped as to how to remove the Staff_symbol_engraver and still get the markup and spanners to respect staff-padding.


Thanks,

Trevor.




--
Trevor Bača
address@hidden

Attachment: example-1.png
Description: PNG image

Attachment: example-2.png
Description: PNG image


reply via email to

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