Dear Lilypond-user,
I sent this mail to the wrong mail, I should have send it to
lilypond-user-requ...@gnu.org ! Sorry!
Best,
Artur Dobija

pon., 8 sty 2024 o 23:56 Artur Dobija <arturdob...@gmail.com> napisał(a):

> Dear Experts,
>
> I am working on writing my own function which combines several notes into
> one custom symbol (ligature).
> (For the context, I now about Mensural_ligature_engraver, but I want to
> create something that will allow for more flexibility, as I try to engrave
> symbols as close to one of different manuscripts from different eras and by
> different hands)
>
> My code is like:
> \relative { a \customLigatura { b c d } f }
>
> In my approach, I want to remove all the notes except the first, which
> will receive the ligature stencil.
> I need to *remove* them, not only hide, because if they are still there,
> they still heavily affect the spacing in unexpected ways!
> What I ask you is: how to *remove* notes "c" and "d" in such a way, that
> it would not mess up the relative mode and think, that the note "f" is
> calculated from the note "d" (otherwise it will be octave lower)? The
> function is agnostic of the pitch before and pitch after.
>
> What I tried:
> – \resetRelativeOctave
> – setting to-relative-callback note property to ##f
>
> customLigatura =
> #(define-music-function
>   (music)
>   (ly:music?)
>
>   (let ((notes (list)) ; notes participating in ligature creation: pitch,
> duration, shape (square, punctum, obliqua, pes, )
>         (total-duration (make-duration-of-length (ly:music-length music))))
>
>     ; get all those notes only that will form ligature's stencil
>     (for-some-music
>       (lambda (m)
>        (if (equal? (ly:music-property m 'name) 'NoteEvent)
>          (set! notes
>                (append notes
>                       (list (make-music
>                         'NoteEvent
>                         'pitch (ly:music-property m 'pitch)
>                         'duration (ly:music-property m 'duration)
>                   'mensural-ligature-shape (ly:music-property m
> 'mensural-ligature-shape)))))
>          #f))
>       music)
>
>   #{
>       \once \override MensuralVoice.NoteHead.stencil =
> #ly:text-interface::print
>       \once \override MensuralVoice.NoteHead.text = \markup \translate
> #'(0 . -0.5) "Ligatura" % this will be my stencil.
>
>      % only the first note with new stencil must be printed
>       #(make-music
>          'NoteEvent
>          'duration total-duration
>          'pitch (ly:music-property (list-ref notes 0) 'pitch))
>
>     %{************************************************************
>            What goes here to trick the relative mode to think
>           that it must calculate the pitch from the LAST note
>           (and not the given note)?
>            something like: \countRelativeFrom d
>
>       I tried:
>   (ly:make-music-relative! music (ly:make-pitch
>                                                      -1
>                                                      (quotient
>                                                      (ly:pitch-steps
> (ly:make-pitch 1 0))
>                                                      2)))
>   \resetRelativeOctave #(last (music-pitches music))
>     ************************************************************%}
>   #}))
>
> % TESTS
> <<
> \new MensuralStaff \new MensuralVoice \relative { \clef F g,1 \ligatura {
> a a' c,, g''} a }
> \new MensuralStaff \new MensuralVoice \relative { \clef F g,1 a a' c,, g''
> a }
> >>
> <<
> \new MensuralStaff \new MensuralVoice \relative { a1 \ligatura { b c d } f
> }
> \new MensuralStaff \new MensuralVoice \relative { a1 b c d f }
> >>
>
> % ArturJD, Engraving Chant, https://www.instagram.com/engraving.chant/
>
>

Reply via email to