Hi Chen, I was able to solve the first two problems by adding bar lines to the dynamics context and replacing their stencils with a printed time signature. Without an example of what you mean by compound meters I'm not sure what is wrong, but if you were referring to the ability to supply a beat structure when you use \time, then I added that back in. The code is below.
\version "2.19.0" ttime = #(define-music-function (beat-structure fraction) ((number-list? '()) fraction?) (define-markup-command (time-sig layout props numer denom) (markup? markup?) (interpret-markup layout props #{ \markup \override #'(baseline-skip . 1.5) \center-column { \number #numer \number #denom }#})) (let* ((numer (number->string (car fraction))) (denom (number->string (cdr fraction)))) #{ \time #fraction \once \override BarLine.stencil = #(lambda (grob) (grob-interpret-markup grob #{ \markup { \time-sig #numer #denom } #})) #})) timeSignatures = { \tempo 4 = 80 \bar "" \ttime 4/4 s1 \ttime 3/8 s4. \ttime 3/4 s2. \ttime 4/4 s1 \ttime 2/4 \grace s8 s4. } \score { \layout { \context { \Score \override MetronomeMark.break-align-symbols = #'(clef time-signature) \remove "Bar_number_engraver" } \context { \Staff \override MultiMeasureRest.spacing-pair = #'(clef . staff-bar) \remove "Time_signature_engraver" } \context { \Score } } << \new Dynamics \with { \consists "Bar_engraver" \override BarLine.break-visibility = #'#(#t #t #t) \override BarLine.font-size = #8 } { \timeSignatures } \new StaffGroup \with {} << \new Staff \with { \consists "Bar_number_engraver" } \relative c' { \textLengthOn \time 4/4 c4 ( _\markup \column { "← Objects failed to appear" "below the time signature" "when using \\textLengthOn" } \textLengthOff d4 e4 f4 ) \time 3/8 a'4 ( g8 ) \time 3/4 R2. \time 4/4 c1 \time 2/4 a8 ^\markup \column { "← Time signature appear twice" "when one staff has a grace note" "as the first note in a bar" } g8 f8 e8 } \new Staff \relative c' { \time 4/4 R1 \time 3/8 R4. \clef bass \time 3/4 a,2. \> \break \time 4/4 c2 _\markup \column { " " "↑" "Hairpin stops below the time signature" } e2 \! \clef treble \time 2/4 \acciaccatura f'8 a8 g8 f8 e8 } \new Staff \relative c' { \clef bass \time 4/4 R1 \time 3/8 R4. \time 3/4 R2. \time 4/4 c1 \time 2/4 a8 g8 f8 e8 } >> >> } Hope that helps, Kevin On Sun, 12 Apr 2020 at 12:12, Leo Chen <leo04c...@outlook.com> wrote: > Hi Kevin, > > I really appreciate your help. > > I may be asking a bit too much here, however, I still have a few problems > with this helper function. > Firstly, the time signatures are aligned to the first note in a bar. Are > there any ways it can be aligned to the bar line? > Secondly, the time signature doesn't show up at the end of the line > whenever a new time signature is drawn after the line break. > Thirdly, this helper function isn't supporting compound meters which I > happened to be using a lot in my composition. > > Leo > ------------------------------ > *发件人:* Kevin Barry <barr...@gmail.com> > *发送时间:* 2020年4月12日 18:13 > *收件人:* Chen Leo <leo04c...@outlook.com> > *抄送:* lilypond-user@gnu.org <lilypond-user@gnu.org> > *主题:* Re: Alignment issues of Time signature above the staff > > Hi Chen, > > Space alloted for time signatures in one staff cause space to be allotted > in all other staves as well (even if they aren't printing it), which is > causing lots of problems that have to be worked around. > > Perhaps a different approach would be easier. In the code below there is a > helper function (\ttime) to print the time signature as a markup (with the > time signature engraver removed everywhere). It seems to make things easier. > > \version "2.19.0" > > ttime = > #(define-music-function (fraction music) > (fraction? ly:music?) > (let* ((numer (number->string (car fraction))) > (denom (number->string (cdr fraction)))) > #{ \time #fraction > #music ^\markup > \override #'(baseline-skip . 1.5) > \center-column { \number #numer \number #denom } #})) > > timeSignatures = { \tempo 4 = 80 \ttime 4/4 s1 \ttime 3/8 s4. > \ttime 3/4 s2. \ttime 4/4 s1 \once \override > TextScript.X-offset = #-6 > \ttime 2/4 s4.} > > \score { > \layout { > \context { > \Score > \override MetronomeMark.break-align-symbols = #'(clef time-signature) > \remove "Bar_number_engraver" > } > \context { > \Staff > \override MultiMeasureRest.spacing-pair = #'(clef . staff-bar) > \remove "Time_signature_engraver" > } > \context { > \Score > } > } > << > \new Dynamics \with { > \override TextScript.font-size = #8 > \override TextScript.X-offset = #-2 > } > { > \timeSignatures > } > > \new StaffGroup \with {} << > > \new Staff \with { > \consists "Bar_number_engraver" > } > \relative c' { > \textLengthOn > \time 4/4 > c4 ( _\markup \column { > "← Objects failed to appear" > "below the time signature" > "when using \\textLengthOn" > } > \textLengthOff > d4 e4 f4 ) > \time 3/8 > a'4 ( g8 ) > \time 3/4 > R2. > \time 4/4 > c1 > \time 2/4 > a8 ^\markup \column { > "← Time signature appear twice" > "when one staff has a grace note" > "as the first note in a bar" > } g8 f8 e8 > } > > \new Staff \relative c' { > \time 4/4 > R1 > \time 3/8 > R4. > \clef bass > \time 3/4 > a,2. \> \break > \time 4/4 > c2 _\markup \column { > " " > "↑" > "Hairpin stops below the time signature" > } > e2 \! > \clef treble > \time 2/4 > \acciaccatura f'8 a8 > g8 f8 e8 > } > > \new Staff \relative c' { > \clef bass > \time 4/4 > R1 > \time 3/8 > R4. > \time 3/4 > R2. > \time 4/4 > c1 > \time 2/4 > a8 g8 f8 e8 > } > >> > >> > } > > Hope that helps! > Kevin > > > On Sat, 11 Apr 2020 at 16:04, Chen Leo <leo04c...@outlook.com> wrote: > > Hi, > > I was able to align the metronome mark above the time signature by using a > small hack > > That is to use > \override TimeSignature.stencil = #(lambda (grob) (grob-interpret-markup > grob (markup ""))) > instead of removing the “time_signature_engraver” from the staff context. > > I also discovered another problem that is the time signature will display > twice when one staff has a grace note as the first note in a bar. I was > only able to solve this by commenting out the \time commands from the rest > of the staffs, which is not an ideal solution. After looking into some of > the internal commands I still don’t have a clue on how to solve the rest of > the alignment problems, I guess some deeper scheme knowledge is required to > make this work. > > See the attached files. > > ------------------------------ > Hi, > Thank you for your responses. > I managed to solve the bar number problem by removing the > "Bar_number_engraver" from the staff context and \consists > "Bar_number_engraver" in the staff under the time signature. > For the time signature’s alignment, I found a simpler solution by using > \override TimeSignature.break-align-symbol = #'staff-bar with \override > MultiMeasureRest.spacing-pair = #'(clef . staff-bar). However, It still > causes break-alignment issues from here to there. > > Example: > > \version "2.19.0" > > timeSignatures = { \numericTimeSignature \tempo 4 = 80 \time 4/4 s1 \time > 3/8 s4. > \time 3/4 s2. \time 4/4 s1 } > > \score { > \layout { > \context { > \type "Engraver_group" > \consists "Time_signature_engraver" > \consists "Axis_group_engraver" > \name "TimeSig" > \alias "Staff" > \override TimeSignature.font-size = #8 > \override TimeSignature.break-align-symbol = #'staff-bar > \override TimeSignature.X-offset = > #ly:self-alignment-interface::x-aligned-on-self > \override TimeSignature.self-alignment-X = #LEFT > %\override TimeSignature.X-extent = #'(0 . 0) > } > \context { > \Score > \accepts TimeSig > \remove "Bar_number_engraver" > } > \context { > \Staff > \override MultiMeasureRest.spacing-pair = #'(clef . staff-bar) > \remove "Time_signature_engraver" > } > \context { > \Score > } > } > << > \new TimeSig \with { > } > { > \timeSignatures > } > > \new StaffGroup \with {} << > \new Staff \with { > \consists "Bar_number_engraver" > } > \relative c' { > \textLengthOn > c4 ( _\markup \column { > "← Objects failed to appear" > "below the time signature" > "when using \\textLengthOn" > } > \textLengthOff > d4 e4 f4 ) > a''4 ( g8 ) R2. c1 } > \new Staff \relative c' { > R1 > R4. > \clef bass > a2. \> \break > c2 _\markup \column { > " " > "↑" > "Hairpin stops below the time signature" > } c2\! } > \new Staff \relative c' { R1 R4. R2. c1 } > >> > >> > } > > ------------------------------ > > On 3/29/2020 2:10 AM, Chen Leo wrote: > > Hi Kevin, > > > Thank you for your reply. > > > For the first problem, you will have to set break-align-symbol to ##f to > reproduce the problem. That is because by default break-align-symbol is > set to #'time-signature. so commenting out the override shouldn't help. > > > Secondly, using \override TimeSignature.X-extent = #'(0 . 0) causes > collisions when texts and notes are displayed above the staff because > lilypond is not adding vertical spacing above the staff. And it seems like > now all the time signatures are shifted a bit to the right instead of > aligning right after the bar line. > > > Thirdly, the bar numbers are raised to align vertically with the > time-signatures, which is not something I would like to have. It will be > nice if you can share any ideas on how that can be solved. > > > Leo > > Here's an example: > > \version "2.20.0" > > \layout { > \context { > \type "Engraver_group" > \consists "Time_signature_engraver" > \consists "Axis_group_engraver" > \name "TimeSig" > \alias "Staff" > % original settings from "http://lsr.di.unimi.it/LSR/Snippet?id=272" > <http://lsr.di.unimi.it/LSR/Snippet?id=272> > %{ > \override TimeSignature.font-size = #3 > \override TimeSignature.break-align-symbol = ##f > \override TimeSignature.X-offset = > #ly:self-alignment-interface::x-aligned-on-self > \override TimeSignature.self-alignment-X = #CENTER > \override TimeSignature.after-line-breaking = > #shift-right-at-line-begin > %} > % settings after adjustments > { > \override TimeSignature.font-size = #4 > \override TimeSignature.X-offset = > #ly:self-alignment-interface::x-aligned-on-self > \override TimeSignature.self-alignment-X = #LEFT > \override TimeSignature.X-extent = #'(0 . 0) > } > } > \context { > \Score > \accepts TimeSig > } > \context { > \Staff > \remove "Time_signature_engraver" > } > } > > timeSignatures = { \numericTimeSignature \time 4/4 s1 \time 3/8 s4. \time > 3/4 s2. \break \time 4/4 s1 } > > \score { > << > \new TimeSig \timeSignatures > \new Staff \relative c' { c4 ^\markup \column {"a" "b" "c"} ( d4 e4 f4 > ) a''4 > ^\markup \column {"a" "b" "c"} ( g8 ) R2. c1 > } > \new Staff \relative c' { R1 R4. \clef bass a2. c1 } > \new Staff \relative c' { R1 R4. R2. c1 } > >> > } > > > ------------------------------ > > Hi Chen, > > I was able to solve the second of your problems (the whole bar rests > being shifted by the time signatures in the TimeSig context) by > adding: > \override TimeSignature.X-extent = ##f > (You could also use the value #'(0 . 0) if the warnings are off > putting, but I noticed that that doesn't *quite* fix it fully.) > > I tried to reproduce your description of the first problem (time > signatures aligning over cue clefs), but even commenting out the > break-align-symbol override didn't make it appear. I was able to > correct the alignment of the first time signature by removing the > line: > \override TimeSignature.after-line-breaking = #shift-right-at-line-begin > > After both of the above modifications everything looks OK to me, but > perhaps we need a fuller example. > > Kevin > > On Sat, 28 Mar 2020 at 10:30, Chen Leo <leo04c...@outlook.com> > <leo04c...@outlook.com> wrote: > > > > Hi, I am trying to put time signatures above the staffs according to " > http://lsr.dsi.unimi.it/LSR/Item?id=272". > > > > > > > > I discovered an issue, that is whenever a clef change is made, the time > signature on the next bar fails to align to the bar line, it aligns to the > cue clef in the previous bar instead. After some research, I found out that > this is because the TimeSignature property "break-align-symbol" is set to > "##f". I set "break-align-symbol" back to "#'time-signature", and this > problem is solved, however, the horizontal alignments of the other time > signatures are messed up. (Using the code presented below, the 4/4 in the > first bar moves to the right & the bar rest on the third bar stretches to > the right. ) Are there any ways to align all the time signatures to their > corresponding bar lines without changing the alignments of other objects? > Thank you. > > > > > > > > \version "2.20.0" > > > > > > > > \layout { > > > > \context { > > > > \type "Engraver_group" > > > > \consists "Time_signature_engraver" > > > > \consists "Axis_group_engraver" > > > > \name "TimeSig" > > > > \alias "Staff" > > > > \override TimeSignature.font-size = #4 > > > > \override TimeSignature.break-align-symbol = #'time-signature > > > > \override TimeSignature.X-offset = > > > > #ly:self-alignment-interface::x-aligned-on-self > > > > \override TimeSignature.self-alignment-X = #LEFT > > > > \override TimeSignature.after-line-breaking = > > > > #shift-right-at-line-begin > > > > } > > > > \context { > > > > \Score > > > > \accepts TimeSig > > > > } > > > > \context { > > > > \Staff > > > > \remove "Time_signature_engraver" > > > > } > > > > } > > > > > > > > timeSignatures = { \numericTimeSignature \time 4/4 s1 \time 3/8 s4. > \time 3/4 s2. } > > > > > > > > \score { > > > > << > > > > \new TimeSig \timeSignatures > > > > \new Staff \relative c' { c4 ( d4 e4 f4 ) a4 ( g8 ) R2. } > > > > \new Staff \relative c' { R1 R4. \clef bass a2. } > > > > \new Staff \relative c' { R1 R4. R2. } > > > > >> > > > > } > > > > > > Hi Chen, > > > The measure numbers should be aligned correctly throughout your score, > except in the certain cases where there happens to be a time signature > change at the end of the system and/or at the start of a new line. > > > In which case you could simply use an override like this: \once \override > Score.BarNumber.Y-offset = #-6. > > > Would this help? > > > (see attached) > > > %%%%%%%%%%% > > > \version "2.19.0" > > \layout { > \context { > \type "Engraver_group" > \consists "Time_signature_engraver" > \consists "Axis_group_engraver" > \consists "Staff_symbol_engraver" > \name "TimeSig" > \alias "Staff" > % original settings from "http://lsr.di.unimi.it/LSR/Snippet?id=272" > <http://lsr.di.unimi.it/LSR/Snippet?id=272> > %{ > \override TimeSignature.font-size = #3 > \override TimeSignature.break-align-symbol = ##f > \override TimeSignature.X-offset = > #ly:self-alignment-interface::x-aligned-on-self > \override TimeSignature.self-alignment-X = #CENTER > \override TimeSignature.after-line-breaking = > #shift-right-at-line-begin > %} > % settings after adjustments > { > \override TimeSignature.font-size = #4 > \override TimeSignature.X-offset = > #ly:self-alignment-interface::x-aligned-on-self > \override TimeSignature.self-alignment-X = #LEFT > \override TimeSignature.X-extent = #'(0 . 0) > } > } > \context { > \Score > \accepts TimeSig > } > \context { > \Staff > \remove "Time_signature_engraver" > } > \context { > \Score > \remove "System_start_delimiter_engraver" > } > } > > timeSignatures = { > \numericTimeSignature \time 4/4 s1 \time 3/8 s4. > \time 3/4 s2. \break \time 4/4 s1 > } > > \score { > << > \new TimeSig \with { > \override VerticalAxisGroup.default-staff-staff-spacing.padding = #2 > \override StaffSymbol.transparent = ##t > } { > \timeSignatures > } > \new StaffGroup \with { > \consists "System_start_delimiter_engraver" > systemStartDelimiter = #'SystemStartBar > } << > \new Staff \relative c' { > c4 ^\markup \column {"a" "b" "c"} ( d4 > e4 f4 ) a''4 > ^\markup \column {"a" "b" "c"} ( g8 ) R2. > \once \override Score.BarNumber.Y-offset = #-6 > c,1 c c c c c \break c c > } > \new Staff \relative c' { > R1 > R4. > \clef bass > a2. > c1 > } > \new Staff \relative c' { R1 R4. R2. c1 } > >> > >> > } > >