I said

> "If this could be made to work into the function itself would be great"
>

Thinking twice, I guess the user should have the freedom to make an ossia
that's not connected to the main staff. My problem has been solved then!
:-) What does Urs think of this?

Am So., 27. Sept. 2020 um 17:02 Uhr schrieb Martín Rincón Botero <
[email protected]>:

> I wasn't paying enough attention either for the dashed bar lines
> connecting both staves. If this could be made to work into the function
> itself would be great, but I suppose it's quite difficult if not impossible
> since Lilypond has to be aware of the Staffgroup first, before even
> engraving the ossia measure, right?
>
> \version "2.20.0"
>
> \layout {
>    \context {
>      \Staff
>      \name OssiaStaff
>      \alias Staff
>      \remove "Time_signature_engraver"
>      \magnifyStaff #2/3
>      \hide Clef
>      firstClef = ##f
>      instrumentName = "ossia"
>      shortInstrumentName = "ossia"
>    }
>    \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 = "violin"
>   \relative {
>    c'4 d e g
>    f d e g
>    f d e g
>    \time 3/4
>     c b c
>    \time 4/4
>    c b c2
> }
>
> \new StaffGroup \with {
>   \override SystemStartBracket.stencil = ##f
>   \override SpanBar.glyph-name = #"!"
> } <<
>
> \new Staff = "viola"
> \relative {
>    \clef alto
>    c'4 d e g
>    f d e g
>    f d e g
>    \time 3/4
>    \ossia { e^"Treble clef? No, it's alto now." d f  }
>           { c^"c'? Yes, because \\relative says so." b c  }
>    \time 4/4
>    c b c2
> }
>
>   >> >>
>
> [image: image.png]
>
>
> Cheers,
> Martín.
>
> Am So., 27. Sept. 2020 um 16:50 Uhr schrieb Martín Rincón Botero <
> [email protected]>:
>
>> Sorry, I wasn't paying attention. shortInstrumentName = "ossia" clearly
>> works (instrumentName should work as well!).
>>
>> Am So., 27. Sept. 2020 um 16:46 Uhr schrieb Martín Rincón Botero <
>> [email protected]>:
>>
>>> Dear Aaron,
>>>
>>> this is, as usual, excellent. Thank you very much! I was reading Elaine
>>> Gould's book regarding ossias and two things would improve this snippet:
>>> Naming the ossia staff "ossia" (adding instrumentName = "ossia" to \context
>>> {  \Staff ...} doesn't work) and joining both systems with dashed bar lines
>>> except for the first barline of the system (putting \new StaffGroup \with
>>> {  \override SpanBar.glyph-name = #"!"   \remove
>>> System_start_delimiter_engraver } before << \new OssiaStaff... >> doesn't
>>> work either). What am I missing?
>>>
>>> Best regards,
>>> Martín.
>>>
>>> Am So., 27. Sept. 2020 um 13:26 Uhr schrieb Aaron Hill <
>>> [email protected]>:
>>>
>>>> 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
>>>
>>>
>>>
>>> --
>>> www.martinrinconbotero.com
>>>
>>
>>
>> --
>> www.martinrinconbotero.com
>>
>
>
> --
> www.martinrinconbotero.com
>


-- 
www.martinrinconbotero.com

Reply via email to