lilypond-user
[Top][All Lists]
Advanced

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

Re: Automatic cross-staff chords - testing help


From: Thomas Morley
Subject: Re: Automatic cross-staff chords - testing help
Date: Fri, 8 Jan 2021 00:55:32 +0100

Am Do., 7. Jan. 2021 um 13:08 Uhr schrieb Davide Bonetti <db@davidebonetti.it>:
>
> Hi,
>
> Great work.
>
> I've done some testing and found some bugs. Below the code I've tested,
> attached the PDF with the result (on second page, first page are your
> examples).
>
> \autoSplitChord doesn't works with curly braces, it returns blank output
> (like a blank space in the score), so it's not possible to work with:
> - chordmode
> - more than one chord a time
> - moltiple voices
>
> Also, \autoSplitChord doesn't works with single notes, it returns blank
> space.
>
> It accepts variables, but the result is the same.
>
> Pippo = <c e g c' e'>1
> PippoDue = \chordmode {c1:/g}
> PippoTre = c1
> PippoQuattro = {<c e g>}
>
> \new PianoStaff
> \with { \consists #Span_stem_engraver }
> <<
>    \new Staff = "up"
>    {
>      \key c\major
>      %chord with stem up
>      \autoSplitChord #UP <f a a' f'>2         %works
>      %chord without stem
>      \autoSplitChord <g c' e'>4            %works
>      %chord with stem down
>      \autoSplitChord #DOWN <g c' e'>        %works
>      %chord, whole note
>      \autoSplitChord <c g e' c''>1        %works
>      %chordmode
>      \autoSplitChord \chordmode {c:/g}         %blank output
>      %chord entered in curly braces
>      \autoSplitChord {<c g e' c''>}         %blank output
>      %more than one chord, in curly braces
>      \autoSplitChord {<c e g> <d     f a>}  %blank output
>      %single note
>      \autoSplitChord c                 %blank output
>      %single note in a chord
>      \autoSplitChord <c'>            %works
>      %chord entered in polyphonic style
>      \autoSplitChord <<c\\e'\\g''\\g,>>        %works
>      %polyphonic style, different durations
>      \autoSplitChord <<c1\\e'2\\g''\\g,>>    %warning & strange output
>      %polyphonic style, with some curly braces
>      \autoSplitChord <<c1 \\ {e2 f}\\d'1>>    %notes in curly braces are
> not printed
>      %polyphonic style, with curly braces
>      \autoSplitChord <<
>        {c4 d e f}
>        \\
>        {c' d' e' f'}
>      >>                        %blank output
>      %chord in a variable
>      \autoSplitChord \Pippo            %works
>      %chord in a variable with chordmode
>      \autoSplitChord \PippoDue            %blank output
>      %single note in a variable
>      \autoSplitChord \PippoTre            %blank output
>      %chord in curly braces in a variable
>      \autoSplitChord \PippoQuattro        %blank output
>    }
>    \new Staff = "down"
>    {
>      \key c\major
>      \clef bass
>      s1
>    }
>  >>
>
> Thank you for the work.
>
> Cheers
>
> Davide

Hi Davide,

many thanks for testing.

Though, `autoSplitChord` is meant ot be a tool applied to chords, i.e.
event-chords.
All of:
\chordmode { c:/g }
{ <c g e' c''> }
<<
  {c4 d e f}
  \\
  {c' d' e' f'}
>>
is sequential or simultaneous music.
A single note-event like c'4 is not an event-chord as well.

In all those cases `autoSplitChord` is not expected to work.
\autoSplitChord << b \\ e' \\ g'' >> works more by accident.

Below is an improved function which will simply returns the input, if
it's not an event-chord, avoiding the blank space.
\autoSplitChord << b \\ e' \\ g'' >> will stop working as well, all
notes are returned unchanged.

autoSplitChord =
#(define-music-function (stem-dir staff-names pitch chord)
  ((ly:dir? 0) (pair? '("up" . "down")) (ly:pitch?) ly:music?)
  (_i "Split @var{chord} at optional @var{pitch}.  The default of @var{pitch} is
@code{#f}, which is interpreted by the called procedure
@code{make-autosplit-chord} as @code{c'}.

The splitted chords are distributed to named staves, relying on optional
@var{staff-names}.

The optional @var{stem-dir}, determines the direction of the stems and whether
the chords may be connected by a cross-staff stem.
The default results in unconnected chords.
If the @code{Span_stem_engraver} is consisted, the chords may be connected by a
cross-staff stem.")
  (if (music-is-of-type? chord 'event-chord)
      (let* ((skip (make-duration-of-length (ly:music-length chord)))
             (devided-pitches (make-autosplit-chord chord pitch))
             (upper-chord
               (if (pair? (car devided-pitches))
                   (make-event-chord (car devided-pitches))
                   (make-skip-music skip)))
             (lower-chord
               (if (pair? (cdr devided-pitches))
                   (make-event-chord (cdr devided-pitches))
                   (make-skip-music skip))))
        #{
          <<
            \context Staff = #(car staff-names)
              \context Voice {
                $(if (negative? stem-dir)
                  #{
                     \once \override Stem.cross-staff = #cross-staff-connect
                     \once \override Flag.style = #'no-flag
                     <>\noBeam
                  #})
                $(if (not (zero? stem-dir))
                  #{ \once \override Stem.direction = #stem-dir #})
                #upper-chord
              }

            \context Staff = #(cdr staff-names)
              \context Voice {
                $(if (positive? stem-dir)
                  #{
                     \once \override Stem.cross-staff = #cross-staff-connect
                     \once \override Flag.style = #'no-flag
                     <>\noBeam
                  #})
                $(if (not (zero? stem-dir))
                  #{ \once \override Stem.direction = #stem-dir #})
                #lower-chord
              }
          >>
        #})
      #{ \context Staff $chord #}))

\autoSplitChord is supposed to work on a single chord of a single
Voice. Like \autochange works an single notes of  a single Voice.
Best would be a combination, I'll continue thinking about it.


Thanks again,
  Harm



reply via email to

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