[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