lilypond-user
[Top][All Lists]
Advanced

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

Re: Align above "current" staff


From: Aaron Hill
Subject: Re: Align above "current" staff
Date: Sun, 27 Sep 2020 04:25:21 -0700
User-agent: Roundcube Webmail/1.4.2

On 2020-09-27 3:23 am, Martín Rincón Botero wrote:
I hope this message lands in the right 2018 thread. I find an ossia
function very worth the work! I tried several things yesterday but
none of them really worked. I amended a few details to Urs/David's
code (a couple of \with attributes) but there are still some minor
issues (other than this big 13 years old bug
https://gitlab.com/lilypond/lilypond/-/issues/127).

When I look at the code (see below) I would expect this to happen:
\ossia {%ossiamusic} {%music}. What happens is the opposite. This is
trivial, since the only thing you have to tell the user is that the
normal music goes before the ossia music, but it makes me wonder why
anyways... Other minor issues are that the ossia music doesn't inherit
the clef from the normal music, and that placing all this inside a
\relative is not reliable (the first note of whichever of both
components might be in an unexpected octave). Does Urs, who started
working on this, or David (or anyone :-)) have any idea on how to
solve these minor issues? Here the amended code with an example that
demonstrate them:

[ . . . ]

Firstly let me be clear that I have not chased down all information relating to this thread, so I very well might be missing important details.

I can see no reason why the order of arguments could not be swapped so that the ossia-music comes first. This is very useful as it clarifies why \relative works the way it does. The ossia-music expression gets processed before the remaining music. The first "c" in the remaining music follows the final "e" in the ossia-music, not the "g" is the preceding music.

Regarding clefs, I have a patched version of \ossia that attempts to match the current clef settings by mimicking how \clef works:

%%%%
\version "2.20.0"

\layout {
  \context {
    \Staff
    \name OssiaStaff
    \alias Staff
    \remove "Time_signature_engraver"
    \magnifyStaff #2/3
    \hide Clef
    firstClef = ##f
  }
  \inherit-acceptability OssiaStaff Staff
}

ossia =
#(define-music-function
  (ossia-music music)
  (ly:music? ly:music?)
  (let ((staff-name #f)
        (clef-props '(clefGlyph
                      middleCClefPosition
                      clefPosition
                      clefTransposition
                      clefTranspositionStyle)))
    (define (initialize context)
      (set! staff-name
        (ly:context-id (ly:context-find context 'Staff)))
      (set! clef-props
        (map (lambda (prop)
               (cons prop (ly:context-property context prop)))
             clef-props)))
    (define (update context)
      (ly:context-set-property! context
        'alignAboveContext staff-name)
      (for-each (lambda (prop)
                  (ly:context-set-property! context
                    (car prop) (cdr prop)))
                clef-props)
      (ly:set-middle-C! context))
    #{ \applyContext #initialize
       << \new OssiaStaff
            \with #(ly:make-context-mod `((apply ,update)))
            { #ossia-music }
          #music >> #}))

\new Staff = "viola" \relative {
  \clef alto
  c'4 d e g
  \ossia { e^"Treble clef? No, it's alto now." d f e }
         { c^"c'? Yes, because \\relative says so." b c d }
  c b c2
}
%%%%

Note that I went ahead and defined an OssiaStaff context so that properties relating to it are not buried within the \ossia function. Also a little refactoring should make the function's logic a little easier to follow.


-- Aaron Hill

Attachment: ossia.cropped.png
Description: PNG image


reply via email to

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