多声部处理细节之crossstaff音符处理

 

 

 

 

 

下面给出这几个案例的代码 ,可直接粘贴编译。

 

\version "2.20.0"
\language "english"

\paper { #(set-paper-size "a5") markup-markup-spacing = #'((padding . 4 )) }
\markup {钢琴作品里经常有横跨两行的音符,命令为 "\crossstaff" } \markup {这是lilypond 的官方文档里"\crossstaff"的案例} \layout { \context { \PianoStaff \consists #Span_stem_engraver } } { \new PianoStaff << \new Staff { <b d'>4 r d'16\> e'8. g8 r\! e'8 f' g'4 e'2 } \new Staff { \clef bass \voiceOne \autoBeamOff \crossStaff { <e g>4 e, g16 a8. c8} d \autoBeamOn g8 f g4 c2 } >> } \markup {但是,这是如果给左手加上其他声部,"\crossstaff"命令就失效了} { \new PianoStaff << \new Staff { <b d'>4 r d'16\> e'8. g8 r\! e'8 f' g'4 e'2 } \new Staff { << { \clef bass \voiceOne \autoBeamOff \crossStaff { <e g>4 e, g16 a8. c8} d \autoBeamOn} {<d f>2} %加了一个声部 >> g8 f g4 c2 } >> } \markup {由于原本要执行跨行的音符出现了位移,于是猜想是不是要调整NoteColumn的参数} \markup {理论上说,使用"\override NoteColumn.force-hshift = #-2"就是解决办法} \markup {但实践证明,这条命令也不管用} { \new PianoStaff << \new Staff { <b d'>4 r d'16\> e'8. g8 r\! e'8 f' g'4 e'2 } \new Staff { \clef bass <<{\voiceOne \autoBeamOff \crossStaff { <e g>4 e, g16 a8. c8} d \autoBeamOn} {\override NoteColumn.force-hshift = #-2 <d f>2}>> g8 f g4 c2 } >> } \markup {通过反复试验,发现了最关键之处——} \markup {要对多声部的每一个声部都标明"\\new voice",这样notecolumn的设置才能生效} \markup {并且,多声部下案例里的<e g>是默认hshift值为1的,会造成偏离} \markup {就必须再次声明hshift值为0才可以重新启用crossstaff命令} \markup {实验这次成功了,效果如下图} { \new PianoStaff << \new Staff { <b d'>4 r d'16\> e'8. g8 r\! e'8 f' g'4 e'2 } \new Staff { \clef bass <<\new Voice{ \voiceOne \autoBeamOff \crossStaff { \override NoteColumn.force-hshift = #0 <e g>4 e, g16 a8. c8} d \autoBeamOn g8 f g4 c2} \new Voice { \override NoteColumn.force-hshift = #-1 \voiceTwo <d f>} >> } >> }

 

posted on 2020-11-07 01:18  lilypond手残粉  阅读(192)  评论(0编辑  收藏  举报