lilypond-devel
[Top][All Lists]
Advanced

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

Re: \change Voice


From: Keith OHara
Subject: Re: \change Voice
Date: Sat, 25 Apr 2015 12:17:05 -0700
User-agent: Opera Mail/12.16 (Win32)

On Fri, 24 Apr 2015 22:04:28 -0700, David Kastrup <address@hidden> wrote:

Keith OHara <address@hidden> writes:

The thing you want to change is the "outlet" of the sequential
iterator.

That's just \context Voice = "xxx".  However, it does not take engravers
and properties along, as opposed to \change ...

Yes.  The current part-combine-iterator does not carry properties along either,
which is to first approximation what we want, when a line of music moves from 
'a2' with \oneVoice to 'two' with \voiceTwo style.

A big difference is that \change... changes routing so that all following music 
is affected, while \context... applies to only the following music expression.  
We would need to form sequential music  groups in order to use the \context... 
method.

\new Staff <<
  \context Voice = "up" \with { \voiceOneStyle } s1*2
  \context Voice = "down" \with { \voiceTwoStyle } s1*2
  { \context Voice = "up" { f'2 f' }
    \context Voice = "down" { e' e' }
  } >>

Current \partcombine does not collect segments into sequential music groups, 
but it could do so.  The analysis pass of \partcombine looks at the music 
globally to find the transition points that it puts in 'split-list, so a next 
pass can form sequential music groups between the transition points.

  \partcombine
    {R1*3 g''2 d''2 }
    {r1 r2 b2 R1 b2 d'2 }

could be transformed into

  \new Staff <<
    \context Voice = "one" \with { \voiceOne }
    \context Voice = "two" \with { \voiceTwo }
    \context Voice = "solo"
    \context Voice = "shared"
    {
      \context Voice = "shared" {R1 r2}
      \context Devnull { R2 }
      \context Voice = "shared" {R1 }
      \context Voice = "one" { g''2 }
      \context Voice = "shared" { d'' }
    }
    {
      \context Devnull {r1 r2}
      \context Voice = "solo" { \mark"solo II" b2 }
      \context Devnull { R1 }
      \context Voice = "two" { b2 }
      \context Voice = "shared" { d'2 }
    } >>

I imagined the splitting of multi-measure rests being done in the grouping pass, rather than in the iterator 
as it is done now.  If we define the names "one", etc., in just one place, then we can choose to 
replace "solo" with "shared" so that they use the same Voice.

I think \context...{} segments make a better implementation of \partcombine 
than re-routing outlets in the part-combine-iterator.cc




reply via email to

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