Hello,
I am in charge of the question of (de)crescendo syntax issue in 2.12.2.
Here is what lilypond 2.12.2 currently does (in ly/spanners-init.ly):
- \< and \cr are equivalent: they start a crescendo event on the
previous note: #(make-span-event 'CrescendoEvent START)
- \> and \decr are equivalent: they start a decrescendo event on the
previous note: #(make-span-event 'DecrescendoEvent START)
- \!, \endcr and \enddecr are equivalent: they stop of (de)cresendo
event on the previous note: #(make-span-event 'CrescendoEvent STOP),
#(make-span-event 'DecrescendoEvent STOP) (is it really equivalent?)
- the following commands set the (de)cresendo to be text with dashed
line or hairpin forever (until changed to something else):
. crescTextCresc -> text "cresc."
. dimTextDecresc -> text "decresc."
. dimTextDecr -> text "decr."
. dimTextDim -> text "dim."
. crescHairpin -> hairpin
. dimHairpin -> hairpin
- the following commands start a text (de)crescendo on the next note
(affects only the next (de)crescendo):
. cresc -> text "cresc."
. dim -> text "dim."
- the following commands stop a (de)crescendo on the next note:
. enddim
. endcresc
Current syntax is not satisfactory because:
- syntax is different between \<, \>, \! and \cresc, \dim, \enddim,
\endcresc (undocumented):
. \<, \>, \! apply to the previous note,
. \cresc, \dim, \enddim, \endcresc apply to the next note
- there is no symmetry between \crescTextXXXX, \dimTextXXXX commands and
\XXXX commands
- some people just want cresc. to be printed without dashed line (spanner)
- \endcresc does something different from \endcr which is confusing
Here are my dreams:
- \<, \>, \! are used to start/stop (de)crescendo spanner (hairpin or text),
- crescTextXXX, dimTextXXX, crescHairpin, dimHairpin decide if \<, \>,
\! produce text or hairpin (applies for ever until changed to something
else), I would prefer simpler syntax: \crescCresc, \crescHairpin,
\dimDim, \dimDecr, \dimDecresc, i.e. remove Text
- \<"cresc.", \<"cresc. poco a poco", \>"dim."... produce a text spanner
with corresponding text, the spanner is ended with \!, the text applies
only once, i.e. next (de)crescendo produces hairpin if this is the
current setting
- \cresc, \dim, \decr, \decresc produce a text without spanner, applies
only once to the previous note, no need to finish with \! or \endcresc,
this could be implemented with a \markup command
- remove unnecessary \cr, \endcr, \decr, \enddecr
- remove unnecessary \enddim, \endcresc
I know that it is not possible to implement this only with scheme and
lily code but I am sure it is possible in C++.
Could you please comment on these propositions and give any other ideas.
F. Bron
PS: attached is a file that show the behaviour of the commands.
\version "2.12.2"
%{
1) Make a table of all the crescendo and decrescendo forms, so we can
see at a glance the missing/broken pieces.
2) Make a patch for v. 2.13 (when it's started) to get the appropriate
symmetry for all forms. This will require posting the table from 1)
on -user and getting feedback from users.
3) Make a patch for convert-ly, which will do two things:
a) fix the problem you've identified for the previous convert-ly rule for
2.12
b) Make a correct convert-ly rule for 2.13.
\<
\!
cr = #(make-span-event 'CrescendoEvent START) -> equivalent to \<
decr = #(make-span-event 'DecrescendoEvent START) -> equivalent to \>
enddecr = #(make-span-event 'DecrescendoEvent STOP) -> equivalent to \!
endcr = #(make-span-event 'CrescendoEvent STOP) -> equivalent to \!
cresc =
2.10.33: { #(ly:export (make-event-chord (list cr))) \set crescendoText = \markup { \italic "cresc." } \set crescendoSpanner = #'dashed-line }
2.12.2: { #(ly:export (make-event-chord (list cr))) \once \set crescendoText = \markup { \italic "cresc." } \once \set crescendoSpanner = #'text }
dim =
2.10.33: { #(ly:export (make-event-chord (list decr))) \set decrescendoText = \markup { \italic "dim." } \set decrescendoSpanner = #'dashed-line }
2.12.2: { #(ly:export (make-event-chord (list decr))) \once \set decrescendoText = \markup { \italic "dim." } \once \set decrescendoSpanner = #'text }
enddim =
2.10.33: { #(ly:export (make-event-chord (list enddecr))) \unset decrescendoText \unset decrescendoSpanner }
2.12.2: { #(ly:export (make-event-chord (list enddecr))) }
endcresc =
2.10.33: { #(ly:export (make-event-chord (list endcr))) \unset crescendoText \unset crescendoSpanner }
2.12.3: { #(ly:export (make-event-chord (list endcr))) }
2.10.33:
setTextCresc = { \set crescendoText = \markup { \italic "cresc." } \set crescendoSpanner = #'dashed-line }
setTextDecresc = { \set decrescendoText = \markup { \italic "decr." } \set decrescendoSpanner = #'dashed-line }
setTextDim = { \set decrescendoText = \markup { \italic "dim." } \set decrescendoSpanner = #'dashed-line }
2.12.2:
crescTextCresc = { \set crescendoText = \markup { \italic "cresc." } \set crescendoSpanner = #'text \override DynamicTextSpanner #'style = #'dashed-line }
dimTextDecresc = { \set decrescendoText = \markup { \italic "decresc." } \set decrescendoSpanner = #'text \override DynamicTextSpanner #'style = #'dashed-line }
dimTextDecr = { \set decrescendoText = \markup { \italic "decr." } \set decrescendoSpanner = #'text \override DynamicTextSpanner #'style = #'dashed-line }
dimTextDim = { \set decrescendoText = \markup { \italic "dim." } \set decrescendoSpanner = #'text \override DynamicTextSpanner #'style = #'dashed-line }
2.10.33:
setHairpinCresc = { \unset crescendoText \unset crescendoSpanner }
setHairpinDecresc = { \unset decrescendoText \unset decrescendoSpanner }
setHairpinDim = { \unset decrescendoText \unset decrescendoSpanner }
2.12.2:
crescHairpin = { \unset crescendoText \unset crescendoSpanner }
dimHairpin = { \unset decrescendoText \unset decrescendoSpanner }
grob properties:
\override context.name #'property = #value -> for ever, default context=Voice
\once \override context.name #'property = #value -> only once
\revert comes back to previous value (same context) after \override
context properties:
\set context.prop = #value default context=current bottom-most
\once \set context.prop = #value
\unset -> same context must be used
%}
music= \relative {
\set Score.currentBarNumber = #1
c4^\markup \typewriter { "\<" } \< c c c^\markup \typewriter { "\!" } \! % 1
c ^\markup \typewriter { "\cr" } \cr c c c^\markup \typewriter { "\!" } \! % 2
c ^\markup \typewriter { "\cresc" } \cresc c c c^\markup \typewriter { "\!" } \! % 3
c ^\markup \typewriter { "\<" } \< c c c^\markup \typewriter { "\!" } \! % 4
\break
c^\markup \typewriter { "\>" } \> c c c^\markup \typewriter { "\!" } \! % 5
c^\markup \typewriter { "\decr" } \decr c c c^\markup \typewriter { "\!" } \! % 6
c^\markup \typewriter { "\dim" } \dim c c c^\markup \typewriter { "\!" } \! % 7
c^\markup \typewriter { "\<" } \> c c c^\markup \typewriter { "\!" } \! % 8
\break
}
\paper {
indent = 0\mm
}
{
\override Score.BarNumber #'break-visibility = #'#(#t #t #t)
\override Score.RehearsalMark #'self-alignment-X = #LEFT
\time 4/4
\mark \markup \typewriter { "default" } \music
\crescTextCresc
\mark \markup \typewriter { "crescTextCresc" } \music
\crescHairpin
\mark \markup \typewriter { "crescHairpin" } \music
\dimTextDecresc
\mark \markup \typewriter { "dimTextDecresc" } \music
\dimTextDecr
\mark \markup \typewriter { "dimTextDecr" } \music
\dimTextDim
\mark \markup \typewriter { "dimTextDim" } \music
\dimHairpin
\mark \markup \typewriter { "dimHairpin" } \music
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-user