*.gcov
*.gcda
*.gcno
+*.600pk
Manuel de référence
* Basic notation:: notation musicale standard.
-* Instrument-specific notation::
+* Instrument-specific notation:: notation spécifique à un instrument.
* Advanced notation:: notation plus rarement utilisée.
* Changing defaults:: retoucher la mise en forme.
* Non-musical notation:: aspects autres que la notation musicale.
@node LilyPond command index
@appendix LilyPond command index
+UNTRANSLATED NODE: IGNORE ME
+
@printindex ky
@node LilyPond index
@appendix LilyPond index
+UNTRANSLATED NODE: IGNORE ME
+
@printindex cp
@bye
"Project-Id-Version: fr\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-12-23 14:50+0100\n"
-"PO-Revision-Date: 2006-12-23 15:02+0100\n"
+"PO-Revision-Date: 2006-12-27 23:51+0100\n"
"Last-Translator: John Mandereau <john.mandereau@free.fr>\n"
"Language-Team: Français <lilypond-user-fr@gnu.org>\n"
"MIME-Version: 1.0\n"
msgstr "Notation sur la portée"
msgid "Clef"
-msgstr "Clé"
+msgstr "Clés"
msgid "Key signature"
msgstr "Armure"
msgstr "Répétitions de mesure"
msgid "Instrument-specific notation"
-msgstr ""
+msgstr "Notation spécifique"
msgid "Piano music"
-msgstr ""
+msgstr "Musique pour piano"
msgid "Automatic staff changes"
-msgstr ""
+msgstr "Changements de portée automatiques"
msgid "Manual staff switches"
-msgstr ""
+msgstr "Changements de portée manuels"
msgid "Pedals"
-msgstr ""
+msgstr "Pédales"
msgid "Staff switch lines"
-msgstr ""
+msgstr "Lignes de changement de portée"
msgid "Cross staff stems"
-msgstr ""
+msgstr "Accords sur plusieurs portées"
msgid "Chord names"
-msgstr ""
+msgstr "Accords nommés"
msgid "Introducing chord names"
-msgstr ""
+msgstr "Introduction aux noms d'accords"
msgid "Chords mode"
-msgstr ""
+msgstr "Mode accords"
msgid "Printing chord names"
-msgstr ""
+msgstr "Imprimer des noms d'accords"
msgid "Vocal music"
-msgstr ""
+msgstr "Musique vocale"
msgid "Setting simple songs"
-msgstr ""
+msgstr "Écrire des chansons simples¿"
msgid "Entering lyrics"
-msgstr ""
+msgstr "Saisie des paroles"
msgid "Hyphens and extenders"
-msgstr ""
+msgstr "Traits d'union et de prolongation"
msgid "The Lyrics context"
-msgstr ""
+msgstr "Le contexte de paroles (Lyrics)"
msgid "Melismata"
-msgstr ""
+msgstr "Mélismes"
msgid "Another way of entering lyrics"
-msgstr ""
+msgstr "Une autre manière de saisir des paroles"
msgid "Flexibility in placement"
-msgstr ""
+msgstr "Flexibilité dans le placement"
msgid "Lyrics to multiple notes of a melisma"
-msgstr ""
+msgstr "Paroles sur plusieurs notes d'un mélisme"
msgid "Divisi lyrics"
-msgstr ""
+msgstr "Paroles alternatives"
msgid "Switching the melody associated with a lyrics line"
-msgstr ""
+msgstr "Changer la voix associée à une ligne de paroles"
msgid "Specifying melismata within the lyrics"
-msgstr ""
+msgstr "Indiquer les mélismes au sein des paroles"
msgid "Lyrics independent of notes"
-msgstr ""
+msgstr "Paroles indépendantes des notes"
msgid "Spacing lyrics"
-msgstr ""
+msgstr "Espacement des paroles"
msgid "More about stanzas"
-msgstr ""
+msgstr "Plus à propos des strophes"
msgid "Ambitus"
-msgstr ""
+msgstr "Ambitus"
msgid "Other vocal issues"
-msgstr ""
+msgstr "Autres éléments relatifs à la voix"
msgid "Rhythmic music"
-msgstr ""
+msgstr "Musique rythmique"
msgid "Showing melody rhythms"
-msgstr ""
+msgstr "Graver des lignes rythmiques"
msgid "Entering percussion"
-msgstr ""
+msgstr "Notation de percussions"
msgid "Percussion staves"
-msgstr ""
+msgstr "Portée de percussions"
msgid "Ghost notes"
-msgstr ""
+msgstr "Notes fantômes"
msgid "Guitar"
-msgstr ""
+msgstr "Guitare"
msgid "String number indications"
-msgstr ""
+msgstr "Indications de numéro de corde"
msgid "Tablatures basic"
-msgstr ""
+msgstr "Base des tablatures"
msgid "Non-guitar tablatures"
-msgstr ""
+msgstr "Tablatures autres que pour la guitare"
msgid "Banjo tablatures"
-msgstr ""
+msgstr "Tablatures pour banjo"
msgid "Fret diagrams"
-msgstr ""
+msgstr "Tablatures"
msgid "Right hand fingerings"
-msgstr ""
+msgstr "Doigtés pour la main droite"
msgid "Other guitar issues"
-msgstr ""
+msgstr "Autres éléments relatifs à la guitare"
msgid "Bagpipe"
-msgstr ""
+msgstr "Cornemuse"
msgid "Bagpipe definitions"
-msgstr ""
+msgstr "Définitions pour la cornemuse"
msgid "Bagpipe example"
-msgstr ""
+msgstr "Exemple pour la cornemuse"
msgid "Ancient notation"
-msgstr ""
+msgstr "Notations anciennes"
msgid "Ancient note heads"
-msgstr ""
+msgstr "Têtes de note anciennes"
msgid "Ancient accidentals"
-msgstr ""
+msgstr "Altérations anciennes"
msgid "Ancient rests"
-msgstr ""
+msgstr "Silences anciens"
msgid "Ancient clefs"
-msgstr ""
+msgstr "Clefs anciennes"
msgid "Ancient flags"
-msgstr ""
+msgstr "Crochets anciens"
msgid "Ancient time signatures"
-msgstr ""
+msgstr "Métriques anciennes"
msgid "Ancient articulations"
-msgstr ""
+msgstr "Articulations anciennes"
msgid "Custodes"
msgstr ""
msgstr ""
msgid "Figured bass"
-msgstr ""
+msgstr "Basse chiffrée"
msgid "Other instrument specific notation"
-msgstr ""
+msgstr "Autres notations spécifique à des instruments"
msgid "Artificial harmonics (strings)"
-msgstr ""
+msgstr "Harmoniques artificiels (cordes)"
msgid "Advanced notation"
-msgstr ""
+msgstr "Notation avancée"
msgid "Text"
-msgstr ""
+msgstr "Texte"
msgid "Text scripts"
msgstr ""
More information about adding and removing engravers can
be found in @ref{Modifying context plug-ins}.
+Instrument names may be changed in the middle of a piece,
+
+@lilypond[quote,fragment,verbatim,ragged-right]
+\set Staff.instrumentName = "First"
+\set Staff.shortInstrumentName = "one"
+c1 c c c \break
+c1 c c c \break
+\set Staff.instrumentName = "Second"
+\set Staff.shortInstrumentName = "two"
+c1 c c c \break
+c1 c c c \break
+@end lilypond
+
@seealso
@end itemize
+The macro @code{\transposedCueDuring} is
+useful to add cues to instruments which use a completely different
+octave range (for example, having a cue of a piccolo flute within
+a contra bassoon part).
+
+@lilypond[verbatim,ragged-right,quote]
+picc = \relative c''' {
+ \clef "treble^8"
+ R1 |
+ c8 c c e g2 |
+ a4 g g2 |
+}
+\addquote "picc" { \picc }
+
+cbsn = \relative c, {
+ \clef "bass_8"
+ c4 r g r
+ \transposedCueDuring #"picc" #UP c,, { R1 } |
+ c4 r g r |
+}
+
+<<
+ \context Staff = "picc" \picc
+ \context Staff = "cbsn" \cbsn
+>>
+@end lilypond
+
+
@node Aligning to cadenzas
@subsection Aligning to cadenzas
* Analysis brackets::
* Coloring objects::
* Parentheses::
+* Grid lines::
@end menu
@node Balloon help
@end example
+@node Grid lines
+@subsection Grid lines
+
+Vertical lines can be drawn between staves synchronized with
+the notes.
+
+Examples: @inputfileref{input/@/regression,grid@/-lines@/.ly}.
+
@internalsref{systemStartDelimiter}.
+@commonprop
+
+System start delimiters may be deeply nested,
+
+@lilypond[quote,ragged-right,verbatim]
+\new StaffGroup
+\relative <<
+ \set StaffGroup.systemStartDelimiterHierarchy
+ = #'(SystemStartSquare (SystemStartBracket a (SystemStartSquare b)) d)
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+ \new Staff { c1 }
+>>
+@end lilypond
+
+
@node Staff symbol
@subsection Staff symbol
* Layout tunings within contexts::
* Changing context default settings::
* Defining new contexts::
+* Aligning contexts::
@end menu
@end example
+@node Aligning contexts
+@subsection Aligning contexts
+
+New contexts may be aligned above or below exisiting contexts. This
+could be useful in setting up a vocal staff (@ref{Vocal ensembles}) and
+in ossia,
+
+@cindex ossia
+@findex alignAboveContext
+@findex alignBelowContext
+
+@lilypond[quote,ragged-right]
+ossia = { f4 f f f }
+\score{
+ \relative c' \new Staff = "main" {
+ c4 c c c
+ <<
+ \new Staff \with {alignAboveContext=main} \ossia
+ { d8 f d f d f d f }
+ >>
+ }
+}
+@end lilypond
+
@node The \override command
@end multitable
@end quotation
+
@node Many quotes of a large score
@section Many quotes of a large score
If you need to quote many fragments of a large score, you can also use
the clip systems feature, see @ref{Extracting fragments of notation}.
+
+@ignore
+@n ode Inserting LilyPond output into OpenOffice.org
+@s ection Inserting LilyPond output into OpenOffice.org
+
+@c index OpenOffice.org
+
+LilyPond notation can be added to OpenOffice.org with
+@u ref{http://@/ooolilypond@/.sourceforge@/.net@/,OOoLilyPond}
+
+@end ignore
+
+
@node Inserting LilyPond output into other programs
@section Inserting LilyPond output into other programs
Markup texts are rendered above, between or below the scores or music
expressions, wherever they appear.
+@cindex variables
+@cindex identifiers
+
@item
An identifier, such as
@example
often placed above the @code{\score}. That's just
another shorthand that LilyPond accepts.
+@cindex variables
+@cindex indentifiers
+
Another great shorthand is the ability to define
variables. All the templates use this
@cindex reporting bugs
If you have input that results in a crash or an erroneous output, then
-that is a bug. We try to respond to bug-reports promptly, and fix them as
-soon as possible. Help us by sending a defective input file, so we can
-reproduce the problem. Send the report via:
+that is a bug. There is a list of current bugs on our google bug tracker,
-@example
-@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs}
-@end example
-
-A few tips:
-@itemize @bullet
-
-@item Try to produce a very small input file which demonstrates the problem;
-one or two bars is often sufficient to reproduce a bug. The smaller the
-input file is, the easier it is for us to debug the problem.
-
-@item Don't forget to tell which version of LilyPond you use!
-
-@item If possible, use @code{ragged-right} in your example. This makes sure
-that the bug can be reproduced in all paper sizes.
-@end itemize
-
-@ignore
-@c the bug database is not up to date enough.
+@uref{http://code.google.com/p/lilypond/issues/list}
-When you've found a bug, have a look at our
-@uref{http://@/lilypond@/.org/@/bugs/@/v2.8/@/,bug database} to see if
-it has already been reported. You could also try to do a few searches
-on the mailing list for the bug. Sometimes the bug will have already
-been reported and a fix or workaround is already known.
-@end ignore
-
-Here is an example of a good bug report:
-
-@verbatim
-It seems that placement of accidentals is broken. In the
-following example, the accidental touches the note head.
+If you have discovered a bug which is not listed, please report the
+bug by following the directions on
-Using Mac OSX 10.3.7, lilypond 2.7.32
+@uref{http://lilypond.org/web/devel/participating/bugs}
-\version "2.9.13"
-\layout { ragged-right = ##t }
-\relative c'' {
- a4 b cis d
-}
-@end verbatim
-
-@lilypond[quote]
-\layout { ragged-right = ##t }
-\relative c''{
- \override Accidental #'extra-offset = #'(1.0 . 0)
- a4 b cis d
-}
-@end lilypond
@node Error messages
@section Error messages
}
@end lilypond
+@appendixsubsec SATB with aligned contexts
+
+Here all the lyrics lines are placed using @code{alignAboveContext}
+and @code{alignBelowContext}.
+
+@lilypond[quote,verbatim,ragged-right]
+\version "2.10.0"
+global = {
+ \key c \major
+ \time 4/4
+}
+
+sopMusic = \relative c'' {
+ c4 c c8[( b)] c4
+}
+sopWords = \lyricmode {
+ hi hi hi hi
+}
+
+altoMusic = \relative c' {
+ e4 f d e
+}
+altoWords =\lyricmode {
+ ha ha ha ha
+}
+
+tenorMusic = \relative c' {
+ g4 a f g
+}
+tenorWords = \lyricmode {
+ hu hu hu hu
+}
+
+bassMusic = \relative c {
+ c4 c g c
+}
+bassWords = \lyricmode {
+ ho ho ho ho
+}
+
+\score {
+ \new ChoirStaff <<
+ \new Staff = women <<
+ \new Voice =
+ "sopranos" { \voiceOne << \global \sopMusic >> }
+ \new Voice =
+ "altos" { \voiceTwo << \global \altoMusic >> }
+ >>
+ \new Lyrics \with {alignAboveContext=women} \lyricsto sopranos \sopWords
+ \new Lyrics \with {alignBelowContext=women} \lyricsto altos \altoWords
+% we could remove the line about this with the line below, since we want
+% the alto lyrics to be below the alto Voice anyway.
+% \new Lyrics \lyricsto altos \altoWords
+
+ \new Staff = men <<
+ \clef bass
+ \new Voice =
+ "tenors" { \voiceOne <<\global \tenorMusic >> }
+ \new Voice =
+ "basses" { \voiceTwo <<\global \bassMusic >> }
+ >>
+
+ \new Lyrics \with {alignAboveContext=men} \lyricsto tenors \tenorWords
+ \new Lyrics \with {alignBelowContext=men} \lyricsto basses \bassWords
+% again, we could replace the line above this with the line below.
+% \new Lyrics \lyricsto basses \bassWords
+ >>
+
+ \layout {
+ \context {
+ % a little smaller so lyrics
+ % can be closer to the staff
+ \Staff
+ \override VerticalAxisGroup #'minimum-Y-extent = #'(-3 . 3)
+ }
+ }
+}
+
+
+\score {
+ \new ChoirStaff <<
+ \new Staff = women <<
+ \new Voice =
+ "sopranos" { \voiceOne << \global \sopMusic >> }
+ \new Voice =
+ "altos" { \voiceTwo << \global \altoMusic >> }
+ >>
+
+ \new Lyrics \with {alignAboveContext=women} \lyricsto sopranos \sopWords
+ \new Lyrics \lyricsto altos \altoWords
+
+ \new Staff = men <<
+ \clef bass
+ \new Voice =
+ "tenors" { \voiceOne <<\global \tenorMusic >> }
+ \new Voice =
+ "basses" { \voiceTwo <<\global \bassMusic >> }
+ >>
+
+ \new Lyrics \with {alignAboveContext=men} \lyricsto tenors \tenorWords
+ \new Lyrics \lyricsto basses \bassWords
+ >>
+
+ \layout {
+ \context {
+ % a little smaller so lyrics
+ % can be closer to the staff
+ \Staff
+ \override VerticalAxisGroup #'minimum-Y-extent = #'(-3 . 3)
+ }
+ }
+}
+@end lilypond
+
@c bad node name to avoid node name confict
@node Ancient notation templates
@node Tutorial
@chapter Tutorial
-This tutorial starts with a short introduction to the LilyPond music
-language. After this first contact we will show you how to produce
-printed output. Then you will be able to create and print your own
-sheets of music.
+This tutorial starts with an introduction to the LilyPond music
+language and how to produce printed music. After this first contact we
+will explain how to create common musical notation.
@ifhtml
Many people learn programs by trying and fiddling around with the
@menu
* First steps::
-* Running LilyPond for the first time::
+* Second steps::
* More about pitches::
* Entering ties::
* Automatic and manual beams::
@example
@{
-c d e f g a b
+c' d' e' f' g' a' b' c''
@}
@end example
@noindent
the result looks like this
-@lilypond[fragment,quote,notime,relative=1]
-c d e f g a b
+@lilypond[quote]
+{
+c' d' e' f' g' a' b' c''
+}
@end lilypond
-Every piece of LilyPond input needs to have @{curly braces@} placed
+@emph{Warning:} Every piece of LilyPond input needs to have
+@{curly braces@} placed around the input. Don't forget them!
+
+@cindex Case sensitive
+In addition, LilyPond input is case sensitive. @code{ @{ c d e @} } is
+valid input; @code{ @{ C D E @} } will produce an error message.
+
+
+
+@unnumberedsubsec Entering music and viewing output
+
+In this section we will explain what commands to run
+and how to view or print the output.
+
+@unnumberedsubsec MacOS X
+
+If you double click LilyPond.app, it will open with an example
+file. Save it, for example, to @file{test.ly} on your Desktop, and
+then process it with the menu command @samp{Compile > Typeset File}.
+The resulting PDF file will be displayed on your screen.
+
+Be warned that the first time you ever run lilypond
+will take a minute or two, because
+all of the system fonts have to be analyzed first.
+
+For future use of LilyPond, you should begin by selecting "New"
+or "Open".
+
+@unnumberedsubsec Windows
+
+On Windows, start up a text-editor@footnote{Any simple or
+programmer-oriented editor will do, for example Notepad. Do not use a
+word processor, since these insert formatting codes that will confuse
+LilyPond.} and enter
+
+@verbatim
+{ c' e' g' c'' }
+@end verbatim
+
+Save it on the desktop as @file{test.ly} and make sure that it is not
+called @file{test.ly.TXT}. Double clicking @file{test.ly} will process
+the file and show the resulting PDF file.
+
+
+@unnumberedsubsec Unix
+
+Begin by opening a terminal window and starting a text editor. For
+example, you could open an xterm and execute
+@code{joe}@footnote{There are macro files for VIM addicts, and there
+is a @code{LilyPond-mode} for Emacs addicts. If they have not been
+installed already, refer to the file @file{INSTALL.txt}.}. In your
+text editor, enter the following input and save the file as
+@file{test.ly}
+
+@verbatim
+{ c' e' g' c'' }
+@end verbatim
+
+@noindent
+To process @file{test.ly}, proceed as follows
+
+@example
+lilypond test.ly
+@end example
+
+@noindent
+You will see something resembling
+
+@example
+lilypond test.ly
+GNU LilyPond 2.10.0
+Processing `test.ly'
+Parsing...
+Interpreting music... [1]
+Preprocessing graphical objects...
+Calculating line breaks... [2]
+Layout output to `test.ps'...
+Converting to `test.pdf'...
+@end example
+
+@cindex DVI file
+@cindex Viewing music
+@cindex xdvi
+@noindent
+The result is the file @file{test.pdf} which you can print or view
+with the standard facilities of your operating system.@footnote{If
+your system does not have any tools installed, you can try
+@uref{http://@/www@/.cs@/.wisc@/.edu/@/~ghost/,Ghostscript}, a freely
+available package for viewing and printing PDF and PostScript files.}
+
+
+@node Second steps
+@section Second steps
+
+@emph{Remember:} Every piece of LilyPond input needs to
+have @{curly braces@} placed
around the input. For the rest of this manual, most examples will
omit these braces, but don't forget them in your own music!
+@c will be removed once the tutorial either explains \relative or
+@c examples are fixed so they don't use it. -gp
In addition, many examples use @code{relative} mode. This is explained
in @ref{Octave entry}; for now simply be aware that some examples
should be placed inside @code{\relative @{ @emph{...music...} @}}.
Finally, LilyPond input is case sensitive. @code{ @{ c d e @} } is
valid input; @code{ @{ C D E @} } will produce an error message.
+@c End of latest re-write. Since I have no life, I may do more
+@c work on this, but I'd really like to have a Doc Helper take
+@c over this task. -gp
+
+
The @rglos{duration} of a note is specified by a number after the note
name. @samp{1} for a @rglos{whole note}, @samp{2} for a @rglos{half note},
@samp{4} for a @rglos{quarter note} and so on
Remember to enclose the notes and commands in curly braces
@code{@{@tie{}@dots{}@tie{}@}} to convert it to printable output.
-@c @li lypond[fragment,quote,noindent,line-width=55\staff-space]
@lilypond[fragment,quote,noindent,verbatim]
\time 3/4
\clef bass
@end quotation
-@node Running LilyPond for the first time
-@section Running LilyPond for the first time
-
-@c cheesy title to avoid clash with chapter name.
-
-In the last section we explained what kind of things you can enter in
-a LilyPond file. In this section we will explain what commands to run
-and how to view or print the output. If you have not used LilyPond
-before, want to test your setup, or want to run an example file
-yourself, read this section.
-
-@unnumberedsubsec MacOS X
-
-If you double click LilyPond.app, it will open with an example
-file. Save it, for example, to @file{test.ly} on your Desktop, and
-then process it with the menu command @samp{Compile > Typeset File}.
-The resulting PDF file will be displayed on your screen.
-
-Be warned that the first-ever run will take a minute or two, because
-all of the system fonts have to be analyzed first.
-
-@unnumberedsubsec Windows
-
-On Windows, start up a text-editor@footnote{Any simple or
-programmer-oriented editor will do, for example Notepad. Do not use a
-word processor, since these insert formatting codes that will confuse
-LilyPond.} and enter
-
-@verbatim
-{ c'4 e' g' }
-@end verbatim
-
-Save it on the desktop as @file{test.ly} and make sure that it is not
-called @file{test.ly.TXT}. Double clicking @file{test.ly} will process
-the file and show the resulting PDF file.
-
-
-@unnumberedsubsec Unix
-
-Begin by opening a terminal window and starting a text editor. For
-example, you could open an xterm and execute
-@code{joe}.@footnote{There are macro files for VIM addicts, and there
-is a @code{LilyPond-mode} for Emacs addicts. If they have not been
-installed already, refer to the file @file{INSTALL.txt}.} In your
-text editor, enter the following input and save the file as
-@file{test.ly}
-
-@verbatim
-{ c'4 e' g' }
-@end verbatim
-
-@noindent
-To process @file{test.ly}, proceed as follows
-
-@example
-lilypond test.ly
-@end example
-
-@noindent
-You will see something resembling
-
-@example
-lilypond test.ly
-GNU LilyPond 2.6.0
-Processing `test.ly'
-Parsing...
-Interpreting music... [1]
-Preprocessing graphical objects...
-Calculating line breaks... [2]
-Layout output to `test.ps'...
-Converting to `test.pdf'...
-@end example
-
-@cindex DVI file
-@cindex Viewing music
-@cindex xdvi
-@noindent
-The result is the file @file{test.pdf} which you can print or view
-with the standard facilities of your operating system.@footnote{If
-your system does not have any tools installed, you can try
-@uref{http://@/www@/.cs@/.wisc@/.edu/@/~ghost/,Ghostscript}, a freely
-available package for viewing and printing PDF and PostScript files.}
-
@node More about pitches
@section More about pitches
* Default files::
* Fitting music onto fewer pages::
* Advanced tweaks with Scheme::
+* Avoiding tweaks with slower processing::
@end menu
}
@end lilypond
+
+@node Avoiding tweaks with slower processing
+@section Avoiding tweaks with slower processing
+
+LilyPond can perform extra checks while it processes files. These
+commands will take extra time, but the result may require fewer
+manual tweaks.
+
+@example
+%% makes sure text scripts and lyrics are within the paper margins
+\override Score.PaperColumn #'keep-inside-line = ##t
+@end example
+
+
+
@node Saving typing with identifiers and functions
@section Saving typing with identifiers and functions
+@cindex variables
+@cindex identifiers
+
By this point, you've seen this kind of thing:
@lilypond[quote,verbatim,ragged-right]
RESULT_DIR=$(top-build-dir)/out/test-results/
-check-test: test
+local-check: test
rm -rf $(RESULT_DIR)
mkdir -p $(RESULT_DIR)
$(PYTHON) $(buildscript-dir)/output-distance.py --output-dir $(RESULT_DIR) $(CHECK_SOURCE) input/regression/out-test/
Bertalan Fodor
Benjamin Drung
Cameron Horsburgh
+Carl Sorensen
David Bobroff
Eduardo Vieira
Jay Anderson
+Jean-Marie Mouchel
Kazuhiro Suzuki
Laura Conrad
Luc Wehli
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=11
-PATCH_LEVEL=5
+PATCH_LEVEL=6
MY_PATCH_LEVEL=
AC_DEFINE_UNQUOTED(FLOWER_VERSION, "${FULL_FLOWER_VERSION}")
+# must also have local.make if configure fails.
+touch local.make
+
# Gather requirements and generate output.
STEPMAKE_END
EOF
-
-touch local.make
# test uses LILYPONDPREFIX
LOCALSTEPMAKE_TEMPLATES=lilypond
TEST_MODULE_LIBS = ../flower
-
+export top-src-dir
include $(depth)/make/stepmake.make
File_path path;
char cwd[PATH_MAX];
getcwd (cwd, PATH_MAX);
- string ly_dir = string (getenv ("LILYPONDPREFIX")) + "/ly";
+ string ly_dir = string (getenv ("top-src-dir")) + "/ly";
cout << ly_dir << endl;
path.parse_path (string (1, PATHSEP) + ly_dir);
string file_name = path.find (file, extensions);
file_name = path.find (file, extensions);
cout << file_name << endl;
BOOST_CHECK_EQUAL (file_name, ly_dir + "/init.ly");
+
}
c \bar ":|:" \mark \markup { \simple #":|:" }
c \bar "|." \mark \markup { \simple #"|." }
c \bar ":" \mark \markup { \simple #":" }
-
- c c c
+ c c c \bar "dashed" \mark \markup { \simple #"dashed" }
+ c c c c
\bar "||:" \mark \markup { \tiny \typewriter "unbroken" \simple
#"||:" }
c c c c
-\version "2.10.0"
+\version "2.11.5"
\header {
texidoc = "Cautionary accidentals are indicated using either
{
c''4
cis''?4
- \override Staff.Accidental #'cautionary-style = #'smaller
+ \once \override Staff.AccidentalCautionary #'font-size = #-2
cis''?4
- \override Staff.Accidental #'cautionary-style = #'parentheses
+ \once \override Staff.AccidentalCautionary #'parenthesized = ##t
cis''?4
}
}
-\version "2.10.0"
+\version "2.11.5"
\paper {
ragged-right = ##t
}
\time 2/4
\set suggestAccidentals = ##t
cis^> gis'-|
- \override AccidentalSuggestion #'cautionary-style = #'parentheses
+ \override AccidentalSuggestion #'parenthesized = ##t
cis,_"paren" gis'
- \override AccidentalSuggestion #'cautionary-style = #'()
- cis,_"no caut style" gis'
}
class Accidental_engraver : public Engraver
{
int get_bar_number ();
- void update_local_key_signature ();
+ void update_local_key_signature (SCM new_signature);
void create_accidental (Accidental_entry *entry, bool, bool);
- Grob *make_standard_accidental (Stream_event *note, Grob *note_head, Engraver *trans);
+ Grob *make_standard_accidental (Stream_event *note, Grob *note_head, Engraver *trans, bool);
Grob *make_suggested_accidental (Stream_event *note, Grob *note_head, Engraver *trans);
protected:
virtual void derived_mark () const;
public:
- SCM last_keysig_; // ugh.
+ SCM last_keysig_;
- /*
- Urgh. Since the accidentals depend on lots of variables, we have
- to store all information before we can really create the
- accidentals.
- */
vector<Grob*> left_objects_;
vector<Grob*> right_objects_;
};
/*
- TODO:
-
- ugh, it is not clear what properties are mutable and which
- aren't. eg. localKeySignature is changed at runtime, which means
- that references in grobs should always store ly_deep_copy ()s of
- those.
+ localKeySignature is changed at runtime, which means that references
+ in grobs should always store ly_deep_copy ()s of those.
*/
}
void
-Accidental_engraver::update_local_key_signature ()
+Accidental_engraver::update_local_key_signature (SCM new_sig)
{
- last_keysig_ = get_property ("keySignature");
+ last_keysig_ = new_sig;
set_context_property_on_children (context (),
ly_symbol2scm ("localKeySignature"),
- last_keysig_);
+ new_sig);
Context *trans = context ()->get_parent_context ();
bool
is_tied (SCM alteration_def)
{
- return (alteration_def == SCM_BOOL_T)
- || (scm_is_pair (alteration_def) && scm_car (alteration_def) == SCM_BOOL_T);
+ SCM tied = ly_symbol2scm ("tied");
+ return (alteration_def == tied
+ || (scm_is_pair (alteration_def) && scm_car (alteration_def) == tied));
}
-static int
-number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch,
- int bar_number, SCM laziness, bool ignore_octave)
+struct Accidental_result
+{
+ bool need_acc;
+ bool need_restore;
+
+ Accidental_result () {
+ need_restore = need_acc = false;
+ }
+
+ int score () const {
+ return need_acc ? 1 : 0
+ + need_restore ? 1 : 0;
+ }
+};
+
+Accidental_result
+check_pitch_against_signature (SCM key_signature, Pitch const &pitch,
+ int bar_number, SCM laziness, bool ignore_octave)
{
- int n = pitch->get_notename ();
- int o = pitch->get_octave ();
+ Accidental_result result;
+ int n = pitch.get_notename ();
+ int o = pitch.get_octave ();
SCM previous_alteration = SCM_BOOL_F;
SCM from_same_octave = ly_assoc_get (scm_cons (scm_from_int (o),
- scm_from_int (n)), sig, SCM_BOOL_F);
- SCM from_key_signature = ly_assoc_get (scm_from_int (n), sig, SCM_BOOL_F);
+ scm_from_int (n)), key_signature, SCM_BOOL_F);
+ SCM from_key_signature = ly_assoc_get (scm_from_int (n), key_signature, SCM_BOOL_F);
SCM from_other_octaves = SCM_BOOL_F;
- for (SCM s = sig; scm_is_pair (s); s = scm_cdr (s))
+ for (SCM s = key_signature; scm_is_pair (s); s = scm_cdr (s))
{
SCM entry = scm_car (s);
if (scm_is_pair (scm_car (entry))
else if (from_key_signature != SCM_BOOL_F)
previous_alteration = from_key_signature;
- int num = 1;
if (is_tied (previous_alteration))
{
- num = 1;
- *different = true;
+ result.need_acc = true;
}
else
{
Rational prev = extract_alteration (previous_alteration);
- Rational alter = pitch->get_alteration ();
-
- if (alter == prev)
- num = 0;
- else if ((alter.abs () < prev.abs ()
- || (prev * alter).sign () < 0) && alter.sign ())
- num = 2;
- *different = (alter != prev);
+ Rational alter = pitch.get_alteration ();
+
+ if (alter != prev)
+ {
+ result.need_acc = true;
+ if (alter.sign ()
+ && (alter.abs () < prev.abs ()
+ || (prev * alter).sign () < 0))
+ result.need_restore = true;
+ }
}
- return num;
+
+ return result;
}
-static int
-number_accidentals (bool *different,
- Pitch *pitch, Context *origin,
- SCM accidentals, int bar_number)
+static
+Accidental_result
+check_pitch_against_rules (Pitch const &pitch, Context *origin,
+ SCM rules, int bar_number)
{
- int number = 0;
-
- *different = false;
- if (scm_is_pair (accidentals) && !scm_is_symbol (scm_car (accidentals)))
+ Accidental_result result;
+ if (scm_is_pair (rules) && !scm_is_symbol (scm_car (rules)))
warning (_f ("accidental typesetting list must begin with context-name: %s",
- ly_scm2string (scm_car (accidentals)).c_str ()));
+ ly_scm2string (scm_car (rules)).c_str ()));
- for (; scm_is_pair (accidentals) && origin;
- accidentals = scm_cdr (accidentals))
+ for (; scm_is_pair (rules) && origin;
+ rules = scm_cdr (rules))
{
- // If pair then it is a new accidentals typesetting rule to be checked
- SCM rule = scm_car (accidentals);
+ SCM rule = scm_car (rules);
if (scm_is_pair (rule))
{
SCM type = scm_car (rule);
SCM laziness = scm_cdr (rule);
SCM localsig = origin->get_property ("localKeySignature");
- bool same_octave_b
- = scm_is_eq (ly_symbol2scm ("same-octave"), type);
- bool any_octave_b
- = scm_is_eq (ly_symbol2scm ("any-octave"), type);
+ bool same_octave
+ = (ly_symbol2scm ("same-octave") == type);
+ bool any_octave
+ = (ly_symbol2scm ("any-octave") == type);
- if (same_octave_b || any_octave_b)
+ if (same_octave || any_octave)
{
- bool d = false;
- int n = number_accidentals_from_sig
- (&d, localsig, pitch, bar_number, laziness, any_octave_b);
- *different = *different || d;
- number = max (number, n);
+ Accidental_result rule_result = check_pitch_against_signature
+ (localsig, pitch, bar_number, laziness, any_octave);
+
+ result.need_acc |= rule_result.need_acc;
+ result.need_restore |= rule_result.need_restore;
}
else
- warning (_f ("ignoring unknown accidental: %s",
+ warning (_f ("ignoring unknown accidental rule: %s",
ly_symbol2string (type).c_str ()));
}
ly_scm2string (rule).c_str ()));
}
- return number;
+ return result;
}
int
{
if (accidentals_.size () && !accidentals_.back ().done_)
{
- SCM accidentals = get_property ("autoAccidentals");
- SCM cautionaries = get_property ("autoCautionaries");
+ SCM accidental_rules = get_property ("autoAccidentals");
+ SCM cautionary_rules = get_property ("autoCautionaries");
int barnum = get_bar_number ();
for (vsize i = 0; i < accidentals_.size (); i++)
if (!pitch)
continue;
- bool different = false;
- bool different_caut = false;
-
- int num = number_accidentals (&different,
- pitch, origin,
- accidentals, barnum);
- int num_caut = number_accidentals (&different_caut,
- pitch, origin,
- cautionaries, barnum);
-
+ Accidental_result acc = check_pitch_against_rules (*pitch, origin,
+ accidental_rules, barnum);
+ Accidental_result caut = check_pitch_against_rules (*pitch, origin,
+ cautionary_rules, barnum);
bool cautionary = to_boolean (note->get_property ("cautionary"));
- if (num_caut > num)
+ if (caut.score () > acc.score ())
{
- num = num_caut;
- different = different_caut;
+ acc.need_acc |= caut.need_acc;
+ acc.need_restore |= caut.need_restore;
+
cautionary = true;
}
bool forced = to_boolean (note->get_property ("force-accidental"));
- if (num == 0 && forced)
- num = 1;
+ if (!acc.need_acc && forced)
+ acc.need_acc = true;
/* Cannot look for ties: it's not guaranteed that they reach
us before the notes. */
- if (num
+ if (acc.need_acc
&& !note->in_event_class ("trill-span-event"))
- create_accidental (&accidentals_[i], num > 1, cautionary);
+ create_accidental (&accidentals_[i], acc.need_restore, cautionary);
if (forced || cautionary)
accidentals_[i].accidental_->set_property ("forced", SCM_BOOL_T);
if (as_suggestion)
a = make_suggested_accidental (note, support, entry->origin_engraver_);
else
- a = make_standard_accidental (note, support, entry->origin_engraver_);
+ a = make_standard_accidental (note, support, entry->origin_engraver_, cautionary);
- SCM accs = scm_cons (scm_from_int (pitch->get_alteration () * Rational (4)),
- SCM_EOL);
if (restore_natural)
{
if (to_boolean (get_property ("extraNatural")))
- accs = scm_cons (scm_from_int (0), accs);
+ a->set_property ("restore-first", SCM_BOOL_T);
}
- /* TODO: add cautionary option in accidental. */
- if (cautionary)
- a->set_property ("cautionary", SCM_BOOL_T);
-
- a->set_property ("accidentals", accs);
+ a->set_property ("alteration", scm_from_int (pitch->get_alteration () * Rational (4)));
entry->accidental_ = a;
}
Grob *
Accidental_engraver::make_standard_accidental (Stream_event *note,
Grob *note_head,
- Engraver *trans)
+ Engraver *trans,
+ bool cautionary)
{
(void)note;
level, so that we get the property settings for
Accidental from the respective Voice.
*/
- Grob *a = trans->make_item ("Accidental", note_head->self_scm ());
+ Grob *a = 0;
+ if (cautionary)
+ a = trans->make_item ("AccidentalCautionary", note_head->self_scm ());
+ else
+ a = trans->make_item ("Accidental", note_head->self_scm ());
/*
We add the accidentals to the support of the arpeggio,
Side_position_interface::add_support (left_objects_[i], a);
}
- /*
- Hmm. Junkme?
- */
for (vsize i = 0; i < right_objects_.size (); i++)
Side_position_interface::add_support (a, right_objects_[i]);
Accidental_placement::add_accidental (accidental_placement_, a);
note_head->set_object ("accidental-grob", a->self_scm ());
-
+
return a;
}
Remember an alteration that is different both from
that of the tied note and of the key signature.
*/
- localsig = ly_assoc_front_x
- (localsig, key, scm_cons (SCM_BOOL_T, scm_from_int (barnum)));
+ localsig = ly_assoc_prepend_x (localsig, key, scm_cons (ly_symbol2scm ("tied"),
+ scm_from_int (barnum)));
change = true;
}
not really really correct if there are more than one
noteheads with the same notename.
*/
- localsig = ly_assoc_front_x (localsig, key,
+ localsig = ly_assoc_prepend_x (localsig, key,
scm_cons (ly_rational2scm (a),
scm_from_int (barnum)));
change = true;
/*
string harmonics usually don't have accidentals.
*/
- if (to_boolean (get_property ("harmonicAccidentals"))
- || !ly_is_equal (info.grob ()->get_property ("style"),
- ly_symbol2scm ("harmonic")))
+ if (info.grob ()->get_property ("style") != ly_symbol2scm ("harmonic")
+ || to_boolean (get_property ("harmonicAccidentals")))
{
Accidental_entry entry;
entry.head_ = info.grob ();
Accidental_engraver::process_music ()
{
SCM sig = get_property ("keySignature");
- /* Detect key sig changes.
- Update all parents and children. */
if (last_keysig_ != sig)
- update_local_key_signature ();
+ update_local_key_signature (sig);
}
ADD_ACKNOWLEDGER (Accidental_engraver, arpeggio);
"This engraver usually lives at Staff level, but "
"reads the settings for Accidental at @code{Voice} level, "
"so you can @code{\\override} them at @code{Voice}. ",
- "Accidental AccidentalSuggestion",
+ /* grobs */
+ "Accidental "
+ "AccidentalCautionary"
+ "AccidentalSuggestion",
+
+ /* props */
"autoAccidentals "
"autoCautionaries "
"internalBarNumber "
#include "pitch.hh"
#include "stencil.hh"
-/*
- TODO: insert support for smaller cautionaries, tie-break-reminders.
- Either here or in new-accidental-engraver.
-
- 'accidentals should go, for a single 'accidental property -- see
- accidental-placement.cc
-*/
Stencil
parenthesize (Grob *me, Stencil m)
{
}
vector<Box>
-Accidental_interface::accurate_boxes (Grob *a, Grob **common)
+Accidental_interface::accurate_boxes (Grob *me, Grob **common)
{
Box b;
- b[X_AXIS] = a->extent (a, X_AXIS);
- b[Y_AXIS] = a->extent (a, Y_AXIS);
+ b[X_AXIS] = me->extent (me, X_AXIS);
+ b[Y_AXIS] = me->extent (me, Y_AXIS);
vector<Box> boxes;
- bool parens = false;
- if (to_boolean (a->get_property ("cautionary")))
- {
- SCM cstyle = a->get_property ("cautionary-style");
- parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses"));
- }
+ bool parens = to_boolean (me->get_property ("parenthesized"));
- SCM accs = a->get_property ("accidentals");
- SCM scm_style = a->get_property ("style");
+ SCM scm_style = me->get_property ("style");
if (!scm_is_symbol (scm_style)
- && !parens
- && scm_ilength (accs) == 1)
+ && !to_boolean (me->get_property ("restore-first"))
+ && !parens)
{
- switch (scm_to_int (scm_car (accs)))
+ int acc = scm_to_int (me->get_property ("alteration"));
+ switch (acc)
{
case FLAT:
{
if (!boxes.size ())
boxes.push_back (b);
- Offset o (a->relative_coordinate (common[X_AXIS], X_AXIS),
- a->relative_coordinate (common[Y_AXIS], Y_AXIS));
+ Offset o (me->relative_coordinate (common[X_AXIS], X_AXIS),
+ me->relative_coordinate (common[Y_AXIS], Y_AXIS));
+
for (vsize i = boxes.size (); i--;)
boxes[i].translate (o);
style = ""; // currently same as default
if (style == "default")
style = "";
+
return style + to_string (alteration);
}
Accidental_interface::print (SCM smob)
{
Grob *me = unsmob_grob (smob);
- bool smaller = false;
- bool parens = false;
-
- bool caut = to_boolean (me->get_property ("cautionary"));
- if (caut)
- {
- SCM cstyle = me->get_property ("cautionary-style");
- parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses"));
- smaller = ly_is_equal (cstyle, ly_symbol2scm ("smaller"));
- }
+ bool parens = to_boolean (me->get_property ("parenthesized"));
SCM scm_style = me->get_property ("style");
string style;
*/
style = "";
- Font_metric *fm = 0;
- if (smaller)
- {
- SCM ac = Font_interface::music_font_alist_chain (me);
- /*
- TODO: should calc font-size by adding -2 to current font-size
- */
- ac = scm_cons (scm_list_1 (scm_cons
- (ly_symbol2scm ("font-size"),
- scm_from_int (-2))),
- ac);
- fm = select_font (me->layout (), ac);
- }
- else
- fm = Font_interface::get_default_font (me);
+ Font_metric *fm = Font_interface::get_default_font (me);
- Stencil mol;
- for (SCM s = me->get_property ("accidentals");
- scm_is_pair (s); s = scm_cdr (s))
+ SCM stencils = me->get_property ("stencils");
+ if (!scm_is_pair (stencils)
+ || !unsmob_stencil (scm_car (stencils)))
+ return SCM_EOL;
+
+ Stencil mol (*unsmob_stencil (scm_car (stencils)));
+ if (to_boolean (me->get_property ("restore-first")))
{
- int alteration = scm_to_int (scm_car (s));
- string font_char = get_fontcharname (style, alteration);
+ string font_char = get_fontcharname (style, 0);
Stencil acc (fm->find_by_name ("accidentals." + font_char));
if (acc.is_empty ())
me->warning (_f ("accidental `%s' not found", font_char));
else
- mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1, 0);
+ mol.add_at_edge (X_AXIS, LEFT, acc, 0.1, 0);
}
-
+
if (parens)
mol = parenthesize (me, mol);
return mol.smobbed_copy ();
}
+
+MAKE_SCHEME_CALLBACK (Accidental_interface, calc_stencils, 1);
+SCM
+Accidental_interface::calc_stencils (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+
+ SCM scm_style = me->get_property ("style");
+ string style;
+ if (scm_is_symbol (scm_style))
+ style = ly_symbol2string (scm_style);
+ else
+ /*
+ preferably no name for the default style.
+ */
+ style = "";
+
+
+ Font_metric *fm = Font_interface::get_default_font (me);
+ SCM acc = me->get_property ("alteration");
+ if (scm_is_number (acc))
+ {
+ string font_char = get_fontcharname (style, scm_to_int (acc));
+
+ Stencil acc_stencil (fm->find_by_name ("accidentals." + font_char));
+
+ return scm_list_1 (acc_stencil.smobbed_copy ());
+ }
+ else
+ return SCM_EOL;
+}
+
ADD_INTERFACE (Accidental_interface,
"a single accidental",
- "accidentals "
+
+ /* props */
+ "alteration "
"avoid-slur "
- "cautionary "
- "cautionary-style "
"forced "
"style "
+ "parenthesized "
+ "restore-first "
"tie "
);
}
else
{
- SCM l = scm_list_1 (scm_from_int (int (Real (Rational (4) * p.get_alteration ()))));
- accidentals_[d]->set_property ("accidentals", l);
+ accidentals_[d]->set_property ("alteration", scm_from_int (int (Real (Rational (4) * p.get_alteration ()))));
}
}
while (flip (&d) != DOWN);
{
Grob *me = unsmob_grob (smob);
Real staff_space = Staff_symbol_referencer::staff_space (me);
- Real staff_size;
Real thickness = Staff_symbol_referencer::line_thickness (me);
thickness *= robust_scm2double (me->get_property ("thickness"), 1.0);
- if (Staff_symbol_referencer::get_staff_symbol (me))
- staff_size = (Staff_symbol_referencer::line_count (me) - 1) * staff_space;
- else
- staff_size = 0.0;
Real blotdiameter = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
{
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_stencils, (SCM));
DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
DECLARE_GROB_INTERFACE();
SCM ly_hash_table_keys (SCM tab);
int procedure_arity (SCM);
-/* inserts at front, removing dublicates */
-inline SCM ly_assoc_front_x (SCM alist, SCM key, SCM val)
-{
- return scm_acons (key, val, scm_assoc_remove_x (alist, key));
-}
+SCM ly_assoc_prepend_x (SCM alist, SCM key, SCM val);
inline bool ly_is_list (SCM x) { return SCM_NFALSEP (scm_list_p (x)); }
inline bool ly_is_procedure (SCM x) { return SCM_NFALSEP (scm_procedure_p (x)); }
inline bool ly_is_port (SCM x) { return SCM_NFALSEP (scm_port_p (x)); }
This is local. We don't assign to self_scm_ directly, to assure \
that S isn't GC-ed from under us. \
\
- We don't use smobbed_self () to ensure that mark_smob () doesn't have to \
- deal half-initialized objects: scm_done_malloc ( ) might trigger GC. \
- the warning in smobs.hh is just to be doubleplus goodly sure \
+ We don't use smobbed_self () to ensure that mark_smob () doesn't \
+ have to deal half-initialized objects: scm_done_malloc ( ) might \
+ trigger GC.the warning in smobs.hh is just to be doubleplus \
+ goodly sure \
*/ \
SCM s; \
SCM_NEWSMOB (s, CL::smob_tag_, this); \
SCM c;
SCM d;
};
+
+/* inserts at front, removing duplicates */
+SCM ly_assoc_prepend_x (SCM alist, SCM key, SCM val)
+{
+ return scm_acons (key, val, scm_assoc_remove_x (alist, key));
+}
+
/*
- text-spanner-engraver.cc -- implement Ottava_spanner_engraver
+ ottova-engraver.cc -- implement Ottava_spanner_engraver
source file of the GNU LilyPond music typesetter
trill_accidental_ = make_item ("TrillPitchAccidental", ev->self_scm ());
// fixme: naming -> alterations
- trill_accidental_->set_property ("accidentals", scm_list_1 (scm_from_int (Rational (4)
- * p->get_alteration ())));
+ trill_accidental_->set_property ("alteration", scm_from_int (Rational (4)
+ * p->get_alteration ()));
Side_position_interface::add_support (trill_accidental_, trill_head_);
trill_head_->set_object ("accidental-grob", trill_accidental_->self_scm ());
junk_pointers (configurations_);
}
-Real
-broken_trend_y (Slur_score_state const &state, Direction hdir)
-{
- /* A broken slur should maintain the same vertical trend
- the unbroken slur would have had. */
- Real by = 0.0;
- if (Spanner *mother = dynamic_cast<Spanner *> (state.slur_->original ()))
- {
- Grob *neighbor = mother->broken_neighbor (hdir);
- if (!neighbor)
- return by;
-
-
- Spanner *common_mother
- = dynamic_cast<Spanner *> (state.common_[Y_AXIS]->original ());
- int common_k
- = broken_spanner_index (dynamic_cast<Spanner *> (state.common_[Y_AXIS]));
- int common_j = common_k + hdir;
-
- if (common_j < 0 || vsize (common_j) >= common_mother->broken_intos_.size ())
- return by;
-
- Grob *common_next_system = common_mother->broken_intos_[common_j];
-
- SCM last_point = scm_car (scm_last_pair (neighbor->get_property ("control-points")));
-
- return scm_to_double (scm_cdr (last_point))
- + neighbor->relative_coordinate (common_next_system, Y_AXIS);
- }
- return by;
-}
-
/*
copy slur dir forwards across line break.
*/
if (Accidental_interface::has_interface (g))
{
penalty = parameters_.accidental_collision_;
- /* Begin copy accidental.cc */
- bool parens = false;
- if (to_boolean (g->get_property ("cautionary")))
- {
- SCM cstyle = g->get_property ("cautionary-style");
- parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses"));
- }
- SCM accs = g->get_property ("accidentals");
+ SCM alt = g->get_property ("alteration");
SCM scm_style = g->get_property ("style");
if (!scm_is_symbol (scm_style)
- && !parens
- && scm_ilength (accs) == 1)
+ && !to_boolean (g->get_property ("parenthesized"))
+ && !to_boolean (g->get_property ("restore-first")))
{
/* End copy accidental.cc */
- switch (scm_to_int (scm_car (accs)))
+ switch (scm_to_int (alt))
{
case FLAT:
case DOUBLE_FLAT:
local-help: local-ly-help
-local-ly-help:
- @echo -e "\
- convert-ly convert all LilyPond sources\n\
-"\
-#
-
local-WWW: $(outdir)/collated-files.html $(outdir)/collated-files.pdf
#.PRECIOUS: $(outdir)/$(NAME).texi
+
-% -*-Fundamental-*-
+% -%-Fundamental-%- -*-Metafont-*-
% parmesan-accidentals.mf -- implement ancient accidentals
%
% source file of LilyPond's pretty-but-neat music font
-% -*-Fundamental-*-
+% -%-Fundamental-%- -*-Metafont-*-
% parmesan-flags.mf -- implement ancient flags
%
% source file of LilyPond's pretty-but-neat music font
-
-% -*-Fundamental-*-
+% -%-Fundamental-%- -*-Metafont-*-
% parmesan-generic.mf -- implement generic stuff: include lots of files,
% but don't set dims.
%
-% -*-Fundamental-*-
+% -%-Fundamental-%- -*-Metafont-*-
% parmesan-timesig.mf -- implement ancient time signatures
%
% source file of LilyPond's pretty-but-neat music font
conversions.append (((2, 11, 2), conv, """ly:clone-parser -> ly:parser-clone"""))
+
+
+def conv (str):
+ str = re.sub ("Accidental\s*#'cautionary-style\s*=\s*#'smaller",
+ "AccidentalCautionary #'font-size = #-2", str)
+ str = re.sub ("Accidental\s*#'cautionary-style\s*=\s*#'parentheses",
+ "AccidentalCautionary #'parenthesized = ##t", str)
+
+ str = re.sub ("([A-Za-z]+)\s*#'cautionary-style\s*=\s*#'parentheses",
+ r"\1 #'parenthesized = ##t", str)
+ str = re.sub ("([A-Za-z]+)\s*#'cautionary-style\s*=\s*#'smaller",
+ r"\1 #'font-size = #-2", str)
+
+ return str
+
+conversions.append (((2, 11, 5), conv, """ly:clone-parser -> ly:parser-clone"""))
+
(X-offset ,number? "The horizontal amount that this object is moved relative to its X-parent")
(Y-offset ,number? "The vertical amount that this object is moved
relative to its Y-parent")
- (accidentals ,list? "List of alteration numbers")
+ (alteration ,number? "alteration numbers for accidental")
(after-line-breaking ,boolean? "Dummy property, used to trigger callback for after-line-breaking")
(alteration-alist ,list? "List of @code{(@var{pitch}
. @var{accidental})} pairs for key signature.")
#t means visible, #f means killed.")
(c0-position ,integer? "An integer indicating the position of
middle C.")
- (cautionary-style ,symbol? "How to print cautionary
-accidentals. Choices are @code{smaller} or
-@code{parentheses}.")
- (cautionary ,boolean? "Is this a cautionary accidental?")
(concaveness ,number? "A beam is concave when its inner stems are
closer to the beam than the two outside stems. This number is a
measure of the closeness of the inner stems. It is used for damping
This affects the choices of the page breaker; it will avoid a page
turn at a column with a positive penalty and prefer a page turn at a column
with a negative penalty.")
+ (parenthesized ,boolean? "Parenthesize this grob.")
(line-break-penalty ,number? "Penalty for a line break at this column.
This affects the choices of the line breaker; it will avoid a line
break at a column with a positive penalty and prefer a line break at a column
(remove-empty ,boolean? "If set, remove group if it contains no
@code{interesting-items}")
(remove-first ,boolean? "Remove the first staff of a orchestral score?")
+ (restore-first ,boolean? "Print a natural before the accidental.")
(rhythmic-location ,rhythmic-location? "Where (bar number, measure position) in the score.")
(right-padding ,ly:dimension? "Space to insert on the right side of an object (eg. between note and its accidentals.)")
(rotation ,list? "Number of degrees to rotate this object, and what point
(Accidental
. (
(avoid-slur . inside)
- (cautionary-style . parentheses)
(stencil . ,ly:accidental-interface::print)
+ (stencils . ,ly:accidental-interface::calc-stencils)
(after-line-breaking
. ,ly:accidental-interface::after-line-breaking)
(meta . ((class . Item)
(interfaces . (accidental-interface
font-interface))))))
+ (AccidentalCautionary
+ . (
+ (avoid-slur . inside)
+ (parenthesized . #t)
+ (stencil . ,ly:accidental-interface::print)
+ (stencils . ,ly:accidental-interface::calc-stencils)
+ (after-line-breaking
+ . ,ly:accidental-interface::after-line-breaking)
+ (meta . ((class . Item)
+ (interfaces . (accidental-interface
+ font-interface))))))
+
(AccidentalSuggestion
. (
,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent))
,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
(self-alignment-X . ,CENTER)
- (cautionary . #t)
- (cautionary-style . smaller)
+ (font-size . -2)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
- (cautionary-style . parentheses)
(direction . ,UP)
(staff-padding . 0.25)
+ (outside-staff-priority . 0)
(script-priority . 0)
+ (stencils . ,ly:accidental-interface::calc-stencils)
(side-axis . ,X)
(meta . ((class . Item)
(interfaces . (side-position-interface
(padding . 0.5)
(X-offset . ,ly:side-position-interface::x-aligned-side)
(direction . ,LEFT)
- (cautionary-style . parentheses)
(stencil . ,ly:accidental-interface::print)
+ (stencils . ,ly:accidental-interface::calc-stencils)
+
(after-line-breaking . ,ly:accidental-interface::after-line-breaking)
(side-axis . ,X)
(meta . ((class . Item)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(stencil . ,ly:text-interface::print)
(font-shape . italic)
- (padding . 0.6)
(staff-padding . 0.2)
(font-size . -4)
(meta . ((class . Item)
(font-size . 2)
(baseline-skip . 2)
(break-visibility . ,end-of-line-invisible)
- (break-align-symbol . staff-bar)
+ (break-align-symbol . clef)
(padding . 0.8)
(outside-staff-priority . 1500)
(meta . ((class . Item)
(font-size . -4)
(side-axis . ,X)
(stencil . ,ly:accidental-interface::print)
+ (stencils . ,ly:accidental-interface::calc-stencils)
(meta . ((class . Item)
(interfaces . (item-interface
trill-pitch-accidental-interface
note-head-interface
rhythmic-head-interface
font-interface
- accidental-interface
axis-group-interface))))))
(TrillPitchHead
(check-internal-types #f "check every property assignment for types")
(clip-systems #f "Generate cut-out snippets of a score")
(debug-gc #f "dump memory debugging statistics")
- (debug-gc-assert-parsed-dead
- #f "for memory debugging: ensure that all refs to parsed objects are dead.")
+ (debug-gc-assert-parsed-dead #f "for memory debugging:
+ensure that all refs to parsed objects are dead. This is an internal option, and is switched on automatically for -ddebug-gc.")
(debug-lexer #f "debug the flex lexer")
(debug-midi #f "generate human readable MIDI")
(debug-parser #f "debug the bison parser")
(ly:reset-all-fonts)
(gc)
(gc)
+ (display "Asserting dead objects\n")
(ly:set-option 'debug-gc-assert-parsed-dead #t)
(gc)
(ly:set-option 'debug-gc-assert-parsed-dead #f)