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

Reply via email to