[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: TimeSignatures over BarLines
From: |
Thomas Morley |
Subject: |
Re: TimeSignatures over BarLines |
Date: |
Fri, 8 May 2015 02:29:02 +0200 |
2015-05-07 18:48 GMT+02:00 Alexander Kobel <address@hidden>:
> Dear all,
>
> I'm trying to move time signatures to print over bar lines for a modern
> piece, to allow for a proportional (or almost proportional) note spacing
> despite several time changes.
>
> The usual approach is to place them over the staff, like here:
> http://lsr.di.unimi.it/LSR/Item?id=272
> However, the full piece has a whole bunch of staves, so vertical space is at
> a premium; for each staff, the signatures do not fit, and I feel that a
> single time signature over the score is not enough.
> Hence, I decided to break the bar line stencil into two short slices, and
> squeeze the time signature in between.
>
> I'm almost there. The missing piece is automatic adjustment of time
> signatures at the beginning of a system. If realignTimeSignatures in the
> attached example is delayed by one measure, the default placement of the
> first time signature is perfect - as usual. However, I could not find a way
> to do the same for the time signature in the fourth system (other than
> manually reverting the overrides).
> I achieve either
> 1) a nice placement of the in-line signature (with \realignTimeSignatures),
> but have to shift the begin-of-line ones by some amount and cannot make
> enough space for them, xor
> 2) the default position for the begin-of-line signatures (with
> \realignTimeSignaturesII), but then I cannot position barlines and time
> signatures on top of each other.
> Can anyone enlighten me here?
>
> Bonus points for someone who can come up with a proper centered alignment of
> the "4" in the double bar line at the /end/ of the third system...
>
>
> Thanks in advance,
> Alexander
Hi,
how about:
\version "2.19.18"
cTime =
#(define-music-function (parser location time) (fraction?)
#{ \once \override Staff.BarLine #'stencil =
#(lambda (grob)
(ly:grob-set-property! grob 'bar-extent '(-2 . -1))
(ly:stencil-add
(ly:bar-line::print grob)
(ly:stencil-translate-axis (ly:bar-line::print grob) 3 Y)))
\time $time #})
move-time-sig-into-bar-line =
\override Staff.BarLine.before-line-breaking =
#(lambda (grob)
(let* (
(b-a-g (ly:grob-parent grob X))
(b-a (ly:grob-parent b-a-g X))
(elts (ly:grob-array->list (ly:grob-object b-a 'elements)))
(break-align-groups
(filter
(lambda (g)
(grob::has-interface g 'break-aligned-interface))
elts))
(b-a-g-elts
(apply append
(map
(lambda (g)
(ly:grob-array->list (ly:grob-object g 'elements)))
break-align-groups)))
(time-sig
(filter
(lambda (g)
(grob::has-interface g 'time-signature-interface))
b-a-g-elts))
(bar-line
(filter
(lambda (g)
(grob::has-interface g 'bar-line-interface))
b-a-g-elts)))
(if (and (not (null? time-sig)) (not (null? bar-line)))
;; TODO:
;; only the first entry of time-sig and bar-line are affected
;; may cause problems in cases where a StaffGroup contains Staffs with
;; different settings for TimeSignature and/or BarLine
(let* ((time-sig-length
(interval-length
(ly:grob-extent (car time-sig) (car time-sig) X)))
(bar-line-length
(interval-length
(ly:grob-extent (car bar-line) (car bar-line) X))))
(ly:grob-set-property! grob 'space-alist
`((time-signature extra-space
.
,(/ (+ time-sig-length bar-line-length) -2))
(custos minimum-space . 2.0)
(clef minimum-space . 1.0)
(key-signature extra-space . 1.0)
(key-cancellation extra-space . 1.0)
(first-note fixed-space . 0.3)
(next-note semi-fixed-space . 0.9)
(right-edge extra-space . 0.0)))
(if (= (ly:item-break-dir grob) LEFT)
(ly:grob-set-property! (car time-sig) 'X-extent '(0 . 0)))))))
time-sig-space-at-line-end =
\override Staff.TimeSignature.space-alist =
#'((cue-clef extra-space . 1.5)
(first-note fixed-space . 2.0)
;; not sure how it should look, for now hardcoded
(right-edge extra-space . 0)
(staff-bar extra-space . 1.0))
global = {
\cTime 2/4 s2*8 \cTime 3/4 s2. \cTime 2/4 s2*4 \break
s2*2 \cTime 3/4 s2. \cTime 2/4 s2 \cTime 3/4 s2. \cTime 2/4 s2*5
\cTime 3/4 s2. \cTime 2/4 s2 \cTime 3/4 s2. \break
s2. \cTime 2/4 s2 \cTime 3/4 s2. \cTime 2/4 s2*2 \cTime 4/4 s1
\cTime 2/4 s2*5 \cTime 4/4 s1 \cTime 2/4 s2 \bar "||" \break
\cTime 4/4 s1
}
mel = \relative c'' {
| c2 | c | c | c | R | R
| c2 | c | c c4 | c2 | c | R | R
| c2 | c | c c4 | c2 | c c4 | c2 c | R
| c2 | c | c c4 | c2 | c c4 | c2. | c4 c | c2 c4 | c2 | c | R1 | R2
| c2 | c | c | c | R1 | R2
\once \override Score.RehearsalMark.break-visibility = ##(#t #f #f)
\once \override Score.RehearsalMark.self-alignment-X = #0.85
\mark \markup \right-column { "not sure" "how it" "should look" ↓ }
| c1
}
#(set-global-staff-size 16.5)
\paper {
left-margin = 15\mm
right-margin = 15\mm
}
\score {
\new Staff << \global \mel >>
\layout {
\context {
\Staff
\move-time-sig-into-bar-line
\time-sig-space-at-line-end
\override TimeSignature.style = #'single-digit
% \override TimeSignature.break-visibility = #end-of-line-invisible
}
}
}
There's a TODO in it ...
And I'm not sure how the combination of time-sig and (double-)bar-line
at line-end should look like.
If the bar-line is really at line-end the time-sig will stick out to
the right. Is this wanted?
Cheers,
Harm