@end ignore
+@item
+The construct @code{#@{ @dots{} #@}} can now be used not just for
+constructing sequential music lists, but also for single music events,
+void music expressions, post events, markups (mostly freeing users from
+having to use the @code{markup} macro), markup lists, number
+expressions, context definitions and modifications, and a few other
+things. If it encloses nothing or only a single music event, it no
+longer returns a sequential music list but rather a void music
+expression or just the music event itself, respectively.
+
+@item
+New command-line option @option{--loglevel=@var{level}} to control how much output
+LilyPond creates. Possible values are ERROR, WARN, BASIC_PROGRESS, PROGRESS, DEBUG.
+
@item
@code{\set \once} now correctly resets the property value to the previous value.
@lilypond[fragment,quote,relative=2]
The Contributor's Guide as a whole is still a work in progress,
but some chapters are much more complete than others. Chapters
which are @qq{almost finished} should not have major changes
-without a discussion on @code{-devel}; in other chapters, a
+without a discussion on @w{@code{-devel}}; in other chapters, a
disorganized @qq{wiki-style dump} of information is encouraged.
Do not change (other than spelling mistakes) without discussion:
@item
Frog Meister: is responsible for code patches from (relatively)
inexperienced contributors. Keeps track of patches, does initial
-reviewing of those patches, sends them to @code{-devel} when
+reviewing of those patches, sends them to @w{@code{-devel}} when
they've had some initial review on the Frog list, pesters the
-@code{-devel} community into actually reviewing said patches, and
+@w{@code{-devel}} community into actually reviewing said patches, and
finally pushes the patches once they're accepted. This person is
@emph{not} responsible for training new programmers, because that
would be far too much work -- he job is @qq{only} to guide
@node Policy decisions (finished)
@subsection Policy decisions (finished)
-@subheading GOP-PROP 1: python formatting
+Here is a record the final decisions, along with links to the
+discussions.
+
+@menu
+* GOP-PROP 1 - python formatting::
+* GOP-PROP 2 - mentors and frogs::
+* GOP-PROP 3 - C++ formatting::
+* GOP-PROP 4 - lessons from 2.14::
+* GOP-PROP 5 - build system output (not accepted)::
+* GOP-PROP 6 - private mailing lists::
+* GOP-PROP 7 - developers as resources::
+* GOP-PROP 8 - issue priorities::
+* GOP-PROP 9 - behavior of make doc::
+@end menu
+
+@node GOP-PROP 1 - python formatting
+@subsubsection GOP-PROP 1 - python formatting
We will follow the indentation described in PEP-8.
@uref{http://www.python.org/dev/peps/pep-0008/}
any @code{.py} file in lilypond git. All such files should be
converted to use spaces only.
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00060.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00084.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00310.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00574.html}
+@end smallexample
-@subheading GOP-PROP 2: mentors and frogs
+
+@node GOP-PROP 2 - mentors and frogs
+@subsubsection GOP-PROP 2 - mentors and frogs
Nothing much was decided. The list of responsibilities was
slightly altered; see the new one in @ref{Mentors}. We should
That's pretty much it.
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00311.html}
+@uref{}
+@uref{}
+@end smallexample
+
+
+@node GOP-PROP 3 - C++ formatting
+@subsubsection GOP-PROP 3 - C++ formatting
+
+Speaking academically, C++ code style is a "solved problem". Let's
+pick one of the existing solutions, and let a computer deal with
+this. Humans should not waste their time, energy, and creativity
+manually adding tabs or spaces to source code.
+
+We have modified @code{fixcc.py} to use astyle, along with extra
+regex tweaks.
+
+@itemize
+@item
+the final script will be run @strong{blindly} on the lilypond
+source code. We will accept whatever formatting the final version
+of this script produces, with no manual tweaking.
+
+@item
+patches which have been run through this tool will not be rejected
+for style reasons. Any code formatting @qq{desires} which are not
+enforced by @code{fixcc.py} will not be considered grounds for
+rejecting a patch.
+
+@item
+for now, this style will not be enforced. It is not cause for
+concern if patches which do not follow the formatting done by
+@code{fixcc.py} are pushed. From time to time, Graham will run
+the formatter on the entire code base, and commit the resulting
+changes.
+
+In a few months, we will tighten up this policy item (with some
+sort of automatic processing), but that is outside the scope of
+this policy item and is a matter for later discussion.
+
+@item
+after the proposal is accepted, we will leave some time for
+existing patches to be accepted and pushed. The script was
+run on the source code on @strong{2011 August 01}.
+
+@end itemize
+
+@subheading GNU code
+
+LilyPond is a GNU project, so it makes sense to follow the GNU
+coding standards. These standards state:
+
+@quotation
+We don’t think of these recommendations as requirements, because
+it causes no problems for users if two different programs have
+different formatting styles.
+
+But whatever style you use, please use it consistently, since a
+mixture of styles within one program tends to look ugly. If you
+are contributing changes to an existing program, please follow the
+style of that program.
+@end quotation
+
+(@uref{http://www.gnu.org/prep/standards/html_node/Formatting.html})
+
+With that in mind, we do not think that we must blindly follow the
+formatting given by the currrent version of Emacs.
+
+@subheading Implementation notes
+
+We can avoid some of the style change pollution in git history by
+ignoring whitespaces changes:
+
+@example
+git diff -w
+@end example
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00526.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00796.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00200.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00525.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00751.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00751.html}
+@end smallexample
+
+
+@node GOP-PROP 4 - lessons from 2.14
+@subsubsection GOP-PROP 4 - lessons from 2.14
+
+@subheading History
+
+A brief history of releases:
+
+@multitable @columnfractions .2 .2 .3
+@headitem date (YYYY-MM-DD) @tab version @tab comment
+@item 2008-10-28 @tab 2.11.63 @tab nobody checking regtests
+@item 2008-11-17 @tab 2.11.64
+@item 2008-11-29 @tab 2.11.65
+@item 2008-12-23 @tab 2.12.0
+@item 2009-01-01 @tab @tab somewhere around here, Graham becomes
+officially release manager, but Han-Wen still builds the actual
+releases
+@item 2009-01-01 @tab 2.12.1
+@item 2009-01-25 @tab 2.12.2
+@item 2009-02-28 @tab 2.13.0
+@item 2009-06-01 @tab 2.13.1 @tab note jump in time!
+@item 2009-06-27 @tab 2.13.2 @tab first Graham release?
+@item 2009-07-03 @tab 2.13.3
+@item 2009-09-09 @tab @tab Graham arrives in Glasgow, gets a
+powerful desktop computer, and begins serious work on GUB (sending
+bug reports to Jan). It takes approximately 100 hours until GUB
+is stable enough to make regular releases.
+@item 2009-09-24 @tab 2.13.4
+@item 2009-10-02 @tab 2.13.5
+@item 2009-10-22 @tab 2.13.6
+@item 2009-11-05 @tab 2.13.7
+@item ...
+@item 2010-01-13 @tab 2.12.3
+@item ...
+@item 2010-03-19 @tab 2.13.16 @tab Bug squad starts doing a few
+regtest comparisons, but IIRC the effort dies out after a few
+weeks (BLUE)
+@item ...
+@item 2010-08-04 @tab 2.13.29 @tab Phil starts checking regtests (BLUE)
+@item ...
+@item 2011-01-12 @tab 2.13.46 @tab release candidate 1 (GREEN)
+@item ...
+@item 2011-05-30 @tab 2.13.63 @tab release candidate 7 (GREEN)
+@item 2011-06-06 @tab 2.14.0
+@end multitable
+
+@c A graphical display of bugs:
+@c
+@c @image{bugs-2.13-visualization,png}
+@c @image{zoom-2.13-visualization,png}
+
+@subheading Carl's analysis of the bugs
+
+A @file{csv} spreadsheet is available.
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00852.html}
+@end smallexample
+
+@example
+@uref{lilypond-issues-analysis.csv}
+@uref{lilypond-issues-analysis-trim-duplicates.csv}
+@end example
+
+There 148 issues marked with Priority=Critical in the tracker.
+
+I've done an analysis, and it looks to me like there was initially
+a backlog of critical issues that weren't fixed, and little work
+was being done to eliminate critical issues.
+
+Somewhere about 2010-08-01, critical issues started to disappear,
+but occasional new ones appeared.
+
+There were a couple of major changes that introduced unanticipated
+regressions (new spacing code, beam collision avoidance). These
+produced more than the expected number of regressions.
+
+It appears to me that we didn't really get serious about
+eliminating critical bugs until about 2010-06-15 or so. After
+that point, the number of critical bugs more-or-less steadily
+decreased until we got to a release candidate.
+
+Of particular interest, the first release candidate of 2.14 was
+released on 2011-01-12. Over the next 10 days, about a dozen bugs
+were reported and fixed. Release candidate 2 came out on
+2011-02-09. No surge of bugs occurred with this release.
+Candidate 3 came out on 2011-03-13; we got 2 bugs per week.
+Candidate 4 came out on 2011-03-29; 2 new bugs. Candidate 6 came
+out on 2011-04-07. We got a couple of bugs per week.
+
+@subheading Notes, commentary, and opinions
+
+@example
+Han-Wen: Overall, I think this cycle took too long
+Mike: I agree
+Graham: +1
+@end example
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00797.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00364.html}
+@uref{}
+@end smallexample
+
+
+@node GOP-PROP 5 - build system output (not accepted)
+@subsubsection GOP-PROP 5 - build system output (not accepted)
+
+This proposal was too broad; after a month of discussion, Graham
+withdrew the proposal. Portions of it will be introduced in later
+proposals.
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00320.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00527.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00753.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg01042.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00116.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00310.html}
+@end smallexample
+
+
+@node GOP-PROP 6 - private mailing lists
+@subsubsection GOP-PROP 6 - private mailing list
+
+Potentially sensitive or private matters will be referred to
+Graham. He will then decide who should discuss the matter on an
+ad-hoc basis, and forward or CC them on future emails.
+
+For emphasis, the project administrators are Han-Wen, Jan, and
+Graham; those three will always be CC'd on any important
+discussions.
+
+The lilypond-hackers mailing list will be removed.
+
+@subheading History
+
+There is some unhappy history about this idea in our development
+community:
+
+@example
+@uref{http://lists.gnu.org/archive/html/lilypond-devel/2010-09/msg00178.html}
+@uref{http://news.lilynet.net/spip.php?article121}
+@uref{http://lists.gnu.org/archive/html/lilypond-devel/2010-11/msg00076.html}
+@end example
+
+@subheading Other projects
+
+The idea of private mailing lists is hardly uncommon in
+open-source software. For example,
+
+@example
+@uref{http://lwn.net/Articles/394660/} about debian-private
+@uref{http://subversion.apache.org/mailing-lists.html} private@@
+@uref{http://www.freebsd.org/administration.html#t-core}
+@uref{http://foundation.gnome.org/legal/} board members pledge
+to keep certain matters confidential
+
+every security team of every linux distribution and OS
+@end example
+
+In fact, Karl Fogel's @qq{Producing Open Source Software}
+explicitly suggests a private mailing list for some circumstances:
+
+@example
+[on granting commit/push access to a contributor]
+
+But here is one of the rare instances where secrecy is
+appropriate. You can't have votes about potential committers
+posted to a public mailing list, because the candidate's feelings
+(and reputation) could be hurt.
+
+@uref{http://producingoss.com/en/consensus-democracy.html#electorate}
+@end example
+
+@subheading Board of governers, voting, etc?
+
+Many projects have an official board of directors, or a list of
+@qq{core developers}, with set term limits and elections and
+stuff.
+
+I don't think that we're that big. I think we're still small
+enough, and there's enough trust and consensus decisions, that we
+can avoid that. I would rather that we kept on going with
+trust+consensus for at least the next 2-3 years, and spent more
+time+energy on bug fixes and new features instead of
+administrative stuff.
+
+Project administrators are Han-Wen, Jan, and Graham.
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00783.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg01004.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00117.html}
+@end smallexample
+
+
+@node GOP-PROP 7 - developers as resources
+@subsubsection GOP-PROP 7 - developers as resources
+
+We shall treat developers (and contributors) as
+@strong{Independent volunteers}: each person does whatever they
+want, whenever they want. We have busy careers and lives; we make
+no expectations of action from anybody (with the exception of the
+6 people in @qq{Meister} positions).
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg01092.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00087.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00497.html}
+@end smallexample
+
+
+@node GOP-PROP 8 - issue priorities
+@subsubsection GOP-PROP 8 - issue priorities
+
+We will delete the @qq{priority} field of the issue tracker
+altogether. The @qq{type} system will be tweaked.
+
+Type-critical:
+
+@itemize
+
+@item
+a reproducible failure to build either @code{make} or @code{make
+doc}, from an empty build tree, in a first run, if
+@code{configure} does not report any errors.
+
+@item
+any program behaviour which is @strong{unintentionally} worse than
+the previous stable version or the current development version.
+Developers may always use the @qq{this is intentional}, or even
+the @qq{this is an unavoidable effect of an improvement in another
+area}, reason to move this to a different type.
+
+@item
+anything which stops contributors from helping out (e.g.
+lily-git.tcl not working, source tree(s) not being available,
+lilydev being unable to compile git master, inaccurate
+instructions in the Contributor's Guide 2 Quick start).
+
+To limit this scope of this point, we will assume that the
+contributor is using the latest lilydev and has read the relevant
+part(s) of the Contributor's Guide. Problems in other chapters of
+the CG are not sufficient to qualify as Type-Critical.
+
+@end itemize
+
+@subsubheading More new/changed types and labels
+
+Unless otherwise specified, the current types and labels will
+continue to be used. The new types introduced by this proposal
+are:
+
+@itemize
+
+@item
+Type-crash: any segfault, regardless of what the input file looks
+like or which options are given. Disclaimer: this might not be
+possible in some cases, for example certain guile programs (we
+certainly can't predict if a piece of scheme will ever stop
+running, i.e. the halting problem), or if we rely on other
+programs (i.e. ghostscript). If there are any such cases that
+make segfault-prevention impossible, we will document those
+exceptions (and the issue will remain as a "crash" instead of
+"documentation" until the warning has been pushed).
+
+@item
+Type-maintainability: anything which makes it difficult for
+serious contributors to help out (e.g. difficult to find the
+relevant source tree(s), confusing policies, problems with
+automatic indentation tools, etc).
+
+@item
+Type-ugly: replaces Type-collision, and it will include things
+like bad slurs in addition to actual collision.
+
+@end itemize
+
+A new label will be added:
+
+@itemize
+@item
+(label) Needs_evidence: it is not clear what the correct output
+should look like. We need scans, references, examples, etc.
+
+@end itemize
+
+@subheading Reminding users about stars
+
+We can remind users that they can @qq{star} an issue to indicate
+that they care about it. Since we resolved to treat developers as
+independent volunteers, there is no expectation that anybody will
+look at those stars, but if any developer want to organize their
+work schedule according to the stars, they are welcome to do so.
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00019.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00277.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00413.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00624.html}
+@uref{}
+@end smallexample
+
+
+@node GOP-PROP 9 - behavior of make doc
+@subsubsection GOP-PROP 9 - behavior of make doc
+
+If there are build problems, then it should be easier to find out
+why it's failing. This will be achieved with log files, as well
+as possibly including scripts which automatically display portions
+of those log files for a failing build.
+
+We will also add targets for building a specific manual (for
+quick+easy checking of doc work), as well as for building all
+documentation in a specific language (either English or a
+translated language).
+
+When you run @code{make doc},
+
+@itemize
+
+@item
+All output will be saved to various log files, with the exception
+of output directly from @code{make(1)}.
+
+Note that @code{make(1)} refers to a specific executable file on
+unix computers, and is not a general term for the build system.
+
+@item
+By default, no other output will be displayed on the console, with
+one exception: if a build fails, we might display some portion(s)
+of log file(s) which give useful clues about the reason for the
+failure.
+
+The user may optionally request additional output to be printed;
+this is controlled with the @code{VERBOSE=x} flag. In such cases,
+all output will still be written to log files; the console output
+is strictly additional to the log files.
+
+@item
+Logfiles from calling lilypond (as part of lilypond-book) will go
+in the relevant @file{build/out/lybook-db/12/lily-123456.log}
+file. All other logfiles will go in the @file{build/logfiles/}
+directory.
+
+A single @code{make doc} will therefore result in hundreds of log
+files. Log files produced from individual lilypond runs are not
+under our control; apart from that, I anticipate having one or two
+dozen log files. As long as it is clear which log file is
+associated with which operation(s), I think this is entirely
+appropriate. The precise implementation will be discussed for
+specific patches as they appear.
+
+@item
+Both stderr and stdout will be saved in @code{*.log}. The order
+of lines from these streams should be preserved.
+
+@item
+There will be no additional @qq{progress messages} during the
+build process. If you run @code{make --silent}, a non-failing
+build should print absolutely nothing to the screen.
+
+@item
+Assuming that the loglevels patch is accepted, lilypond (inside
+lilypond-book) will be run with --loglevel=WARN.
+@uref{http://codereview.appspot.com/4822055/}
+
+@item
+Ideally, a failing build should provide hints about the reason why
+it failed, or at least hints about which log file(s) to examine.
+
+@end itemize
+
+If this proposal is accepted, none of these policies will be
+assumed to apply to any other aspect of the build system.
+Policies for any other aspect of the build system will be
+discussed in separate proposals.
+
+@subheading Don't cause more build problems
+
+However, there is a danger in this approach, that vital error
+messages can also be lost, thus preventing the cause of the
+failure of a make being found. We therefore need to be
+exceptionally careful to move cautiously, include plenty of tests,
+and give time for people to experiment/find problems in each stage
+before proceeding to the next stage.
+
+This will be done by starting from individual lilypond calls
+within lilypond-book, and slowly moving to @qq{larger} targets of
+the build system -- after the individual lilypond calls are are
+producing the appropriate amount of output and this is saved in
+the right place and we can automatically isolate parts of a
+failing build, we will work on lilypond-book in general, and only
+then will we look at the build system itself.
+
+@subheading Implementation notes
+
+There is an existing make variable QUIET_BUILD, which
+alter the amount of output being displayed
+(@uref{
+http://lilypond.org/doc/v2.15/Documentation/contributor/useful-make-variables}
+). We are not planning on keeping this make variable.
+
+The standard way for GNU packages to give more output is with a
+@code{V=x} option. Presumably this is done by increasing
+@code{x}? If we support this option, we should still write log
+files; we would simply print more of the info in those log files
+to screen.
+
+The command @code{tee} may be useful to write to a file and
+display to stdout (in the case of VERBOSE).
+
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00378.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00703.html}
+@end smallexample
+
+
+@ignore
+@n ode GOP-PROP 10 - scheme indentation
+@s ubsubsection GOP-PROP 10 - scheme indentation
+
+still under discussion
+
+@subsubheading Discussions
+
+@smallexample
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg00625.html}
+@uref{https://lists.gnu.org/archive/html/lilypond-devel/2011-08/msg01026.html}
+@c @uref{}
+@end smallexample
+@end ignore
+
+
@node Grand LilyPond Input Syntax Standardization (GLISS)
@section Grand LilyPond Input Syntax Standardization (GLISS)
@end smallexample
I don't currently understand the @code{ifeq}, since @code{$(out)}
-is empty at this point, but the line starting @code{-$(INSTALL)}
+is empty at this point, but the line starting @w{@code{-$(INSTALL)}}
translates to:
@example
7492 total
-2- Tutorial
-1203 web/manuals.itexi
+1214 web/manuals.itexi
124 learning.tely
2535 learning/tutorial.itely
-4184 learning/common-notation.itely
-8046 total
+4187 learning/common-notation.itely
+8060 total
-3- Fundamental Concepts, starting of Usage and Community
11139 learning/fundamental.itely -- Fundamental concepts
135 usage.tely
-3622 usage/running.itely
+3681 usage/running.itely
1189 usage/updating.itely
-1755 web/community.itexi
-17840 total
+1888 web/community.itexi
+18032 total
-4- Rest of Learning manual and Suggestions on writing LilyPond files
15393 learning/tweaks.itely -- Tweaking output
4502 notation/pitches.itely
6048 notation/rhythms.itely
1726 notation/expressive.itely
-945 notation/repeats.itely
+944 notation/repeats.itely
2216 notation/simultaneous.itely
-2345 notation/staff.itely
+2341 notation/staff.itely
931 notation/editorial.itely
2716 notation/text.itely
81 notation/specialist.itely -- Specialist notation
66 notation/strings.itely
242 notation/bagpipes.itely
4752 notation/ancient.itely
-7671 notation/input.itely -- Input syntax
+7686 notation/input.itely -- Input syntax
2164 notation/non-music.itely -- Non-musical notation
11087 notation/spacing.itely -- Spacing issues
-12248 notation/changing-defaults.itely -- Changing defaults
+12258 notation/changing-defaults.itely -- Changing defaults
5187 notation/programming-interface.itely -- Interfaces for programmers
-1989 notation/notation-appendices.itely -- Notation manual tables
+2017 notation/notation-appendices.itely -- Notation manual tables
252 notation/cheatsheet.itely -- Cheat sheet
-76610 total
+76658 total
-6- Rest of Application Usage
-3952 usage/lilypond-book.itely -- LilyPond-book
+3978 usage/lilypond-book.itely -- LilyPond-book
1122 usage/converters.itely -- Converting from other formats
-5074 total
+5100 total
-7- Appendices whose translation is optional
326 essay/literature.itely
@@subsection @@code@{Foo@} Bar
@end example
+@item
+With the exception of @code{@@} commands, the section name must
+match the node name exactly.
+
+@item
+No commas may be used in the node names.
+
@item
If a heading is desired without creating a @code{@@node}, please use
the following:
LSR snippets are linked with:
@example
-@@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
@{filename.ly@}
@end example
\paper @{
indent = 0\mm
line-width = 160\mm - 2.0 * 0.4\in
- ragged-right = ##t
- force-assignment = #""
line-width = #(- line-width (* mm 3.000000))
@}
@item
Download the latest snippet tarball, extract it, and run
@code{convert-ly} on all files using the command-line option
-@code{--to=VERSION} to ensure snippets are updated to the
+@option{--to=@var{version}} to ensure snippets are updated to the
correct stable version.
@item
* Programming without compiling::
* Finding functions::
* Code style::
+* Warnings Errors Progress and Debug Output::
* Debugging LilyPond::
* Tracing object relationships::
* Adding or modifying features::
This command will search all the contents of the directory subdirectory/
and display every line in any of the files that contains
-functionName. The @code{-i} option makes @command{grep} ignore
+functionName. The @option{-i} option makes @command{grep} ignore
case -- this can be very useful if you are not yet familiar with
our capitalization conventions.
@end itemize
+@node Warnings Errors Progress and Debug Output
+@section Warnings, Errors, Progress and Debug Output
+
+@unnumberedsubsec Available log levels
+
+LilyPond has several loglevels, which specify how verbose the output on
+the console should be:
+@itemize
+@item NONE: No output at all, even on failure
+@item ERROR: Only error messages
+@item WARN: Only error messages and warnings
+@item BASIC_PROGRESS: Warnings, errors and basic progress (success, etc.)
+@item PROGRESS: Warnings, errors and full progress messages
+@item INFO: Warnings, errors, progress and more detailed information (default)
+@item DEBUG: All messages, including vull debug messages (very verbose!)
+@end itemize
+
+The loglevel can either be set with the environment variable
+@code{LILYPOND_LOGLEVEL} or on the command line with the @option{--loglevel=...}
+option.
+
+@unnumberedsubsec Functions for debug and log output
+
+LilyPond has two different types of error and log functions:
+@itemize
+
+@item
+If a warning or error is caused by an identified position in the input file,
+e.g. by a grob or by a music expression, the functions of the @code{Input}
+class provide logging functionality that prints the position of the message
+in addition to the message.
+
+@item
+If a message can not be associated with a particular position in an input file,
+e.g. the output file cannot be written, then the functions in the
+@code{flower/include/warn.hh} file will provide logging functionality that
+only prints out the message, but no location.
+
+@end itemize
+
+There are also Scheme functions to access all of these logging functions from
+scheme. In addition, the Grob class contains some convenience wrappers for
+even easier access to these functions.
+
+The message and debug functions in @code{warn.hh} also have an optional
+argument @code{newline}, which specifies whether the message should always
+start on a new line or continue a previous message.
+By default, @code{progress_indication} does NOT start on a new line, but rather
+continue the previous output. They also do not have a particular input
+position associated, so there are no progress functions in the Input class.
+All other functions by default start their output on a new line.
+
+The error functions come in three different flavors: fatal error messages,
+programming error messages and normal error messages. Errors written
+by the @code{error ()} function will cause LilyPond to exit immediately,
+errors by @code{Input::error ()} will continue the compilation, but
+return a non-zero return value of the lilypond call (i.e. indicate an
+unsuccessful program execution). All other errors will be printed on the
+console, but not exit LilyPond or indicate an unsuccessful return code.
+Their only differences to a warnings are the displayed text and that
+they will be shown with loglevel @code{ERROR}.
+
+If the Scheme option @code{warning-as-error} is set, any warning will be
+treated as if @code{Input::error} was called.
+
+
+@unnumberedsubsec All logging functions at a glance
+
+@multitable @columnfractions 0.16 0.42 0.42
+@headitem
+@tab C++, no location
+@tab C++ from input location
+
+@item ERROR
+@tab @code{error ()}, @code{programming_error (msg)}, @code{non_fatal_error (msg)}
+@tab @code{Input::error (msg)}, @code{Input::programming_error (msg)}
+
+@item WARN
+@tab @code{warning (msg)}
+@tab @code{Input::warning (msg)}
+
+@item BASIC
+@tab @code{basic_progress (msg)}
+@tab -
+
+@item PROGRESS
+@tab @code{progress_indication (msg)}
+@tab -
+
+@item INFO
+@tab @code{message (msg)}
+@tab @code{Input::message (msg)}
+
+@item DEBUG
+@tab @code{debug_output (msg)}
+@tab @code{Input::debug_output (msg)}
+
+@item @tab @tab
+
+@headitem
+@tab C++ from a Grob
+@tab Scheme, music expression
+
+@item ERROR
+@tab @code{Grob::programming_error (msg)}
+@tab -
+
+@item WARN
+@tab @code{Grob::warning (msg)}
+@tab @code{(ly:music-warning music msg)}
+
+@item BASIC
+@tab -
+@tab -
+
+@item PROGRESS
+@tab -
+@tab -
+
+@item INFO
+@tab -
+@tab @code{(ly:music-message music msg)}
+
+@item DEBUG
+@tab -
+@tab -
+
+@item @tab @tab
+
+@headitem
+@tab Scheme, no location
+@tab Scheme, input location
+
+@item ERROR
+@tab -
+@tab @code{(ly:error msg args)}, @code{(ly:programming-error msg args)}
+
+@item WARN
+@tab @code{(ly:warning msg args)}
+@tab @code{(ly:input-warning input msg args)}
+
+@item BASIC
+@tab @code{(ly:basic-progress msg args)}
+@tab -
+
+@item PROGRESS
+@tab @code{(ly:progress msg args)}
+@tab -
+
+@item INFO
+@tab @code{(ly:message msg args)}
+@tab @code{(ly:input-message input msg args)}
+
+@item DEBUG
+@tab @code{(ly:debug msg args)}
+@tab -
+
+@end multitable
+
+
+
@node Debugging LilyPond
@section Debugging LilyPond
In order for the Graphviz tool to work, config.make must be modified.
It is probably a good idea to first save a copy of config.make under
a different name. Then, edit config.make by removing every occurrence
-of @code{-DNDEBUG}.
+of @option{-DNDEBUG}.
@item Rebuilding LilyPond
The pdf file can then be viewed with any pdf viewer.
-When compiled without @code{-DNDEBUG}, lilypond may run slower
+When compiled without @option{-DNDEBUG}, lilypond may run slower
than normal. The original configuration can be restored by either
renaming the saved copy of @code{config.make} or rerunning
@code{configure}. Then rebuild lilypond with
global and repository-specific options.
To configure settings that affect all repositories, use the
-@command{--global} command line option. For example, the first
+@option{--global} command line option. For example, the first
two options that you should always set are your @var{name} and
@var{email}, since Git needs these to keep track of commit
authors:
@end example
Using the @command{git@tie{}config} command @emph{without} the
-@command{--global} option configures repository-specific settings,
+@option{--global} option configures repository-specific settings,
which are stored in the file @file{.git/config}. This file is
created when a repository is initialized (using
@command{git@tie{}init}), and by default contains these lines:
@end example
If you're tracking the remote @code{master} branch, you should add
-the @code{-r} option (short for @code{--rebase}) to keep commits
+the @option{-r} option (short for @option{--rebase}) to keep commits
on your local branch current:
@example
@end example
If you don't edit translated documentation and don't want to type
-@code{-r} every time, configure the master branch to rebase by
+@option{-r} every time, configure the master branch to rebase by
default with this command:
@example
@end example
Git will ask you for confirmation if it sees that data would be
-lost by deleting the branch. Use @code{-D} instead of @code{-d}
+lost by deleting the branch. Use @option{-D} instead of @option{-d}
to bypass this. Note that you cannot delete a branch if it is
currently checked out.
@end example
@noindent
-The @code{-a} is short for @code{--all} which includes modified
+The @option{-a} is short for @option{--all} which includes modified
and deleted files, but only those newly created files that have
previously been added.
alternate method here.
You should always run @command{git@tie{}pull@tie{}-r} (translators
-should leave off the @code{-r}) before doing this to ensure that
+should leave off the @option{-r}) before doing this to ensure that
your patches are as current as possible.
Once you have made one or more commits in your local repository,
@item
-Generate an SSH @q{dsa} key pair. Enter the following at the
+Generate an SSH @q{rsa} key pair. Enter the following at the
command prompt:
@example
-ssh-keygen -t dsa
+ssh-keygen -t rsa
@end example
When prompted for a location to save the key, press <ENTER> to
-accept the default location (@file{~/.ssh/id_dsa}).
+accept the default location (@file{~/.ssh/id_rsa}).
Next you are asked to enter an optional passphrase. On most
systems, if you use a passphrase, you will likely be prompted for
You can change/enable/disable your passphrase at any time with:
@example
-ssh-keygen -f ~/.ssh/id_dsa -p
+ssh-keygen -f ~/.ssh/id_rsa -p
@end example
Note that the GNOME desktop has a feature which stores your
@end example
After setting up your passphrase, your private key is saved as
-@file{~/.ssh/id_dsa} and your public key is saved as
-@file{~/.ssh/id_dsa.pub}.
+@file{~/.ssh/id_rsa} and your public key is saved as
+@file{~/.ssh/id_rsa.pub}.
@item
-Register your public SSH @q{dsa} key with Savannah. From the
+Register your public SSH @q{rsa} key with Savannah. From the
@qq{My Account Configuration} page, click on @qq{Edit SSH Keys},
-then paste the contents of your @file{~/.ssh/id_dsa.pub} file into
+then paste the contents of your @file{~/.ssh/id_rsa.pub} file into
one of the @qq{Authorized keys} text fields, and click
@qq{Update}.
@end example
@noindent
-where @var{user} is your username on Savannah.
+replacing @var{user} with your Savannah username.
@item
@noindent
Then @code{git@tie{}push} should work as before. For more
details, consult the @code{git@tie{}push} man page.
-@end enumerate
+@item
+Repeat the steps from generating an RSA key through to testing
+your commit access, for each machine from which you will be
+making commits, or you may simply copy the files from your
+local @file{~/.ssh} folder to the same folder on the other
+machine.
+
+@end enumerate
+
@subsubheading Technical details
@itemize
@node Uploading and security
@section Uploading and security
+@subheading Building the website from scratch for local checking
+
+Initial setup:
+
+Create directories:
+
+@example
+$HOME/lilypond/
+$HOME/lilypond/media/
+$HOME/lilypond/trusted-scripts/
+@end example
+
+To reduce the CPU burden on the shared host (as well as some
+security concerns), the 'Documentation/pictures/' and
+'Documentation/web/ly-examples/' directories are **not** compiled.
+We will do this ourselves right now.
+
+Go to your lilypond build directory. make doc.
+
+Set up some variables (you'll only do this once:)
+
+@example
+BUILD_DIR=$HOME/lilypond-git
+PICS=$BUILD_DIR/Documentation/pictures/
+EXAMPLES=$BUILD_DIR/Documentation/web/ly-examples/
+@end example
+
+Copy files over:
+
+@example
+cp -r $PICS $HOME/lilypond/media/pictures
+cp -r $EXAMPLES $HOME/lilypond/media/ly-examples
+@end example
+
+Get the scripts you need. First define these variables:
+
+@example
+GIT=$HOME/lilypond-git
+DEST=$HOME/lilypond/trusted-scripts
+@end example
+
+Then do the copying:
+
+@smallexample
+cp $GIT/make/website.make $DEST/website.make
+cp $GIT/Documentation/lilypond-texi2html.init $DEST/lilypond-texi2html.init
+cp $GIT/scripts/build/extract_texi_filenames.py $DEST/extract_texi_filenames.py
+cp $GIT/scripts/build/create-version-itexi.py $DEST/create-version-itexi.py
+cp $GIT/scripts/build/create-weblinks-itexi.py $DEST/create-weblinks-itexi.py
+cp $GIT/scripts/build/mass-link.py $DEST/mass-link.py
+cp $GIT/scripts/build/website_post.py $DEST/website_post.py
+cp $GIT/scripts/build/bib2texi.py $DEST/bib2texi.py
+cp $GIT/Documentation/web/server/lilypond.org.htaccess $DEST/lilypond.org.htaccess
+cp $GIT/Documentation/web/server/website-dir.htaccess $DEST/website-dir.htaccess
+@end smallexample
+
+Delete your build directory (or maybe just rename your build
+directory to build-old).
+
+@example
+cd $HOME/lilypond
+@end example
+
+Run
+
+@example
+make -f ../lilypond-git/make/website.make WEBSITE_ONLY_BUILD=1 \
+ TOP_SRC_DIR=$HOME/lilypond-git/ \
+ PYTHONPATH=$HOME/lilypond-git/python \
+ TEXI2HTML_PROGRAM=texi2html \
+ website
+@end example
+
+The website should be at:
+
+@example
+$HOME/lilypond/out-website/website/index.html
+@end example
+
+@subheading Building the online website
+
The website is generated hourly by user @code{graham} the host
@code{lilypond.org}. For security reasons, we do not use the
makefiles and scripts directly from git; copies of the relevant
@appendixsubsec Pouze noty
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec Noty a text
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec Noty a názvy akordů
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec Noty, text a názvy akordů
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec Klavírní sólo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec Klavír a hlas zpěvu
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec Klavír s vystředěným textem
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec Klavír s vystředěným označením hlasitosti
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec Smyčcový kvartet
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec Hlasy smyčcového kvartetu
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec Notový zápis SATB
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec Notový zápis SATB a automatický klavírní výtah
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec SATB s příslušnými prostředími
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec Sólový zpěv a dvojhlasný refrén
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@translationof Orchestral templates
@appendixsubsec Orchestr, sbor a klavír
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Přepis menzurální hudby
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Předlohy pro přepis gregorianik
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@node Jiné předlohy
@appendixsubsec Džezová skupina
@translationof Jazz combo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@end html
@end ifhtml
-@emph{Naposledy obnoveno Wed Jul 13 10:59:12 UTC 2011
+@emph{Naposledy obnoveno Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 Běžný notový zápis
@*
-4184
+4187
@tab Pavel Fric
@tab
@tab
@item
Příručky
@*
-1203
+1214
@tab Pavel Fric
@tab
@tab
@item
Společenství
@*
-1755
+1888
@tab Pavel Fric
@tab
@tab
@ifhtml
@html
-<span style="background-color: #25fe1f">částečně</span>
+<span style="background-color: #4efe25">částečně</span>
@end html
@end ifhtml
@ifnothtml
aufgerufen, so wird der Inhalt der Datei @file{foo.texidoc@var{LANG}}
anstelle von @file{foo.texidoc} eingefügt.
-@item lilyquote
-(Nur innerhalb von Texinfo-Dateien.) Diese Option wirkt wie die
-@code{quote} Option, außer dass nur das Musikfragment (und natürlich optional der
-gesamte LilyPond-Code bei Benutzung von @code{verbatim}) in den Zitatblock
-eingefügt wird. Dies ist nützlich, wenn Sie ein Musikfragment zitieren möchten,
-nicht aber dessen @code{texidoc} Dokumentationsblock.
-
@item doctitle
(Nur innerhalb von Texinfo-Dateien.) Diese Option wirkt ähnlich wie die
@code{texidoc} Option: Wenn @command{lilypond} mit der Option
/***********************************************************/
@media print {
- /* Hide the sidebar: */
- body { padding-left: 0; }
- #tocframe { display: none; }
+ /* Hide the sidebar and make the main contents take up the full width */
+ div#main { position: static; overflow: visible; left: 0; }
+ div#tocframe { display: none; }
+ /* Also don't show the navigation toolbars between all sections */
.nav_table { display: none; }
}
@appendixsubsec Nur Noten
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec Noten und Text
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec Noten und Akkordbezeichnungen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec Noten, Text und Akkordbezeichnungen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec Piano Solo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec Klavier und Gesangstimme
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec Klavier mit zentriertem Text
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec Klavier mit zentrierten Lautstärkebezeichnungen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec Streichquartett
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec Streichquartettstimmen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec SATB-Partitur
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec SATB-Partitur und automatischer Klavierauszug
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec SATB mit zugehörigen Kontexten
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec SATB auf vier Systemen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{satb-choir-template---four-staves.ly}
@appendixsubsec Sologesang und zweistimmiger Refrain
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@appendixsubsec Hymnen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{hymn-template.ly}
@appendixsubsec Psalmengesang
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{anglican-psalm-template.ly}
@translationof Orchestral templates
@appendixsubsec Orchester, Chor und Klavier
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Transkription mensuraler Musik
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Vorlage zur Transkription von Gregorianik
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@node Andere Vorlagen
@appendixsubsec Jazz-Combo
@translationof Jazz combo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
nur (@code{mensural}) unterstützt.
@lilypond[quote,fragment,ragged-right,verbatim]
-\override Stem #'flag-style = #'mensural
+\override Flag #'style = #'mensural
\override Stem #'thickness = #1.0
\override NoteHead #'style = #'mensural
\autoBeamOff
das von einem bestimmten Stil nicht unterstützt wird, wechselt LilyPond zu einem
anderen Stil.
-@c @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,texidoc,doctitle]
@c {ancient-accidentals.ly}
Der Stil für Versetzungs- und Vorzeichen wird von der
werden müssen, während man sich dennoch an den Taktlinien
rhythmisch orientieren kann.
-@lilypondfile[verbatim,lilyquote,texidoc]
+@lilypondfile[verbatim,quote,texidoc]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@c This simple setup will take care of the
@cindex Akkorde, Unterdrückung wiederholt
@funindex chordChanges
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{showing-chords-at-changes.ly}
-@c @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
@c {adding-bar-lines-to-chordnames-context.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@snippets
@cindex Ausnahmen, Akkordsymbole
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-name-exceptions.ly}
@c TODO - tweak snippet to use \blackTriangleMarkup as well
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-name-major7.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-bar-lines-to-chordnames-context.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{volta-below-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-chord-separator.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-positions-of-figured-bass-alterations.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{avoiding-collisions-with-chord-fingerings.ly}
@seealso
@cindex Hals nach unten
@cindex Hals neutral
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{default-direction-of-stems-on-the-center-line-of-the-staff.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{grid-lines--changing-their-appearance.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{modifying-default-values-for-articulation-shorthand-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-vertical-ordering-of-scripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-a-delayed-turn.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-hairpin-behavior-at-bar-lines.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-minimum-length-of-hairpins.ly}
@cindex al niente
@cindex niente, al
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-hairpins-using-al-niente-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligned-dynamics-and-textscripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{hiding-the-extender-line-for-text-dynamics.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-text-and-spanner-styles-for-text-dynamics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-double-slurs-for-legato-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-text-markups-inside-slurs.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-slurs-with-complex-dash-structure.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-breath-mark-symbol.ly}
@cindex caesura
@cindex railroad tracks
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{inserting-a-caesura.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adjusting-the-shape-of-falls-and-doits.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{contemporary-glissando.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-a-piano-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-other-contexts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-arpeggios-across-notes-in-different-voices.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{stem-and-beam-behavior-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{polyphony-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{open-string-harmonics-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fretted-string-harmonics-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{slides-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-glissando-in-tablature.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-fret-orientations.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-markup-fret-diagrams.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-fretboard-fret-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{defining-predefined-fretboards-for-other-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chordchanges-for-fretboards.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fretboards-alternate-tables.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{placement-of-right-hand-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingerings,-string-indications,-and-right-hand-fingerings.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-midi-output-to-one-channel-per-voice.ly}
@knownissues
@c @snippets
-@c @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,texidoc,doctitle]
@c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\Staff \RemoveEmptyStaves.ly}
@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312
% extend the stems to reach the other staff
\override Stem #'length = #12
% do not print extra flags
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
% prevent beaming as needed
a8 g4 f8 f bes\noBeam g4
}
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{indicating-cross-staff-chords-with-arpeggio-bracket.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{accordion-discant-symbols.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-extra-naturals-from-being-automatically-added.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{transposing-pitches-with-minimum-accidentals-smart-transpose.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-clef-properties.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ottava-text.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-ambitus-per-voice.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ambitus-with-multiple-voices.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-ambitus-gap.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{numbers-as-easy-note-heads.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{applying-note-head-styles-depending-on-the-step-of-the-scale.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{shortening-volta-brackets.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-volta-brackets-to-additional-staves.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-double-repeat-default-for-volte.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-counter.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-count-visibility.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{isolated-percent-repeats.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{cross-staff-tremolos.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{alternative-breve-note.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-number-of-augmentation-dots-per-note.ly}
@seealso
@funindex tupletNumberFormatFunction
@funindex tupletSpannerDuration
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{entering-several-tuplets-using-only-one--times-command.ly}
@cindex Triolennummer, Änderung
@funindex TupletNumber
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-tuplet-number.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{non-default-tuplet-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-tuplet-bracket-visibility.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{permitting-line-breaks-within-beamed-tuplets.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-ties-with-arpeggios.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{engraving-ties-manually.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{rest-styles.ly}
@seealso
@cindex Pausen, Kirchenstil
@cindex Balkenpausen, mehrtaktig
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-form-of-multi-measure-rests.ly}
@cindex Mehrtaktpausen, Positionierung
@cindex Position von Mehrtaktpausen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{positioning-multi-measure-rests.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{multi-measure-rest-markup.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-time-signature-without-affecting-the-beaming.ly}
@cindex compound time signatures
@cindex time signature, compound
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
@c perhaps also an example of how to move it horizontally?
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-tempo-without-a-metronome-mark.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-metronome-marks-in-markup-mode.ly}
Zu Einzelheiten siehe @ref{Text formatieren}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{compound-time-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{guitar-strum-rhythms.ly}
@seealso
@cindex auto-knee-gap
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beams-across-line-breaks.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-beam-knee-gap.ly}
@cindex Balken, \partcombine und \autoBeamOff
@cindex Stimmen, \autoBeamOff und \partcombine
-@lilypondfile [verbatim, lilyquote, ragged-right, texidoc, doctitle]
+@lilypondfile [verbatim, quote, ragged-right, texidoc, doctitle]
{partcombine-and-autobeamoff.ly}
@seealso
@funindex subdivideBeams
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{subdividing-beams.ly}
@cindex Taktgruppen
@funindex autoBeamSettings
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{conducting-signs,-measure-grouping-signs.ly}
@cindex Balken, letzter in Partitur
@cindex Balken, letzter in polyphoner Stimme
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beam-endings-in-score-context.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{flat-flags-and-beam-nibs.ly}
@seealso
@cindex Taktnummer, Form
@cindex Aussehen von Taktnummern
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-the-bar-number-for-the-first-measure.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-at-regular-intervals.ly}
@cindex Ausrichtung von Taktlinien
@cindex Taktlinien, Ausrichtung
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-inside-boxes-or-circles.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{aligning-bar-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{removing-bar-numbers-from-a-score.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-grace-note-slashes-with-normal-heads.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-grace-layout-within-music.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{redefining-grace-note-global-defaults.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-grace-notes-with-floating-space.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{additional-voices-to-avoid-collisions.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{forcing-horizontal-shift-of-notes.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{combining-two-parts-on-the-same-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-partcombine-texts.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{use-square-bracket-at-the-start-of-a-staff-group.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{display-bracket-with-only-one-staff-in-a-system.ly}
@cindex Mensurstriche
@cindex Transkription von Mensuralmusik
@cindex Mensuralmusik, Transkription
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{nesting-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-some-staff-lines-thicker-than-the-others.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligning-ossias-and-lyrics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{removing-the-first-empty-line.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{quoting-another-voice-with-transposition.ly}
@cindex note-event
@funindex quotedEventTypes
@funindex quotedCueEventTypes
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{quoting-another-voice.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-text-spanner-postfix.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-custom-text-spanner-postfix.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-at-the-end-of-a-line.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{aligning-marks-with-various-notation-objects.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-on-every-staff.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{stand-alone-two-column-markup.ly}
@seealso
hierzu @ref{Text formatieren}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{formatting-lyrics-syllables.ly}
mit geraden Anführungszeichen (@code{"}) umgeben werden oder ein
Unterstrich (@code{_}) benutzt werden, um ein Leerzeichen zwischen
Silben zu setzen. Mit der Tilde (@code{~}) kann ein Bindebogen
-gesetzt werden. Dies erfordert, dass eine Schriftart vorhanden ist,
-die das entsprechende Symbol (U+203F) beinhaltet. Frei erhältliche
-Schriftarten, die den Bindebogen enthalten, sind @qq{FreeSerif} (ein
-Times-Klon), @qq{DejaVuSans} (aber nicht DejaVuSerif) oder
-TeXGyreSchole (ein Century Schoolbook-Klon).
+gesetzt werden.
@lilypond[quote,ragged-right,verbatim]
{
\time 3/4
\relative c' { c2 e4 g2 e4 }
- \addlyrics { gran- de_a- mi- go }
- \addlyrics { pu- "ro y ho-" nes- to }
- \addlyrics { pu- ro~y~ho- nes- to }
+ \addlyrics { gran -- de_a -- mi -- go }
+ \addlyrics { pu -- "ro y ho" -- nes -- to }
+ \addlyrics { pu -- ro~y~ho -- nes -- to }
}
@end lilypond
@rlearning{Vokalensemble}-Vorlagen im Handbuch zum Lernen heranzieht.
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{lyrics-old-spacing-settings.ly}
@seealso
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{lyrics-alignment.ly}
@c TODO: move to LSR -vv
@ref{Notation von Akkorden}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@seealso
@cindex Stimmen, geteilt
@cindex geteilte Stimmen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-arpeggiobracket-to-make-divisi-more-visible.ly}
@seealso
die Tipparbeit erspart und die Klaviernoten klarer macht.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{adding-orchestral-cues-to-a-vocal-score.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{chant-or-psalms-notation.ly}
Cantica und andere liturgische Texte können freier gesetzt werdne,
gesetzt. In diesem Fall werden die Noten entsprechend der
Ausdehnung des Textes und nicht der Notenlänge gesetzt.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@seealso
Beginn der Musik ein und @code{\bar "|"} oder @code{\bar "||"},
um die schließende Taktlinie am Ende der Zeile zu setzen.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{hymn-template.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing--flageolet-mark-size.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingering-symbols-for-wind-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{recorder-fingering-chart.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-listing.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{graphical-and-text-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-size-of-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-key-lists.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{makam-example.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{arabic-improvisation.ly}
@end html
@end ifhtml
-@emph{Zuletzt aktualisiert am Wed Jul 13 10:59:12 UTC 2011
+@emph{Zuletzt aktualisiert am Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 Schnittstellen für Programmierer
@*
-3568
+3899
@tab Till Paala
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">ja</span>
+<span style="background-color: #dfef77">teilweise (98 %)</span>
@end html
@end ifhtml
@ifnothtml
-ja
+teilweise (98 %)
@end ifnothtml
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">ja</span>
+<span style="background-color: #39ff22">teilweise</span>
@end html
@end ifhtml
@ifnothtml
-ja
+teilweise
@end ifnothtml
@tab vor-GDP
@end multitable
@item
2 Übliche Notation
@*
-4184
+4187
@tab Till Paala
@tab
@tab
@item
1.4 Wiederholungszeichen
@*
-945
+944
@tab Till Paala
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">ja</span>
+<span style="background-color: #25fe1f">teilweise</span>
@end html
@end ifhtml
@ifnothtml
-ja
+teilweise
@end ifnothtml
@tab vor-GDP
@item
@item
1.6 Notation auf Systemen
@*
-2345
+2341
@tab Till Paala
@tab
@tab
@ifhtml
@html
-<span style="background-color: #9eff30">teilweise</span>
+<span style="background-color: #a5ff31">teilweise</span>
@end html
@end ifhtml
@ifnothtml
@item
2.2 Tasteninstrumente und andere Instrumente mit mehreren Systemen
@*
-864
+862
@tab Till Paala
@tab
@tab
@item
3 Allgemeine Eingabe und Ausgabe
@*
-7671
+7686
@tab Till Paala
@tab
@tab
@ifhtml
@html
-<span style="background-color: #83fe2c">teilweise</span>
+<span style="background-color: #8aff2d">teilweise</span>
@end html
@end ifhtml
@ifnothtml
@item
5 Standardeinstellungen verändern
@*
-12248
+12258
@tab Till Paala
@tab
@tab
@item
A Notationsübersicht
@*
-1989
+2017
@tab Till Paala
@tab
@tab
@item
1 @command{lilypond} starten
@*
-3622
+3681
@tab Reinhold Kainhofer
@*
Till Paala
@item
3 @command{lilypond-book} aufrufen
@*
-3952
+3978
@tab Reinhold Kainhofer
@tab Till Paala
@tab
@item
4 Externe Programme
@*
-2170
+2180
@tab Till Paala
@*
Reinhold Kainhofer
@ifhtml
@html
-<span style="background-color: #1fff1f">ja</span>
+<span style="background-color: #25fe1f">teilweise</span>
@end html
@end ifhtml
@ifnothtml
-ja
+teilweise
@end ifnothtml
@tab vor-GDP
@item
@item
Handbücher
@*
-1203
+1214
@tab Till Paala
@tab
@tab
@item
Gemeinschaft
@*
-1755
+1888
@tab Till Paala
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">ja</span>
+<span style="background-color: #40fe23">teilweise</span>
@end html
@end ifhtml
@ifnothtml
-ja
+teilweise
@end ifnothtml
@tab vor-GDP
@end multitable
aufgerufen, so wird der Inhalt der Datei @file{foo.texidoc@var{LANG}}
anstelle von @file{foo.texidoc} eingefügt.
-@item lilyquote
-(Nur innerhalb von Texinfo-Dateien.) Diese Option wirkt wie die
-@code{quote} Option, außer dass nur das Musikfragment (und natürlich optional der
-gesamte LilyPond-Code bei Benutzung von @code{verbatim}) in den Zitatblock
-eingefügt wird. Dies ist nützlich, wenn Sie ein Musikfragment zitieren möchten,
-nicht aber dessen @code{texidoc} Dokumentationsblock.
-
@item doctitle
(Nur innerhalb von Texinfo-Dateien.) Diese Option wirkt ähnlich wie die
@code{texidoc} Option: Wenn @command{lilypond} mit der Option
@appendixsubsec Sólo notas
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec Notas y letra
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec Notas y acordes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec Notas, letra y acordes.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec Piano solo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec Piano y melodía con letra
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec Piano con letra centrada
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec Piano con dinámicas centradas
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec Cuarteto de cuerda
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec Particellas de cuarteto de cuerda
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec Partitura vocal SATB
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec Partitura vocal SATB y reducción para piano automática
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec SATB con contextos alineados
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec SATB sobre cuatro pentagramas
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{satb-choir-template---four-staves.ly}
@appendixsubsec Estrofas a solo y estribillo a dos voces
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@appendixsubsec Melodías de himnos
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{hymn-template.ly}
@appendixsubsec Salmos
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{anglican-psalm-template.ly}
@translationof Orchestral templates
@appendixsubsec Orquesta, coro y piano
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Transcripción de música mensural
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Plantilla para transcripción de canto gregoriano
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@appendixsubsec Combo de jazz
@translationof Jazz combo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
contemplado el estilo @code{mensural}
@lilypond[quote,fragment,ragged-right,verbatim]
-\override Stem #'flag-style = #'mensural
+\override Flag #'style = #'mensural
\override Stem #'thickness = #1.0
\override NoteHead #'style = #'mensural
\autoBeamOff
proporcionan las barras de compás.
-@lilypondfile[verbatim,lilyquote,texidoc]
+@lilypondfile[verbatim,quote,texidoc]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@cindex acordes, eliminar repetidos
@funindex chordChanges
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{showing-chords-at-changes.ly}
-@c @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
@c {adding-bar-lines-to-chordnames-context.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@snippets
@cindex excepciones, nombres de acorde
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-name-exceptions.ly}
@c TODO - tweak snippet to use \blackTriangleMarkup as well
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-name-major7.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-bar-lines-to-chordnames-context.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{volta-below-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-chord-separator.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-positions-of-figured-bass-alterations.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{avoiding-collisions-with-chord-fingerings.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{default-direction-of-stems-on-the-center-line-of-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{grid-lines--changing-their-appearance.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{modifying-default-values-for-articulation-shorthand-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-vertical-ordering-of-scripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-a-delayed-turn.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-hairpin-behavior-at-bar-lines.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-minimum-length-of-hairpins.ly}
@cindex al niente
@cindex niente, al
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-hairpins-using-al-niente-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligned-dynamics-and-textscripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{hiding-the-extender-line-for-text-dynamics.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-text-and-spanner-styles-for-text-dynamics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-double-slurs-for-legato-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-text-markups-inside-slurs.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-slurs-with-complex-dash-structure.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-breath-mark-symbol.ly}
@cindex caesura
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{inserting-a-caesura.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adjusting-the-shape-of-falls-and-doits.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{contemporary-glissando.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-a-piano-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-other-contexts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-arpeggios-across-notes-in-different-voices.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{stem-and-beam-behavior-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{polyphony-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{open-string-harmonics-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fretted-string-harmonics-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{slides-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-glissando-in-tablature.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-fret-orientations.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-markup-fret-diagrams.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-fretboard-fret-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{defining-predefined-fretboards-for-other-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chordchanges-for-fretboards.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fretboards-alternate-tables.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{placement-of-right-hand-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingerings,-string-indications,-and-right-hand-fingerings.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-midi-output-to-one-channel-per-voice.ly}
@knownissues
@end itemize
@c @snippets
-@c @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,texidoc,doctitle]
@c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\RemoveEmptyStaffContext.ly}
@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312
% extend the stems to reach the other staff
\override Stem #'length = #12
% do not print extra flags
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
% prevent beaming as needed
a8 g4 f8 f bes\noBeam g4
}
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{indicating-cross-staff-chords-with-arpeggio-bracket.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{accordion-discant-symbols.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle,ragged-right]
+@lilypondfile[verbatim,quote,texidoc,doctitle,ragged-right]
{hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-extra-naturals-from-being-automatically-added.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{transposing-pitches-with-minimum-accidentals-smart-transpose.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-clef-properties.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ottava-text.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-ambitus-per-voice.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ambitus-with-multiple-voices.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-ambitus-gap.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{numbers-as-easy-note-heads.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{applying-note-head-styles-depending-on-the-step-of-the-scale.ly}
Para ver todos los estilos de formas de cabeza de nota, consulte
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{shortening-volta-brackets.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-volta-brackets-to-additional-staves.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-double-repeat-default-for-volte.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-counter.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-count-visibility.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{isolated-percent-repeats.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{cross-staff-tremolos.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{alternative-breve-note.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-number-of-augmentation-dots-per-note.ly}
@funindex tupletNumberFormatFunction
@funindex tupletSpannerDuration
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{entering-several-tuplets-using-only-one--times-command.ly}
@cindex grupos de valoración especial, modificación del número
@funindex TupletNumber
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-tuplet-number.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{non-default-tuplet-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-tuplet-bracket-visibility.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{permitting-line-breaks-within-beamed-tuplets.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-ties-with-arpeggios.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{engraving-ties-manually.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{rest-styles.ly}
@cindex silencios eclesiásticos
@cindex kirchenpausen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-form-of-multi-measure-rests.ly}
@cindex multicompás, posicionamiento de los silencios
@cindex colocación de los silencios multicompás
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{positioning-multi-measure-rests.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{multi-measure-rest-markup.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-time-signature-without-affecting-the-beaming.ly}
@cindex compuesto, indicaciones de compás
@cindex compás compuesto, indicaciones de
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
@c perhaps also an example of how to move it horizontally?
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-tempo-without-a-metronome-mark.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-metronome-marks-in-markup-mode.ly}
Para ver más detalles, consulte @ref{Formatear el texto}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{compound-time-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{guitar-strum-rhythms.ly}
@funindex breakable
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beams-across-line-breaks.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-beam-knee-gap.ly}
@cindex barras, \partcombine con \autoBeamOff
@cindex voces, \partcombine con \autoBeamOff
-@lilypondfile [verbatim, lilyquote, ragged-right, texidoc, doctitle]
+@lilypondfile [verbatim, quote, ragged-right, texidoc, doctitle]
{partcombine-and-autobeamoff.ly}
@seealso
@cindex barras, subdivisión
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{subdividing-beams.ly}
@cindex compás, agrupación
@cindex agrupar pulsos
@cindex compases, sub-agrupar
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{conducting-signs,-measure-grouping-signs.ly}
@cindex barra, finales en la partitura
@cindex barra, finales con varias voces
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beam-endings-in-score-context.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{flat-flags-and-beam-nibs.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-the-bar-number-for-the-first-measure.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-at-regular-intervals.ly}
@cindex compás, número de, formato
@cindex número de compases, formato de
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-inside-boxes-or-circles.ly}
@cindex compás, número, alineación
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{aligning-bar-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{removing-bar-numbers-from-a-score.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-grace-note-slashes-with-normal-heads.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-grace-layout-within-music.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{redefining-grace-note-global-defaults.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-grace-notes-with-floating-space.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{additional-voices-to-avoid-collisions.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{forcing-horizontal-shift-of-notes.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{combining-two-parts-on-the-same-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-partcombine-texts.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{use-square-bracket-at-the-start-of-a-staff-group.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{display-bracket-with-only-one-staff-in-a-system.ly}
@cindex diseño «mensurstriche»
@cindex transcripción de música mensural
@cindex mensural, música, transcripción de
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{nesting-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-some-staff-lines-thicker-than-the-others.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligning-ossias-and-lyrics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{removing-the-first-empty-line.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-text-spanner-postfix.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-custom-text-spanner-postfix.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-at-the-end-of-a-line.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{aligning-marks-with-various-notation-objects.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-on-every-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{stand-alone-two-column-markup.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{formatting-lyrics-syllables.ly}
sílabas, podemos encerrar la frase entre comillas o utilizar un
carácter de guión bajo @code{_}. De forma alternativa, podemos usar
el símbolo de tilde curva (@code{~}) para obtener una ligadura de
-texto. La ligadura de texto está implementada con el carácter Unicode
-U+203F, por tanto debemos asegurarnos de usar una fuente tipográfica
-para este glifo que realmente lo contenga. Algunas de las fuentes
-tipográficas disponibles libremente con una ligadura de letra son, por
-ejemplo, `FreeSerif' (un clon de Times), `DejaVuSans' (pero no
-`DejaVuSerif') o `TeXGyreSchola' (un clon de Century Schoolbook).
+texto.
@lilypond[quote,ragged-right,verbatim]
{
\time 3/4
\relative c' { c2 e4 g2 e4 }
- \addlyrics { gran- de_a- mi- go }
- \addlyrics { pu- "ro y ho-" nes- to }
- \addlyrics { pu- ro~y~ho- nes- to }
+ \addlyrics { gran -- de_a -- mi -- go }
+ \addlyrics { pu -- "ro y ho" -- nes -- to }
+ \addlyrics { pu -- ro~y~ho -- nes -- to }
}
@end lilypond
@rlearning{Conjuntos vocales} del manual de aprendizaje.
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{lyrics-old-spacing-settings.ly}
@seealso
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{lyrics-alignment.ly}
@c TODO: move to LSR -vv
@ref{Notación de acordes}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@seealso
@cindex voces divididas
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-arpeggiobracket-to-make-divisi-more-visible.ly}
@seealso
hacer que las notas del piano estén más claras.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{adding-orchestral-cues-to-a-vocal-score.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{chant-or-psalms-notation.ly}
Los cánticos y otros textos litúrgicos pueden disponerse de una forma
espaciadas de acuerdo con las sílabas en vez de hacerlo con las
duraciones de las notas.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@seealso
instrucción @code{\partial} al principio de la música e instrucciones
@code{\bar "|"} ó @code{\bar "||"} al final de cada línea.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{hymn-template.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing--flageolet-mark-size.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingering-symbols-for-wind-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{recorder-fingering-chart.ly}
@seealso
@endpredefined
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-listing.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{graphical-and-text-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-size-of-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-key-lists.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{makam-example.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{arabic-improvisation.ly}
@end html
@end ifhtml
-@emph{Actualizado en Wed Jul 13 10:59:12 UTC 2011
+@emph{Actualizado en Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
Títulos de sección
@*
-1779
+193
@tab Francisco Vila
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">sí</span>
+<span style="background-color: #ff7855">parcialmente</span>
@end html
@end ifhtml
@ifnothtml
-sí
+parcialmente
@end ifnothtml
@tab pre-GDP
@item
@item
1 Interfaces para programadores
@*
-3568
+3899
@tab Francisco Vila
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">sí</span>
+<span style="background-color: #dfef77">parcialmente (98 %)</span>
@end html
@end ifhtml
@ifnothtml
-sí
+parcialmente (98 %)
@end ifnothtml
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">sí</span>
+<span style="background-color: #39ff22">parcialmente</span>
@end html
@end ifhtml
@ifnothtml
-sí
+parcialmente
@end ifnothtml
@tab pre-GDP
@end multitable
@item
2 Notación corriente
@*
-4184
+4187
@tab Francisco Vila
@tab
@tab
@item
1.4 Repeticiones
@*
-945
+944
@tab Francisco Vila
@tab
@tab
@item
1.6 Notación de los pentagramas
@*
-2345
+2341
@tab Francisco Vila
@tab
@tab
@item
2.2 Teclados y otros instrumentos de varios pentagramas
@*
-864
+862
@tab Francisco Vila
@tab
@tab
@item
3 Entrada y salida generales
@*
-7671
+7686
@tab Francisco Vila
@tab
@tab
@ifhtml
@html
-<span style="background-color: #dfef77">parcialmente (96 %)</span>
+<span style="background-color: #1fff1f">sí</span>
@end html
@end ifhtml
@ifnothtml
-parcialmente (96 %)
+sí
@end ifnothtml
@tab
@ifhtml
@item
5 Cambiar los valores por omisión
@*
-12248
+12258
@tab Francisco Vila
@tab
@tab
@item
A Tablas del manual sobre notación
@*
-1989
+2017
@tab Francisco Vila
@tab
@tab
@item
1 Ejecutar LilyPond
@*
-3622
+3681
@tab Francisco Vila
@tab
@tab
@item
3 Ejecución de @command{lilypond-book}
@*
-3952
+3978
@tab Francisco Vila
@tab
@tab
@item
4 Programas externos
@*
-2170
+2180
@tab Francisco Vila
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">sí</span>
+<span style="background-color: #25fe1f">parcialmente</span>
@end html
@end ifhtml
@ifnothtml
-sí
+parcialmente
@end ifnothtml
@tab pre-GDP
@item
@item
Manuales
@*
-1203
+1214
@tab Francisco Vila
@tab
@tab
@item
Comunidad
@*
-1755
+1888
@tab Francisco Vila
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">sí</span>
+<span style="background-color: #40fe23">parcialmente</span>
@end html
@end ifhtml
@ifnothtml
-sí
+parcialmente
@end ifnothtml
@tab pre-GDP
@end multitable
@file{loquesea.texidoc@var{LANG}} en lugar de
@file{loquesea.texidoc}.
-@item lilyquote
-(Sólo para la salida de Texinfo.) Esta opción es similar a quote,
-pero se pone dentro del bloque de cita solamente el fragmento de
-música (y el bloque preformateado que se da en la opción
-@code{verbatim}). Esta opción es útil si queremos citar
-(@code{quote}) el fragmento musical pero no el bloque de documentación
-@code{texidoc}.
-
@item doctitle
(Sólo para la salida de Texinfo.) Esta opción funciona de forma
parecida a la opción @code{texidoc}: si @command{lilypond} se llama
(@tie{}@w{@code{#@{@dots{}#@}}}@tie{}). Within LilyPond code
blocks, use @code{$} to reference function arguments (eg.,
@samp{$arg1}) or to start an inline scheme expression containing
-function arguments (eg., @w{@samp{$(cons arg1 arg2)}}).
+function arguments (eg., @w{@samp{$(cons arg1 arg2)}}). A LilyPond code
+block may contain anything that you can use on the right side of an
+assignment. In addition, an empty LilyPond block corresponds to a void
+music expression, and a LilyPond block containing multiple music events
+gets turned into a sequential music expression.
@end multitable
@itemize
@item
At top level in a music expression. There are no special restrictions
-on the argument list. Using the @code{#@{}@dots{}@code{#@}} construct
-produces a sequential music expression and consequently can only applied
-in this context.
+on the argument list.
@item
As a post-event. All trailing arguments of the music function with the
turning off Point and Click). To do this, we return a @code{void}
music expression.
-That is why the form that is returned is the
-@w{@code{(make-music @dots{})}}. With the @code{'void} property
-set to @code{#t}, the parser is told to actually disregard this
-returned music expression. Thus the important part of the void
-music function is the processing done by the function, not the
-music expression that is returned.
+Using the form @code{#@{ #@}} will actually achieve that. If you for
+some reason really need an empty sequential music expression, you would
+have to write @code{#@{ @{ @} #@}} instead.
@example
noPointAndClick =
(parser location)
()
(ly:set-option 'point-and-click #f)
- (make-music 'SequentialMusic 'void #t))
+ #@{ #@})
...
\noPointAndClick % disable point and click
@end example
@noindent
is equivalent to:
@example
-\markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
- \larger \line @{ foo bar baz @} @}
+#@{ \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
+ \larger \line @{ foo bar baz @} @} #@}
@end example
@noindent
This example demonstrates the main translation rules between regular
-LilyPond markup syntax and Scheme markup syntax.
+LilyPond markup syntax and Scheme markup syntax. Using @code{#@{
+@dots{} #@}} for entering in Lilypond syntax will often be most
+convenient, but we explain how to use the @code{markup} macro to get a
+Scheme-only solution.
@quotation
@multitable @columnfractions .3 .3
taking one argument (the text). This draws the two boxes, with some
padding.
+@lisp
+#(define-markup-command (double-box layout props text) (markup?)
+ "Draw a double box around text."
+ (interpret-markup layout props
+ #@{\markup \override #'(box-padding . 0.4) \box
+ \override #'(box-padding . 0.6) \box @{ $text @}#@}))
+@end lisp
+
+or, equivalently
+
@lisp
#(define-markup-command (double-box layout props text) (markup?)
"Draw a double box around text."
@code{text} is the name of the command argument, and @code{markup?} its
type: it identifies it as a markup. The @code{interpret-markup}
function is used in most of markup commands: it builds a stencil, using
-@code{layout}, @code{props}, and a markup. Here, this markup is built
-using the @code{markup} scheme macro, see @ref{Markup construction in Scheme}.
-The transformation from @code{\markup} expression to scheme
-markup expression is straight-forward.
+@code{layout}, @code{props}, and a markup. In the second case, this
+markup is built using the @code{markup} scheme macro, see @ref{Markup
+construction in Scheme}. The transformation from @code{\markup}
+expression to scheme markup expression is straight-forward.
The new command can be used as follow:
@code{box-padding} will be used for the inner padding. The new code is
now as follows:
+@lisp
+#(define-markup-command (double-box layout props text) (markup?)
+ #:properties ((inter-box-padding 0.4)
+ (box-padding 0.6))
+ "Draw a double box around text."
+ (interpret-markup layout props
+ #@{\markup \override #`(box-padding . ,$inter-box-padding) \box
+ \override #`(box-padding . ,$box-padding) \box
+ @{ $text @} #@}))
+@end lisp
+
+Again, the equivalent version using the markup macro would be:
+
@lisp
#(define-markup-command (double-box layout props text) (markup?)
#:properties ((inter-box-padding 0.4)
(box-padding 0.6))
"Draw a double box around text."
(interpret-markup layout props
- (markup #:override `(box-padding . ,inter-box-padding) #:box
- #:override `(box-padding . ,box-padding) #:box text)))
+ #{\markup \override #`(box-padding . ,$inter-box-padding) \box
+ \override #`(box-padding . ,$box-padding) \box
+ { $text } #}))
\markup \double-box A
\markup \override #'(inter-box-padding . 0.8) \double-box A
In the following example, a @code{\paragraph} markup list command is
defined, which returns a list of justified lines, the first one being
indented. The indent width is taken from the @code{props} argument.
+
+@example
+#(define-markup-list-command (paragraph layout props args) (markup-list?)
+ #:properties ((par-indent 2))
+ (interpret-markup-list layout props
+ #@{\markuplines \justified-lines @{ \hspace #$par-indent $args @} #@}))
+@end example
+
+
+The version using just Scheme is more complex:
@example
#(define-markup-list-command (paragraph layout props args) (markup-list?)
#:properties ((par-indent 2))
First, the function gets the indent width, a property here named
@code{par-indent}, from the property list @code{props}. If the
property is not found, the default value is @code{2}. Then, a
-list of justified lines is made using the
-@code{make-justified-lines-markup-list} function, which is related
-to the @code{\justified-lines} built-in markup list command. A
-horizontal space is added at the beginning using the
-@code{make-hspace-markup} function. Finally, the markup list is
+list of justified lines is made using the built-in markup list command
+@code{\justified-lines}, which is related to the
+@code{make-justified-lines-markup-list} function. A
+horizontal space is added at the beginning using @code{\hspace} (or the
+@code{make-hspace-markup} function). Finally, the markup list is
interpreted using the @code{interpret-markup-list} function.
This new markup list command can be used as follows:
@item Numbers
Numbers are entered in the standard fashion,
-@code{1} is the (integer) number one, while @code{-1.5} is a
+@code{1} is the (integer) number one, while @w{@code{-1.5}} is a
floating point number (a non-integer number).
@item Strings
@subsection LilyPond Scheme syntax
The Guile interpreter is part of LilyPond, which means that
-Scheme can be included in LilyPond input files. The hash mark @code{#}
+Scheme can be included in LilyPond input files. The hash mark@tie{}@code{#}
is used to tell the LilyPond parser that the next value is a Scheme
value.
@end example
For the rest of this section, we will assume that the data is entered
-in a music file, so we add @code{#}s at the beginning of each Scheme
+in a music file, so we add@tie{}@code{#}s at the beginning of each Scheme
expression.
All of the top-level Scheme expressions in a LilyPond input file can
@knownissues
Mixing Scheme and LilyPond variables is not possible with the
-@code{--safe} option.
+@option{--safe} option.
@node Object properties
@appendixsubsec Notes seules
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec Notes et paroles
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec Notes et accords
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec Notes, paroles et accords
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec Piano seul
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec Chant et accompagnement
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec Piano et paroles entre les portées
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec Piano et nuances entre les portées
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec Quatuor à cordes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec Parties pour quatuor à cordes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec Partition pour chœur à quatre voix mixtes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec Partition pour chœur SATB avec réduction pour piano
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec Partition pour chœur SATB avec alignement des contextes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec Partition pour chœur SATB, sur quatre portées
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{satb-choir-template---four-staves.ly}
@appendixsubsec Couplet pour solo et refrain à deux voix
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@appendixsubsec Hymnes et cantiques
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{hymn-template.ly}
@appendixsubsec Psalmodie
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{anglican-psalm-template.ly}
@appendixsubsec Orchestre, chœur et piano
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Transcription de musique mensurale
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Transcription du grégorien
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@appendixsubsec Symboles de jazz
@translationof Jazz combo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
@ignore
- Translation of GIT committish: a6cd9e45dcb86a249936f174403c9f8bc8afebc0
+ Translation of GIT committish: b38fd63a19190741c0c19faf6a904af82c3f434c
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
* Autres retouches::
@end menu
+
@node Retouches élémentaires
@section Retouches élémentaires
@translationof Tweaking basics
* Méthodes de retouche::
@end menu
+
@node Introduction aux retouches
@subsection Introduction aux retouches
@translationof Introduction to tweaks
graveurs et autres propriétés qui y sont décrits, sont indispensables
pour comprendre et construire les retouches.
+
@node Objets et interfaces
@subsection Objets et interfaces
@translationof Objects and interfaces
doigtés, les clefs, etc. sont appelés @qq{Objets de rendu}@tie{}; ils
sont aussi connus sous le nom d'@qq{Objets graphiques} (en
anglais@tie{}: @emph{Graphical objects} ou @emph{Grobs} pour faire
-court). Ce sont bien des objets au sens générique ci-dessus, et, en
+court). Ce sont bien des objets au sens générique ci-dessus et, en
tant que tels, ils reçoivent des propriétés qui leur sont associées,
comme leur position, leur taille, leur couleur, etc.
compte plus d'une centaine. Nous verrons plus loin en quoi c'est
intéressant et utile pour l'utilisateur.
-Ainsi s'achève le tour des principaux termes relatifs aux objets et
+Ainsi s'achève le tour des principaux termes relatifs aux objets
que nous serons amenés à utiliser dans ce chapitre.
+
@node Conventions de nommage des objets et propriétés
@subsection Conventions de nommage des objets et propriétés
@translationof Naming conventions of objects and properties
@multitable @columnfractions .33 .33 .33
@headitem Type d'objet/propriété
- @tab Convention de nommage
- @tab Exemples
+ @tab Convention de nommage
+ @tab Exemples
@item Contextes
- @tab Aaaa ou AaaaAaaaAaaa
- @tab Staff, GrandStaff
+ @tab Aaaa ou AaaaAaaaAaaa
+ @tab Staff, GrandStaff
@item Objets de rendu
- @tab Aaaa ou AaaaAaaaAaaa
- @tab Slur, NoteHead
+ @tab Aaaa ou AaaaAaaaAaaa
+ @tab Slur, NoteHead
@item Graveurs
- @tab Aaaa_aaa_engraver
- @tab Clef_engraver, Note_heads_engraver
+ @tab Aaaa_aaa_engraver
+ @tab Clef_engraver, Note_heads_engraver
@item Interfaces
- @tab aaa-aaa-interface
- @tab grob-interface, break-aligned-interface
+ @tab aaa-aaa-interface
+ @tab grob-interface, break-aligned-interface
@item Propriétés de contexte
- @tab aaa ou aaaAaaaAaaa
- @tab alignAboveContext, skipBars
+ @tab aaa ou aaaAaaaAaaa
+ @tab alignAboveContext, skipBars
@item Propriétés d'objet de rendu
- @tab aaa ou aaa-aaa-aaa
- @tab direction, beam-thickness
+ @tab aaa ou aaa-aaa-aaa
+ @tab direction, beam-thickness
@end multitable
Comme nous le verrons bientôt, les propriétés des différents
qu'il est bon de savoir reconnaître le type d'un objet en fonction du
nom de ses propriétés.
+
@node Méthodes de retouche
@subsection Méthodes de retouche
@translationof Tweaking methods
}
@end lilypond
+
@seealso
Manuel de notation :
@ruser{La commande d'affinage (@emph{tweak})}.
* Types de propriétés::
@end menu
+
@node Propriétés des objets de rendu
@subsection Propriétés des objets de rendu
@translationof Properties of layout objects
prendre@tie{}? Vous êtes convaincu, avec tout ce qui a été dit sur la
souplesse de LilyPond, qu'une telle retouche est réalisable et
vous vous dites qu'elle fera sans doute intervenir la commande
-@code{\override}. Mais existe-t-il une propriété lourde qui s'applique
-à une liaison et, dans l'affirmative, comment faire pour la
+@code{\override}. Mais existe-t-il une propriété épaisseur qui
+s'applique à une liaison et, dans l'affirmative, comment faire pour la
modifier@tie{}? C'est là qu'intervient la Référence des propriétés
internes. Elle contient toutes les informations dont vous avez besoin
pour construire n'importe quelle commande @code{\override}.
commandes -- mais il faut encore s'exercer. Les exemples
suivants sont là dans cette intention.
+
@subheading Détermination du contexte adéquat
@cindex contexte, détermination du
niveau, qu'il est activé sans ambiguïté par le fait que l'on est
en train de saisir des notes, on peut ici ne pas le mentionner.
+
@subheading Redéfinition pour une seule occurence
@cindex dérogation pour une seule fois
exemples seront progressivement accompagnés d'explications et
introduiront des termes nouveaux.
+
@node Propriétés listées par interface
@subsection Propriétés listées par interface
@translationof Properties found in interfaces
est@tie{}: @qq{Comment se fait-il que les propriétés @code{font-series}
et @code{font-size} se retrouvent à la fois dans @code{LyricText} et
dans l'interface @code{font-interface} alors que ce n'est pas le cas
-pour @code{font-shape} ?} La réponse est que lorsqu'un objet
+pour @code{font-shape}@tie{}?} La réponse est que lorsqu'un objet
@code{LyricText} est créé, les valeurs globales par défaut de
@code{font-series} et @code{font-size} sont modifiées, mais pas celles
de @code{font-shape}. Les possibilités de modification dans
@noindent
et voilà les paroles en italiques.
+
@subheading Spécification du contexte en mode lyrique
@cindex contexte, spécification en mode lyrique
autre caractère compte comme un élément de la syllabe. C'est pourquoi
il faut une espace ou un saut de ligne avant le @code{@}} final, pour
éviter qu'il ne soit assimilé à la dernière syllabe. De même, il faut
-insérer des espaces avant et après le point, @qq{.}, qui sépare le nom
-de contexte du nom de l'objet, faute de quoi les deux noms seront joints
-et l'interpréteur ne pourra pas les reconnaître. La formulation
+insérer des espaces de part et d'autre du point, @qq{.}, qui sépare le
+nom de contexte du nom de l'objet, faute de quoi les deux noms seront
+joints et l'interpréteur ne pourra pas les reconnaître. La formulation
correcte est donc@tie{}:
@example
@subsection Types de propriétés
@translationof Types of properties
-
@cindex propriété, types de
Nous avons vu jusqu'à maintenant deux types de propriétés@tie{}:
@tab Vrai (@emph{true} en anglais) ou Faux (@emph{false} en anglais),
sous la forme @code{#t} ou @code{#f}
@tab @code{#t}, @code{#f}
-@item Dimension (en lignes de portée)
+@item Dimension (en espaces de portée)
@tab Un nombre positif décimal (en unités de lignes de portée)
@tab @code{2.5}, @code{0.34}
@item Direction
@item Liste
@tab Plusieurs valeurs séparées par une espace, encadrées par des
parenthèses et prédédées par une apostrophe
- @tab @code{'(left-edge staff-bar)}, @code{'(1)}, @code{'(1.0 0.25 0.5)}
+ @tab @code{'(left-edge staff-bar)}, @code{'(1)},
+ @code{'(1.0 0.25 0.5)}
@item Markup (ou étiquette)
@tab Toute commande @code{\markup} valide
@tab @code{\markup @{ \italic "cresc." @}}
mesure -- et de beaucoup d'autres objets, bien sûr. Examinons chacune
d'elles tour à tour.
+
@subheading stencil
@cindex stencil, propriété
@code{stencil} déclechera une erreur dès lors que l'objet en question se
doit d'avoir des dimensions pour les nécessités du traitement. Ce sera
le cas, par exemple, si vous effacez le @code{stencil} d'un objet
-@code{NoteHead}. Il vaut mieux, en pareil caas, utiliser la fonction
+@code{NoteHead}. Il vaut mieux, en pareil cas, utiliser la fonction
@code{point-stencil} qui, quant à elle, attribue à l'objet une taille à
zero@tie{}:
}
@end lilypond
+
@subheading visibilité des barres (break-visibility)
@cindex break-visibility, propriété
Comme on peut le constater, cette solution-là aussi supprime les barres
de mesure.
+
@subheading transparence
@cindex transparent, propriété
valeur @code{#f} supprime totalement l'objet, tandis que le fait de le
rendre @code{transparent} le laisse en place, mais de façon invisible.
+
@subheading couleur
@cindex color, propriété
les mêmes proportions que les polices de caractères. La prochaine
sous-section montrera comment faire.
+
@node Longueur et épaisseur des objets
@subsection Longueur et épaisseur des objets
@translationof Length and thickness of objects
Pour de petits changements d'échelle, comme dans l'exemple ci-dessus, il
n'est généralement pas utile d'ajuster l'épaisseur des différentes
lignes telles que les barres de mesure, les ligatures, les soufflets de
-crescendo/decrescendo, les liaisons, etc. Si l'épaisseur d'un objet en
-particulier doit être ajustée, le mieux est de modifier sa propriété
+crescendo ou decrescendo, les liaisons, etc. Si l'épaisseur d'un objet
+en particulier doit être ajustée, le mieux est de modifier sa propriété
@code{thickness}. Nous avons vu plus haut, dans
@ref{Propriétés des objets de rendu}, un exemple de modification de
l'épaisseur des liaisons. L'épaisseur de tous les objets tracés
(c'est-à-dire ceux qui ne proviennent pas d'une police de caractère)
peut être changée de la même manière.
+
@node Positionnement des objets
@section Positionnement des objets
@translationof Placement of objects
* Objets hors de la portée::
@end menu
+
@node Comportement automatique
@subsection Comportement automatique
@translationof Automatic behavior
de modifier ce comportement automatique.
Parmi les objets extérieurs à la portée, on compte des éléments comme
-les marques de reprise, les indications de texte ou de nuances. Dans
+les marques de reprise, les indications de texte ou de nuance. Dans
LilyPond, la règle est de placer verticalement ces objets extérieurs à
la portée le plus près possible de la portée, tout en évitant la
collision avec d'autres objets. LilyPond utilise la propriété
à la portée doivent occuper la même place, c'est celui qui a la
@code{outside-staff-priority} la plus basse qui est placé le plus près
de la portée. Et si deux objets ont la même
-@code{outside-staff-priority}, le premier rencontré sera placé le plus
+@code{outside-staff-priority}, le premier rencontré sera placé au plus
près de la portée.
Dans l'exemple suivant, tous les @emph{markup} ont la même priorité,
utiliser la commande prédéfinie, suivie, après la note à modifier, de la
commande @code{\xxxNeutral} correspondante.
+
@subheading Doigtés
@cindex doigtés, positionnement
c,4 c c c |
@end lilypond
+N'oublions pas que certains objets, tels les numéros de mesure,
+indications métronomiques et marques-repères, sont par défaut attachés
+au contexte @code{Score}.
+
@cindex liaisons et outside-staff-priority
@cindex liaisons et articulations
@cindex articulations et liaisons
notes pour laisser plus de place au texte. C'est possible grâce à la
commande @code{textLengthOn}.
+
@subheading \textLengthOn
@cindex notes, répartition selon le texte
@subheading Nuances
-@cindex modifier le positionnement des nuances
-@cindex nuances, modifier le positionnement
+@cindex modification du positionnement des nuances
+@cindex nuances, modification du positionnement
-Les indications de nuance se placent normalement sous la portée mais on
+Les indications de nuance se placent normalement sous la portée, mais on
peut les placer au-dessus avec la commande @code{dynamicUp}. Elles se
positionnent verticalement par rapport à la note à laquelle elles sont
liées et se décalent vers le bas (ou le haut) en fonction des objets de
Si une telle situation devait survenir dans de la musique @qq{réelle},
il serait préférable d'espacer un peu plus les notes, de façon que les
indications de nuance puissent toutes se situer à la même distance de la
-portée. Il était possible de faire cela pour les textes de
-@emph{markup} grâce à la commande @code{\textLengthOn} mais il n'existe
+portée. S'il est possible de faire cela pour les textes de
+@emph{markup} grâce à la commande @code{\textLengthOn}, il n'existe
pas d'équivalent pour les indications de nuance. Il nous faut donc
chercher à faire cela avec la commande @code{\override}.
+
@subheading Dimensionnement des objets graphiques
@cindex grob, dimensionnement
@code{'(+inf.0@tie{}.@tie{}-inf.0)}. Pour être sûr que les objets ne se
chevaucheront pas horizontalement, nous devons donc corriger cette
valeur de @code{extra-spacing-width} en @w{@code{'(0 . 0)}}, afin que
-leur vraie largeur se manifeste. La commande pour y parvenir avec des
+leur vraie largeur se manifeste. La commande pour y parvenir avec des
indications de nuances est@tie{}:
@example
* Exemple concret::
@end menu
+
@node Déplacement d'objets
@subsection Déplacement d'objets
@translationof Moving objects
Ce point a déjà été traité en détails -- voir
@ref{Objets inclus dans la portée}.
+
@item
@code{padding}, @code{right-padding}, @code{staff-padding}
sont pas forcément traitées dans l'objet en question@tie{}; il faut
alors regarder les objets qui semblent s'en rapprocher.
-Toutes les valeurs @code{padding} sont exprimées en espaces de portée.
+Toutes les valeurs @code{padding} sont exprimées en espace de portée.
Pour la plupart des objets, la valeur par défaut est aux alentours de
1,0 et parfois moins (cela dépend de chaque objet). Il est possible de
la modifier lorsqu'on a besoin d'un espace vide plus grand (ou plus
correspond à un déplacement de la moitié de la longueur du
texte.
+
@item
@code{extra-spacing-width}
@code{staff-position} est une propriété de la
@code{staff-symbol-referencer-interface}, qui s'applique aux objets
-positionnés par rapport à la portée. Elle indique, en demi-espaces de
+positionnés par rapport à la portée. Elle indique, en demi-espace de
portée, la position verticale des objets par rapport à la ligne médiane
de la portée. C'est bien pratique pour résoudre des problèmes de
collision entre des objets comme les silences valant mesure entière,
les liaisons et les notes de différentes voix.
+
@item
@code{force-hshift}
(voir @ref{Instanciation explicite des voix}) ne suffisent plus à
résoudre les conflits. Elle est alors préférable à l'utilisation de la
propriété @code{extra-offset}, dans la mesure où on n'a pas besoin
-d'exprimer la distance en espaces de portée et où le fait de déplacer
+d'exprimer la distance en espace de portée et où le fait de déplacer
les notes à l'intérieur ou à l'extérieur d'une @code{NoteColumn} affecte
d'autres actions comme les fusions de notes.
@end itemize
+
@item
Pour terminer, quand toutes les autres méthodes ont échoué, il est
possible de repositionner verticalement les objets à la main par rapport
à la ligne médiane de la portée, ou en les déplaçant à une distance
donnée vers une nouvelle position. Les inconvénients sont qu'il faut
individuellement, pour chaque objet, trouver les valeurs correctes de
-repositionnement souvent par tâtonnement, et que, puisque le
+repositionnement souvent par tâtonnement et que, puisque le
mouvement est opéré après que LilyPond a placé tous les autres
objets, c'est à l'utilisateur de résoudre tous les problèmes de
collision qui pourraient survenir. Et le pire avec cette méthode est
@cindex extra-offset, propriété
Cette propriété s'applique à tout objet acceptant la
-@code{grob-interface}. Elle reçoit une paire de nombre qui indiquent le
-déplacement supplémentaire dans le sens horizontal et vertical. Des
+@code{grob-interface}. Elle reçoit une paire de nombres qui indiquent
+le déplacement supplémentaire dans le sens horizontal et vertical. Des
nombres négatifs déplacent l'objet vers la gauche ou vers la droite.
L'unité utilisée est l'espace de portée. Le déplacement supplémentaire
intervient une fois que la composition des objets est achevée, si bien
Cette propriété est très utile pour ajuster manuellement l'inclinaison
et la hauteur des barres de ligature, des liaisons et des nolets. Elle
-est suivie de deux nombres qui donnent la position des bords gauche et
-droit des barres, liaisons, etc. par rapport à la ligne médiane de la
-portée. L'unité de référence est l'intervalle de lignes de portée.
+est suivie de deux nombres qui donnent la position des extrémités gauche
+et droite des barres, liaisons, etc. par rapport à la ligne médiane de
+la portée. L'unité de référence est l'intervalle de lignes de portée.
Attention toutefois au fait que les liaisons et phrasés ne peuvent pas
être repositionnés n'importe où. LilyPond commence par dresser la liste
des emplacements possibles pour les liaisons et choisit par défaut la
Voyons maintenant comment les propriétés décrites dans la section
précédente peuvent nous aider à résoudre les collisions.
+
@subheading la propriété padding
@cindex décalage (padding)
@code{outside-staff-priority}, cet objet sera déplacé, ainsi que tous
les autres objets du groupe.
+
@subheading right-padding
@cindex right-padding, propriété
@noindent
+
@subheading la propriété staff-padding
@cindex alignement d'objets sur une ligne de base
<a\2>
@end lilypond
+
@subheading la propriété staff-position
@cindex collision d'objets à l'intérieur d'une portée
@code{MultiMeasureRest}@tie{}; nous avons donc besoin de la déplacer,
disons, de quatre demi-intervalles vers le bas, ce qui donne @code{-8}.
-
@cindex MultiMeasureRest, exemple de dérogation
@cindex staff-position, exemple d'utilisation de la propriété
car la ligne supplémentaire au-dessus du silence est insérée
automatiquement.
+
@subheading la propriété extra-offset
@cindex positionnement des objets
second bloc de croches de la première voix mais qu'il ne s'applique
à aucune mesure de la deuxième voix.
+
@subheading la propriété force-hshift
Maintenant, nous sommes prêts à appliquer les dernières corrections à
le do avec liaison, le ré blanche qui se fond avec le ré croche, et le
fa dièse noire pointée qui se fond lui aussi avec la croche de même
hauteur. Tout le reste se réduit à une seule voix. Le plus simple est
-donc de créer temporairement ces quatre voix au moment opportun.
-Si vous avez oublié comment faire, reportez-vous à
-@ref{J'entends des Voix}. Commençons par saisir les notes comme
-appartenant à deux variables, mettons en place l'ossature des
-portées dans un bloc @code{\Score} et voyons ce que LilyPond propose par
-défaut@tie{}:
+donc de créer temporairement ces trois voix supplémentaires au moment
+opportun. Si vous avez oublié comment faire, reportez-vous à
+@ref{J'entends des Voix} et @ref{Instanciation explicite des voix}.
+Nous opterons ici pour une déclaration explicite des voix du passage
+polyphonique, puisque LilyPond est alors plus performant en matière
+d'évitement des collisions.
+
+Commençons par saisir les notes comme appartenant à deux variables,
+mettons en place l'ossature des portées dans un bloc @code{\Score} et
+voyons ce que LilyPond propose par défaut@tie{}:
@c line-width ensures no break
@lilypond[quote,verbatim,ragged-right,line-width=6\in]
@cindex objets, invisibles
@cindex liaison de tenue avec changement de voix
+
@subheading Liaison entre plusieurs voix
Voici un exemple qui montre comment créer une liaison de
>>
@end lilypond
+
@subheading Rendu MIDI d'un point d'orgue
@cindex stencil, utilisation de la propriété
@tab Réglages affectant l'apparence des frets, couleurs, altérations,
barres de mesure, etc.
@item @file{scm/parser-clef.scm}
- @tab Définition des clefs prises en charge
+ @tab Définition des clefs prises en charge
@item @file{scm/script.scm}
- @tab Réglages par défaut des articulations
+ @tab Réglages par défaut des articulations
@end multitable
-
@node Retouches avancées avec Scheme
@subsection Retouches avancées avec Scheme
@translationof Advanced tweaks with Scheme
</div>
@end html
@iftex
-@image{examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@code{mensural}.
@lilypond[quote,fragment,ragged-right,verbatim]
-\override Stem #'flag-style = #'mensural
+\override Flag #'style = #'mensural
\override Stem #'thickness = #1.0
\override NoteHead #'style = #'mensural
\autoBeamOff
@cindex exceptions, chiffrage d'accords
@cindex chiffrage d'accords, exceptions
@cindex accords chiffrés, exceptions
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{chord-name-exceptions.ly}
@funindex majorSevenSymbol
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{avoiding-collisions-with-chord-fingerings.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{default-direction-of-stems-on-the-center-line-of-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{grid-lines--changing-their-appearance.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{modifying-default-values-for-articulation-shorthand-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-vertical-ordering-of-scripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-a-delayed-turn.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-hairpin-behavior-at-bar-lines.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-minimum-length-of-hairpins.ly}
@cindex al niente
@cindex niente, al
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-hairpins-using-al-niente-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligned-dynamics-and-textscripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{hiding-the-extender-line-for-text-dynamics.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-text-and-spanner-styles-for-text-dynamics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-double-slurs-for-legato-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-text-markups-inside-slurs.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-slurs-with-complex-dash-structure.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-breath-mark-symbol.ly}
@cindex césure
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{inserting-a-caesura.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adjusting-the-shape-of-falls-and-doits.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{contemporary-glissando.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-a-piano-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-other-contexts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-arpeggios-across-notes-in-different-voices.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{stem-and-beam-behavior-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{polyphony-in-tablature.ly}
@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-fret-orientations.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-markup-fret-diagrams.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-fretboard-fret-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{defining-predefined-fretboards-for-other-instruments.ly}
@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{placement-of-right-hand-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingerings,-string-indications,-and-right-hand-fingerings.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-midi-output-to-one-channel-per-voice.ly}
@knownissues
% extend the stems to reach the other staff
\override Stem #'length = #12
% do not print extra flags
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
% prevent beaming as needed
a8 g4 f8 f bes\noBeam g4
}
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{indicating-cross-staff-chords-with-arpeggio-bracket.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{accordion-discant-symbols.ly}
* Glyphes d'extrémité d'accolade::
* Glyphes de pédale::
* Glyphes d'accordéon::
+* Glyphes de liaison::
* Glyphes de style vaticana::
* Glyphes de style medicaea::
* Glyphes de style Hufnagel::
@end lilypond
+@node Glyphes de liaison
+@unnumberedsubsec Tie glyphs
+
+@lilypond[quote]
+\include "font-table.ly"
+\markuplines \override-lines #'(word-space . 4)
+ \doc-chars #ties
+@end lilypond
+
+
@node Glyphes de style vaticana
@unnumberedsubsec Glyphes de style vaticana
@translationof Vaticana glyphs
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle,ragged-right]
+@lilypondfile[verbatim,quote,texidoc,doctitle,ragged-right]
{hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly}
-@lilypondfile[verbatim,lilyquote,texidoc, doctitle]
+@lilypondfile[verbatim,quote,texidoc, doctitle]
{preventing-extra-naturals-from-being-automatically-added.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{transposing-pitches-with-minimum-accidentals-smart-transpose.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-clef-properties.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ottava-text.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-ambitus-per-voice.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ambitus-with-multiple-voices.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-ambitus-gap.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{numbers-as-easy-note-heads.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{applying-note-head-styles-depending-on-the-step-of-the-scale.ly}
Pour une liste exhaustive des styles de tête de note, consultez
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{shortening-volta-brackets.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-volta-brackets-to-additional-staves.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-double-repeat-default-for-volte.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-counter.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-count-visibility.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{isolated-percent-repeats.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{cross-staff-tremolos.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-number-of-augmentation-dots-per-note.ly}
@funindex tupletNumberFormatFunction
@funindex tupletSpannerDuration
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{entering-several-tuplets-using-only-one--times-command.ly}
@cindex nolet, modification du chiffre
@funindex TupletNumber
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-tuplet-number.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{non-default-tuplet-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-tuplet-bracket-visibility.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{permitting-line-breaks-within-beamed-tuplets.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-ties-with-arpeggios.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{engraving-ties-manually.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{rest-styles.ly}
@cindex silence d'église
@cindex kirchenpausen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-form-of-multi-measure-rests.ly}
@cindex silence multimesure, positionnement
@cindex positionnement des silences multimesure
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{positioning-multi-measure-rests.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{multi-measure-rest-markup.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-time-signature-without-affecting-the-beaming.ly}
@cindex métriques composites
@cindex métriques décomposées
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
@c perhaps also an example of how to move it horizontally?
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-tempo-without-a-metronome-mark.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-metronome-marks-in-markup-mode.ly}
Pour de plus amples détails, veuillez consulter
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{compound-time-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{guitar-strum-rhythms.ly}
@funindex breakable
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beams-across-line-breaks.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-beam-knee-gap.ly}
@cindex \partcombine et \autoBeamOff
@cindex \autoBeamOff et \partcombine
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{partcombine-and-autobeamoff.ly}
@cindex ligatures, subdivision
@cindex subdivision de ligature
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{subdividing-beams.ly}
@cindex groupement de mesures
@cindex pulsation, regroupement
@cindex mesure, subdivision
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{conducting-signs,-measure-grouping-signs.ly}
@cindex ligature en fin de partition
@cindex ligature en fin de voix polyphonique
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beam-endings-in-score-context.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{flat-flags-and-beam-nibs.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-the-bar-number-for-the-first-measure.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-at-regular-intervals.ly}
@cindex numéro de mesure, formatage
@cindex formatage du numéro de mesure
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-inside-boxes-or-circles.ly}
@cindex alignement du numéro de mesure
@cindex numéro de mesure, alignement
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{aligning-bar-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{removing-bar-numbers-from-a-score.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-grace-note-slashes-with-normal-heads.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-grace-layout-within-music.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{redefining-grace-note-global-defaults.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-grace-notes-with-floating-space.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{additional-voices-to-avoid-collisions.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{forcing-horizontal-shift-of-notes.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{combining-two-parts-on-the-same-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-partcombine-texts.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{use-square-bracket-at-the-start-of-a-staff-group.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{display-bracket-with-only-one-staff-in-a-system.ly}
@cindex présentation mensurale
@cindex transcription de musique ancienne
@cindex musique ancienne, transcription
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{nesting-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-some-staff-lines-thicker-than-the-others.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligning-ossias-and-lyrics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{removing-the-first-empty-line.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{quoting-another-voice-with-transposition.ly}
@cindex note-event
@funindex quotedEventTypes
@funindex quotedCueEventTypes
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{quoting-another-voice.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-text-spanner-postfix.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-custom-text-spanner-postfix.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-at-the-end-of-a-line.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{aligning-marks-with-various-notation-objects.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-on-every-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{stand-alone-two-column-markup.ly}
Pour attribuer plus d'une syllabe à une même note, vous pouvez soit les
mettre entre guillemets, soit utiliser le caractère souligné
(@code{_}) pour obtenir une espace, ou bien encore utiliser un tilde
-(@code{~}) pour obtenir une liaison entre les syllabes. Cette
-liaison adaptée aux paroles correspond au caractère Unicode
-@code{U+203F}, et n'apparaîtra dans la partition que si le système
-dispose d'une police installée qui contient ce symbole. Un certain
-nombre de fontes librement disponibles en disposent, comme FreeSerif
-(un clone de Times), `DejaVuSans' (mais pas DejaVuSerif) ou
-TeXGyreSchola (un clone de Century Schoolbook).
+(@code{~}) pour obtenir une liaison entre les syllabes.
@lilypond[quote,ragged-right,verbatim]
{
\time 3/4
\relative c' { c2 e4 g2 e4 }
- \addlyrics { gran- de_a- mi- go }
- \addlyrics { pu- "ro y ho-" nes- to }
- \addlyrics { pu- ro~y~ho- nes- to }
+ \addlyrics { gran -- de_a -- mi -- go }
+ \addlyrics { pu -- "ro y ho" -- nes -- to }
+ \addlyrics { pu -- ro~y~ho -- nes -- to }
}
@end lilypond
d'initiation.
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{lyrics-old-spacing-settings.ly}
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{lyrics-alignment.ly}
@c TODO: move to LSR -vv
chapitre @ref{Notation des accords}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@cindex voix, division
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-arpeggiobracket-to-make-divisi-more-visible.ly}
@seealso
la lisibilité des notes du piano.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{adding-orchestral-cues-to-a-vocal-score.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{chant-or-psalms-notation.ly}
Cantiques et autres textes liturgiques peuvent être mis en forme avec
alignés sur les notes. En pareil cas, les notes sont espacées selon les
syllabes et non leur durée.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@seealso
d'une commande @code{\bar@tie{}"|"} ou @code{\bar@tie{}"||"} à la fin de
chaque ligne.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{hymn-template.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing--flageolet-mark-size.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingering-symbols-for-wind-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{recorder-fingering-chart.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-listing.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{graphical-and-text-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-size-of-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-key-lists.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{makam-example.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{arabic-improvisation.ly}
@end html
@end ifhtml
-@emph{Dernière mise à jour Wed Jul 13 10:59:12 UTC 2011
+@emph{Dernière mise à jour Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 Bases de notation musicale
@*
-4184
+4187
@tab Nicolas Grandclaude
@*
Ludovic Sardain
@item
1.4 Répétitions et reprises
@*
-945
+944
@tab Valentin Villenave
@*
Jean-Charles Malahieude
@ifhtml
@html
-<span style="background-color: #39ff22">partiellement</span>
+<span style="background-color: #40fe23">partiellement</span>
@end html
@end ifhtml
@ifnothtml
@item
1.6 Notation sur la portée
@*
-2345
+2341
@tab Valentin Villenave
@*
Jean-Charles Malahieude
@ifhtml
@html
-<span style="background-color: #9eff30">partiellement</span>
+<span style="background-color: #a5ff31">partiellement</span>
@end html
@end ifhtml
@ifnothtml
@item
2.2 Instruments utilisant des portées multiples
@*
-864
+862
@tab Valentin Villenave
@*
Jean-Charles Malahieude
@item
3 Généralités en matière d'entrée et sortie
@*
-7671
+7686
@tab Jean-Charles Malahieude
@*
Valentin Villenave
@ifhtml
@html
-<span style="background-color: #91ff2e">partiellement</span>
+<span style="background-color: #97ff2f">partiellement</span>
@end html
@end ifhtml
@ifnothtml
@item
5 Modification des réglages prédéfinis
@*
-12248
+12258
@tab Valentin Villenave
@*
Jean-Charles Malahieude
@item
A Tables du manuel de notation
@*
-1989
+2017
@tab Frédéric Chiasson
@*
Jean-Charles Malahieude
@ifhtml
@html
-<span style="background-color: #dfef77">partiellement (85 %)</span>
+<span style="background-color: #dfef77">partiellement (84 %)</span>
@end html
@end ifhtml
@ifnothtml
-partiellement (85 %)
+partiellement (84 %)
@end ifnothtml
@tab
@ifhtml
@item
1 Exécution de @command{lilypond}
@*
-3622
+3681
@tab Jean-Charles Malahieude
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">oui</span>
+<span style="background-color: #25fe1f">partiellement</span>
@end html
@end ifhtml
@ifnothtml
-oui
+partiellement
@end ifnothtml
@tab pré-GDP
@item
@item
3 Association musique-texte avec @command{lilypond-book}
@*
-3952
+3978
@tab Jean-Charles Malahieude
@tab
@tab
@item
4 Programmes externes
@*
-2170
+2180
@tab Jean-Charles Malahieude
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">oui</span>
+<span style="background-color: #25fe1f">partiellement</span>
@end html
@end ifhtml
@ifnothtml
-oui
+partiellement
@end ifnothtml
@tab pré-GDP
@item
@item
Manuels
@*
-1203
+1214
@tab John Mandereau
@tab Jean-Charles Malahieude
@tab
@item
Communauté
@*
-1755
+1888
@tab Jean-Charles Malahieude
@*
John Mandereau
@ifhtml
@html
-<span style="background-color: #1fff1f">oui</span>
+<span style="background-color: #40fe23">partiellement</span>
@end html
@end ifhtml
@ifnothtml
-oui
+partiellement
@end ifnothtml
@tab pré-GDP
@end multitable
contenu de @file{toto.texidoc@var{LANGUE}} en lieu et place de celui de
@file{toto.texidoc}.
-@item lilyquote
-Option disponible uniquement pour Texinfo.@*
-Cette option est équivalente à l'option @code{quote} à ceci près que
-seule l'image de la partition -- ainsi que les éventuels blocs
-@emph{verbatim} si vous la couplez à l'option @code{verbatim} -- fera
-l'objet d'une citation. Cette option permet l'inclusion de la partition
-en omettant les commentaires contenus dans le bloc @code{texidoc} du
-fichier source.
-
@item doctitle
Option disponible uniquement pour Texinfo.@*
Cette option fonctionne selon le même principe que l'option
</div>
@end html
@iftex
-@image{examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@end html
@end ifhtml
-@emph{Last updated Wed Jul 13 10:59:12 UTC 2011
+@emph{Last updated Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 Elemi kottaírás
@*
-4184
+4187
@tab Harmath Dénes
@tab
@tab
@item
1 A @command{lilypond} használata
@*
-3622
+3681
@tab Team-hu
@tab
@tab
@item
3 A @command{lilypond-book} használata
@*
-3952
+3978
@tab Team-hu
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">yes</span>
+<span style="background-color: #25fe1f">partially</span>
@end html
@end ifhtml
@ifnothtml
-yes
+partially
@end ifnothtml
@tab pre-GDP
@end multitable
@item
Dokumentáció
@*
-1203
+1214
@tab Harmath Dénes
@tab
@tab
@item
Közösség
@*
-1755
+1888
@tab Harmath Dénes
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">yes</span>
+<span style="background-color: #40fe23">partially</span>
@end html
@end ifhtml
@ifnothtml
-yes
+partially
@end ifnothtml
@tab pre-GDP
@end multitable
@file{foo.texidoc@var{LANG}} will be included instead of
@file{foo.texidoc}.
-@item lilyquote
-(Only for Texinfo output.) This option is similar to quote, but only
-the music snippet (and the optional verbatim block implied by
-@code{verbatim} option) is put into a quotation block. This option is
-useful if you want to @code{quote} the music snippet but not the
-@code{texidoc} documentation block.
-
@item doctitle
(Only for Texinfo output.) This option works similarly to
@code{texidoc} option: if @command{lilypond} is called with the
@email{t.daniels@@treda.co.uk},
Assistant documentation editor
+@item Phil Holmes:
+@email{mail@@philholmes.net}
+@uref{http://www.philholmes.net}
+Build unentangler, Bug squad member
+
@item Reinhold Kainhofer:
@email{reinhold@@kainhofer.com},
@uref{http://reinhold.kainhofer.com},
@item Valentin Villenave:
LSR editor and Bug squad member
+@item Jan Warchoł:
+happy nitpicker
+
@end itemize
@end macro
@c use commas not colons
-Karin Hoethker,
-Jan Warchoł
+Karin Hoethker
@c no comma for last entry
By default, `@command{make@tie{}install}' will install all the
files in @file{/usr/local/bin}, @file{/usr/local/lib} etc. You
can specify an installation prefix other than @file{/usr/local}
-using `@code{--prefix}', for instance `@code{--prefix=$HOME}'.
+using `@option{--prefix}', for instance `@option{--prefix=$HOME}'.
@end quotation
A typical installation prefix is @file{$HOME/usr}:
If you want to build multiple versions of LilyPond with different
configuration settings, you can use the
-@code{--enable-config=@var{CONF}} option of @command{configure}.
-You should use @code{make@tie{}conf=@var{CONF}} to generate the
-output in @file{out-@var{CONF}}. For example, suppose you want to
+@option{--enable-config=@var{conf}} option of @command{configure}.
+You should use @code{make@tie{}conf=@var{conf}} to generate the
+output in @file{out-@var{conf}}. For example, suppose you want to
build with and without profiling, then use the following for the
normal build
@menu
* Documentation editor's edit/compile cycle::
* Building documentation::
+* Building a single document::
* Saving time with CPU_COUNT::
* AJAX search::
* Installing documentation::
indiscriminately---it is more efficient to @command{touch} only
the affected files.
+@node Building a single document
+@unnumberedsubsubsec Building a single document
+It's possible to build a single document. For example, to rebuild
+only @file{contributor.pdf}, do the following:
+
+@example
+cd build/
+cd Documentation/
+touch ../../Documentation/contributor.texi
+make out=www out-www/contributor.pdf
+@end example
+
+If you are only working on a single document, test-building it in
+this way can give substantial time savings - recreating
+@file{contributor.pdf}, for example, takes a matter of seconds.
@node Saving time with CPU_COUNT
@unnumberedsubsubsec Saving time with @code{CPU_COUNT}
(define brackettips (get-group glyph-list "^brackettips\\."))
(define pedal (get-group glyph-list "^pedal\\."))
(define accordion (get-group glyph-list "^accordion\\."))
+ (define ties (get-group glyph-list "^ties\\."))
;; remove all remaining groups from the glyph-list
(for-each
arrowheads
brackettips
pedal
- accordion))
+ accordion
+ ties))
;;;;;;;;;
\version "2.14.0"
-\header{
+
+\header {
texidoc="
-Note head shapes may be set from several choices.
-The stem endings should be adjusted according to the note head.
+Note head shapes may be set from several choices.
+The stem endings should be adjusted according to the note head.
If you want different note head styles on one stem,
you must create a special context.
Harmonic notes have a different shape and different
-dimensions.
+dimensions.
"
}
\layout {
indent = 0.0
ragged-right = ##t
+
+ \context {
+ \Score
+ \remove "Bar_number_engraver"
+ }
}
pattern = <<
\new Voice {
- \override Stem #'direction = #UP
- e'4 e'2. e'1 e'\breve*1/2 e'\longa*1/4
+ \override Stem #'direction = #UP
+ e'4 e'2. e'1 e'\breve*1/2 e'\longa*1/4 \bar "||"
}
\new Voice {
- \override Stem #'direction = #DOWN
- a4 a2. a1 a\breve*1/2 a\longa*1/4
+ \override Stem #'direction = #DOWN
+ a4 a2. a1 a\breve*1/2 a\longa*1/4 \bar "||"
}
>>
s1*0^\markup { "slash" }
\pattern
}
-
-
-
\version "2.14.0"
-% yes, I know this is a mess. But I'm not going to fuss with
-% it one day before I leave. -gp
-
% this chart is used in the manual too.
\header {
- texidoc ="@cindex Percussion notes
+ texidoc ="@cindex Percussion notes
This chart shows all percussion and drum notes."
}
myBreak = { \bar " " \break }
\score {
- \new DrumStaff \with {
- \remove "Time_signature_engraver"
-} \context DrumVoice {
+ \new DrumStaff \with {
+ \remove "Time_signature_engraver"
+ } \context DrumVoice {
%% this stuff set up nice || bar lines to divide percussion notes
%% into related fields, but it should be placed in the actual
%% music, not as a separate voice. -gp
%{
-barlines = {
-\repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||"
-\repeat "unfold" 2 { s 1 \bar" " s 1 \bar" " s 1 \bar "||" }
-\repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||"
-\repeat "unfold" 7 {s 1 \bar" " } s 1 \bar "||"
-s 1 \bar" " s 1 \bar "||"
-\repeat "unfold" 2 { \repeat "unfold" 5 {s 1 \bar" " } s 1 \bar "||" }
-\repeat "unfold" 2 { s 1 \bar" " s 1 \bar "||" }
-\repeat "unfold" 2 {s 1 \bar" " } s 1 \bar "||"
-\repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||"
-s 1 \bar" " s 1 \bar "||"
-\repeat "unfold" 3 {s 1 \bar" " } s 1 \bar "||"
-\repeat "unfold" 2 {s 1 \bar" " } s 1 \bar "||"
-\repeat "unfold" 3 {\repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||" }
-}
+ barlines = {
+ \repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||"
+ \repeat "unfold" 2 { s 1 \bar" " s 1 \bar" " s 1 \bar "||" }
+ \repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||"
+ \repeat "unfold" 7 {s 1 \bar" " } s 1 \bar "||"
+ s 1 \bar" " s 1 \bar "||"
+ \repeat "unfold" 2 { \repeat "unfold" 5 {s 1 \bar" " } s 1 \bar "||" }
+ \repeat "unfold" 2 { s 1 \bar" " s 1 \bar "||" }
+ \repeat "unfold" 2 {s 1 \bar" " } s 1 \bar "||"
+ \repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||"
+ s 1 \bar" " s 1 \bar "||"
+ \repeat "unfold" 3 {s 1 \bar" " } s 1 \bar "||"
+ \repeat "unfold" 2 {s 1 \bar" " } s 1 \bar "||"
+ \repeat "unfold" 3 {\repeat "unfold" 4 {s 1 \bar" " } s 1 \bar "||" }
+ }
%}
-\drummode {
-\textLengthOn
-\cadenzaOn
-bda1 ^"acousticbassdrum: bda" bd ^"bassdrum: bd" sn ^"snare: sn" sne ^"electricsnare: sne" sna ^"acousticsnare: sna" \myBreak
-tomfl ^"lowfloortom: tomfl" tomfh ^"highfloortom: tomfh" toml ^"lowtom: toml" tomh ^"hightom: tomh"
-tomml ^"lowmidtom: tomml" tommh ^"himidtom: tommh" \myBreak
-hhc ^"closedhihat: hhc" hh ^"hihat: hh" hhp ^"pedalhihat: hhp" hho ^"openhihat: hho" hhho ^"halfopenhihat: hhho" \myBreak
-cymca ^"crashcymbala: cymca" cymc ^"crashcymbal: cymc" cymra ^"ridecymbala: cymra" cymr ^"ridecymbal: cymr" \myBreak cymch ^"chinesecymbal: cymch" cyms ^"splashcymbal: cyms"
-cymcb ^"crashcymbalb: cymcb" cymrb ^"ridecymbalb: cymrb"
-rb ^"ridebell: rb" cb ^"cowbell: cb" \myBreak
-bohm ^"mutehibongo: bohm" boh ^"hibongo: boh" boho ^"openhibongo: boho" bolm ^"mutelobongo: bolm" bol ^"lobongo: bol" bolo ^"openlobongo: bolo"\myBreak
-cghm ^"mutehiconga: cghm" cglm ^"muteloconga: cglm" cgho ^"openhiconga: cgho" cgh ^"hiconga: cgh" cglo ^"openloconga: cglo" cgl ^"loconga: cgl" \myBreak
-timh ^"hitimbale: timh" timl ^"lotimbale: timl"
-agh ^"hiagogo: agh" agl ^"loagogo: agl" \myBreak
-ssh ^"hisidestick: ssh" ss ^"sidestick: ss" ssl ^"losidestick: ssl" \myBreak
-guis ^"shortguiro: guis" guil ^"longguiro: guil" gui ^"guiro: gui" cab ^"cabasa: cab" mar ^"maracas: mar" \myBreak
-whs ^"shortwhistle: whs" whl ^"longwhistle: whl" \myBreak
-hc ^"handclap: hc" tamb ^"tambourine: tamb" vibs ^"vibraslap: vibs" tt ^"tamtam: tt" \myBreak
-cl ^"claves: cl" wbh ^"hiwoodblock: wbh" wbl ^"lowoodblock: wbl" \myBreak
-cuim ^"mutecuica: cuim" cuio ^"opencuica: cuio"
-trim ^"mutetriangle: trim" tri ^"triangle: tri" trio ^"opentriangle: trio" \myBreak
-ua ^"oneup: ua" ub ^"twoup: ub" uc ^"threeup: uc" ud ^"fourup: ud" ue ^"fiveup: ue" \myBreak
-da ^"onedown: da" db ^"twodown: db" dc ^"threedown: dc" dd ^"fourdown: dd" de ^"fivedown: de" \myBreak
-}
-}
+ \drummode {
+ \cadenzaOn
+
+ bda1^\markup { \center-align "acousticbassdrum: bda" }
+ bd _\markup { \center-align "bassdrum: bd" }
+ sn ^\markup { \center-align "snare: sn" }
+ sne _\markup { \center-align "electricsnare: sne" }
+ sna ^\markup { \center-align "acousticsnare: sna" } \myBreak
+
+ tomfl^\markup { \center-align "lowfloortom: tomfl" }
+ tomfh_\markup { \center-align "highfloortom: tomfh" }
+ toml ^\markup { \center-align "lowtom: toml" }
+ tomh _\markup { \center-align "hightom: tomh" }
+ tomml^\markup { \center-align "lowmidtom: tomml" }
+ tommh_\markup { \center-align "himidtom: tommh" } \myBreak
+
+ hhc ^\markup { \center-align "closedhihat: hhc" }
+ hh _\markup { \center-align "hihat: hh" }
+ hhp ^\markup { \center-align "pedalhihat: hhp" }
+ hho _\markup { \center-align "openhihat: hho" }
+ hhho^\markup { \center-align "halfopenhihat: hhho" } \myBreak
+
+ cymca^\markup { \center-align "crashcymbala: cymca" }
+ cymc _\markup { \center-align "crashcymbal: cymc" }
+ cymra^\markup { \center-align "ridecymbala: cymra" }
+ cymr _\markup { \center-align "ridecymbal: cymr" } \myBreak
+
+ cymch^\markup { \center-align "chinesecymbal: cymch" }
+ cyms _\markup { \center-align "splashcymbal: cyms" }
+ cymcb^\markup { \center-align "crashcymbalb: cymcb" }
+ cymrb_\markup { \center-align "ridecymbalb: cymrb" }
+ rb ^\markup { \center-align "ridebell: rb" }
+ cb _\markup { \center-align "cowbell: cb" } \myBreak
+
+ bohm^\markup { \center-align "mutehibongo: bohm" }
+ boh _\markup { \center-align "hibongo: boh" }
+ boho^\markup { \center-align "openhibongo: boho" }
+ bolm_\markup { \center-align "mutelobongo: bolm" }
+ bol ^\markup { \center-align "lobongo: bol" }
+ bolo_\markup { \center-align "openlobongo: bolo" } \myBreak
+
+ cghm^\markup { \center-align "mutehiconga: cghm" }
+ cglm_\markup { \center-align "muteloconga: cglm" }
+ cgho^\markup { \center-align "openhiconga: cgho" }
+ cgh _\markup { \center-align "hiconga: cgh" }
+ cglo^\markup { \center-align "openloconga: cglo" }
+ cgl _\markup { \center-align "loconga: cgl" } \myBreak
+
+ timh^\markup { \center-align "hitimbale: timh" }
+ timl_\markup { \center-align "lotimbale: timl" }
+ agh ^\markup { \center-align "hiagogo: agh" }
+ agl _\markup { \center-align "loagogo: agl" } \myBreak
+
+ ssh^\markup { \center-align "hisidestick: ssh" }
+ ss _\markup { \center-align "sidestick: ss" }
+ ssl^\markup { \center-align "losidestick: ssl" } \myBreak
+
+ guis^\markup { \center-align "shortguiro: guis" }
+ guil_\markup { \center-align "longguiro: guil" }
+ gui ^\markup { \center-align "guiro: gui" }
+ cab _\markup { \center-align "cabasa: cab" }
+ mar ^\markup { \center-align "maracas: mar" } \myBreak
+
+ whs^\markup { \center-align "shortwhistle: whs" }
+ whl_\markup { \center-align "longwhistle: whl" } \myBreak
+
+ hc ^\markup { \center-align "handclap: hc" }
+ tamb_\markup { \center-align "tambourine: tamb" }
+ vibs^\markup { \center-align "vibraslap: vibs" }
+ tt _\markup { \center-align "tamtam: tt" } \myBreak
+
+ cl ^\markup { \center-align "claves: cl" }
+ wbh_\markup { \center-align "hiwoodblock: wbh" }
+ wbl^\markup { \center-align "lowoodblock: wbl" } \myBreak
+
+ cuim^\markup { \center-align "mutecuica: cuim" }
+ cuio_\markup { \center-align "opencuica: cuio" }
+ trim^\markup { \center-align "mutetriangle: trim" }
+ tri _\markup { \center-align "triangle: tri" }
+ trio^\markup { \center-align "opentriangle: trio" } \myBreak
+
+ ua^\markup { \center-align "oneup: ua" }
+ ub_\markup { \center-align "twoup: ub" }
+ uc^\markup { \center-align "threeup: uc" }
+ ud_\markup { \center-align "fourup: ud" }
+ ue^\markup { \center-align "fiveup: ue" } \myBreak
+
+ da^\markup { \center-align "onedown: da" }
+ db_\markup { \center-align "twodown: db" }
+ dc^\markup { \center-align "threedown: dc" }
+ dd_\markup { \center-align "fourdown: dd" }
+ de^\markup { \center-align "fivedown: de" } \myBreak
+ }
+ }
+
\layout {
\context {
\Score
}
}
}
-
c d e f g a b c
}
-%% Optional helper for automatic updating by convert-ly. May be omitted.
+%% Optional helper for automatic updating by convert-ly.
+%% May be omitted.
\version "2.14.0"
ISOLANG = it
depth = ../..
-SUBDIRS = learning texidocs web usage
+SUBDIRS = learning texidocs web usage included
STEPMAKE_TEMPLATES = documentation
LOCALSTEPMAKE_TEMPLATES = lilypond ly doc-i18n-root
--- /dev/null
+depth = ../../..
+
+LOCALSTEPMAKE_TEMPLATES = ly
+
+include $(depth)/make/stepmake.make
--- /dev/null
+@c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*-
+@c This file is part of web/download.itexi and
+@c learning/tutorial.itely
+@ignore
+ Translation of GIT committish: 8f02aa6516b3cfe16b2c145142ea652cbc3b8970
+
+ When revising a translation, copy the HEAD committish of the
+ version that you are working on. For details, see the Contributors'
+ Guide, node Updating translation committishes..
+@end ignore
+
+@c This is about "compiling" a lilypond file
+@c (Learning 1 Tutorial), **not** compiling the
+@c source code.
+
+@macro lilypadOSX
+@warning{Queste istruzioni presumono che tu stia usando il programma
+LilyPond. Se stai usando uno dei programmi descritti in
+@rweb{Editing facilitato}, in caso di problemi consulta la documentazione
+di quei programmi.}
+
+
+@subsubheading Passo 1. Crea il tuo file @file{.ly}
+
+Clicca due volte su @command{LilyPond.app}, si aprirà un file di esempio.
+
+@sourceimage{Learning_Macos_welcome,,,}
+
+Dai menu in cima a sinistra dello schermo seleziona
+@w{@code{File > Save}}.
+
+@sourceimage{Learning_Macos_Save_menu,,,}
+
+Scegli un nome per il tuo file, ad esempio @file{test.ly}.
+
+@sourceimage{Learning_Macos_Save_file_with_name,,,}
+
+
+@subsubheading Passo 2. Compila (con LilyPad)
+
+Dagli stessi menu seleziona
+@w{@code{Compile > Typeset}}.
+
+@sourceimage{Learning_Macos_Typeset_menu,,,}
+
+Si aprirà una nuova finestra che mostra i messaggi di log della compilazione
+del file che hai appena salvato.
+
+@sourceimage{Learning_Macos_Compiling_log,,,}
+
+
+@subsubheading Passo 3. Visualizza l'output
+
+Quando la compilazione è finita, un file PDF con lo stesso nome del file
+originale viene creato e automaticamente aperto nel visualizzatore
+PDF predefinito, che lo mostrerà sullo schermo.
+
+@sourceimage{Learning_Macos_pdf_output,,,}
+
+
+@subsubheading Altri comandi
+
+Per creare nuovi file per LilyPond, comincia col selezionare
+@w{@code{File > New}}
+
+@sourceimage{Learning_Macos_New_menu,,,}
+
+oppure @w{@code{File > Open}} per aprire e modificare file esistenti che
+hai salvato precedentemente.
+
+@sourceimage{Learning_Macos_Open_menu,,,}
+
+Devi salvare qualsiasi nuova modifica fatta al file prima di cliccare
+@w{@code{Compile > Typeset}} e se il file PDF non compare controlla se
+ci sono degli errori nella finestra dei messaggi di log.
+
+Se non stai usando il visualizzatore d'anteprima PDF incluso nel sistema
+operativo del Mac e un file PDF generato da una compilazione precedente
+è aperto, qualsiasi compilazione successiva potrebbe non riuscire a
+generare un PDF aggiornato finché non chiudi l'originale.
+
+
+
+@end macro
+
+
+@macro lilypadWindows
+@warning{Queste istruzioni presumono che tu stia usando l'editor LilyPad
+incluso nel programma. Se stai usando uno dei programmi descritti in
+@rweb{Editing facilitato}, in caso di problemi nel compilare un file consulta
+la documentazione di quei programmi.}
+
+
+@subsubheading Passo 1. Crea il tuo file @file{.ly}
+
+Clicca due volte sull'icona di LilyPond sulla scrivania, si aprirà un file di esempio.
+
+@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+
+Dai menu che appaiono in cima al file di esempio seleziona
+@w{@code{File > Save as}}. Non usare @w{@code{File > Save}}
+per il file di esempio perché non funzionerà finché non gli darai
+un nome di file valido per LilyPond.
+
+@sourceimage{Learning_Win7_Save_Menu,,,}
+
+Scegli un nome per il tuo file, ad esempio @file{test.ly}.
+
+@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+
+
+@subsubheading Passo 2a. Compila (con drag-and-drop)
+
+A seconda di quel che preferisci, per compilare il file puoi:
+
+Trascinare e rilasciare (drag-and-drop) il file direttamente sull'icona di LilyPond.
+
+@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+
+Cliccare col tasto destro sul file e dal menu contestuale a comparsa scegliere
+@w{@code{Open with > LilyPond}}.
+
+@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+
+
+@subsubheading Passo 2b. Compilare (con doppio clic)
+
+O semplicemente clicca due volte su @file{test.ly}.
+
+
+@subsubheading Passo 3. Visualizza l'output
+
+Durante la compilazione del file @file{test.ly}, una finestra dei comandi
+si aprirà per breve tempo e poi si chiuderà. Nel corso di questo processo
+verranno creati tre ulteriori file.
+
+@sourceimage{Learning_Win7_All_Files_Created,,,}
+
+Il file PDF contiene il file @file{test.ly} compilato.
+
+@sourceimage{Learning_Win7_Pdf_Output,,,}
+
+
+@subsubheading Altri comandi
+
+Per creare un nuovo file, per prima cosa seleziona @w{@code{File > New}} se
+hai aperto un file creato in precedenza.
+
+@sourceimage{Learning_Win7_New_Menu,,,}
+
+@noindent
+oppure @w{@code{File > Open}} per aprire e modificare i file che hai
+salvato prima.
+
+@sourceimage{Learning_Win7_Open_Menu,,,}
+
+Devi salvare qualsiasi nuovo modifica prima di compilare. Se il file
+PDF non viene creato, controlla se ci sono degli errori nel file di log che
+sarà stato creato durante il tentativo di compilazione.
+
+@sourceimage{Learning_Win7_Log_File,,,}
+
+Questo file di log viene sovrascritto ogni volta che compili il file LilyPond.
+
+Il file PS viene usato da LilyPond per creare il file PDF e può essere
+ignorato. Anch'esso viene sovrascritto ogni volta che compili il file.
+
+Se visualizzi il file in un lettore PDF, devi chiudere il PDF se desideri
+fare una nuova compilazione, perché potrebbe non riuscire a creare il
+nuovo file PDF mentre è ancora aperto per la visualizzazione.
+
+
+@end macro
+
+
+@c not lilypad at all, but I ran out of names. :(
+@macro lilypadCommandLine
+@warning{Queste istruzioni presumono che tu abbia familiarità con i
+programmi a linea di comando. Se stai usando uno dei programmi descritti in
+@rweb{Editing facilitato}, in caso di problemi nel compilare un file consulta
+la documentazione di quei programmi.}
+
+
+@subsubheading Passo 1. Crea il tuo file @file{.ly}
+
+Crea un file di testo chiamato @file{test.ly} e scrivi:
+
+@c double \\ required because this is inside a macro!
+@example
+\\version "@w{@versionStable{}}"
+@{
+ c' e' g' e'
+@}
+@end example
+
+
+@subsubheading Passo 2. Compila (da linea di comando)
+
+Per elaborare @file{test.ly}, scrivi il seguente comando nel terminale:
+
+@example
+lilypond test.ly
+@end example
+
+@noindent
+Vedrai qualcosa di simile a questo:
+
+@example
+GNU LilyPond @w{@versionStable{}}
+Processing `test.ly'
+Parsing...
+Interpreting music...
+Preprocessing graphical objects...
+Solving 1 page-breaking chunks...[1: 1 pages]
+Drawing systems...
+Layout output to `test.ps'...
+Converting to `./test.pdf'...
+@end example
+
+@subsubheading Passo 3. Visualizza l'output
+
+Puoi visualizzare o stampare il file @file{test.pdf}.
+
+@end macro
+
+
--- /dev/null
+@c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*-
+@c This file is part of web/community.itexi and
+@c contributor/introduction.itely
+
+@ignore
+ Translation of GIT committish: 66e5185e494d29c40ec25d5f71326836204cd680
+
+ When revising a translation, copy the HEAD committish of the
+ version that you are working on. For details, see the Contributors'
+ Guide, node Updating translation committishes..
+@end ignore
+
+@macro helpusNeed
+@subheading Abbiamo bisogno di te!
+
+Il team di sviluppo di LilyPond è piuttosto piccolo; desideriamo davvero
+coinvolgere nuove persone. Prendi in considerazione l'idea di aiutare i
+tuoi compagni utenti di LilyPond diventando un collaboratore!
+
+Anche lavorare su piccoli compiti può avre un grande impatto: occuparsi di
+questi compiti permette agli sviluppatori esperti di lavorare sui compiti
+complessi, invece di impiegare il tempo in quelli semplici.
+
+@end macro
+
+
+@macro helpusTasks
+@subheading Compiti semplici
+
+Non è richiesto compilare o lavorare sul codice sorgente!
+
+@itemize
+@item
+Supporto nelle mailing list: rispondi alle domande degli utenti.
+
+@item
+Segnalazione bug: aiuta gli utenti a creare una @rweb{Segnalazione bug}
+corretta e/o entra nel Bug Squad per l'organizzazione dei @rcontribnamed{Issues, Problemi}.
+
+@item
+Documentazione: puoi proporre piccole modifiche seguendo le linee
+guida per i @rcontribnamed{Documentation suggestions,Consigli per la documentazione}.
+
+@item
+LilyPond Snippet Repository (LSR): crea e correggi i frammenti di codice
+seguendo le linee guida in
+@rcontribnamed{Adding and editing snippets, Aggiungere e modificare i frammenti di codice}.
+
+@item
+Discussioni, revisioni e prove: gli sviluppatori chiedono spesso
+delle opinioni sulla documentazione, possibili cambiamenti di sintassi
+e il test di nuove funzionalità. Contribuisci a queste discussioni!
+
+@end itemize
+
+@subheading Compiti avanzati
+
+Questi compiti di solito richiedono il codice sorgente e la capacità di
+compilare LilyPond.
+
+@warning{Consigliamo ai collaboratori che usano Windows o MacOS X di
+@strong{non} cercare di configurare il proprio ambiente di sviluppo;
+si consiglia invece di usare Lilydev come spiegato in @rcontribnamed{Quick start,Avvio rapido}.}
+
+Anche i collaboratori che usano Linux o FreeBSD possono usare Lilydev, ma se
+preferiscono il proprio ambiente di sviluppo, devono leggere
+@rcontribnamed{Working with source code,Lavorare col codice sorgente} e
+@rcontribnamed{Compiling,Compilare}.
+
+@itemize
+@item
+Documentazione: per ampie modifiche si veda
+@rcontribnamed{Documentation work,Lavorare sulla documentazione}.
+
+@item
+Sito web: il sito web viene creato dai sorgenti della
+documentazione. Si vedano le informazioni relative alla documentazione e anche
+@rcontribnamed{Website work,Lavorare sul sito web}.
+
+@item
+Traduzioni: si veda @rcontribnamed{Translating the documentation,Tradurre la documentazione}
+e @rcontribnamed{Translating the website,Tradurre il sito web}.
+
+@item
+Correzioni di bug o nuove funzionalità: il miglior modo per iniziare è unirsi
+ai Frogs e leggere @rcontribnamed{Programming work,Lavori di programmazione}.
+
+@end itemize
+
+@end macro
+
+
+@macro helpusProjects
+@subheading Progetti
+
+@subsubheading Frogs
+
+Sito web e mailing list:
+
+@example
+@uref{http://frogs.lilynet.net}
+@end example
+
+I Frogs sono comuni utenti LilyPond che hanno scelto di impegnarsi
+nello sviluppo del loro software preferito. Correggere i bug,
+implementare nuove funzionalità, documentare il codice sorgente: c'è
+molto da fare. Ma soprattutto si tratta di un'occasione per tutti
+per acquisire maggiori conoscenze su LilyPond, il Software Libero e
+la programmazione... e per divertirsi. Se uno di questi punti
+ti incuriosisce, allora il monito è: @emph{Join the Frogs!}
+
+
+
+@subsubheading Grand LilyPond Input Syntax Standardization
+
+Sito web:
+@rcontrib{Grand LilyPond Input Syntax Standardization (GLISS)}.
+
+GLISS renderà stabile la sintassi di input (esclusi i tweak) per il futuro
+LilyPond 3.0. Dopo l'aggiornamento alla versione 3.0, la sintassi di input per
+la musica senza tweak rimarrà stabile nell'immediato futuro.
+
+Ci sarà un ampio periodo di discussione per determinare la specifica finale
+per l'input.
+
+@warning{GLISS inizierà poco dopo il rilascio della versione 2.16.}
+
+@subsubheading Grand Organizing Project
+
+Sito web: @rcontrib{Grand Organization Project (GOP)}.
+
+GOP sarà la nostra grande iniziativa di reclutamento di nuovi collaboratori. Abbiamo
+un disperato bisogno di distribuire tra più persone i compiti di sviluppo (inclusi
+i @qq{compiti semplici} che non richiedono di dover programmare o avere a che
+fare col codice sorgente!). Abbiamo anche bisogno di documentare la conoscenza
+degli attuali sviluppatori in modo che non vada persa.
+
+Diversamente dalla maggior parte dei @qq{Grand Projects}, GOP non aggiungerà
+nuove funzionalità né riprogetterà completamente le cose. Il suo scopo è darci
+delle fondamenta più stabili in modo da poter andare avanti con compiti più
+grandi in futuro.
+
+@end macro
+
+
@appendixsubsec Solo note
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec Note e testo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec Note e accordi
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec Note, testo e accordi.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec Solo pianoforte
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec Pianoforte e melodia con testo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec Pianoforte con testo al centro
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec Pianoforte con dinamiche al centro
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec Quartetto d'archi
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec Parti di un quartetto d'archi
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec Partitura vocale SATB
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec Partitura vocale SATB e automatica riduzione per pianoforte
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec SATB con contesti allineati
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec SATB su quattro righi
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{satb-choir-template---four-staves.ly}
@appendixsubsec Strofa sola e ritornello a due parti
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@appendixsubsec Inni
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{hymn-template.ly}
@appendixsubsec Salmi
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{anglican-psalm-template.ly}
@translationof Orchestral templates
@appendixsubsec Orchestra, coro e pianoforte
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Transcrizione di musica mensurale
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Trascrizione di musica Gregoriana
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@appendixsubsec Combo jazz
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@end html
@end ifhtml
-@emph{Last updated Wed Jul 13 10:59:12 UTC 2011
+@emph{Last updated Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 Notazione comunemente utilizzata
@*
-4184
+4187
@tab Federico Bruni
@tab Luca Rossetto Casel
@tab
@item
1 Eseguire @command{lilypond}
@*
-3622
+3681
@tab Federico Bruni
@tab Luca Rossetto Casel
@tab
@item
3 Eseguire @command{lilypond-book}
@*
-3952
+3978
@tab Federico Bruni
@tab Luca Rossetto Casel
@tab
@item
4 Programmi esterni
@*
-2170
+2180
@tab Federico Bruni
@tab Luca Rossetto Casel
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">yes</span>
+<span style="background-color: #25fe1f">partially</span>
@end html
@end ifhtml
@ifnothtml
-yes
+partially
@end ifnothtml
@tab pre-GDP
@item
@item
Manuali
@*
-1203
+1214
@tab Federico Bruni
@tab Luca Rossetto Casel
@tab
@item
Comunità
@*
-1755
+1888
@tab Federico Bruni
@tab Luca Rossetto Casel
@tab
@ifhtml
@html
-<span style="background-color: #25fe1f">partially</span>
+<span style="background-color: #4efe25">partially</span>
@end html
@end ifhtml
@ifnothtml
con l'opzione @option{--header=@/texidoc@var{LANG}} verrà incluso
@file{foo.texidoc@var{LANG}} invece di @file{foo.texidoc}.
-@item lilyquote
-(Solo per l'output Texinfo.) Questa opzione è simile alla citazione, ma solo
-il frammento musicale (e l'opzionale blocco di testo sottinteso dall'opzione
-@code{verbatim}) vengono inseriti in un blocco di citazione. Questa opzione è
-utile se si vuole citare (@code{quote}) il frammento musicale ma non il
-blocco della documentazione @code{texidoc}.
-
@item doctitle
(Solo per l'output Texinfo.) Questa opzione funziona in modo simile
all'opzione @code{texidoc}: se @command{lilypond} viene lanciato con
\input texinfo @c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: 4d852ef65fc654e4ed02413926fc0cb78a1da1be
+ Translation of GIT committish: 18e1018ce7446f2cb86990c31f112f6cf05ca371
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@include macros.itexi
@include weblinks.itexi
-@afourpaper
@c don't remove this comment.
@ignore
@macro docLinkSplit{name,base,webLink}
@ifclear web_version
- @uref{../\base\/index.html, \name\ (split HTML)}
+ @uref{../\base\/index.html, \name\ (HTML multipagina)}
@end ifclear
@ifset web_version
\webLink\
@macro docLinkBig{name,base,webLink}
@ifclear web_version
- @uref{../\base\-big-page.html, \name\ (big HTML)}
+ @uref{../\base\-big-page.html, \name\ (HTML pagina unica)}
@end ifclear
@ifset web_version
\webLink\
@item @docLinkSplit{\name\,\base\,\split\} @minus{}
il manuale è diviso in tante pagine HTML.
- @*@ @ @emph{(small download for each page)}
+ @*@ @ @emph{(piccolo download per ogni pagina)}
@item @docLinkBig{\name\,\base\,\big\} @minus{}
leggi questo manuale in un'unica grande pagina HTML.
- @*@ @ @emph{(large single download, \bigsize\)}
+ @*@ @ @emph{(un solo grande download, \bigsize\)}
@item @docLinkPdf{\name\,\base\,\pdf\} @minus{}
scarica come file PDF.
- @*@ @ @emph{(large single download, \pdfsize\)}
+ @*@ @ @emph{(un solo grande download, \pdfsize\)}
@end itemize
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: ee3a89f9f7289bcd90c5f27fd8f86400159088b2
+ Translation of GIT committish: 402e3b1ac8d0c65b63a992dfd1247ed058e69ff8
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@divClass{column-center-top}
@subheading Cosa sono gli @qq{Esempi minimi}?
-Un esempio minimo è un esempio dal quale niente può essere tolto.
+Un esempio minimo è un esempio dal quale @strong{niente} può essere tolto.
@divEnd
@divClass{column-left-bottom}
possono comprenderlo e aiutarti.
@item
-Un esempio semplice dimostra che hai tentato di risolvere il problema
+Un esempio minimo dimostra che hai tentato di risolvere il problema
da solo. Quando le persone inviano grandi porzioni di input, sembra
che non si preoccupino che noi li possiamo aiutare o no.
@item
-Creare un esempio minimo ti spinge a capire cosa sta
+Creare un esempio minimo ti aiuta a capire cosa sta
succedendo. Molte segnalazioni di un falso problema possono essere
evitate se si prova a creare un esempio minimo; se non riesci a ricreare
un @qq{bug} in un esempio minimo, allora probabilmente il problema è
@divClass{column-right-bottom}
-@subheading Come li creo?
+@subheading Come crearli?
@divClass{keep-bullets}
@itemize
@item
-Includi il numero di versione nel comando \version.
+Includi il numero di versione nel comando @code{\version}.
@item
Crea un esempio piccolo! Gli esempi che riguardano la spaziatura o la
formattazione di pagina potrebbero richiedere molte battute, ma la maggior
-parte dei problemi può essere ricreata in una singola
-battuta.
+parte dei problemi può essere ricreata in meno di una sola battuta.
@item
Durante la preparazione di un esempio, cerca di commentare @w{(@code{%}
allora elimina il materiale commentato!
@item
-Evita di usare note, tonalità, o segni di tempo complicati a meno che
+Evita di usare note, tonalità o segni di tempo complicati a meno che
il malfunzionamento non riguardi proprio il comportamento di questi elementi.
@item
Non usare i comandi @code{\override} o @code{\set} a meno che il malfunzionamento
non riguardi questi comandi in particolare.
+@item
+Eventualmente, allega un'immagine che mostri il risultato grafico desiderato.
+
@end itemize
@divEnd
@divEnd
+@divClass{column-center-bottom}
+@subheading Quanto piccoli devono essere?
+
+Il codice seguente è un esempio minimo?
+
+@example
+\version "2.14.1"
+\include "english.ly"
+
+\score @{
+ \new Staff @{
+ \key d \major
+ \numericTimeSignature
+ \time 2/4
+ <cs' d'' b''>16 <cs' d'' b''>8.
+ %% Here: the tie on the D's looks funny
+ %% Too tall? Left-hand endpoint is not aligned with the B tie?
+ ~
+ <cs' d'' b''>8 [ <b d'' a''> ]
+ @}
+@}
+@end example
+
+Non è così grande, ma un vero esempio minimo è il seguente:
+
+@example
+\version "2.14.1"
+@{
+ % middle tie looks funny here:
+ <c' d'' b''>8. ~ <c' d'' b''>8
+@}
+@end example
+
+Sono pochi gli esempi minimi che superano 10 righe di codice -
+spesso 4 righe sono sufficienti per spiegare il problema!
+@divEnd
@node Segnalazione bug
Ecco un esempio di una valida segnalazione bug:
@example
-%% il comando di ottavazione
-%% non modifica l'output!
-
-\version "2.10.0"
-\paper@{ ragged-right=##t @}
-\relative c''' @{
- c1
- #(set-octavation 1)
- c1
+% Le alterazioni dovrebbero comparire solo nella
+% prima nota di una legatura di valore, ma questa
+% versione mostra il bemolle accanto a entrambe le note.
+\version "2.10.1"
+
+\relative c'' @{
+ bes1 ~
+ bes1
@}
@end example
@end itemize
@divEnd
+@divEnd
+
+@divClass{column-center-bottom}
+@subheading Passo 4: Attendi una risposta
Una volta che il bug è stato inviato alla lista, la nostra Squadra Bug esaminerà
la segnalazione. Una risposta può richiedere fino a 24 ore, perché abbiamo
avere un account google.
@divEnd
+@divClass{column-center-bottom}
+@subheading Aiuto facoltativo: mostra il comportamento desiderato
+
+Dopo che il problema è stato aggiunto al tracker, può essere molto
+utile poter vedere l'output desiderato. Aggiungi pure del codice di
+input e/o delle immagini (se possibile, create con altri strumenti) che
+mostrino come dovrebbe apparire secondo te!
+
+@divEnd
+
+
@node Aiutaci
@unnumberedsec Aiutaci
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: ee3a89f9f7289bcd90c5f27fd8f86400159088b2
+ Translation of GIT committish: 12503a0c383617cd11fa0bba2836af6c0518ecf7
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@subsubheading Disinstallazione
-Digita in un terminale:
+Digita nel terminale:
@example
uninstall-lilypond
@end example
+@subsubheading Aiuto
+
+Digita nel terminale:
+
+@example
+sh lilypond-@versionStable{}-OS-TYPE.sh --help
+@end example
+
@divEnd
@item
@sourceimage{logo-fedora,,,}
@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447,
-Fedora: LilyPond 2.12.3}
+Fedora: LilyPond 2.14.1}
@item
@sourceimage{logo-ubuntu,,,}
@uref{http://packages.ubuntu.com/search?keywords=lilypond,
-Ubuntu: LilyPond 2.12.2}
+Ubuntu: LilyPond 2.12.3}
@item
@sourceimage{logo-slackware,,,}
@uref{http://www.johannes-schoepfer.de/lilypond/,
-Slackware: LilyPond 2.12.3}
+Slackware: LilyPond 2.14.1}
@item
@sourceimage{logo-debian,,,}
@uref{http://packages.debian.org/search?keywords=lilypond,
-Debian: LilyPond 2.12.2}
+Debian: LilyPond 2.12.3}
@item
@sourceimage{logo-suse,,,}
[@var{pre-set paths}];@var{DIR}\LilyPond\usr\bin
@end example
-@warning{@var{DIR} generalmente è @code{C:\Program Files}.}
+@warning{@var{DIR} generalmente è @code{C:@bs{}Program Files}.}
@noindent
e clicca il bottone @qq{OK} per chiudere la finestra.
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: cd0fa693cd2297298aabfdc2d2d9d8b0d7746a5c
+ Translation of GIT committish: d282588015bad1ed86833848a5bcbdc43cfdc9e5
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@itemize
@item
-May 2010
+Aprile 2011
+
+@uref{http://www.linux-magazine.com,Linux Magazine} pubblica un
+articolo intitolato
+@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf,
+Projects on the Move}. È un articolo introduttivo a MuseScore,
+LilyPond e Chordii. L'autrice Carla Schroder afferma @qq{LilyPond è un
+programma a linea di comando, ma non lasciatevi spaventare dalla mancanza
+dell'interfaccia grafica; LilyPond è facile da usare e da imparare}, e fornisce
+anche un esempio pratico.
+
+@item
+Maggio 2010
Peter Kirn, sul sito Create Digital Music, pubblica una
@uref{http://createdigitalmusic.com/2010/05/14/lilypond-free-beautiful-music-notation-engraving-for-anyone/,recensione
articolo su LilyPond}.
@item
-August 2009
+Agosto 2009
Ann Drinan, sul sito
@uref{http://www.polyphonic.org/article.php?id=188, Polyphonic.org}, presenta
software per gestire le loro biblioteche.
@item
-June 2009
+Giugno 2009
In un @uref{http://news.lilynet.net/Free-Music-Now, articolo}
pubblicato nella rivista annuale francese @emph{National Conservatory Parent
che fa sembrare le alternative commerciali di second'ordine.}
@item
-August 20, 2005
+20 Agosto 2005
La rivista belga De Standaard fa un'indagine sulle motivazioni degli
autori di Software Libero in un articolo intitolato
@uref{http://denemo.org}
-Denemo è un editor grafico che genera codice sorgente LilyPond,
-nella versione 2.8.7, e permette anche la riproduzione audio. Consente
-agli utenti di vedere il codice sorgente LilyPond in parallelo alla
-visualizzazione grafica. Modifiche manuali del codice possono essere attaccate a note,
-accordi etc. e vengono salvate nel file di Denemo, così che gli utenti possano
-continuare a modificare il documento tramite l'interfaccia grafica.
+Denemo è un editor grafico che genera codice sorgente LilyPond
+e permette anche la riproduzione audio. Consente agli utenti di vedere
+il codice sorgente LilyPond in parallelo alla visualizzazione grafica. Modifiche
+manuali del codice possono essere attaccate a note, accordi etc. e vengono
+salvate nel file di Denemo, così che gli utenti possano continuare a
+modificare il documento tramite l'interfaccia grafica.
Se si muove il cursore nel codice LilyPond si muove anche il cursore
nella visualizzazione grafica, e qualsiasi errore di sintassi nelle tue modifiche
manuali al codice LilyPond viene evidenziato nella visualizzazione testuale
-quando stampi da lì.
+quando elaborato da lì.
@divEnd
i file di input di LilyPond.
Puoi trovare maggiori informazioni sulla configurazione di Emacs e Vim in
-@rprogram{Text editor support}.
+@rprogram{LilyPond e gli editor di testo}.
@sourceimage{logo-macosx,,,}
@itemize
@item
-@uref{http://lilykde.googlecode.com/,LilyKDE} è stato sosituito da
-@uref{http://www.frescobaldi.org/,Frescobaldi}, e esiste soltanto come
+@uref{http://lilykde.googlecode.com/,LilyKDE} è stato sostituito da
+@uref{http://www.frescobaldi.org/,Frescobaldi}; esiste soltanto come
LilyKDE3 per KDE 3.5 e lilypond-KDE4 per KDE 4.1.
@item
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: ee3a89f9f7289bcd90c5f27fd8f86400159088b2
+ Translation of GIT committish: c7175b7e8387655964d9c9a975e9789fe581043c
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
prima questo!
@item
-@ifWebLinks{@manualStableLearningSplitNoName,@rlearningnamed{Top,Learning}}
+@ifWebLinks{@manualStableLearningSplitNoName-it,@rlearningnamed{Top,Apprendimento}}
un'introduzione a LilyPond leggera e @qq{imprescindibile}.
-@details{Learning}
+@details{Apprendimento}
@item
-@ifWebLinks{@manualStableGlossarySplitNoName,@rglosnamed{Top,Glossary}}
+@ifWebLinks{@manualStableGlossarySplitNoName,@rglosnamed{Top,Glossario}}
@emph{(lettura opzionale)}
termini musicali e traduzioni.
-@details{Glossary}
+@details{Glossario}
@item
-@ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Essay}}
+@ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Saggio}}
@emph{(lettura opzionale)}
informazioni sull'incisione realizzata dal computer.
-@details{Essay}
+@details{Saggio}
@end itemize
@itemize
-@item @ifWebLinks{@manualStableNotationSplitNoName,@rusernamed{Top,Notation}}
+@item @ifWebLinks{@manualStableNotationSplitNoName,@rusernamed{Top,Notazione}}
guida alla sintassi.
-@details{Notation}
+@details{Notazione}
-@item @ifWebLinks{@manualStableUsageSplitNoName,@rprogramnamed{Top,Usage}}
+@item @ifWebLinks{@manualStableUsageSplitNoName-it,@rprogramnamed{Top,Uso}}
eseguire i programmi.
-@details{Usage}
+@details{Uso}
-@item @ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Snippets}}
+@item @ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Frammenti}}
brevi trucchi e consigli.
-@details{Snippets}
+@details{Frammenti}
@end itemize
questo documento.
@details{Web}
-@item @ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Changes}}
+@item @ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Cambiamenti}}
cosa c'è di nuovo?
-@details{Changes}
+@details{Cambiamenti}
-@item @ifWebLinks{@manualStableExtendingSplitNoName,@rextendnamed{Top,Extending}}
+@item @ifWebLinks{@manualStableExtendingSplitNoName,@rextendnamed{Top,Estendere}}
tweak interessanti.
-@details{Extending}
+@details{Estendere}
-@item @ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Internals}}
+@item @ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Funzionamento interno}}
guida ai tweak.
-@details{Internals}
+@details{Funzionamento interno}
@end itemize
@itemize
+@item
+@ref{Tutti}:
+versioni stabili precedenti e quella attuale in un archivio compresso.
+
@item @ref{Tradotti}:
stato delle traduzioni per i lettori di lingua non inglese.
-@item @ref{Tutti}:
-manuali vecchi e scaricabili.
+@item
+@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}:
+esempi, consigli e trucchi creati dagli utenti.
@item @ref{Sviluppo}:
manuali per la versione non stabile.
* Saggio:: Saggio.
* Notazione:: Riferimento.
* Uso:: Utilizzo.
-* Frammenti di codice:: Frammenti di codice.
+* Frammenti:: Frammenti di codice.
* FAQ:: FAQ.
* Web:: Web.
* Cambiamenti:: Novità.
-* Estensioni:: Programmazione.
+* Estendere:: Programmazione.
* Funzionamento interno:: Funzionamento interno.
* Tradotti:: Traduzione.
* Tutti:: Tutti i manuali.
@divClass{column-right-bottom}
-@docLinks{Learning, learning,
- @rlearningnamed{Top,Learning},
+@docLinks{Apprendimento, learning,
+ @rlearningnamed{Top,Apprendimento},
@manualStableLearningSplit,
@manualStableLearningBig, 1.5 MB,
@manualStableLearningPdf, 3 MB}
@divClass{column-right-bottom}
-@docLinks{Music glossary, music-glossary,
- @rglosnamed{Top,Music glossary},
+@docLinks{Glossario musicale, music-glossary,
+ @rglosnamed{Top,Glossario musicale},
@manualStableGlossarySplit,
@manualStableGlossaryBig, 1 MB,
@manualStableGlossaryPdf, 1.5 MB}
@divClass{column-right-bottom}
-@docLinks{Essay, essay,
- @ressaynamed{Top,Essay},
+@docLinks{Saggio, essay,
+ @ressaynamed{Top,Saggio},
@manualStableEssaySplit,
@manualStableEssayBig, 2 MB,
@manualStableEssayPdf, 2.5 MB}
@divClass{column-right-bottom}
-@docLinks{Notation, notation,
- @rusernamed{Top,Notation},
+@docLinks{Notazione, notation,
+ @rusernamed{Top,Notazione},
@manualStableNotationSplit,
@manualStableNotationBig, 7 MB,
@manualStableNotationPdf, 18 MB}
@translationof Usage
@divClass{column-left-top}
-@subheading Usage manual
+@subheading Manuale d'uso
Questo libro spiega come eseguire i programmi, come integrare la
notazione di LilyPond in altri programmi, e suggerisce le @qq{migliori
@divClass{column-right-bottom}
-@docLinks{Usage, usage,
- @rprogramnamed{Top,Usage},
+@docLinks{Uso, usage,
+ @rprogramnamed{Top,Uso},
@manualStableUsageSplit,
- @manualStableUsageBig, 300 KB,
- @manualStableUsagePdf, 400 KB}
+ @manualStableUsageBig, 400 KB,
+ @manualStableUsagePdf, 600 KB}
@divEnd
-@node Frammenti di codice
-@unnumberedsec Frammenti di codice
+@node Frammenti
+@unnumberedsec Frammenti
@translationof Snippets
@divClass{column-left-top}
-@subheading Frammenti di codice
+@subheading Frammenti
Questo manuale presenta una selezione di frammenti di codice LilyPond tratti dal
@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}
@divClass{column-right-bottom}
-@docLinks{Snippets, snippets,
- @rlsrnamed{Top,Snippets},
+@docLinks{Frammenti, snippets,
+ @rlsrnamed{Top,Frammenti},
@manualStableSnippetsSplit,
@manualStableSnippetsBig, 2.5 MB,
@manualStableSnippetsPdf, 8 MB}
@subsubheading C'è un sacco di documentazione! Devo leggerla?
-Devi leggere @ref{Learning, il Manuale di Apprendimento}. Per quanto
+Devi leggere il @ref{Learning, Manuale di Apprendimento}. Per quanto
riguarda il resto della documentazione, puoi leggere solo le sezioni
sul tipo di notazione che vuoi creare.
@subsubheading C'è ancora molto da leggere! Ne vale la pena?
Tocca a te decidere; le ragioni per cui potresti voler usare
-LilyPond sono esposte nell' @ref{Introduzione}.
+LilyPond sono esposte nell'@ref{Introduzione}.
@divEnd
@subsubheading Qualcosa non funziona! Come posso risolvere?
-Questo viene spiegato in @rprogram{Troubleshooting}.
+Questo viene spiegato in @rprogram{Risoluzione dei problemi}.
@subsubheading Perché cambiate la sintassi?
-Questo viene spiegato in @rprogram{Why does the syntax change?}.
+Questo viene spiegato in @rprogram{Perché la sintassi cambia?}.
@divEnd
@divClass{column-right-bottom}
-@docLinks{Changes, changes,
- @rchangesnamed{Top,Changes},
+@docLinks{Cambiamenti, changes,
+ @rchangesnamed{Top,Cambiamenti},
@manualStableChangesSplit,
@manualStableChangesBig, 6 KB,
@manualStableChangesPdf, 200 KB}
@divEnd
-@node Estensioni
-@unnumberedsec Estensioni
+@node Estendere
+@unnumberedsec Estendere
@translationof Extending
@divClass{column-left-top}
@divClass{column-right-bottom}
-@docLinks{Extending, extending,
- @rextendnamed{Top,Extending},
+@docLinks{Estendere, extending,
+ @rextendnamed{Top,Estendere},
@manualStableExtendingSplit,
@manualStableExtendingBig, 200 KB,
@manualStableExtendingPdf, 400 KB}
@divClass{column-right-bottom}
-@docLinks{Internals, internals,
- @rinternalsnamed{Top,Internals},
+@docLinks{Funzionamento interno, internals,
+ @rinternalsnamed{Top,Funzionamento interno},
@manualStableInternalsSplit,
@manualStableInternalsBig, 2.5 MB,
@manualStableInternalsPdf, 2.8 MB}
+++ /dev/null
-@c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*-
-@ignore
- Translation of GIT committish: 61fed596442d47e96c10ac3c9c0c696e5dfd22cf
-
- When revising a translation, copy the HEAD committish of the
- version that you are working on. For details, see the Contributors'
- Guide, node Updating translation committishes..
-@end ignore
-
-@c This file is part of lilypond-web.texi and community.itexi
-
-@c when you add a new item, consider moving the lowest item(s)
-@c into news-old.itexi.
-
-@c keep two blank lines between news entries
-
-@c used for news about the upcoming release; see CG 10.2
-
-
-@newsItem
-@subsubheading Rilasciato LilyPond 2.13.40! @emph{21 Novembre 2010}
-
-Siamo felici di annunciare il rilascio di LilyPond 2.13.40. Questo
-rilascio contiene come sempre un certo numero di correzioni. Tuttavia rimangono
-ancora alcuni problemi critici: questo rilascio è dunque destinato solo
-agli sviluppatori.
-
-Si noti che questa @strong{non} è la seconda versione beta test. A causa di
-varie modifiche non verificate al processo di compilazione, non possiamo essere
-del tutto sicuri della qualità di questo rilascio.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading Prima versione beta test della 2.14 -- Rilasciato LilyPond 2.13.39! @emph{15 Novembre 2010}
-
-LilyPond 2.13.39 è disponibile; questa è la prima beta test della prossima
-versione stabile, la 2.14. Si invitano gli utenti a provare questa
-versione. Le nuove funzionalità introdotte rispetto alla versione 2.12.3 sono
-elencate nel manuale @qq{Changes} della sezione del sito sullo
-@ref{Sviluppo}.
-
-Ci sono ancora alcuni problemi critici in questo rilascio: la
-spaziatura verticale è sospetta in due casi, e lilypond può
-bloccarsi se l'input è strano. Se decidi di provare la 2.13.39, non
-stupirti se incontrerai dei problemi, ma inviaci una cortese
-@ref{Segnalazione bug}.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond Report #22. @emph{3 Novembre 2010}
-
-Il @emph{LilyPond Report} è tornato, con alcune sorprese ed esaltanti
-notizie per tutta la comunità di LilyPond! In questo numero troverete
-una lista completa e aggiornata di tutte le mailing list e i forum su
-LilyPond in tutto il mondo. Inoltre, per la prima volta il nostro ospite
-speciale è il co-fondatore e sviluppatore principale di LilyPond,
-@strong{Jan Nieuwenhuizen}, che è stato impegnato negli ultimi tre mesi --
-continua a leggere per scoprire in cosa!
-
-@uref{http://news.lilynet.net/The-LilyPond-Report-22, Leggi il
-LilyPond Report 22} ora; commenti e contributi sono ben accetti!
-
-@newsEnd
-
-
-
@appendixsubsec 音符のみ
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec 音符と歌詞
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec 音符とコード
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec 音符、歌詞それにコード
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec ソロ ピアノ
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec ピアノと歌詞を持つ旋律
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec 歌詞が中央に配置されたピアノ譜
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec 強弱記号が中央に配置されたピアノ譜
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec 弦楽四重奏
@translationof String quartet
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec 弦楽四重奏パート
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec SATB ボーカル譜
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec SATB ボーカル譜と自動ピアノ譜
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec 整列されたコンテキストを持つ SATB
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec 4 つの譜に配置された SATB
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{satb-choir-template---four-staves.ly}
@appendixsubsec ソロと 2 パートのリフレイン
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@appendixsubsec Hymn tunes
@c Hymn tunes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{hymn-template.ly}
@appendixsubsec 賛美歌
@c Psalms
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{anglican-psalm-template.ly}
@translationof Orchestral templates
@appendixsubsec オーケストラ、合唱それにピアノ
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Transcription of mensural music
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Gregorian transcription template
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@appendixsubsec Jazz コンボ
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*-
@ignore
- Translation of GIT committish: 2c3bd5e85d39155e3e6804f9818722bef483056d
+ Translation of GIT committish: 10fbcf1752dc0bec6ad1101c6948a94529128586
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
* Specialist notation:: 特別な目的でのみ使用される記譜法
* 入出力全般:: LilyPond 入力についての一般的な情報
* スペースの問題:: 出力の表示
-* Changing defaults:: 出力の調整
+* デフォルトを変更する:: 出力の調整
付録
* Notation manual tables:: 表と図
-* Cheat sheet:: LilyPond 構文についての要約
+* カンニング ペーパー:: LilyPond 構文についての要約
* LilyPond 文法:: LilyPond 構文解析プログラムのための構文ダイアグラム
* GNU Free Documentation License:: このドキュメントの使用許諾書
* LilyPond コマンド インデックス::
@ignore
@menu
* 専門的な記譜法:: 特別な目的でのみ使用される記譜法
-* デフォルトを変更する:: 出力の調整
付録
--- /dev/null
+@c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*-
+
+@ignore
+ Translation of GIT committish: 10fbcf1752dc0bec6ad1101c6948a94529128586
+
+ When revising a translation, copy the HEAD committish of the
+ version that you are working on. For details, see the Contributors'
+ Guide, node Updating translation committishes..
+@end ignore
+
+@c \version "2.14.0"
+
+@c Translators: Yoshiki Sawada
+@c Translation status: post-GDP
+
+@node デフォルトを変更する
+@chapter デフォルトを変更する
+@translationof Changing defaults
+
+LilyPond はデフォルトで最高品質の出力を提供できるよう設計されています。@c
+それにもかかわらず、@c
+デフォルトのレイアウトを変更する必要が発生する場合もあります。@c
+レイアウトは、@q{プロパティ} と呼ばれる多数の @q{つまみとスイッチ} によって@c
+制御されています。@c
+これらのプロパティにアクセスし、変更するための手引は学習マニュアルの中にあります
+-- @rlearning{出力を調整する} を参照してください。@c
+まずはこれを読むべきです。@c
+本章は同様の内容をカバーしていますが、@c
+よりリファレンス マニュアルに適したスタイルで提供します。
+
+@cindex Internals Reference (内部リファレンス)
+
+調整のために利用できる制御の定義についての説明は、@c
+別のドキュメントの中にあります: @rinternalsnamed{Top,内部リファレンス} です。@c
+このマニュアルは利用可能なすべての変数、関数、それにオプションを@c
+リストアップしています。@c
+これは HTML ドキュメントとして記述されていて、@c
+@uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/user/@/lilypond@/-internals/,オンライン}
+で入手可能であり、@c
+LilyPond ドキュメント パッケージにも含まれています。
+
+内部的には、LilyPond は Scheme (LISP 派生語) を用いて機能を提供しています。@c
+レイアウトについての決定をオーバライドすることは、@c
+プログラムの内部にアクセスすることであり、@c
+Scheme 入力が必要になります。@c
+Scheme の要素は、@code{.ly} の中で、@c
+ハッシュ記号 @code{#} を付けて記述します。@footnote{@rextend{Scheme tutorial}
+の中に、Scheme 形式で数、リスト、文字列、それに記号を入力するための@c
+簡単な手引きがあります。}
+
+
+@menu
+* コンテキストを理解する::
+* 内部リファレンスの説明::
+* プロパティを変更する::
+* 役に立つコンセプトとプロパティ::
+* 高度な調整::
+* 音楽関数を使用する::
+@end menu
+
+
+@node コンテキストを理解する
+@section コンテキストを理解する
+@translationof Interpretation contexts
+
+このセクションでは、コンテキストとは何なのか、@c
+それをどのように変更するのかについて説明します。
+
+@menu
+* コンテキストの説明::
+* コンテキストを作成する::
+* コンテキストを残しておく::
+* コンテキストのプラグインを変更する::
+* コンテキストのデフォルト設定を変更する::
+* 新しいコンテキストを定義する::
+* コンテキストを揃える::
+@end menu
+
+
+@seealso
+学習マニュアル:
+@rlearning{コンテキストとエングラーバ}
+
+インストール済みファイル:
+@file{ly/@/engraver@/-init@/.ly},
+@file{ly/@/performer@/-init@/.ly}
+
+コード断片集:
+@rlsr{Contexts and engravers}
+
+内部リファレンス:
+@rinternals{Contexts},
+@rinternals{Engravers and Performers}
+
+
+@node コンテキストの説明
+@subsection コンテキストの説明
+@translationof Contexts explained
+
+@ignore
+@c TODO Rethink and rewrite
+
+>> > > - list of contexts: my *danger unmaintainable*
+>> > > alarm just went off. I'm
+
+I knew it would... And leaving out some of them is perfectly fine
+with me.
+I do think that a list like this, with the main contexts and a
+brief
+description of what they do (perhaps also with a note about what
+default
+behavior is associated with each of them, but this may be
+unmanageable),
+should be there, and then we could simply list the remaining ones
+without
+further explanation and with links to the IR.
+@end ignore
+
+@c TODO Improve layout, order and consistency of wording -td
+
+@c TODO Add introduction which explains contexts in generality -td
+
+@c TODO Describe propagation of property values -td
+
+コンテキストは階層的に配置されます:
+
+@menu
+* Score - すべてのコンテキストのマスタ::
+* 上位コンテキスト - 譜コンテナ::
+* 中位コンテキスト - 譜::
+* 下位コンテキスト - ボイス::
+@end menu
+
+@node Score - すべてのコンテキストのマスタ
+@unnumberedsubsubsec Score - すべてのコンテキストのマスタ
+@translationof Score - the master of all contexts
+
+これは最上位の記譜コンテキストです。@c
+他のコンテキストが Score コンテキストを保持することはできません。@c
+デフォルトでは、Score コンテキストが拍子記号の管理を扱い、@c
+音部記号、拍子記号、調号などのアイテムが譜間で揃っていることを保証します。
+
+Score コンテキストは、@code{\score @{@dots{}@}} や @code{\layout @{@dots{}@}}
+ブロックが処理されたときに暗黙的にインスタンス化されます。@c
+@c また、@code{\new Score} コマンドが実行されたときに@c
+@c 明示的にインスタンス化されます。
+
+
+@node 上位コンテキスト - 譜コンテナ
+@unnumberedsubsubsec 上位コンテキスト - 譜コンテナ
+@translationof Top-level contexts - staff containers
+
+@strong{@emph{StaffGroup}}
+
+譜をグループ化して、左端に角括弧を付けます。@c
+このコンテキストに保持されている譜の小節線は垂直につながります。@c
+@code{StaffGroup} は譜のコレクション、@c
+それに左端の角括弧と延長された小節線だけを保持します。
+
+@strong{@emph{ChoirStaff}}
+
+保持されている譜の小節線が垂直につながらないことを除けば、@c
+@code{StaffGroup} と同じです。
+
+@strong{@emph{GrandStaff}}
+
+譜をグループ化して、左端に波括弧を付けます。@c
+このコンテキストに保持されている譜の小節線は垂直につながります。@c
+
+@strong{@emph{PianoStaff}}
+
+@code{GrandStaff} と似ていますが、@c
+各システムの左端に楽器名を付けることができます。
+
+
+@node 中位コンテキスト - 譜
+@unnumberedsubsubsec 中位コンテキスト - 譜
+@translationof Intermediate-level contexts - staves
+
+@strong{@emph{Staff}}
+
+音部記号、小節線、調、臨時記号を扱います。@c
+このコンテキストは @code{Voice} コンテキストを保持することができます。
+
+@strong{@emph{RhythmicStaff}}
+
+@code{Staff} と似ていますが、リズムを表示するためのものです。@c
+ピッチは無視され、音符は線として表示されます。
+
+@strong{@emph{TabStaff}}
+
+タブ譜を生成するためのコンテキストです。@c
+デフォルトでは、音楽表記を 6 線のギター タブ譜として配置します。
+
+@strong{@emph{DrumStaff}}
+
+打楽器の譜刻を扱います。@c
+@code{DrumVoice} を保持することができます。
+
+@strong{@emph{VaticanaStaff}}
+
+@code{Staff} と同じですが、@c
+グレゴリア形式の楽曲を譜刻するためにデザインされている点が異なります。
+
+@strong{@emph{MensuralStaff}}
+
+@code{Staff} と同じでが、@c
+定量形式の楽曲を譜刻するためにデザインされている点が異なります。
+
+@node 下位コンテキスト - ボイス
+@unnumberedsubsubsec 下位コンテキスト - ボイス
+@translationof Bottom-level contexts - voices
+
+Voice レベルのコンテキストはある特定のプロパティを初期化し、@c
+適切なエングラーバを開始させます。@c
+下位コンテキストであるため、他のコンテキストを保持することはできません。
+
+@strong{@emph{Voice}}
+
+譜の上にあるボイスに相当します。@c
+このコンテキストは、強弱記号、符幹、連桁、上付き/下付き文字、タイ、@c
+それに休符の変換を扱います。@c
+1 つの譜に複数のボイスを配置する必要がある場合、@c
+ボイスを明示的にインスタンス化する必要があります。
+
+@strong{@emph{VaticanaVoice}}
+
+@code{Voice} と同じですが、@c
+グレゴリア形式の楽曲を譜刻するためにデザインされている点が異なります。
+
+@strong{@emph{MensuralVoice}}
+
+@code{Voice} と同じですが、@c
+定量形式の楽曲を譜刻するためにデザインされている点が異なります。
+
+@strong{@emph{Lyrics}}
+
+歌詞を保持するボイスに相当します。単一行の歌詞の表示を扱います。
+
+@strong{@emph{DrumVoice}}
+
+打楽器譜で使用されるボイス コンテキストです。
+
+@strong{@emph{FiguredBass}}
+
+このコンテキストの中で、@c
+@code{\figuremode} モードで記述された入力から
+@code{BassFigure} オブジェクトが作成されます。
+
+@strong{@emph{TabVoice}}
+
+@code{TabStaff} コンテキスト内部で使用されるボイス コンテキストです。@c
+通常、暗黙的に作成されます。
+
+@strong{@emph{CueVoice}}
+
+小さなサイズの音符を描画するために使用されるボイス コンテキストです。@c
+主に合図音符を譜に付け加えることを目的としています。@c
+@ref{合図音符をフォーマットする} を参照してください。@c
+通常、暗黙的に作成されます。
+
+@strong{@emph{ChordNames}}
+
+コード ネームを譜刻します。
+
+@ignore
+TODO
+
+Then the following, which I don't know what to do with:
+
+ * GregorianTranscriptionVoice
+ * GregorianTranscriptionStaff
+
+ * FretBoards
+ Engraves fretboards from chords. Not easy... Not
+documented.
+ There is now some documentation on FretBoards in the NR, under
+ instrument-specific notation -- cds.
+
+ * NoteNames
+
+ * Global
+ Hard coded entry point for LilyPond. Cannot be tuned.
+ * Devnull
+ Silently discards all musical information given to this
+context.
+
+@end ignore
+
+@node コンテキストを作成する
+@subsection コンテキストを作成する
+@translationof Creating contexts
+
+@c TODO more complete descriptions rather than learning style
+
+ボイスと譜が 1 つだけの楽譜では、コンテキストは自動的に作成されます。@c
+もっと複雑な楽譜では、手動でコンテキストを作成する必要があります。@c
+コンテキスを作成するために 3 つのコマンドがあります。
+
+@itemize
+
+@item
+もっとも簡単なコマンドは @code{\new} であり、@c
+もっとも素早く入力できるコマンドでもあります。@c
+このコマンドは音楽表記の前に置きます。例えば、以下のように:
+
+@funindex \new
+@cindex new contexts (新しいコンテキスト)
+@cindex Context, creating (コンテキストを作成する)
+
+@example
+\new @var{type} @var{music expression}
+@end example
+
+@noindent
+ここで、@var{type} はコンテキスト名 (@code{Staff} や @code{Voice} など) です。@c
+このコマンドは新しいコンテキストを作成し、@c
+そのコンテキストに付属する @var{音楽表記} の解釈を開始します。
+
+@code{\new} の実際的な使用例には、多くの譜を持つ楽譜があります。@c
+それぞれの譜に配置される各パートの前に @code{\new Staff} を記述します。
+
+@lilypond[quote,verbatim,relative=2,ragged-right,fragment]
+<<
+ \new Staff { c4 c }
+ \new Staff { d4 d }
+>>
+@end lilypond
+
+@code{\new} コマンドは、コンテキストに名前を与えることもできます:
+
+@example
+\new @var{type} = @var{id} @var{music}
+@end example
+
+しかしながら、ユーザが指定したコンテキスト名は、
+そのコンテキスト以前に同じ名前を与えられたコンテキストが無い場合にのみ、@c
+使用できます。
+
+
+@funindex \context
+
+@item
+@code{\new} と同様に、@c
+@code{\context} コマンドも音楽表記をコンテキスト オブジェクトに代入します。@c
+しかしながら、このコマンドはコンテキストに明示的に名前を与えます。@c
+構文は以下の通りです:
+
+@example
+\context @var{type} = @var{id} @var{music}
+@end example
+
+この構文は @var{id} という名前の @var{type} タイプのコンテキストが@c
+すで存在していないか検索します。@c
+コンテキストがまだ存在していなければ、@c
+指定された名前を持つコンテキストが新たに作成されます。@c
+これは、コンテキストを後で参照する場合に有用です。@c
+例えば、以下のように名前を付けられたメロディ:
+
+@example
+\context Voice = "@b{tenor}" @var{music}
+@end example
+
+@noindent
+に、以下のように歌詞を設定すると、テキストは適切に音符に揃えられます:
+
+@example
+\new Lyrics \lyricsto "@b{tenor}" @var{lyrics}
+@end example
+
+@noindent
+
+名前付きコンテキストの他の使用例として、2 つの音楽表記をつなげて
+1 つのコンテキストにすることができます。@c
+以下の例では、アーティキュレーションと音符は別々に入力されています:
+
+@example
+music = @{ c4 c4 @}
+arts = @{ s4-. s4-> @}
+@end example
+
+これらを同じ @code{Voice} コンテキストに送ることによって@c
+組み合わせることができます:
+
+@example
+<<
+ \new Staff \context Voice = "A" \music
+ \context Voice = "A" \arts
+>>
+@end example
+@lilypond[quote,ragged-right]
+music = { c4 c4 }
+arts = { s4-. s4-> }
+\relative c'' <<
+ \new Staff \context Voice = "A" \music
+ \context Voice = "A" \arts
+>>
+@end lilypond
+
+このメカニズムを用いることで、原典版 (オリジナル版) を定義し、@c
+オプションとしてそれに異なるアーティキュレーションを付けることができます。
+
+@cindex creating contexts (コンテキストを作成する)
+
+@item
+コンテキストを作成する 3 つ目のコマンドは以下の通りです:
+
+@example
+\context @var{type} @var{music}
+@end example
+
+@noindent
+これは @code{= @var{id}} を持つ @code{\context} に似ていますが、@c
+タイプ @var{type} のすべてのコンテキストに適用されます
+-- そのコンテキストに与えられた名前とは関係なく適用されます。@c
+
+この構文の変形版は、@c
+異なる階層で解釈される可能性がある音楽表記に対して使用されます。@c
+例えば、@code{\applyOutput} コマンド
+(@rextend{Running a function on all layout objects} を参照してください)
+です。@c
+明示的に @code{\context} を指定しなければ、通常は @code{Voice} に適用されます。
+
+@example
+\applyOutput #'@var{context} #@var{function} % Voice に適用されます
+@end example
+
+@code{Score} レベルや @code{Staff} レベルで解釈させるには、以下のようにします:
+
+@example
+\applyOutput #'Score #@var{function}
+\applyOutput #'Staff #@var{function}
+@end example
+
+@end itemize
+
+
+@node コンテキストを残しておく
+@subsection コンテキストを残しておく
+@translationof Keeping contexts alive
+
+@cindex contexts, keeping alive (コンテキストを残しておく)
+@cindex contexts, lifetime (コンテキストのライフタイム)
+
+通常、コンテキストは何もすることが無くなった最初の音楽的タイミングで@c
+消滅させられます。@c
+そのため、@code{Voice} コンテキストはすべてのイベントを終えるとすぐに消滅し、@c
+@code{Staff} コンテキストは保持しているすべての @code{Voice} コンテキストの@c
+イベントが終了するとすぐに消滅する、などとなっています。@c
+このことは、早い段階のすでに消滅したコンテキスを参照する必要がある場合に、@c
+障害となります。@c
+例えば、@code{\change} コマンドで譜を変更する場合、@c
+@code{\lyricsto} コマンドで歌詞をボイスに結び付ける場合、@c
+あるいは、早い段階で登場したコンテキストに音楽イベントを追加する場合に@c
+障害となります。
+
+この規則には 1 つ例外があります:
+@code{Staff} コンテキストや @code{<<...>>} 構造の中にある @code{Voice}
+コンテキストのうち 1 つだけは、例え途中ですることが無くなったとしても、@c
+@code{Staff} コンテキストあるいは
+@code{<<...>>} 構造の終わりまで維持されます。@c
+このように維持されるコンテキストは、最初の @code{@{...@}} 構造の中にある@c
+最初のコンテキストであり、@code{<<...>>} 構造の中にあるものは無視されます。
+
+各音楽タイミングで何かすることを持たせることにより、@c
+任意のコンテキストを残しておくことができます。@c
+@code{Staff} コンテキストを残しておくには、それに含まれるボイスの 1 つが@c
+維持されることを保証する必要があります。@c
+ボイスを残しておく方法の 1 つに、ボイスに含まれる実際の音楽と並列に、@c
+空白休符をそのボイスに付け加えるという方法があります。@c
+残しておく必要があるすべての @code{Voice} コンテキストに対して、@c
+空白休符を付け加える必要があります。@c
+ところどころで使用されるボイスがある場合、@c
+前述の例外によって必要なボイスを残そうとするよりは、@c
+それらのボイスすべてを残しておく方が安全です。
+
+以下の例では、空白休符の追加を用いる方法で、@c
+ボイス A とボイス B の両方が楽曲全体を通して維持されます:
+
+@c KEEP LY
+@lilypond[quote,verbatim]
+musicA = \relative c'' { d4 d d d }
+musicB = \relative c'' { g4 g g g }
+keepVoicesAlive = {
+ <<
+ \new Voice = "A" { s1*5 } % Voice "A" を 5 小節の間、維持する
+ \new Voice = "B" { s1*5 } % Voice "B" を 5 小節の間、維持する
+ >>
+}
+
+music = {
+ \context Voice = "A" {
+ \voiceOneStyle
+ \musicA
+ }
+ \context Voice = "B" {
+ \voiceTwoStyle
+ \musicB
+ }
+ \context Voice = "A" { \musicA }
+ \context Voice = "B" { \musicB }
+ \context Voice = "A" { \musicA }
+}
+
+\score {
+ \new Staff <<
+ \keepVoicesAlive
+ \music
+ >>
+}
+@end lilypond
+
+@cindex lyrics, aligning with sporadic melody (途切れ途切れのメロディに歌詞を揃える)
+
+以下の例は、空白休符を用いる方法で、@c
+途切れ途切れのメロディに歌詞を持たせる方法を示しています。@c
+もちろん、実際に楽譜を書く場合は、@c
+メロディや伴奏は複数のセクションによって構成されることになります。
+
+@c KEEP LY
+@lilypond[quote,verbatim]
+melody = \relative c'' { a4 a a a }
+accompaniment = \relative c' { d4 d d d }
+words = \lyricmode { These words fol -- low the mel -- o -- dy }
+\score {
+ <<
+ \new Staff = "music" {
+ <<
+ \new Voice = "melody" {
+ \voiceOne
+ s1*4 % Voice "melody" を 4 小節の間、残します
+ }
+ {
+ \new Voice = "accompaniment" {
+ \voiceTwo
+ \accompaniment
+ }
+ <<
+ \context Voice = "melody" { \melody }
+ \context Voice = "accompaniment" { \accompaniment }
+ >>
+ \context Voice = "accompaniment" { \accompaniment }
+ <<
+ \context Voice = "melody" { \melody }
+ \context Voice = "accompaniment" { \accompaniment }
+ >>
+ }
+ >>
+ }
+ \new Lyrics \with { alignAboveContext = #"music" }
+ \lyricsto "melody" { \words }
+ >>
+}
+@end lilypond
+
+これに代わる方法として、メロディに直接空白休符を付け加えて、@c
+メロディが伴奏と揃うようにする方法があります
+-- 多くの場合、こちらの方法の方が良いかもしれません:
+
+@c KEEP LY
+@lilypond[quote,verbatim]
+melody = \relative c'' {
+ s1 % 1 小節スキップします
+ a4 a a a
+ s1 % 1 小節スキップします
+ a4 a a a
+}
+accompaniment = \relative c' {
+ d4 d d d
+ d4 d d d
+ d4 d d d
+ d4 d d d
+}
+words = \lyricmode { These words fol -- low the mel -- o -- dy }
+
+\score {
+ <<
+ \new Staff = "music" {
+ <<
+ \new Voice = "melody" {
+ \voiceOne
+ \melody
+ }
+ \new Voice = "accompaniment" {
+ \voiceTwo
+ \accompaniment
+ }
+ >>
+ }
+ \new Lyrics \with { alignAboveContext = #"music" }
+ \lyricsto "melody" { \words }
+ >>
+}
+@end lilypond
+
+
+@node コンテキストのプラグインを変更する
+@subsection コンテキストのプラグインを変更する
+@translationof Modifying context plug-ins
+
+@c TODO Should this be Modifying engravers or Modifying contexts?
+
+記譜コンテキスト (@code{Score} や @code{Staff} のような) は@c
+プロパティを保存するだけなく、@c
+@q{エングラーバ} と呼ばれる記譜要素を作成するプラグインを保持します。@c
+例えば、@code{Voice} コンテキストは @code{Note_head_engraver} を保持し、@c
+@code{Staff} コンテキストは @code{Key_signature_engraver} を保持します。
+
+各プラグインについての説明は、
+@ifhtml
+@rinternals{Engravers and Performers}.
+@end ifhtml
+@ifnothtml
+Internals Reference @expansion{} Translation @expansion{} Engravers.
+@end ifnothtml
+を参照してください。@c
+@ifhtml
+@rinternals{Contexts}
+@end ifhtml
+@ifnothtml
+Internals Reference @expansion{} Translation @expansion{} Context.
+@end ifnothtml
+の中にある各コンテキストについての説明では、@c
+そのコンテキストで使用されるエングラーバがリストアップされています。
+
+これらのプラグインを入れ換えると有用な場合があります。@c
+プラグインを入れ換えるには、新たに作成するコンテキストを
+@code{\new} あるいは @code{\context} で開始し、@c
+そのコンテキストを以下のように変更します:
+
+@funindex \with
+
+@example
+\new @var{context} \with @{
+ \consists @dots{}
+ \consists @dots{}
+ \remove @dots{}
+ \remove @dots{}
+ @emph{etc.}
+@}
+@{
+ @emph{..music..}
+@}
+@end example
+
+@noindent
+ここで、@dots{} はエングラーバの名前になります。@c
+ここで、@code{Staff} コンテキストから @code{Time_signature_engraver} と
+@code{Clef_engraver} を削除する簡単な例を示します:
+
+@lilypond[quote,relative=1,verbatim,fragment]
+<<
+ \new Staff {
+ f2 g
+ }
+ \new Staff \with {
+ \remove "Time_signature_engraver"
+ \remove "Clef_engraver"
+ } {
+ f2 g2
+ }
+>>
+@end lilypond
+
+2 番目の譜には、拍子記号と音部記号がありません。@c
+この方法は、オブジェクトを不可視にするよりも乱暴な方法です。@c
+なぜなら、譜全体に影響を与えるからです。@c
+さらに、望む望まないに係わらず、この方法はスペースにも影響を与えます。@c
+オブジェクトを消すもっと洗練された方法については、@c
+@rlearning{オブジェクトの可視性と色} を参照してください。
+
+次の例は、ある実用的な応用です。@c
+通常、小節線と拍子記号は楽譜全体で同期されます。@c
+これは @code{Timing_translator} と @code{Default_bar_line_engraver}
+によって行われます。@c
+このプラグインは拍子記号の管理や、小節内の配置の管理などを行います。@c
+これらのエングラーバを @code{Score} コンテキストから
+@code{Staff} コンテキストへ異動させることにより、@c
+楽譜の各譜に独自の拍子記号を持たせることが可能になります。
+
+@cindex polymetric scores (複合拍子楽譜)
+@cindex Time signatures, multiple (複数の拍子記号)
+
+@lilypond[quote,relative=1,ragged-right,verbatim,fragment]
+\new Score \with {
+ \remove "Timing_translator"
+ \remove "Default_bar_line_engraver"
+} <<
+ \new Staff \with {
+ \consists "Timing_translator"
+ \consists "Default_bar_line_engraver"
+ } {
+ \time 3/4
+ c4 c c c c c
+ }
+ \new Staff \with {
+ \consists "Timing_translator"
+ \consists "Default_bar_line_engraver"
+ } {
+ \time 2/4
+ c4 c c c c c
+ }
+>>
+@end lilypond
+
+@knownissues
+
+通常、エングラーバが指定される順序は問題にはなりません。@c
+しかしながら、いくつかの特殊なケースでは、この順序が重要になります。@c
+例えば、あるエングラーバがプロパティを記述して、@c
+それを他のエングラーバが読む場合、あるいは、@c
+あるエングラーバがグラフィカル オブジェクトを作成し、@c
+それを他のエングラーバが処理しなければならない場合です。@c
+エングラーバは指定された順序に従って呼び出され、処理を実行します。
+
+以下の順序は重要です:
+通常、@code{Bar_engraver} を最初に指定し、@c
+@code{New_fingering_engraver} を @code{Script_column_engraver} の前で@c
+指定する必要があります。@c
+他にも指定順序が問題になるケースがあるかもしれません。
+
+
+@node コンテキストのデフォルト設定を変更する
+@subsection コンテキストのデフォルト設定を変更する
+@translationof Changing context default settings
+
+@code{Score}, @code{Staff} それに @code{Voice} コンテキストにおいて@c
+デフォルトで使用されるコンテキスト設定は、以下の例で示すように、@c
+@code{\layout} ブロックの中で指定することができます。@c
+@code{\layout} ブロックは、それを適用する @code{\score} ブロックの中で、かつ、@c
+音楽表記の外側に配置する必要があります。
+
+以下のような方法でコンテキストのデフォルト値を指定する場合、@c
+@code{\set} コマンドとコンテキストを@c
+省略する必要があるということに注意してください:
+
+@lilypond[quote,verbatim]
+\score {
+ \relative c'' {
+ a4^"Really small, thicker stems, no time signature" a a a
+ a a a a
+ }
+ \layout {
+ \context {
+ \Staff
+ fontSize = #-4
+ \override Stem #'thickness = #4.0
+ \remove "Time_signature_engraver"
+ }
+ }
+}
+@end lilypond
+
+上記の例の中で、@code{\Staff} コマンドは、@c
+後に続く記述をその score ブロックの中にあるすべての譜に適用するということを@c
+指定しています。
+
+同様の方法で、@c
+@code{Score} コンテキストや @code{Voice} コンテキストに@c
+変更を適用することができます。
+
+@knownissues
+
+変数に加えられたコンテキストの変更を収集すること、それに、@c
+その変数を参照することでそれらの変更を @code{\context} 定義に@c
+適用することはできません。
+
+@code{\RemoveEmptyStaffContext} はカレントの
+@code{\Staff} 設定を上書きします。@c
+@code{\RemoveEmptyStaffContext} を使用する staff
+のデフォルト設定を変更したいのならば、@c
+@code{\RemoveEmptyStaffContext} を呼び出した後に@c
+変更を加える必要があります。@c
+つまり、以下のようにします:
+
+@example
+\layout @{
+ \context @{
+ \RemoveEmptyStaffContext
+
+ \override Stem #'thickness = #4.0
+ @}
+@}
+@end example
+
+@c TODO: add \with in here.
+
+
+@node 新しいコンテキストを定義する
+@subsection 新しいコンテキストを定義する
+@translationof Defining new contexts
+
+@cindex contexts, defining new (新しいコンテキストを定義する)
+@cindex engravers, including in contexts (エングラーバをコンテキストに含める)
+
+@funindex \alias
+@funindex alias
+@funindex \name
+@funindex name
+@funindex \type
+@funindex type
+@funindex \consists
+@funindex consists
+@funindex \accepts
+@funindex accepts
+@funindex \denies
+@funindex denies
+
+@code{Staff} や @code{Voice} のようなコンテキストは、@c
+簡単なブロックの組み合わせで構成されています。
+エングラーバ プラグインの組み合わせを変えることで、@c
+新しいタイプのコンテキスを作成することができます。
+
+次の例は、ゼロからタイプの異なる @code{Voice} コンテキストを作り上げる方法を@c
+示しています。@c
+このコンテキストは @code{Voice} コンテキストに似ていますが、@c
+音符の代わりにスラッシュを譜の中央に譜刻します。@c
+これはジャズで即興を表すのに使うことができます。
+
+@lilypond[quote,ragged-right]
+\layout { \context {
+ \name ImproVoice
+ \type "Engraver_group"
+ \consists "Note_heads_engraver"
+ \consists "Rhythmic_column_engraver"
+ \consists "Text_engraver"
+ \consists Pitch_squash_engraver
+ squashedPosition = #0
+ \override NoteHead #'style = #'slash
+ \override Stem #'transparent = ##t
+ \alias Voice
+}
+\context { \Staff
+ \accepts "ImproVoice"
+}}
+
+\relative c'' {
+ a4 d8 bes8 \new ImproVoice { c4^"ad lib" c
+ c4 c^"undress" c_"while playing :)" c }
+ a1
+}
+@end lilypond
+
+
+これらの設定は @code{\layout} ブロック内部の @code{\context} ブロック@c
+の中で定義します:
+
+@example
+\layout @{
+ \context @{
+ @dots{}
+ @}
+@}
+@end example
+
+以下では、上記の例の @dots{} に入るべき入力について議論します。
+
+最初に、新しいコンテキストの名前を定義する必要があります:
+
+@example
+\name ImproVoice
+@end example
+
+このコンテキストは @code{Voice} に似せる必要があるため、@c
+(既存の) @code{Voice} と同じ機能を実現するコマンドが必要です。@c
+これは、新しいコンテキストにエイリアス @code{Voice} を与えることで実現できます。
+
+@example
+\alias Voice
+@end example
+
+このコンテキストは音符と指示テキストを譜刻しますので、@c
+それらの機能を提供するエングラーバを付け加える必要があります:
+
+@example
+\consists Note_heads_engraver
+\consists Text_engraver
+@end example
+
+しかしながら、音符の代わりにスラッシュを譜の中央線上に配置します:
+
+@example
+\consists Pitch_squash_engraver
+squashedPosition = #0
+@end example
+
+@rinternals{Pitch_squash_engraver} は
+(@rinternals{Note_heads_engraver} によって作成される) 符頭を変更し、@c
+符頭の垂直位置を @code{squashedPosition} にセットします
+-- 今回は @code{0}、つまり中央線上です。
+
+音符はスラッシュで、符幹を持ちません:
+
+@example
+\override NoteHead #'style = #'slash
+\override Stem #'transparent = ##t
+\override Flag #'transparent = ##t
+@end example
+
+これらのプラグインすべてが共同する必要があり、@c
+それには特殊なプラグインが必要です。@c
+このプラグインは常に @code{Engraver_group} であり、@c
+キーワード @code{\type} を付ける必要があります。
+
+@example
+\type "Engraver_group"
+@end example
+
+まとめると、以下のようになります:
+
+@example
+\context @{
+ \name ImproVoice
+ \type "Engraver_group"
+ \consists "Note_heads_engraver"
+ \consists "Text_engraver"
+ \consists Pitch_squash_engraver
+ squashedPosition = #0
+ \override NoteHead #'style = #'slash
+ \override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
+ \alias Voice
+@}
+@end example
+
+@funindex \accepts
+コンテキストは階層を構成します。c
+通常の @code{Voice} と同様に、@c
+@code{ImproVoice} を @code{Staff} の下に置く必要があります。@c
+それゆえ、@code{Staff} 定義を @code{\accepts} コマンドで変更します:
+
+@example
+\context @{
+ \Staff
+ \accepts ImproVoice
+@}
+@end example
+
+@funindex \denies
+@code{\accepts} の反対は @code{\denies} です。@c
+これは既存のコンテキスト定義を再利用する場合に必要となります。
+
+以下のように、両方を @code{\layout} ブロックの中に置きます:
+
+@example
+\layout @{
+ \context @{
+ \name ImproVoice
+ @dots{}
+ @}
+ \context @{
+ \Staff
+ \accepts "ImproVoice"
+ @}
+@}
+@end example
+
+それから、このサブセクションの最初にあった出力を入力します:
+
+@example
+\relative c'' @{
+ a4 d8 bes8
+ \new ImproVoice @{
+ c4^"ad lib" c
+ c4 c^"undress"
+ c c_"while playing :)"
+ @}
+ a1
+@}
+@end example
+
+
+@node コンテキストを揃える
+@subsection コンテキストを揃える
+@translationof Aligning contexts
+
+新しいコンテキストを既存のコンテキストの上または下に揃えることができます。@c
+これはボーカル譜 (@rlearning{合唱}) を組む場合やオッシアで役に立ちます。
+
+@c TODO Better example needed. Ref LM, and expand on it.
+
+@cindex ossia (オッシア)
+@funindex alignAboveContext
+@funindex 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
+
+@cindex nested contexts (ネストされたコンテキスト)
+@cindex contexts, nested (ネストされたコンテキスト)
+
+@funindex \accepts
+@funindex \denies
+
+@code{PianoStaff} のようなコンテキストは、@c
+ネスト (入れ子) 構造をとって、@c
+他のコンテキストを内部に保持することができます。@c
+ネスト構造をとることができるコンテキストは、@c
+コンテキストの @qq{accepts} リストによって定義されています。@c
+このリストには存在しないコンテキストは、楽譜が譜刻されるとき、@c
+(@code{PianoStaff} などの) 親コンテキストの下に配置されます。@c
+例えば、@code{PianoStaff} コンテキストは、デフォルトで、@c
+@code{Staff} と @code{FiguredBass} コンテキストを内部に受け入れるよう@c
+定義されていますが、(例えば) @code{Lyrics} コンテキストは受け入れません。@c
+そのため、以下の例では、歌詞は 2 つの譜の間ではなく、@c
+ピアノ譜の下に配置されています:
+
+@lilypond[verbatim,quote,relative=1]
+\new PianoStaff
+<<
+ \new Staff { e4 d c2 }
+ \addlyrics { Three blind mice }
+ \new Staff {
+ \clef "bass"
+ { c,1 }
+ }
+>>
+@end lilypond
+
+コンテキストの @qq{accepts} リストを変更することで、
+ネストされるコンテキストを追加するができます。@c
+ですから、歌詞を 2 つの譜の間に表示させたいのなら、以下のようにします:
+
+@lilypond[verbatim,quote,relative=1]
+\new PianoStaff \with { \accepts Lyrics }
+<<
+ \new Staff { e4 d c2 }
+ \addlyrics { Three blind mice }
+ \new Staff {
+ \clef "bass"
+ { c,1 }
+ }
+>>
+@end lilypond
+
+@code{\accepts} の反対は @code{\denies} です。@c
+これはコンテキストを @qq{accepts} リストから削除します。
+
+
+@node 内部リファレンスの説明
+@section 内部リファレンスの説明
+@translationof Explaining the Internals Reference
+
+
+@menu
+* 内部リファレンスを使いこなす::
+* レイアウト インターフェイス::
+* グラフィカル オブジェクトを決定する::
+* 命名規約::
+@end menu
+
+@node 内部リファレンスを使いこなす
+@subsection 内部リファレンスを使いこなす
+@translationof Navigating the program reference
+
+@c TODO remove this (it's in the LM)
+@c Replace with more factual directions
+
+以下の譜面の運指記号を移動させたいとします:
+
+@lilypond[quote,relative=2,verbatim]
+c-2
+\stemUp
+f
+@end lilypond
+
+運指指示のドキュメント (@ref{運指の指示}) を見ると、@c
+以下のようなセクションがあることに気付くはずです:
+
+@quotation
+@strong{参照}
+
+内部リファレンス: @rinternals{Fingering}
+
+@end quotation
+
+
+@c outdated info; probably will delete.
+@ignore
+This fragment points to two parts of the program reference: a page
+on @code{FingeringEvent} and one on @code{Fingering}.
+
+The page on @code{FingeringEvent} describes the properties of the music
+expression for the input @code{-2}. The page contains many links
+forward. For example, it says
+
+@quotation
+Accepted by: @rinternals{Fingering_engraver},
+@end quotation
+
+@noindent
+That link brings us to the documentation for the Engraver, the
+plug-in, which says
+
+@quotation
+This engraver creates the following layout objects: @rinternals{Fingering}.
+@end quotation
+
+In other words, once the @code{FingeringEvent}s are interpreted, the
+@code{Fingering_engraver} plug-in will process them.
+@end ignore
+
+@ignore
+@c I can't figure out what this is supposed to mean. -gp
+
+The @code{Fingering_engraver} is also listed to create
+@rinternals{Fingering} objects,
+
+@c old info? it doesn't make any sense to me with our current docs.
+This is also the
+second bit of information listed under @b{See also} in the Notation
+manual.
+@end ignore
+
+@ifnothtml
+内部リファレンスは HTML ドキュメント形式で入手可能です。@c
+内部リファレンスは、オンラインか HTML ドキュメントをダウンロードするかして、@c
+HTML 形式で読むことを強く推奨します。@c
+PDF マニュアルを使用していると、@c
+このセクションを理解するのはずっと困難になります。@c
+(訳者: 日本語では PDF 形式での提供はありません。)
+@end ifnothtml
+
+@rinternals{Fingering} へのリンクを辿ってください。@c
+ページの先頭に、以下のような記述があります:
+
+@quotation
+Fingering objects are created by: @rinternals{Fingering_engraver} and
+@rinternals{New_fingering_engraver}.
+@end quotation
+
+内部リファレンスの中にある関連リンクを辿っていくことで、@c
+プログラム内部の情報フローを追っていくことができます:
+
+@itemize
+
+@item @rinternals{Fingering}:
+@rinternals{Fingering} objects are created by:
+@rinternals{Fingering_engraver}
+
+(@rinternals{Fingering}:
+@rinternals{Fingering} オブジェクトを作成するのは:
+@rinternals{Fingering_engraver})
+
+
+@item @rinternals{Fingering_engraver}:
+Music types accepted:
+@rinternals{fingering-event}
+
+(@rinternals{Fingering_engraver}:
+受け取る音楽タイプは: @rinternals{fingering-event})
+
+@item @rinternals{fingering-event}:
+Music event type @code{fingering-event} is in
+Music expressions named @rinternals{FingeringEvent}
+
+(@rinternals{fingering-event}:
+音楽イベント タイプ @code{fingering-event} は
+@rinternals{FingeringEvent} という名前の音楽表記の中にあります)
+
+@end itemize
+
+このパスは、プログラム内部での情報フローとは逆向きです:
+出力からスタートして、入力イベントで終わっています。@c
+入力イベントからスタートして、情報フローを読み進め、@c
+最後は出力オブジェクトに辿り着くこともできます。
+
+内部リファレンスを通常のドキュメントのように読むこともできます。@c
+内部リファレンスに含まれる章は、
+@ifhtml
+@rinternals{Music definitions},
+@end ifhtml
+@ifnothtml
+@code{Music definitions},
+@end ifnothtml
+@rinternals{Translation}, それに @rinternals{Backend} です。
+各章は、使用されているすべての定義と調整可能なすべてのプロパティを@c
+リストアップしています。
+
+
+@node レイアウト インターフェイス
+@subsection レイアウト インターフェイス
+@translationof Layout interfaces
+
+@cindex interface, layout (レイアウト インターフェイス)
+@cindex layout interface (レイアウト インターフェイス)
+@cindex grob (グラフィカル オブジェクト)
+
+前のセクションで見た HTML ページには、@c
+@rinternals{Fingering} と呼ばれるレイアウト オブジェクトについての@c
+記述がありました。@c
+そのようなオブジェクトは楽譜で記号となります。@c
+レイアウト オブジェクトは (太さや向きのような) 数値を保持する@c
+プロパティを持っていますが、@c
+関連オブジェクトへのポインタも持っています。@c
+レイアウト オブジェクトは @emph{Grob}
+-- これはグラフィカル オブジェクトを縮めたものです --
+とも呼ばれます。@c
+Grob についての詳細は、@rinternals{grob-interface} を参照してください。
+
+@code{Fingering} のページは、@c
+@code{Fingering} オブジェクトの定義をリストアップしています。@c
+例えば、このページには以下のような記述があります:
+
+@quotation
+@code{padding} (dimension, in staff space):
+
+@code{0.5}
+@end quotation
+
+@noindent
+これは、この数値は少なくとも符頭の 0.5 倍の距離を保つということを意味します。
+
+
+各レイアウト オブジェクトは、記譜要素あるいは写植要素としての機能を@c
+いくつか持つ場合があります。@c
+例えば、@code{Fingering} オブジェクトは以下の側面を持っています:
+
+@itemize
+@item
+Its size is independent of the horizontal spacing, unlike slurs or beams.
+
+(このオブジェクトのサイズは、スラーや連桁と異なり、@c
+水平方向のスペースとは無関係です)
+
+@item
+It is a piece of text. Granted, it is usually a very short text.
+
+(このオブジェクトはテキストです。通常、これは非常に短いテキストです。)
+
+@item
+That piece of text is typeset with a font, unlike slurs or beams.
+
+(このテキストは、スラーや連桁と異なり、フォントで写植されます。)
+
+@item
+Horizontally, the center of the symbol should be aligned to the
+center of the note head.
+
+(水平方向では、この記号の中心は符頭の中心に揃えられます。)
+
+@item
+Vertically, the symbol is placed next to the note and the staff.
+
+(垂直方向では、この記号は音符や譜の近く配置されます。)
+
+@item
+The vertical position is also coordinated with other superscript
+and subscript symbols.
+
+(また、垂直方向の位置は、他の上付き記号や下付き記号との調整によって決まります。)
+@end itemize
+
+これらの側面はそれぞれ、いわゆる @emph{インターフェイス}
+として捉ええられます。@c
+それらは、@rinternals{Fingering} ページの最下部でリストアップされています。
+
+@quotation
+This object supports the following interfaces:
+
+(このオブジェクトは以下のインターフェイスをサポートします:)
+
+@rinternals{item-interface},
+@rinternals{self-alignment-interface},
+@rinternals{side-position-interface}, @rinternals{text-interface},
+@rinternals{text-script-interface}, @rinternals{font-interface},
+@rinternals{finger-interface}, and @rinternals{grob-interface}.
+@end quotation
+
+リンクのいずれかをクリックすると、@c
+それぞれのオブジェクト インターフェイスのページに行くことができます。@c
+各インターフェイスはいくつかのプロパティを持ちます。@c
+それらプロパティの中には、ユーザにとって役に立たないもの
+(@q{内部プロパティ}) もありますが、それ以外は変更可能です。
+
+これまで @code{Fingering} オブジェクトについて話してきましたが、@c
+これは実際にはそれほど多くのことをしているわけではありません。@c
+初期化ファイル (@rlearning{その他の情報源} を参照してください)
+@file{scm/define-grobs.scm} がこの @q{オブジェクト} の本質を示しています:
+
+@example
+(Fingering
+ . ((padding . 0.5)
+ (avoid-slur . around)
+ (slur-padding . 0.2)
+ (staff-padding . 0.5)
+ (self-alignment-X . 0)
+ (self-alignment-Y . 0)
+ (script-priority . 100)
+ (stencil . ,ly:text-interface::print)
+ (direction . ,ly:script-interface::calc-direction)
+ (font-encoding . fetaText)
+ (font-size . -5) ; don't overlap when next to heads.
+ (meta . ((class . Item)
+ (interfaces . (finger-interface
+ font-interface
+ text-script-interface
+ text-interface
+ side-position-interface
+ self-alignment-interface
+ item-interface))))))
+@end example
+
+@noindent
+見て取ることができるように、@c
+@code{Fingering} オブジェクトは変数設定の塊に過ぎず、@c
+内部リファレンスの中にある Web ページは、@c
+この定義から直接生成されたに過ぎません。
+
+
+@node グラフィカル オブジェクトを決定する
+@subsection グラフィカル オブジェクトを決定する
+@translationof Determining the grob property
+
+@c TODO remove this (it's in the LM)
+@c Replace with more factual directions
+
+以下の @b{2} の位置を変更しようとしていたことを思い出してください:
+
+@lilypond[quote,fragment,relative=2,verbatim]
+c-2
+\stemUp
+f
+@end lilypond
+
+垂直方向で見て、@b{2} は元の音符の隣に配置されるのですから、@c
+この配置に関連するインターフェイスに干渉する必要があります。@c
+これは @code{side-position-interface} を用いて行います。@c
+このインターフェイスについてのページには、以下のように記述されています:
+
+@quotation
+@code{side-position-interface}
+
+Position a victim object (this one) next to other objects (the
+support). The property @code{direction} signifies where to put the
+victim object relative to the support (left or right, up or down?)
+
+(対象オブジェクトを他のオブジェクト (サポート オブジェクト)
+の隣に配置します。@c
+このプロパティ @code{direction} は、@c
+対象オブジェクトをどこに配置するかを@c
+サポート オブジェクトからの相対位置で示します
+(左あるいは右、上あるいは下?))
+@end quotation
+
+@cindex padding
+@noindent
+この記述の下に、以下のような変数 @code{padding} についての記述があります:
+
+@quotation
+@table @code
+@item padding
+(dimension, in staff space)
+(譜スペースを単位とする距離)
+
+Add this much extra space between objects that are next to each other.
+(隣り合うオブジェクトの間にスペースを付け加えます)
+@end table
+@end quotation
+
+@code{padding} の値を増やすことで、@c
+運指記号を符頭から離すことができます。@c
+以下のコマンドは、音符と運指記号の間に 3 譜スペースを挿入します:
+
+@example
+\once \override Voice.Fingering #'padding = #3
+@end example
+
+このコマンドを @code{Fingering} オブジェクトが作成される前に挿入する
+-- つまり @code{c2} の前に挿入する -- と、以下のような結果が得られます:
+
+@lilypond[quote,relative=2,fragment,verbatim]
+\once \override Voice.Fingering #'padding = #3
+c-2
+\stemUp
+f
+@end lilypond
+
+
+このケースでは、調整されるコンテキストは @code{Voice} です。@c
+このことは、内部リファレンスの @rinternals{Fingering_engraver}
+プラグインについてのページからわかります。@c
+このページには、以下のような記述があります:
+
+@quotation
+Fingering_engraver is part of contexts: @dots{} @rinternals{Voice}
+(Fingering_engraver は次のコンテキストの一部です: @dots{} @rinternals{Voice})
+@end quotation
+
+
+@node 命名規約
+@subsection 命名規約
+@translationof Naming conventions
+
+内部リファレンスについて他に説明しておくべき事柄として、@c
+さまざまな命名規約についての概要があります:
+
+@itemize
+@item Scheme スタイル: 小文字の単語をハイフンでつなぎます
+(1 単語の名前を含みます) -- 例: lowercase-with-hyphens
+@item Scheme 関数: Scheme スタイルの先頭に @code{ly:} を付けます
+-- 例: ly:plus-scheme-style
+@item 音楽イベント、音楽クラス、それに音楽プロパティ: Scheme スタイルです
+-- 例: as-scheme-functions
+@item グラフィカル オブジェクト インターフェイス: Scheme スタイルです
+-- 例: scheme-style
+@c 未訳
+@item バックエンド プロパティ: Scheme スタイルです (が、X と Y があります!)
+@item コンテキスト (それに、音楽表記とグラフィカル オブジェクト):
+大文字で始まる単語、あるいはそれらをつなげます
+-- 例: Capitalized, CamelCase
+@item コンテキスト プロパティ:
+小文字で始まる単語に、大文字で始まる単語をつなげます
+-- 例: lowercaseFollowedByCamelCase
+@item エングラーバ:
+大文字で始まる単語に、小文字で始まる単語をアンダスコアでつなげます
+-- 例: Capitalized_followed_by_lowercase_and_with_underscores
+@end itemize
+
+疑問:
+@itemize
+@item 命名規約のうち、慣習なのはどれで、規則なのはどれか?
+@item 命名規約のうち、どれが基本言語の規則で、@c
+どれが LP (訳者: LilyPond?) 特有の規則なのか?
+@end itemize
+
+
+@node プロパティを変更する
+@section プロパティを変更する
+@translationof Modifying properties
+
+@c TODO change the menu and subsection node names to use
+@c backslash once the new macro to handle the refs
+@c is available. Need to find and change all refs at
+@c the same time. -td
+
+@menu
+* プロパティ変更の概要::
+* set コマンド::
+* override コマンド::
+* tweak コマンド::
+* set 対 override::
+* 連想配列を変更する::
+@end menu
+
+
+@node プロパティ変更の概要
+@subsection プロパティ変更の概要
+@translationof Overview of modifying properties
+
+各コンテキストは、ある特定のタイプのグラフィカル オブジェクトを作成することに@c
+ついて責任を持ちます。@c
+それらのオブジェクトを表示するために使用される設定も、@c
+コンテキストによって保存されます。@c
+それらの設定を変更することにより、オブジェクトの見た目を変えることができます。
+
+コンテキストに保存されるプロパティには 2 種類あります:
+コンテキスト プロパティとグラフィカル オブジェクト プロパティです。@c
+コンテキスト プロパティは、コンテキスト全体に適用され、@c
+コンテキスト自体をどのように表示するかを制御します。@c
+対照的に、グラフィカル オブジェクト プロパティは、コンテキストの中に表示される@c
+ある特定のタイプのグラフィカル オブジェクトに適用されます。
+
+@code{\set} コマンドと @code{\unset} コマンドは、@c
+コンテキスト プロパティの値を変更するために使用されます。@c
+@code{\override} コマンドと @code{\revert} コマンドは、@c
+グラフィカル オブジェクト プロパティの値を変更するために使用されます。
+
+@ignore
+The syntax for this is
+
+@example
+\override @var{context}.@var{name} #'@var{property} = #@var{value}
+@end example
+
+Here @var{name} is the name of a graphical object, like
+@code{Stem} or @code{NoteHead}, and @var{property} is an internal
+variable of the formatting system (@q{grob property} or @q{layout
+property}). The latter is a symbol, so it must be quoted. The
+subsection @ref{Modifying properties}, explains what to fill in
+for @var{name}, @var{property}, and @var{value}. Here we only
+discuss the functionality of this command.
+
+The command
+
+@verbatim
+\override Staff.Stem #'thickness = #4.0
+@end verbatim
+
+@noindent
+makes stems thicker (the default is 1.3, with staff line thickness as a
+unit). Since the command specifies @code{Staff} as context, it only
+applies to the current staff. Other staves will keep their normal
+appearance. Here we see the command in action:
+
+@lilypond[quote,verbatim,relative=2,fragment]
+c4
+\override Staff.Stem #'thickness = #4.0
+c4
+c4
+c4
+@end lilypond
+
+The @code{\override} command changes the definition of the @code{Stem}
+within the current @code{Staff}. After the command is interpreted
+all stems are thickened.
+
+Analogous to @code{\set}, the @var{context} argument may be left out,
+causing the default context @code{Voice} to be used. Adding
+@code{\once} applies the change during one timestep only.
+
+@lilypond[quote,fragment,verbatim,relative=2]
+c4
+\once \override Stem #'thickness = #4.0
+c4
+c4
+@end lilypond
+
+The @code{\override} must be done before the object is
+started. Therefore, when altering @emph{Spanner} objects such as slurs
+or beams, the @code{\override} command must be executed at the moment
+when the object is created. In this example,
+
+@lilypond[quote,fragment,verbatim,relative=2]
+\override Slur #'thickness = #3.0
+c8[( c
+\override Beam #'thickness = #0.6
+c8 c])
+@end lilypond
+
+@noindent
+the slur is fatter but the beam is not. This is because the command for
+@code{Beam} comes after the Beam is started, so it has no effect.
+
+Analogous to @code{\unset}, the @code{\revert} command for a context
+undoes an @code{\override} command; like with @code{\unset}, it only
+affects settings that were made in the same context. In other words, the
+@code{\revert} in the next example does not do anything.
+
+@example
+\override Voice.Stem #'thickness = #4.0
+\revert Staff.Stem #'thickness
+@end example
+
+Some tweakable options are called @q{subproperties} and reside inside
+properties. To tweak those, use commands of the form
+
+@c leave this as a long long
+@example
+\override @var{context}.@var{name} #'@var{property} #'@var{subproperty} = #@var{value}
+@end example
+
+@noindent
+such as
+
+@example
+\override Stem #'(details beamed-lengths) = #'(4 4 3)
+@end example
+
+@end ignore
+
+@seealso
+内部リファレンス:
+@rinternals{Backend},
+@rinternals{All layout objects},
+@rinternals{OverrideProperty},
+@rinternals{RevertProperty},
+@rinternals{PropertySet}
+
+
+@knownissues
+
+バックエンドはオブジェクト プロパティのタイプ チェックを@c
+それほど厳密には行いません。@c
+Scheme 値の循環参照は、ハング アップまたはクラッシュ、@c
+あるいは両方を引き起こす可能性があります。
+
+
+
+@node set コマンド
+@subsection @code{\set} コマンド
+@translationof The set command
+
+@cindex properties (プロパティ)
+@funindex \set
+@cindex changing properties (プロパティを変更する)
+
+各コンテキストは @emph{プロパティ} の集合を持ちます。@c
+プロパティとは、コンテキストの中に保持されている変数です。@c
+コンテキスト プロパティは、@code{\set} コマンドによって変更されます。@c
+@code{\set} コマンドは以下のような構文を持ちます:
+
+@example
+\set @var{context}.@var{property} = #@var{value}
+@end example
+
+@var{value} は Scheme オブジェクトですので、@c
+@code{#} 文字を前に置く必要があります。
+
+通常、コンテキスト プロパティの名前は、@c
+小文字で始まる単語に大文字で始まる単語をつなげたものです。@c
+これらはたいてい音楽から記譜への翻訳を制御します
+-- 例えば、@code{localKeySignature} (臨時記号を表示するかどうかを決定します)
+や、@code{measurePosition} (小節線を表示するタイミングを決定します) です。@c
+コンテキスト プロパティは、楽曲の解釈をしている間、@c
+ずっと値を変更しておくことができます。@c
+@code{measurePosition} がその良い例です。@c
+コンテキスト プロパティは @code{\set} で変更されます。
+
+例えば、コンテキスト プロパティ @code{skipBars} が
+@code{#t} にセットされていれば、@c
+複小節休符は 1 つの小節に統合されます:
+
+@lilypond[quote,verbatim,relative=2,fragment]
+R1*2
+\set Score.skipBars = ##t
+R1*2
+@end lilypond
+
+@var{context} 引数が省略されている場合、@c
+プロパティはカレントの最下位のコンテキストにセットされます
+(一般に、@code{ChordNames}, @code{Voice}, @code{TabVoice},
+あるいは @code{Lyrics} です)。
+
+@lilypond[quote,verbatim,relative=2]
+\set Score.autoBeaming = ##f
+<<
+ {
+ e8 e e e
+ \set autoBeaming = ##t
+ e8 e e e
+ } \\ {
+ c8 c c c c8 c c c
+ }
+>>
+@end lilypond
+
+変更は @q{オンザフライ} (その場、その時々) で適用されるため、@c
+設定 @code{\set autoBeaming = ##t} は 2 番目の 8 分音符グループだけに@c
+効果を持ちます。
+
+最下位コンテキストが常に変更しようとしているプロパティを持っているとは@c
+限らないということに注意してください
+-- 例えば、@code{skipBars} プロパティをデフォルトの最下位コンテキスト
+(この場合は、@code{Voice} です) にセットしようと試みても、効果はありません。@c
+なぜなら、@code{skipBars} は @code{Score} コンテキストのプロパティだからです。
+
+@lilypond[quote,verbatim,relative=2]
+R1*2
+\set skipBars = ##t
+R1*2
+@end lilypond
+
+コンテキストは階層構造をとるため、音楽表記を囲っているコンテキスト
+-- 例えば、@code{Staff} -- が指定された場合、@c
+変更はカレントの @code{Staff} の中にあるすべての @code{Voice} に適用されます。
+
+@funindex \unset
+
+@code{\unset} コマンド:
+
+@example
+\unset @var{context}.@var{property}
+@end example
+
+@noindent
+は、@var{context} から @var{property} の定義を削除するために使用されます。@c
+このコマンドは、@var{context} の中にセットされた場合にのみ、定義を削除します。@c
+音楽表記を囲っているコンテキストにセットされたプロパティは、@c
+囲まれているコンテキストの中にある @code{\unset} では変更されません:
+
+@lilypond[quote,verbatim,relative=2]
+\set Score.autoBeaming = ##t
+<<
+ {
+ \unset autoBeaming
+ e8 e e e
+ \unset Score.autoBeaming
+ e8 e e e
+ } \\ {
+ c8 c c c c8 c c c
+ }
+>>
+@end lilypond
+
+@code{\set} と同様に、
+最下位コンテキストに対しては @var{context} 引数を指定する必要はありません。@c
+ですから、以下の 2 つの記述:
+
+@example
+\set Voice.autoBeaming = ##t
+\set autoBeaming = ##t
+@end example
+
+@noindent
+は、カレントの最下位コンテキストが @code{Voice} であれば、等価です。
+
+
+@cindex \once
+@code{\set} の前に @code{\once} を置くと、@c
+その設定は単一の時間ステップにだけ適用されます:
+
+@lilypond[quote,verbatim,relative=2]
+c4
+\once \set fontSize = #4.7
+c4
+c4
+@end lilypond
+
+利用可能なすべてのコンテキスト プロパティについての完全な記述は、@c
+内部リファレンスにあります。@c
+以下を参照してください:
+@ifhtml
+@rinternals{Tunable context properties}.
+@end ifhtml
+@ifnothtml
+Translation @expansion{} Tunable context properties.
+@end ifnothtml
+
+@seealso
+
+内部リファレンス:
+
+@rinternals{Tunable context properties}
+
+
+@cindex grob properties (グラフィカル オブジェクト プロパティ)
+@cindex properties, grob (グラフィカル オブジェクト プロパティ)
+@funindex \override
+
+
+@node override コマンド
+@subsection @code{\override} コマンド
+@translationof The override command
+
+特殊なタイプのコンテキスト プロパティがあります:
+グラフィカル オブジェクト記述です。@c
+グラフィカル オブジェクト記述には @code{StudlyCaps} という名前
+(大文字で始まります) が付けられています。@c
+これらは、関連リストとして、ある特定の種類のグラフィカル オブジェクト用の
+@q{デフォルト設定} を保持します。@c
+各グラフィカル オブジェクト記述の設定を調べるには、@c
+@file{scm/define-grobs.scm} を参照してください。@c
+各グラフィカル オブジェクト記述は @code{\override} を用いて変更します。
+
+@code{\override} は、実際のところ、簡略化した記述です。
+
+@example
+\override @var{context}.@var{GrobName} #'@var{property} = #@var{value}
+@end example
+
+@noindent
+これは、以下と等価です:
+
+@c leave this long line -gp
+@example
+\set @var{context}.@var{GrobName} =
+ #(cons (cons '@var{property} @var{value})
+ <previous value of @var{context}.@var{GrobName}>)
+@end example
+
+@code{context}.@code{GrobName} (alist) の値は、@c
+個々のグラフィカル オブジェクトのプロパティを初期化するために使用されます。@c
+グラフィカル オブジェクトは、Scheme スタイルの名前
+(小文字の単語を @code{-} でつないだもの) のプロパティを持ちます。@c
+グラフィカル オブジェクト プロパティの値は、@c
+フォーマット処理の間ずっと変更されています:
+基本的に、フォーマット処理は、@c
+コールバック関数を用いてプロパティを計算することに他なりません。@c
+
+例えば、@code{Stem} オブジェクトの @code{thickness} プロパティを@c
+オーバライドすることによって、符幹の太さを太くすることができます:
+
+@lilypond[quote,verbatim,relative=2]
+c4 c
+\override Voice.Stem #'thickness = #3.0
+c4 c
+@end lilypond
+
+If no context is specified in an @code{\override}, the bottom
+context is used:
+
+@lilypond[quote,verbatim,relative=2]
+{ \override Staff.Stem #'thickness = #3.0
+ <<
+ {
+ e4 e
+ \override Stem #'thickness = #0.5
+ e4 e
+ } \\ {
+ c4 c c c
+ }
+ >>
+}
+@end lilypond
+
+@funindex \revert
+@cindex reverting overrides (オーバライドを元に戻す)
+@cindex overrides, reverting (オーバライドを元に戻す)
+
+@code{\override} の効果は、@code{\revert} によって元に戻すことができます:
+
+@lilypond[quote,verbatim,relative=2]
+c4
+\override Voice.Stem #'thickness = #3.0
+c4 c
+\revert Voice.Stem #'thickness
+c4
+@end lilypond
+
+@code{\override} と @code{\revert} の効果は、@c
+その時点から影響を受けるコンテキストの中にある@c
+すべてのグラフィカル オブジェクトに適用されます:
+
+@lilypond[quote,verbatim,relative=2]
+{
+ <<
+ {
+ e4
+ \override Staff.Stem #'thickness = #3.0
+ e4 e e
+ } \\ {
+ c4 c c
+ \revert Staff.Stem #'thickness
+ c4
+ }
+ >>
+}
+@end lilypond
+
+@funindex \once
+@cindex overriding for only one moment (一時的にオーバライドする)
+
+@code{\once} を @code{\override} と共に用いることで、@c
+カレントの時間ステップだけに効果を与えることができます:
+
+@lilypond[quote,verbatim,relative=2]
+{
+ <<
+ {
+ \override Stem #'thickness = #3.0
+ e4 e e e
+ } \\ {
+ c4
+ \once \override Stem #'thickness = #3.0
+ c4 c c
+ }
+ >>
+}
+@end lilypond
+
+
+@ignore
+Commands which change output generally look like
+
+@example
+\override Voice.Stem #'thickness = #3.0
+@end example
+
+@noindent
+To construct this tweak we must determine these bits of information:
+
+@itemize
+@item the context: here @code{Voice}.
+@item the layout object: here @code{Stem}.
+@item the layout property: here @code{thickness}.
+@item a sensible value: here @code{3.0}.
+@end itemize
+
+Some tweakable options are called @q{subproperties} and reside inside
+properties. To tweak those, use commands in the form
+
+@example
+\override Stem #'(details beamed-lengths) = #'(4 4 3)
+@end example
+
+@cindex internal documentation
+@cindex finding graphical objects
+@cindex graphical object descriptions
+@cindex tweaking
+@funindex \override
+@cindex internal documentation
+
+For many properties, regardless of the data type of the property, setting the
+property to false ( @code{##f} ) will result in turning it off, causing
+LilyPond to ignore that property entirely. This is particularly useful for
+turning off grob properties which may otherwise be causing problems.
+
+We demonstrate how to glean this information from the notation manual
+and the program reference.
+@end ignore
+
+@seealso
+
+内部リファレンス:
+@rinternals{Backend}
+
+
+@node tweak コマンド
+@subsection @code{\tweak} コマンド
+@translationof The tweak command
+
+@funindex \tweak
+@cindex tweaking (調整)
+
+@code{\tweak} を用いたグラフィカル オブジェクト プロパティの変更は、@c
+コンテキストの中にあるすべてのグラフィカル オブジェクトに適用されます。@c
+しかしながら、@c
+影響を受けるコンテキストの中にあるすべてのグラフィカル オブジェクトではなく、@c
+1 つのグラフィカル オブジェクトだけに変更を適用したい場合もあります。@c
+そうするには、@code{\tweak} コマンドを用います。@c
+@code{\tweak} コマンドは以下のような構文を持ちます:
+
+@example
+\tweak #'@code{grob-property} #@code{value}
+@end example
+
+@code{\tweak} コマンドは、音楽の流れの中で
+@code{value} のすぐ後に現れるオブジェクトに変更を適用します。
+
+@ignore
+In some cases, it is possible to take a short-cut for tuning
+graphical objects. For objects that are created directly from
+an item in the input file, you can use the @code{\tweak} command.
+For example:
+
+@lilypond[relative=2,verbatim,quote]
+< c
+ \tweak #'color #red
+ d
+ g
+ \tweak #'duration-log #1
+ a
+> 4
+-\tweak #'padding #8
+-^
+@end lilypond
+
+
+
+But the main use of the @code{\tweak} command is to modify just
+one of a number of notation elements which start at the same musical
+moment, like the notes of a chord, or tuplet brackets which start
+at the same time.
+
+The @code{\tweak} command sets a property in the following object
+directly, without requiring the grob name or context to be
+specified. For this to work, it is necessary for the @code{\tweak}
+command to remain immediately adjacent to the object to which it is
+to apply after the input file has been converted to a music stream.
+This is often not the case, as many additional elements are inserted
+into the music stream implicitly. For example, when a note which is
+not part of a chord is processed, LilyPond implicitly inserts a
+@code{ChordEvent} event before the note, so separating the tweak
+from the note. However, if chord symbols are placed round the
+tweak and the note, the @code{\tweak} command comes after the
+@code{ChordEvent} in the music stream, so remaining adjacent to the
+note, and able to modify it.
+
+So, this works:
+
+@lilypond[relative=2,verbatim,quote]
+<\tweak #'color #red c>4
+@end lilypond
+
+@noindent
+but this does not:
+
+@lilypond[relative=2,verbatim,quote]
+\tweak #'color #red c4
+@end lilypond
+
+@end ignore
+
+調整コマンドの構文と使用方法についての紹介は、@c
+@rlearning{調整手段} を参照してください。
+
+同じようなオブジェクトがいくつか、同じ音楽タイミングで配置されている場合、@c
+@code{\override} コマンドでそれらの 1 つだけを変更することはできません
+-- @code{\tweak} コマンドを用いる必要があります。@c
+同じ音楽タイミングで複数出現する可能性があるオブジェクトには、@c
+以下のようなものがあります:
+
+@c TODO expand to include any further uses of \tweak
+@itemize
+@item 和音の中にある音符の符頭
+@item 1 つの音符に付けられるアーティキュレーション記号
+@item 和音の中にある音符の間に付けられるタイ
+@item 同時に始まる連符の囲み
+@end itemize
+
+@c TODO add examples of these
+
+@cindex chord, modifying one note in (和音の中にある音符の 1 つを変更する)
+
+以下の例では、和音の中にある符頭の 1 つの色を変更し、@c
+さらに他の符頭のタイプを変更しています:
+
+@lilypond[relative=2,verbatim,quote]
+< c
+ \tweak #'color #red
+ d
+ g
+ \tweak #'duration-log #1
+ a
+> 4
+@end lilypond
+
+@code{\tweak} を用いて、スラーを変更することができます:
+
+@lilypond[verbatim,quote,relative=1]
+c-\tweak #'thickness #5 ( d e f)
+@end lilypond
+
+
+@code{\tweak} コマンドが機能するためには、@c
+入力ファイルが音楽の流れに変換されたときに、@c
+@code{\tweak} コマンドのすぐ後に@c
+変更が適用されるオブジェクトが配置されている必要があります。
+LilyPond は、構文解釈処理時に、@c
+追加のオブジェクトを音楽の流れの中に挿入する場合があります。@c
+例えば、明示的には和音の一部になっていない音符を、@c
+LilyPond が音符の中に配置する場合があります。@c
+そのため、@code{\tweak} で変更される音符は、@c
+和音構造の中に配置されている必要があります:
+
+@lilypond[relative=2,verbatim,quote]
+\tweak #'color #red c4
+<\tweak #'color #red c>4
+@end lilypond
+
+@code{\tweak} コマンドは、@c
+入力ファイルの中で明示的に記述されていないオブジェクトを@c
+変更するために用いることはできません。@c
+特に、符幹、連桁、あるいは臨時記号を直接変更することはできません。@c
+なぜなら、それらは入力の中にある音楽要素の後ではなく、@c
+符頭の後に生成されるからです。@c
+さらに、音部記号や拍子記号を変更することもできません。@c
+なぜなら、コンテキストを指定するために必要とされる追加要素の自動挿入により、@c
+それらは前に配置された @code{\tweak} コマンドとは分離されるからです。@c
+
+記譜要素の前に複数の @code{\tweak} コマンドを配置することができます
+-- それらはすべて効果を持ちます:
+
+@lilypond[verbatim,quote,relative=1]
+c
+-\tweak #'style #'dashed-line
+-\tweak #'dash-fraction #0.2
+-\tweak #'thickness #3
+-\tweak #'color #red
+ \glissando
+f'
+@end lilypond
+
+入力ファイルのあるセクションから生成される音楽の流れ
+-- 自動的に挿入される要素も含めて --
+が、検証されます。@c
+@rextend{Displaying music expressions} を参照してください。@c
+これは、@code{\tweak} コマンドによって変更されるオブジェクトを決定するとき、@c
+あるいは、@c
+@code{\tweak} の適用で入力を調整する方法を決定するときに役に立つかもしれません。
+
+
+@seealso
+学習マニュアル:
+@rlearning{調整手段}
+
+拡張:
+@rextend{Displaying music expressions}
+
+
+@knownissues
+
+@cindex tweaks in a variable (変数の中での調整)
+@code{\tweak} コマンドを変数の中で用いることはできません。
+
+@cindex tweaks in lyrics (歌詞の中での調整)
+@code{\tweak} コマンドを @code{\lyricmode} の中で用いることはできません。
+
+@cindex tweaking control points (制御ポイントを調整する)
+@cindex control points, tweaking (制御ポイントを調整する)
+
+@code{\tweak} コマンドは、和音の中で生成される複数のタイのうち、@c
+最初のタイだけに適用されます。
+
+
+@node set 対 override
+@subsection @code{\set} 対 @code{\override}
+@translationof set versus override
+
+TODO -- This section is probably unnecessary now.
+
+@ignore
+We have seen two methods of changing properties: @code{\set} and
+@code{\override}. There are actually two different kinds of
+properties.
+
+@code{fontSize} is a special property: it is equivalent to
+entering @code{\override ... #'font-size} for all pertinent
+objects. Since this is a common change, the special
+property (modified with @code{\set}) was created.
+
+@end ignore
+
+
+@node 連想配列を変更する
+@subsection 連想配列を変更する
+@translationof Modifying alists
+
+ユーザが変更可能なプロパティの中には、@c
+内部的には @emph{連想配列} として存在しているものがあります
+-- 連想配列は @emph{キー} と @emph{値} のペアの配列を保持します。@c
+連想配列の構造は下記のとおりです:
+
+@example
+'((@var{キー1} . @var{値1})
+ (@var{キー2} . @var{値2})
+ (@var{キー3} . @var{値3})
+ @dots{})
+@end example
+
+ある連想配列がグラフィカル オブジェクト プロパティまたは
+@code{\paper} 変数である場合、@c
+その連想配列の個々のキーを、他のキーに影響を与えることなく、@c
+変更することができます。
+
+例えば、譜グループの中にある隣り合う譜間のスペースを減らすには、@c
+@code{StaffGrouper} グラフィカル オブジェクトの
+@code{staff-staff-spacing} プロパティを使用します。@c
+このプロパティは 4 つのキー
+-- @code{basic-distance}, @code{minimum-distance},
+@code{padding}, それに @code{stretchability} --
+を持つ連想配列です。@c
+このプロパティの標準設定は、@c
+内部リファレンスの @qq{Backend} セクションでリストアップされています
+(@rinternals{StaffGrouper} を参照してください):
+
+@example
+'((basic-distance . 9)
+ (minimum-distance . 7)
+ (padding . 1)
+ (stretchability . 5))
+@end example
+
+譜間のスペースを小さくする方法の 1 つは、@c
+@code{basic-distance} キーの値 (@code{9}) を
+@code{minimum-distance} キーの値 (@code{7}) 近くまで減らすことです。@c
+個々のキーを変更するには、@emph{ネストされた宣言} を使います:
+
+@c KEEP LY
+@lilypond[quote,verbatim]
+% デフォルトの譜間スペース
+\new PianoStaff <<
+ \new Staff { \clef treble c''1 }
+ \new Staff { \clef bass c1 }
+>>
+
+% 譜間スペースを減らします
+\new PianoStaff \with {
+ % this is the nested declaration
+ \override StaffGrouper #'staff-staff-spacing #'basic-distance = #7
+} <<
+ \new Staff { \clef treble c''1 }
+ \new Staff { \clef bass c1 }
+>>
+@end lilypond
+
+ネストされた宣言は、プロパティの他のキーに変更を加えることなく、@c
+指定されたキー (上の例では @code{basic-distance}) を更新します。
+
+今度は、譜を重ならない範囲でできる限り近づけたいとします。@c
+最も簡単な方法は、連想配列の 4 つのキーすべてを 0 にセットすることです。@c
+しかしながら、4 つのネストされた宣言を記述する必要はありません。@c
+1 つの宣言でプロパティを丸ごと再定義することができます:
+
+@lilypond[quote,verbatim]
+\new PianoStaff \with {
+ \override StaffGrouper #'staff-staff-spacing =
+ #'((basic-distance . 0)
+ (minimum-distance . 0)
+ (padding . 0)
+ (stretchability . 0))
+} <<
+ \new Staff { \clef treble c''1 }
+ \new Staff { \clef bass c1 }
+>>
+@end lilypond
+
+連想配列の再定義でリストアップされなかったキーは、@c
+@emph{セットされなかった場合のデフォルト値} にリセットされます。@c
+@code{staff-staff-spacing} の場合、@c
+セットされなかったキーは 0 にリセットされます
+(@code{stretchability} は例外で、セットされなかった場合、@c
+@code{basic-distance} にリセットされます)。@c
+このため、以下の 2 つの宣言は等価です:
+
+@example
+\override StaffGrouper #'staff-staff-spacing =
+ #'((basic-distance . 7))
+
+\override StaffGrouper #'staff-staff-spacing =
+ #'((basic-distance . 7)
+ (minimum-distance . 0)
+ (padding . 0)
+ (stretchability . 7))
+@end example
+
+連想配列の再定義でリストアップされなかったキーがあることにより、@c
+初期化ファイルでセットされたり、@c
+入力ファイルがコンパイルされるときに読み込まれた@c
+標準設定が (意図せずに) 削除される可能性があります。@c
+上の例では、@code{padding} と @code{minimum-distance} の標準設定
+(@file{scm/define-grobs.scm} で定義されます) は、@c
+@emph{セットされなかった場合のデフォルト値} (両方とも 0) にリセットされます。@c
+プロパティや (任意のサイズ) 連想配列を定義した場合、@c
+セットされなかったキー値はすべて @emph{セットされなかった場合のデフォルト値}
+にリセットされます。@c
+そうすることを意図しているのでない限り、@c
+ネストされた宣言を用いてキー値を個々に更新する方が安全です。
+
+@warning{ネストされた宣言は、コンテキスト プロパティ連想配列
+(@code{beamExceptions}, @code{keySignature}, @code{timeSignatureSettings} 等)
+に対しては機能しません。@c
+これらのプロパティを変更するには、@c
+連想配列として丸ごと再定義するしかありません。}
+
+
+@node 役に立つコンセプトとプロパティ
+@section 役に立つコンセプトとプロパティ
+@translationof Useful concepts and properties
+
+@menu
+* 入力モード::
+* 向きと配置::
+* コンテキスト レイアウトの順序::
+* 距離と距離の単位::
+* 譜記号プロパティ::
+* スパナ::
+* オブジェクトの可視性::
+* ライン スタイル::
+* オブジェクトを回転させる::
+@end menu
+
+
+@node 入力モード
+@subsection 入力モード
+@translationof Input modes
+
+入力ファイルの中に保持されている記譜を解釈する方法は、@c
+カレントの入力モードによって決定されます。
+
+@strong{コード モード}
+
+このモードは @code{\chordmode} コマンドで有効になり、@c
+入力はコード記譜法の構文で解釈されるようになります。@c
+@ref{Chord notation} を参照してください。@c
+コードは、譜面上に音符として描画されます。
+
+コード モードは @code{\chords} コマンドでも有効になります。@c
+このコマンドは新たに @code{ChordNames} コンテキストも作成します。@c
+入力はコード記譜法の構文で解釈され、@c
+さらに @code{ChordNames} コンテキストの中にコード ネームとして描画されます。@c
+@ref{Printing chord names} を参照してください。
+
+@strong{ドラム モード}
+
+このモードは @code{\drummode} コマンドで有効になり、@c
+入力はドラム記譜法の構文で解釈されるようになります。@c
+@ref{Basic percussion notation} を参照してください。
+
+また、ドラム モードは @code{\drums} コマンドでも有効になります。@c
+このモードも新たに @code{DrumStaff} コンテキストを作成し、@c
+コマンドの後に続く入力をドラム記譜法の構文で解釈して、@c
+ドラム譜上にドラム記号として描画します。@c
+@ref{Basic percussion notation} を参照してください。
+
+@strong{音型モード}
+
+このモードは @code{\figuremode} コマンドで有効になり、@c
+入力は通奏低音の構文で解釈されるようになります。@c
+@ref{Entering figured bass} を参照してください。
+
+また、音型モードは @code{\figures} コマンドでも有効になります。@c
+このモードも新たに @code{FiguredBass} コンテキストを作成し、@c
+コマンドの後に続く入力を通奏低音の構文で解釈して、@c
+@code{FiguredBass} コンテキストの中に通奏低音記号として描画します。@c
+@ref{Introduction to figured bass} を参照してください。
+
+@strong{フレットとタブ モード}
+
+フレット記号とタブ記号を入力するための特別な入力モードはありません。
+
+タブ図を作成するには、音符モードで音符や和音を入力して、@c
+それらを @code{TabStaff} コンテキストの中に描画します。@c
+@ref{Default tablatures} を参照してください。
+
+譜の上にフレット図を作成するには、2 つの方法があります。@c
+@code{FretBoards} コンテキスト
+(@ref{Automatic fret diagrams} を参照してください) を用いるか、@c
+あるいは、音符の上に @code{\fret-diagram} コマンド
+(@ref{Fret diagram markups}) を用いてフレット図をマークアップとして@c
+入力するかのどちらかになります。
+
+@strong{歌詞モード}
+
+このモードは @code{\lyricmode} コマンドで有効になり、@c
+入力はオプションで演奏時間を持つ歌詞音節として解釈され、@c
+歌詞識別子に関連付けされます。@c
+通奏低音の構文で解釈されるようになります。@c
+@ref{Vocal music} を参照してください。
+
+また、歌詞モードは @code{\addlyrics} コマンドでも有効になります。@c
+このモードも新たに @code{Lyrics} コンテキストを作成し、@c
+暗黙的に @code{lyricsto} コマンドを作成します。@c
+@code{lyricsto} は、後に続く歌詞を、前にある音楽に関連付けします。
+
+@strong{マークアップ モード}
+
+このモードは @code{\markup} コマンドで有効になり、@c
+入力はマークアップの構文で解釈されるようになります。@c
+@ref{Text markup commands} を参照してください。
+
+@c silly work-around for texinfo broken-ness
+@c (@strong{Note...} causes a spurious cross-reference in Info)
+@strong{音符モード}
+
+このモードはデフォルトのモードであり、@c
+@code{\notemode} コマンドで有効にすることもできます。@c
+入力はピッチ、演奏時間、マークアップなどとして解釈され、@c
+譜面上に音楽記譜として写植されます。
+
+通常、音符モードを明示的に指定する必要はありません。@c
+しかしながら、ある特定の状況
+-- 例えば、歌詞モード、和音モード、あるいは他のモードを使っていて、@c
+音符モードの構文でしか入力できないものを入力しようとしている場合 --
+では、音符モードを明示的に指定することが有用な場合があります。
+
+例えば、合唱曲で節ごとに強弱記号を指定するには、@c
+音符モードで入力して記号を解釈させる必要があります:
+
+@lilypond[verbatim,relative=2,quote]
+{ c4 c4 c4 c4 }
+\addlyrics {
+ \notemode{\set stanza = \markup{ \dynamic f 1. } }
+ To be sung loudly
+}
+\addlyrics {
+ \notemode{\set stanza = \markup{ \dynamic p 2. } }
+ To be sung quietly
+}
+@end lilypond
+
+
+@node 向きと配置
+@subsection 向きと配置
+@translationof Direction and placement
+
+楽譜を写植しているとき、多くの要素の向きと配置には選択の余地があります。@c
+例えば、音符の符幹は上向きあるいは下向きにすることができ、@c
+歌詞、強弱記号、他の表現記号は譜の上あるいは下に配置することができ、@c
+テキストは左揃え、右揃え、あるいは中央揃えにすることができる、などです。@c
+これらの選択のほとんどは LilyPond によって自動的に決定されますが、@c
+強制的に向きや配置を指定することが望ましい場合もあります。
+
+@strong{アーティキュレーションの方向指示子}
+
+デフォルトでは、アーティキュレーションのいくつかの向きは常に上または下に@c
+なっています (例えば、強弱記号やフェルマータ)。@c
+一方、他のアーティキュレーションは、符幹の向きによって、@c
+向きが上下します (スラーやアクセントなど)。
+
+@c TODO Add table showing these
+
+アーティキュレーションの前に @emph{方向指示子} を置くことで、@c
+デフォルトの向きをオーバライドすることができます。@c
+3 つの方向指示子があります: @code{^} (@qq{上向き} を意味します)、@c
+@code{_} (@qq{下向き} を意味します)、@c
+それに @code{-} (@qq{デフォルトの向き} を意味します) です。@c
+通常、方向指示子は省略することができ、その場合は @code{-} と見なされます。@c
+しかしながら、以下のものの前には @strong{常に} 方向指示子を置く必要があります:
+
+@itemize
+@item @code{\tweak} コマンド
+@item @code{\markup} コマンド
+@item @code{\tag} コマンド
+@item 文字列マークアップ。例えば、-"string"
+@item 運指指示。例えば、@code{-1}
+@item アーティキュレーションの短縮記法。例えば、@code{-.}, @code{->}, @code{--}
+@end itemize
+
+方向指示子は、その後にくる音符だけに効果を持ちます:
+
+@lilypond[verbatim,quote,relative=2]
+c2( c)
+c2_( c)
+c2( c)
+c2^( c)
+@end lilypond
+
+@strong{方向プロパティ}
+
+多くのレイアウト オブジェクトの位置や向きは、@c
+@code{direction} プロパティによって制御されます。
+
+@code{direction} プロパティの値は、@c
+@code{1} (@qq{上向き} あるいは @qq{上} を意味します)、@c
+@code{-1} (@qq{下向き} あるいは @qq{下} を意味します)
+にセットすることができます。@c
+記号 @code{UP} と @code{DOWN} は、@c
+それぞれ @code{1} と @code{-1} の代わりに用いることができます。@c
+デフォルトの向きを指定するには、@c
+@code{direction} を @code{0} あるいは @code{CENTER} にセットします。@c
+このような方法を用いる代わりに、@c
+多くの場合で、向きを指定するための前置コマンドが存在しています。@c
+それらはすべて以下のような形式をとります:
+
+@noindent
+@code{\xxxUp}, @code{xxxDown}, @code{xxxNeutral}
+
+@noindent
+ここで、@code{xxxNeutral} は @qq{デフォルトの向きを使用する}
+ことを意味します。@c
+@rlearning{譜表内部オブジェクト} を参照してください。
+
+いくつかのケースでは
+-- 一般的な例としてはアルペジオしかありません --
+@code{direction} プロパティの値は、@c
+オブジェクトが親オブジェクトの左右どちらに配置されるかを指定します。
+この場合、@code{-1} あるいは @code{LEFT} は @qq{左側} を意味し、@c
+@code{1} あるいは @code{RIGHT} は @qq{右側} を意味します。@c
+@code{0} あるいは @code{CENTER} は、前のケースと同様に、@c
+@qq{デフォルトの向きを使用する} ことを意味します。
+
+@ignore
+These all have side-axis set to #X
+AmbitusAccidental - direction has no effect
+Arpeggio - works
+StanzaNumber - not tried
+TrillPitchAccidental - not tried
+TrillPitchGroup - not tried
+@end ignore
+
+これらの指示子は、キャンセルされるまで効果を持ちます。
+
+@lilypond[verbatim,quote,relative=2]
+c2( c)
+\slurDown
+c2( c)
+c2( c)
+\slurNeutral
+c2( c)
+@end lilypond
+
+
+@node コンテキスト レイアウトの順序
+@subsection コンテキスト レイアウトの順序
+@translationof Context layout order
+
+@cindex contexts, layout order (コンテキスト レイアウトの順序)
+
+通常、コンテキストは、入力ファイルの中で出現した順番に、@c
+システムの上から下へと配置されます。@c
+コンテキストがネストされている場合、@c
+入力ファイルの中で内側にネストされたコンテキストが@c
+外側のコンテキストの @q{accepts} リストの中に含まれているのなら、@c
+外側のコンテキストの内部に配置されます。@c
+外側のコンテキストの @qq{accepts} リストに含まれていない場合、@c
+外側のコンテキストの内部ではなく、下に再配置されます。
+
+入力ファイルの中で、@c
+出現したコマンドを保持する適当なコンテキストが存在しない場合、@c
+コンテキストが暗黙的に作成されます。@c
+これは、予期しない譜やスコアを生み出す可能性があります。
+
+コンテキストが配置される順序や @qq{accepts} リストは変更することができます。@c
+@ref{コンテキストを揃える} を参照してください。
+
+@seealso
+アプリケーション使用方法:
+@rprogram{余計な譜が表示される}
+
+
+@node 距離と距離の単位
+@subsection 距離と距離の単位
+@translationof Distances and measurements
+
+@cindex distances, absolute (絶対距離)
+@cindex distances, scaled (相対距離)
+
+@funindex \mm
+@funindex \cm
+@funindex \in
+@funindex \pt
+
+LilyPond における距離には 2 つのタイプがあります: 絶対距離と相対距離です。
+
+絶対距離は、マージン、インデント、それにその他の詳細なページ レイアウトを@c
+指定するために使用され、デフォルトではミリメートルで指定されます。
+距離は以下の単位で指定することもできます: @code{\mm}, @code{\cm},
+@code{\inch} (インチ), それに @code{\pt} (ポイント。1/73.27 インチ) です。@c
+また、ページ レイアウトにおける距離は、@c
+値の後ろに @code{\staff-space} を付けることにより、
+比率で指定することもできます (次の段落を参照してください)。@c
+ページ レイアウトについての詳細は、@c
+@ref{ページ レイアウト} に記述されています。
+
+相対距離は常に譜スペースを単位として指定されます
+ -- 稀に、半譜スペースが使用されます。@c
+譜スペースは隣り合う 2 本の譜線間の距離です。@c
+グローバル譜サイズを設定することにより、@c
+デフォルト値をグローバルに変更することができます。@c
+また、@code{StaffSymbol} の @code{staff-space} プロパティを@c
+変更することにより、譜スペースをローカルにオーバライドすることもできます。@c
+相対距離は、グローバル譜サイズや @code{StaffSymbol} の @code{staff-space}
+プロパティのいずれかが変更されると、自動的に変更されます。@c
+しかしながら、フォントの比率はグローバル譜サイズが変更された場合にのみ、@c
+自動的に変更されます。@c
+そのため、グローバル譜サイズは@c
+容易に描画される楽譜全体のサイズを変更することができます。@c
+グローバル譜サイズを設定するための手段については、@c
+@ref{譜サイズを設定する} を参照してください。
+
+@funindex magstep
+
+楽譜のある部分だけの比率を変更したいのなら
+-- 例えば、オッシア セクションや脚注で --
+単純にグローバル譜サイズを変更するわけにはいきません。@c
+なぜなら、グローバル譜サイズを変更すると、楽譜全体が影響を受けるからです。@c
+そのような場合、@code{StaffSymbol} の @code{staff-space} プロパティと@c
+フォントのサイズをオーバライドすることにより、サイズを変更します。@c
+フォント サイズの変更を @code{staff-space} 単位の変更に変換するには、@c
+Scheme 関数 @code{magstep} を使用することができます。@c
+この関数の説明と使用例については、@c
+@rlearning{オブジェクトの長さと太さ} を参照してください。
+
+
+@seealso
+学習マニュアル:
+@rlearning{オブジェクトの長さと太さ}
+
+記譜法リファレンス:
+@ref{ページ レイアウト},
+@ref{譜サイズを設定する}
+
+
+@node 譜記号プロパティ
+@subsection 譜記号プロパティ
+@translationof Staff symbol properties
+
+@cindex adjusting staff symbol (譜記号を調節する)
+@cindex drawing staff symbol (譜記号を描画する)
+@cindex staff symbol, setting of (譜記号の設定)
+
+@c TODO Extend or remove this section. See also NR 1.6.2 Staff symbol
+@c Need to think of uses for these properties. Eg 'line-positions
+@c is used in a snippet to thicken centre line.
+@c If retained, add @ref to here in 1.6.2 -td
+
+譜線の垂直位置と譜線の本数を同時に定義することができます。@c
+以下の例が示すように、音符の位置は譜線の位置には影響されません。
+
+@warning{@code{'line-positions} プロパティは @code{'line-count} を@c
+オーバライドします。@c
+譜線の本数は、@code{'line-positions} の値リストの中にある要素数によって、@c
+暗黙的に定義されます。}
+
+@lilypond[verbatim,quote,relative=1]
+\new Staff \with {
+ \override StaffSymbol #'line-positions = #'(7 3 0 -4 -6 -7)
+}
+{ a4 e' f b | d1 }
+@end lilypond
+
+譜の幅を変更することができます。@c
+単位は譜スペースです。@c
+譜内部のオブジェクトのスペースは、この設定によって影響を受けません。
+
+@lilypond[verbatim,quote,relative=1]
+\new Staff \with {
+ \override StaffSymbol #'width = #23
+}
+{ a4 e' f b | d1 }
+@end lilypond
+
+
+@node スパナ
+@subsection スパナ
+@translationof Spanners
+
+多くの音楽記譜オブジェクトは、複数の音符あるいは複数の小節にまたがって、@c
+広がりを持ちます。@c
+例としては、スラー、連桁、連譜の囲み、volta 繰り返しの囲み、クレッシェンド、@c
+トリル、それにグリッサンドがあります。@c
+そのようなオブジェクトは総称して @qq{スパナ} と呼ばれ、@c
+それらの見た目と振る舞いを制御するための特殊なプロパティを持ちます。@c
+これらのプロパティのいくつかは、すべてのスパナに共通しています。@c
+他のプロパティはスパナの部分集合に限定されています。
+
+すべてのスパナは @code{spanner-interface} をサポートします。@c
+いくつかのスパナ -- 2 つのオブジェクトの間に直線を描くもの -- は、さらに、@c
+@code{line-spanner-interface} をサポートします。
+
+
+@unnumberedsubsubsec @code{spanner-interface} を使用する
+
+このインターフェイスは、@c
+いくつかのスパナに適用される 2 つのプロパティを提供します。
+
+@strong{@i{@code{minimum-length} プロパティ}}
+
+スパナの最短の長さは、@code{minimum-length} プロパティによって指定されます。@c
+通常、このプロパティを増加させると、@c
+スパナの両端の間にある音符の間隔は増加します。@c
+しかしながら、このオーバライドは多くのスパナで効果を持ちません。@c
+なぜなら、それらの長さは他の要素によって決定されるからです。@c
+以下に効果を持つ例を 2, 3 示します。
+
+@ignore
+Works for:
+ Tie
+ MultiMeasureRest
+ Hairpin
+ Slur
+ PhrasingSlur
+
+Works as long as callback is made:
+ Glissando
+ Beam
+
+Works not at all for:
+ LyricSpace
+ LyricHyphen
+ LyricExtender
+ TextSpanner
+ System
+
+@end ignore
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=2]
+a~a
+a
+% タイの長さを増加させます
+-\tweak #'minimum-length #5
+~a
+@end lilypond
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=2]
+a1
+\compressFullBarRests
+R1*23
+% 休符バーの長さを増加させます
+\once \override MultiMeasureRest #'minimum-length = #20
+R1*23
+a1
+@end lilypond
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=2]
+a \< a a a \!
+% ヘアピンの長さを増加させます
+\override Hairpin #'minimum-length = #20
+a \< a a a \!
+@end lilypond
+
+さらに、このオーバライドはスラーとフレージング スラーの長さを@c
+増加させるためにも使用されます:
+
+@lilypond[verbatim,quote,relative=2]
+a( a)
+a
+-\tweak #'minimum-length #5
+( a)
+
+a\( a\)
+a
+-\tweak #'minimum-length #5
+\( a\)
+@end lilypond
+
+いくつかのレイアウト オブジェクトでは、@c
+@code{minimum-length} プロパティは、@c
+@code{set-spacing-rods} プロシージャが明示的に呼び出された場合にのみ@c
+効果を持ちます。@c
+このプロシージャを呼び出すには、@code{springs-and-rods} プロパティに@c
+@code{ly:spanner::set-spacing-rods} をセットしておく必要があります。@c
+例えば、グリッサンドの最短長は、@c
+@code{springs-and-rods} プロパティが設定されていない限り、@c
+効果を持ちません:
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=1]
+% デフォルト
+e \glissando c'
+
+% 単独では効果を持ちません
+\once \override Glissando #'minimum-length = #20
+e, \glissando c'
+
+% 以下の両方のオーバライドが存在する場合にのみ、効果を持ちます
+\once \override Glissando #'minimum-length = #20
+\once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
+e, \glissando c'
+@end lilypond
+
+@code{Beam} オブジェクトでも同じことが言えます:
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=1]
+% 単独では効果を持ちません
+\once \override Beam #'minimum-length = #20
+e8 e e e
+
+% 以下の両方のオーバライドが存在する場合にのみ、効果を持ちます
+\once \override Beam #'minimum-length = #20
+\once \override Beam #'springs-and-rods = #ly:spanner::set-spacing-rods
+e8 e e e
+@end lilypond
+
+
+@strong{@i{@code{to-barline} プロパティ}}
+
+@code{spanner-interface} の 2 番目に有用なプロパティは
+@code{to-barline} です。@c
+デフォルトではこのプロパティは真であり、@c
+小節の最初の音符のところで終了するヘアピンや他のスパナは@c
+直前の小節線のところで終了させられます。@c
+偽に設定すると、スパナは小節線を越えて、音符のところで終了します:
+
+@lilypond[verbatim,quote,relative=2]
+a \< a a a a \! a a a \break
+\override Hairpin #'to-barline = ##f
+a \< a a a a \! a a a
+@end lilypond
+
+このプロパティはすべてのスパナに対して効果を持つわけではありません。@c
+例えば、スラーやフレージング スラー、@c
+あるいは小節線で終了させることに意味が無い他のスパナに対して、@c
+このプロパティを @code{#t} に設定しても効果がありません。
+
+
+@unnumberedsubsubsec @code{line-spanner-interface} を使用する
+
+@code{line-spanner-interface} をサポートするオブジェクトには@c
+以下のものがあります:
+
+@itemize
+@item @code{DynamicTextSpanner}
+@item @code{Glissando}
+@item @code{TextSpanner}
+@item @code{TrillSpanner}
+@item @code{VoiceFollower}
+@end itemize
+
+これらのスパナのステンシルを描画する責任を持つルーチンは
+@code{ly:line-interface::print} です。@c
+このルーチンはスパナの両端の位置を綿密に決定し、@c
+求めに応じたスタイルでそれらの間に線を描きます@c
+スパナの両端の位置はオンザフライ (その場、その時々) で算出されますが、@c
+それらの Y 座標をオーバライドすることができます。@c
+指定する必要のあるプロパティは、@c
+プロパティ階層内で 2 階層下にネストされていますが、@c
+この @code{\override} コマンドは非常にシンプルです:
+
+@lilypond[relative=2,quote,verbatim]
+e2 \glissando b
+\once \override Glissando #'(bound-details left Y) = #3
+\once \override Glissando #'(bound-details right Y) = #-2
+e2 \glissando b
+@end lilypond
+
+@code{Y} プロパティの単位は @code{staff-space} であり、@c
+譜の中央線が 0 位置です。@c
+グリッサンドでは、スパナの両端は各符頭の中心であり、@c
+@code{Y} はそれらの点を上下させます。
+
+@code{Y} が設定されていない場合、@c
+値はスパナの両端の垂直位置から算出されます。
+
+改行の場合、終点の @code{Y} の値は @code{bound-details} の@c
+部分リスト @code{left-broken} や @code{right-broken} のによって指定されます。@c
+例を示します:
+
+@lilypond[relative=2,ragged-right,verbatim,fragment]
+\override Glissando #'breakable = ##t
+\override Glissando #'(bound-details right-broken Y) = #-3
+c1 \glissando \break
+f1
+@end lilypond
+
+
+@code{bound-details} プロパティの部分リスト @code{left} や @code{right} の@c
+下位プロパティのいくつかは、@code{Y} と同じ方法で変更することができます:
+
+@table @code
+@item Y
+終点の Y 座標を、@c
+譜の中央線からの @code{staff-space} オフセットで、設定します。@c
+デフォルトでは、終点オブジェクトの中心です。@c
+ですから、グリッサンドは符頭の中心に向かって進みます。
+
+水平方向に広がるスパナ -- テキスト スパナやトリル スパナなど --
+では、この値は 0 に固定されています。
+
+@item attach-dir
+スパナのラインがオブジェクトの左右どちらから始まり、終わるのかを決定します。@c
+@code{-1} (あるいは @code{LEFT}) であれば、@c
+ラインは符頭の左側から開始あるいは終了します。
+
+@item X
+終点の絶対 X 座標です。@c
+通常、オンザフライ (その場、その時々) で算出され、@c
+これをオーバライドしてもあまり意味がありません。
+
+@item stencil
+ライン スパナは開始点や終了点で記号を持つ場合があり、@c
+その記号はこのサブ プロパティに保持されています。@c
+このサブ プロパティは内部で使用するためのものです。@c
+このサブ プロパティの代わりに @code{text} を使用することを推奨します。
+
+@item text
+ステンシルを作成するために評価されるマークアップです。@c
+水平スパナに @i{cresc.}, @i{tr} それに他のテキストを配置するために使用されます。
+
+@lilypond[quote,ragged-right,fragment,relative=2,verbatim]
+\override TextSpanner #'(bound-details left text)
+ = \markup { \small \bold Slower }
+c2\startTextSpan b c a\stopTextSpan
+@end lilypond
+
+@item stencil-align-dir-y
+@item stencil-offset
+これらの 1 つを設定しなければ、@c
+ステンシルは、@code{X} と @code{Y} サブ プロパティで定義されたとおりに、@c
+ラインに中央揃えで、終点に配置されます。@c
+@code{stencil-align-dir-y} あるいは @code{stencil-offset} の@c
+どちらかを設定すると、@c
+記号が上下します:
+
+@lilypond[relative=1,fragment,verbatim]
+\override TextSpanner
+ #'(bound-details left stencil-align-dir-y) = #-2
+\override TextSpanner
+ #'(bound-details right stencil-align-dir-y) = #UP
+
+\override TextSpanner
+ #'(bound-details left text) = #"ggg"
+\override TextSpanner
+ #'(bound-details right text) = #"hhh"
+c4^\startTextSpan c c c \stopTextSpan
+@end lilypond
+
+予期される結果とは逆に、@c
+負の値はテキストを @emph{上げる} ということに注意してください。@c
+なぜなら、@code{-1} あるいは @code{DOWN} は@c
+テキストの @emph{下端} をスパナ ラインに揃え、
+@code{1} あるいは @code{UP} は@c
+テキストの @emph{上端} をスパナ ラインに揃えるからです。
+
+@item arrow
+このサブ プロパティに @code{#t} をセットするとラインの終点に矢印が描かれます。
+
+@item padding
+このサブ プロパティはラインの終点と実際の終点の間のスペースを制御します。@c
+パディングがなければ、グリッサンドは両端の符頭の中心から描かれます。
+
+@end table
+
+音楽関数 @code{\endSpanners} は@c
+直後の音符から始まるスパナをすぐに終了させます。@c
+ちょうど 1 音符分でスパナを終了させますが、@c
+@code{to-barline} が真で、かつ、次の音符の前に小節線がある場合は@c
+その小節線のところでスパナを終了させます。
+
+@lilypond[verbatim,quote,ragged-right,relative=2,fragment]
+\endSpanners
+c2 \startTextSpan c2 c2
+\endSpanners
+c2 \< c2 c2
+@end lilypond
+
+@code{\endSpanners} を使用している場合、@c
+@code{\startTextSpan} を @code{\endTextSpan} で閉じる必要はなく、@c
+ヘアピンを @code{\!} で閉じる必要もありません。
+
+
+@seealso
+内部リファレンス:
+@rinternals{TextSpanner},
+@rinternals{Glissando},
+@rinternals{VoiceFollower},
+@rinternals{TrillSpanner},
+@rinternals{line-spanner-interface}
+
+
+@node オブジェクトの可視性
+@subsection オブジェクトの可視性
+@translationof Visibility of objects
+
+@cindex objects, visibility of (オブジェクトの可視性)
+@cindex grobs, visibility of (グラフィカル オブジェクトの可視性)
+@cindex visibility of objects (オブジェクトの可視性)
+
+レイアウト オブジェクトの可視性を制御する主な方法は 4 つあります:
+オブジェクトのステンシルを削除する方法、オブジェクトを透明にする方法、@c
+オブジェクトの色を白にする方法、あるいは、@c
+オブジェクトの @code{break-visibility} プロパティをオーバライドする方法です。
+最初の 3 つの方法はすべてのレイアウト オブジェクトに適用されますが、@c
+最後の方法はいくつかの -- @emph{改行可能な} オブジェクト --
+だけに適用されます。@c
+学習マニュアルでは、これら 4 つのテクニックについて紹介しています。@c
+@rlearning{オブジェクトの可視性と色} を参照してください。
+
+さらに、特定のレイアウト オブジェクト特有のテクニックがいくつかあります。@c
+それらについては、特別な考慮でカバーされています。
+
+@menu
+* ステンシルを削除する::
+* オブジェクトを透明にする::
+* オブジェクトを白で描く::
+* break-visibility を用いる::
+* 特別な考慮を必要とするもの::
+@end menu
+
+
+@node ステンシルを削除する
+@unnumberedsubsubsec ステンシルを削除する
+@translationof Removing the stencil
+
+@cindex stencil, removing (ステンシルを削除する)
+
+レウアウト オブジェクトはそれぞれステンシル プロパティを持ちます。@c
+デフォルトでは、@c
+このプロパティはそのオブジェクトを描画する特殊な関数にセットされています。@c
+このプロパティが @code{#f} にオーバライドされた場合、@c
+関数は呼び出されず、そのオブジェクトは描画されません。@c
+@code{\rever} でデフォルトの動作に戻すことができます。
+
+@lilypond[quote,verbatim,relative=1]
+a1 a
+\override Score.BarLine #'stencil = ##f
+a a
+\revert Score.BarLine #'stencil
+a a a
+@end lilypond
+
+@node オブジェクトを透明にする
+@unnumberedsubsubsec オブジェクトを透明にする
+@translationof Making objects transparent
+
+@cindex transparent, making objects (オブジェクトを透明にする)
+
+レイアウト オブジェクトはそれぞれ @code{transparent} プロパティを持っていて、@c
+デフォルトでは @code{#f} にセットされています。@c
+@code{#t} にセットされると、そのオブジェクトはスペースを占めたままですが、@c
+不可視になります。
+
+@lilypond[quote,verbatim,relative=2]
+a4 a
+\once \override NoteHead #'transparent = ##t
+a a
+@end lilypond
+
+@node オブジェクトを白で描く
+@unnumberedsubsubsec オブジェクトを白で描く
+@translationof Painting objects white
+
+@cindex objects, coloring (オブジェクトに色を付ける)
+@cindex coloring objects (オブジェクトに色を付ける)
+@cindex layers (レイヤ)
+@cindex printing order (描画の順番)
+@cindex overwriting objects (オブジェクトを上書きする)
+@cindex objects, overwriting (オブジェクトを上書きする)
+@cindex grobs, overwriting (グラフィカル オブジェクトを上書きする)
+
+レイアウト オブジェクトはそれぞれ @code{color} プロパティを持っていて、@c
+デフォルトでは @code{black} にセットされています。@c
+このプロパティが @code{white} にセットされてると、@c
+そのオブジェクトは白い背景と区別が付かなくなります。@c
+しかしながら、そのオブジェクトが他のオブジェクトと交差している場合、@c
+交差している場所の色はオブジェクトの描画順序によって決定されます。@c
+これにより、以下に示すように、@c
+白いオブジェクトの画像が幽霊のように浮かび上がることがあります:
+
+@lilypond[quote,verbatim,relative=2]
+\override Staff.Clef #'color = #white
+a1
+@end lilypond
+
+オブジェクトの描画順序を変更することにより、これを回避することができます。@c
+すべてのレイアウト オブジェクトは @code{layer} プロパティを持っており、@c
+このプロパティには整数がセットされています。@c
+より小さな値の @code{layer} を持つオブジェクトが最初に描画され、@c
+より大きな値の @code{layer} を持つオブジェクトが後になってから描画されます。@c
+このため、@c
+より大きな値を持つオブジェクトがより小さな値を持つオブジェクトを上書きします。@c
+デフォルトでは、@c
+たいていのオブジェクトの @code{layer} には @code{1} が代入されています。@c
+しかしながら、いくつかのオブジェクト
+-- @code{StaffSymbol} や @code{BarLine} など --
+には @code{0} が代入されています。@c
+同じ値の @code{layer} を持つオブジェクトを描画する順番は不確定です。
+
+上記の例において、白い音部記号
+(この @code{layer} のデフォルト値は @code{1} です)
+は譜線 @c
+(この @code{layer} のデフォルト値は @code{0} です)
+の後に描画されます。@c
+そのため、音部記号は譜線を上書きしています。@c
+これを変更するには、@code{Clef} オブジェクトの @code{layer} に@c
+より小さな値 -- 例えば、@code{-1} -- を与えて、@c
+音部記号を先に描画させる必要があります:
+
+@lilypond[quote,verbatim,relative=2]
+\override Staff.Clef #'color = #white
+\override Staff.Clef #'layer = #-1
+a1
+@end lilypond
+
+@node break-visibility を用いる
+@unnumberedsubsubsec break-visibility を用いる
+@translationof Using break-visibility
+
+@c TODO Add making other objects breakable
+
+@cindex break-visibility
+
+たいていのレイアウト オブジェクトは 1 回だけ描画されます。@c
+しかしながら、小節線、音部記号、拍子記号、それに調号などのオブジェクトは、@c
+改行が起こると 2 回描画する必要があります
+-- 行の最後で 1 回、次の行の最初でもう 1 回。@c
+そのようなオブジェクトは @emph{改行可能} と呼ばれ、@c
+それらのオブジェクトが描画される可能性がある 3 つの場所
+-- 行の先頭、行の途中 (それらが変更された場合)、@c
+それに、行の最後 (そこで変更が行われた場合) --
+における可視性を制御する @code{break-visibility} プロパティを持ちます。
+
+例えば、デフォルトでは拍子記号は最初の行の先頭で描画されますが、@c
+変更されない限り他の場所には描画されません。@c
+変更された場合、拍子記号は変更が行われた場所に描画されます。@c
+この変更が行の最後で行われた場合、新しい拍子記号は次の行の先頭に描画され、@c
+その前の行の最後にも忠告の拍子記号が描画されます。
+
+この振る舞いは @code{break-visibility} プロパティによって制御されます。@c
+このプロパティについての説明は
+@c Leave this ref on a newline - formats incorrectly otherwise -td
+@rlearning{オブジェクトの可視性と色}
+を参照してください。@c
+このプロパティは 3 つのブール値からなるベクトルをとり、@c
+順に、そのオブジェクトが行の最後で描画されるかどうか、@c
+行の途中で描画されるかどうか、@c
+そして、行の先頭で描画されるかどうかを決定します。@c
+より正確には、改行の前、改行がない場合、改行の後です。
+
+@code{break-visibility} プロパティによって制御する代わりに、@c
+これら 8 通りの組み合わせを @file{scm/output-lib.scm} で定義されている@c
+定義済み関数によって指定することもできます。@c
+このファイルの中で、最後の 3 列がその列のヘッダで示される場所での@c
+可視性を表しています:
+
+@multitable {@code{begin-of-line-invisible}} {@code{'#(#t #t #t)}} {yes} {yes} {yes}
+@headitem 関数 @tab ベクトル @tab 改行前 @tab 改行なし @tab 改行後
+
+@item @code{all-visible} @tab @code{'#(#t #t #t)} @tab yes @tab yes @tab yes
+@item @code{begin-of-line-visible} @tab @code{'#(#f #f #t)} @tab no @tab no @tab yes
+@item @code{center-visible} @tab @code{'#(#f #t #f)} @tab no @tab yes @tab no
+@item @code{end-of-line-visible} @tab @code{'#(#t #f #f)} @tab yes @tab no @tab no
+@item @code{begin-of-line-invisible} @tab @code{'#(#t #t #f)} @tab yes @tab yes @tab no
+@item @code{center-invisible} @tab @code{'#(#t #f #t)} @tab yes @tab no @tab yes
+@item @code{end-of-line-invisible} @tab @code{'#(#f #t #t)} @tab no @tab yes @tab yes
+@item @code{all-invisible} @tab @code{'#(#f #f #f)} @tab no @tab no @tab no
+@end multitable
+
+@code{break-visibility} のデフォルト設定は@c
+レイアウト オブジェクトによって異なります。@c
+以下の表は、@code{break-visibility} によって影響をうける@c
+すべてのレイアウト オブジェクトと、そのプロパティのデフォルト設定を示しています:
+
+@multitable @columnfractions .3 .3 .4
+
+@headitem レイアウト オブジェクト @tab 通常のコンテキスト @tab デフォルト設定
+
+@c omit Ambitus as it appears not to be affected by break-visibility -td
+@c @item @code{Ambitus} @tab as specified @tab @code{begin-of-line-visible}
+@item @code{BarLine} @tab @code{Score} @tab calculated
+@item @code{BarNumber} @tab @code{Score} @tab @code{begin-of-line-visible}
+@c omit the following item until it can be explained -td
+@c @item @code{BreakAlignGroup} @tab @code{Score} @tab calculated
+@item @code{BreathingSign} @tab @code{Voice} @tab @code{begin-of-line-invisible}
+@item @code{Clef} @tab @code{Staff} @tab @code{begin-of-line-visible}
+@item @code{Custos} @tab @code{Staff} @tab @code{end-of-line-visible}
+@item @code{DoublePercentRepeat} @tab @code{Voice} @tab @code{begin-of-line-invisible}
+@c omit KeyCancellation until it can be explained -td
+@c @item @code{KeyCancellation} @tab ?? @tab @code{begin-of-line-invisible}
+@item @code{KeySignature} @tab @code{Staff} @tab @code{begin-of-line-visible}
+@c omit LeftEdge until it can be explained -td
+@c @item @code{LeftEdge} @tab @code{Score} @tab @code{center-invisible}
+@item @code{OctavateEight} @tab @code{Staff} @tab @code{begin-of-line-visible}
+@item @code{RehearsalMark} @tab @code{Score} @tab @code{end-of-line-invisible}
+@item @code{TimeSignature} @tab @code{Staff} @tab @code{all-visible}
+
+@end multitable
+
+以下の例は、小節線の可視性を制御するベクトルの使用方法を示しています:
+
+@c KEEP LY
+@lilypond[quote,verbatim,relative=1,ragged-right]
+f4 g a b
+f4 g a b
+% カレント行の最後で小節線を削除します
+\once \override Score.BarLine #'break-visibility = #'#(#f #t #t)
+\break
+f4 g a b
+f4 g a b
+@end lilypond
+
+@code{break-visibility} をオーバライドするために使用される@c
+ベクトルの要素 3 つをすべて記述する必要がありますが、@c
+それらすべてが各レイアウト オブジェクトに対して効果を持つわけではなく、@c
+組み合わせによってはエラーになる場合もあります。@c
+
+even give errors. The following limitations apply:
+
+@itemize @bullet
+@item 小節線を行の先頭に描画することはできません。
+@item 小節番号は 1 から始まるのでなければ、@c
+最初の行の先頭に描画することはできません。
+@item 音部記号 -- 以下を参照してください
+@item 2 重線のパーセント繰り返しはすべて描画するか、@c
+すべて描画しないかのどちらかです。@c
+描画するには @code{begin-of-line-invisible} を用い、@c
+描画しないのなら @code{all-invisible} を用います。
+@item Key signature -- 以下を参照してください
+@item OctavateEight -- 以下を参照してください
+@end itemize
+
+@node 特別な考慮を必要とするもの
+@unnumberedsubsubsec 特別な考慮を必要とするもの
+@translationof Special considerations
+
+@strong{@emph{明示的な変更の後の可視性}}
+
+@cindex key signature, visibility following explicit change (明示的な変更の後の調号の可視性)
+@cindex explicitKeySignatureVisibility
+@cindex clef, visibility following explicit change (明示的な変更の後の音部記号の可視性)
+@cindex explicitClefVisibility
+
+@code{break-visibility} プロパティが調号の可視性と音部記号の変更を@c
+制御するのは、行の先頭 -- つまり、改行の後 -- においてだけです。@c
+行の途中や終わりでの明示的な調の変更や音部記号の変更の後に出現する@c
+調合や音部記号の可視性には効果を持ちません。@c
+以下の例では、@code{all-invisible} がセットされていますが、@c
+B フラット メジャーへの明示的な変更の後に出現する調号は可視のままです。
+
+@c KEEP LY
+@lilypond[quote,verbatim,relative=1,ragged-right]
+\key g \major
+f4 g a b
+% すべての調号を削除しようと試みます
+\override Staff.KeySignature #'break-visibility = #all-invisible
+\key bes \major
+f4 g a b
+\break
+f4 g a b
+f4 g a b
+@end lilypond
+
+そのような明示的な調号や音部記号の変更の可視性は
+@code{explicitKeySignatureVisibility} プロパティや
+@code{explicitClefVisibility} プロパティによって制御されます。@c
+これらは @code{break-visibility} プロパティと等価であり、@c
+どちらも @code{break-visibility} と同様に 3 つのブール値からなるベクトルか@c
+上でリストアップした定義済み関数をとります。@c
+どちらも @code{Staff} コンテキストのプロパティであり、@c
+レイアウト オブジェクト自体のプロパティではありません。@c
+ですから、これらは @code{\set} コマンドでセットします。@c
+どちらもデフォルトでは @code{all-visible} がセットされています。@c
+これらのプロパティは明示的な変更の結果として生じる@c
+調号と音部記号の可視性だけを制御し、@c
+行の先頭での調号や音部記号には効果を持ちませんので、@c
+オブジェクトを削除するには適切な @code{break-visibility}
+をオーバライドする必要があります。
+
+@lilypond[quote,verbatim,relative=1,ragged-right]
+\key g \major
+f4 g a b
+\set Staff.explicitKeySignatureVisibility = #all-invisible
+\override Staff.KeySignature #'break-visibility = #all-invisible
+\key bes \major
+f4 g a b \break
+f4 g a b
+f4 g a b
+@end lilypond
+
+@strong{@emph{忠告の臨時記号の可視性}}
+
+明示的な調の変更で描画される忠告の臨時記号を削除するには、@c
+@code{Staff} コンテキスト プロパティ @code{printKeyCancellation} に
+@code{#f} をセットします:
+
+@lilypond[quote,verbatim,relative=1,ragged-right]
+\key g \major
+f4 g a b
+\set Staff.explicitKeySignatureVisibility = #all-invisible
+\set Staff.printKeyCancellation = ##f
+\override Staff.KeySignature #'break-visibility = #all-invisible
+\key bes \major
+f4 g a b \break
+f4 g a b
+f4 g a b
+@end lilypond
+
+このオーバライドによって、調の変更を示す臨時記号だけが残ります。
+
+@c TODO Add visibility of cautionary accidentals before notes
+
+@strong{@emph{自動小節線}}
+
+@cindex automaticBars
+@cindex bar lines, suppressing (小節線を消す)
+
+特殊なケースとして、@c
+@code{Score} コンテキストの @code{automaticBars} プロパティを@c
+設定することにより、小節線の描画を Off にすることもできます。@c
+@code{#f} をセットされた場合、小節線は自動的には描画されなくなり、@c
+@code{\bar} コマンドで明示的に作成しなければならなくなります。@c
+定義済みコマンド @code{\cadenzaOn} とは異なり、小節数はカウントされ続けます。@c
+後になってこのプロパティに @code{#t} がセットされると、@c
+このカウントに従って小節線の生成が再開されます。@c
+@code{#f} がセットされている場合、@c
+改行が起こりえるのは明示的な @code{\bar} コマンドがある場所でだけになります。
+
+@c TODO Add example
+
+@strong{@emph{オクターブ移調付きの音部記号}}
+
+@cindex octavated clefs, visibility of (オクターブ移調付きの音部記号の可視性)
+@cindex visibility of octavated clefs (オクターブ移調付きの音部記号の可視性)
+@cindex clefs, visibility of octavation (オクターブ移調付きの音部記号の可視性)
+
+オクターブ移調付きの音部記号上の小さなオクターブ記号は
+@code{OctavateEight} レイアウト オブジェクトによって作り出されます。@c
+このオブジェクトの可視性は
+@code{Clef} オブジェクトの可視性とは独立して制御されます。@c
+そのため、各行の先頭においてそのような音部記号を完全に消そうとするなら、@c
+@code{Clef} オブジェクトと @code{OctavateEight} オブジェクトの両方に対して@c
+必要な @code{break-visibility} のオーバライドを行う必要があります。
+
+明示的な音部記号の変更では、@c
+@code{explicitClefVisibility} プロパティが@c
+音部記号とそれに関連するオクターブ記号の両方を制御します。
+
+
+@seealso
+学習マニュアル:
+@rlearning{オブジェクトの可視性と色}
+
+
+@node ライン スタイル
+@subsection ライン スタイル
+@translationof Line styles
+
+いくつかの演奏指示子
+-- 例えば、@i{rallentando}, @i{accelerando} それに @i{trills} など --
+はテキストとして記述され、@c
+線で (点線や波線の場合もあります) でいくつもの小節にわたって広がります。
+
+これらはすべてグリッサンドと同じルーチンを用いてテキストと線を描きます。@c
+そのため、それらの振る舞いの調整も同じように行います。@c
+これらはスパナによって実現され、スパナを描くルーチンは
+@code{ly:line-interface::print} です。@c
+このルーチンは 2 つの @i{スパン ポイント} の位置を決定し、@c
+要求されたスタイルに応じてそれら 2 点の間に線を描きます。
+
+利用可能なライン スタイルと、それらをどのように調整するかを示す例を挙げます。
+
+@lilypond[relative=2,ragged-right,verbatim,fragment]
+d2 \glissando d'2
+\once \override Glissando #'style = #'dashed-line
+d,2 \glissando d'2
+\override Glissando #'style = #'dotted-line
+d,2 \glissando d'2
+\override Glissando #'style = #'zigzag
+d,2 \glissando d'2
+\override Glissando #'style = #'trill
+d,2 \glissando d'2
+@end lilypond
+
+スパナの終点の位置は各グラフィック オブジェクトごとに@c
+オンザフライ (その場、その時々) で計算されますが、@c
+それらをオーバライドすることもできます:
+
+@c TODO Complete
+@lilypond[relative=2,ragged-right,verbatim,quote]
+e2 \glissando f
+\once \override Glissando #'(bound-details right Y) = #-2
+e2 \glissando f
+@end lilypond
+
+グリッサンドの終点の @code{Y} には @code{-2} がセットされています。@c
+@code{right} の代わりに @code{left} を指定することにより、@c
+始点も同じように調整することができます。
+
+@code{Y} がセットされていない場合、@c
+その値はスパナが取り付けられるポイントの垂直位置から算出されます。
+
+スパナに他の調整を行うことも可能です。@c
+詳細は @ref{スパナ} を参照してください。
+
+
+@node オブジェクトを回転させる
+@subsection オブジェクトを回転させる
+@translationof Rotating objects
+
+レイアウト オブジェクトとマークアップ テキストの要素はどちらも@c
+任意のポイントを中心にして任意の角度で回転させることができます。@c
+しかしながら、回転させる方法はまったく異なります。
+
+@menu
+* レイアウト オブジェクトを回転させる::
+* マークアップを回転させる::
+@end menu
+
+@node レイアウト オブジェクトを回転させる
+@unnumberedsubsubsec レイアウト オブジェクトを回転させる
+@translationof Rotating layout objects
+
+@cindex rotating objects (オブジェクトを回転させる)
+@cindex objects, rotating (オブジェクトを回転させる)
+
+@code{grob-interface} をサポートするすべてのレイアウト オブジェクトは、@c
+それらのオブジェクトの @code{rotation} プロパティを設定することにより、@c
+回転させることができます。@c
+これは 3 要素のリストをとります: 反時計回りの回転の角度、@c
+オブジェクトの参照ポイントからの相対座標 x と y
+(この座標が回転の中心になります) です。@c
+回転の角度は @q{°}で指定し、座標は譜スペースで指定します。
+
+回転の角度と回転の中心座標は、トライ&エラーで決定する必要があります。
+
+@cindex hairpins, angled (回転させられたヘアピン)
+@cindex angled hairpins (回転させられたヘアピン)
+
+レイアウト オブジェクトを回転させることが有用な状況はあまりありません。@c
+以下の例は、有用であるかもしれないシチュエーションの 1 つを示しています:
+
+@lilypond[quote,verbatim,relative=1]
+g4\< e' d' f\!
+\override Hairpin #'rotation = #'(20 -1 0)
+g,,4\< e' d' f\!
+@end lilypond
+
+@node マークアップを回転させる
+@unnumberedsubsubsec マークアップを回転させる
+@translationof Rotating markup
+
+すべてのマークアップ テキストは、@code{\rotate} コマンドを前に置くことにより、@c
+任意の角度に回転させることができます。@c
+このコマンドは 2 つの引数をとります: 反時計回りの回転の角度 @q{°} と、@c
+回転させられるテキストです。@c
+テキストの領域は回転しません:
+テキストの領域は回転させられるテキストの四隅になります。@c
+以下の例では、自動衝突回避を不可にするために@c
+テキストの @code{outside-staff-priority} プロパティに @code{#f} を@c
+セットしています。@c
+そうしなければテキストのいくつかは高く押し上げられてしまいます。
+
+@lilypond[quote,verbatim,relative=1]
+\override TextScript #'outside-staff-priority = ##f
+g4^\markup { \rotate #30 "a G" }
+b^\markup { \rotate #30 "a B" }
+des^\markup { \rotate #30 "a D-Flat" }
+fis^\markup { \rotate #30 "an F-Sharp" }
+@end lilypond
+
+
+@node 高度な調整
+@section 高度な調整
+@translationof Advanced tweaks
+
+このセクションでは、@c
+楽譜の見た目を細かく調節するためのさまざまなアプローチについて議論します。
+
+@menu
+* オブジェクトを揃える::
+* グラフィカル オブジェクトを垂直方向にグループ化する::
+* ステンシルを変更する::
+* 形状を変更する::
+@end menu
+
+
+@seealso
+学習マニュアル:
+@rlearning{出力を調整する},
+@rlearning{その他の情報源}
+
+記譜法リファレンス:
+@ref{内部リファレンスの説明},
+@ref{プロパティを変更する}
+
+インストール済みファイル:
+@file{scm/define-grobs.scm}
+
+コード断片集:
+@rlsr{Tweaks and overrides}
+
+拡張:
+@rextend{Interfaces for programmers}
+
+内部リファレンス:
+@rinternals{All layout objects}
+
+
+@node オブジェクトを揃える
+@subsection オブジェクトを揃える
+@translationof Aligning objects
+
+@code{self-alignment-interface} と/あるいは @code{side-position-interface} を@c
+サポートするグラフィカル オブジェクトは、@c
+さまざまな形式で配置済みのオブジェクトに揃えることができます。@c
+そのようなオブジェクトのリストは、@rinternals{self-alignment-interface} と
+@rinternals{side-position-interface} を参照してください。@c
+
+すべてのグラフィカル オブジェクトは参照ポイント、水平方向の広がり、@c
+それに垂直方向の広がりを持ちます。@c
+水平方向の広がりは、@c
+参照ポイントから左端と右端までの距離を意味する数値のペアであり、@c
+左端は負値です。@c
+垂直方向の広がりは、@c
+参照ポイントから下端と上端までの距離を意味する数値のペアであり、@c
+下端は負値です。@c
+
+あるオブジェクトの譜面上の位置は、@code{X-offset} プロパティと
+@code{Y-offset} プロパティの値によって与えられます。@c
+@code{X-offset} の値は、親オブジェクトの参照ポイントの X 座標からの@c
+距離を意味します。@c
+@code{Y-offset} の値は、譜の中央線からの距離を意味します。@c
+@code{X-offset} と @code{Y-offset} の値は直接設定されることもありますし、@c
+いくつかの形式で親オブジェクトと揃えるために@c
+プロシージャによって算出されることもあります。
+
+@c positioning considerations: 配置のための考慮 -> 配置規則
+@warning{多くのオブジェクトは特殊な配置規則を持っています。@c
+そのため、そのオブジェクトが @code{self-alignment-interface} を@c
+サポートしていたとしても、@c
+@code{X-offset} あるいは @code{Y-offset} の設定は無視されたり、@c
+変更されることがあります。}
+
+例えば、臨時記号は @code{Y-offset} を設定することにより@c
+垂直方向の位置を変更することができますが、@code{X-offset} は効果を持ちません。
+
+リハーサル記号は、小節線、音部記号、拍子記号それに調号などの@c
+改行可能なオブジェクトに揃えることができます。@c
+リハーサル記号をそのようなオブジェクトに合わせて配置するために、@c
+@code{break-aligned-interface} の中に特別なプロパティがあります。
+
+@seealso
+@ref{break-alignable-interface を使用する},
+@rextend{Callback functions}
+
+@menu
+* X-offset と Y-offset を直接設定する::
+* side-position-interface を使用する::
+* self-alignment-interface を使用する::
+* break-alignable-interface を使用する::
+@end menu
+
+@node X-offset と Y-offset を直接設定する
+@unnumberedsubsubsec @code{X-offset} と @code{Y-offset} を直接設定する
+@translationof Setting X-offset and Y-offset directly
+
+多くのオブジェクトの @code{X-offset} プロパティと @code{Y-offset} プロパティに@c
+数値を与えることができます。@c
+以下の例は、3 つの音符を示していて、1 つはデフォルト配置の運指記号を持ち、@c
+他の 2 つの運指記号は @code{X-offset} と @code{Y-offset} が変更されています。
+
+@lilypond[verbatim,quote,relative=2]
+a-3
+a
+-\tweak #'X-offset #0
+-\tweak #'Y-offset #0
+-3
+a
+-\tweak #'X-offset #-1
+-\tweak #'Y-offset #1
+-3
+@end lilypond
+
+@c TODO write more
+
+@node side-position-interface を使用する
+@unnumberedsubsubsec @code{side-position-interface} を使用する
+@translationof Using the @code{side-position-interface}
+
+@code{side-position-interface} をサポートするオブジェクトは、@c
+その親オブジェクトの隣に配置することができ、@c
+それにより、@c
+それら 2 つのオブジェクトの指定された端をくっつけることができます。@c
+オブジェクトを親オブジェクトの上、下、右、あるいは左に配置することができます。@c
+親オブジェクトを指定することはできません:
+親オブジェクトは入力ストリームの中での要素の順序によって決定されます。@c
+たいていのオブジェクトの親オブジェクトは、@c
+そのオブジェクトに関連する符頭となります。
+
+@code{side-axis} プロパティと @code{direction} プロパティの値は、@c
+以下のように、オブジェクトが配置される場所を決定します:
+
+@c TODO add an example of each to the table
+
+@multitable @columnfractions .3 .3 .3
+@headitem @code{side-axis} @tab @code{direction} @tab
+@headitem property @tab property @tab Placement
+
+@item @code{0} @tab @code{-1} @tab 左
+@item @code{0} @tab @code{1} @tab 右
+@item @code{1} @tab @code{-1} @tab 下
+@item @code{1} @tab @code{1} @tab 上
+
+@end multitable
+
+@code{side-axis} が @code{0} である場合、@code{X-offset} には@c
+プロシージャ @code{ly:side-position-interface::x-aligned-side} を@c
+セットする必要があります。@c
+このプロシージャは、@code{direction} の値に基づいて@c
+親オブジェクトの左あるいは右にオブジェクトを配置するための適切な値を
+@code{X-offset} に返します。
+
+@code{side-axis} が @code{1} である場合、@code{Y-offset} には@c
+プロシージャ @code{ly:side-position-interface::y-aligned-side} を@c
+セットする必要があります。@c
+このプロシージャは、@code{direction} の値に基づいて@c
+親オブジェクトの上あるいは下にオブジェクトを配置するための適切な値を
+@code{Y-offset} に返します。
+
+@c TODO Add examples
+
+@node self-alignment-interface を使用する
+@unnumberedsubsubsec @code{self-alignment-interface} を使用する
+@translationof Using the @code{self-alignment-interface}
+
+@emph{オブジェクトを自動的に水平方向に揃える}
+
+@code{self-alignment-interface} をサポートするオブジェクトの水平方向の揃えは、@c
+@code{self-alignment-X} プロパティの値によって制御され、@c
+そのオブジェクトの @code{X-offset} プロパティには@c
+任意の実数値を与えることができる
+@code{ly:self-alignment-interface::x-aligned-on-self}.
+@code{self-alignment-X} がセットされます。@c
+与える実数値は、そのオブジェクトの X 方向の広がりの半分を単位とします。@c
+負値はオブジェクトを右に移動させ、正値はオブジェクトを左に移動させます。@c
+値が @code{0} であればそのオブジェクトは親オブジェクトの参照ポイントに@c
+中央揃えされ、@c
+値が @code{-1} であればそのオブジェクトの左端が親オブジェクトの参照ポイントに@c
+揃えられ、@c
+値が @code{1} であればそのオブジェクトの右端が親オブジェクトの参照ポイントに@c
+揃えられます。@c
+記号 @code{LEFT}, @code{CENTER}, それに @code{RIGHT} は@c
+それぞれ @w{@code{-1}, @code{0}, それに @code{1}} に対応します。
+
+通常、@code{\override} コマンドを用いて @code{self-alignment-X} の値を@c
+変更しますが、@c
+@code{\tweak} コマンドを用いることで@c
+単一の音符に付けられている複数の注釈を個別に揃えることができます:
+
+@lilypond[quote,verbatim,relative=1]
+a'
+-\tweak #'self-alignment-X #-1
+^"left-aligned"
+-\tweak #'self-alignment-X #0
+^"center-aligned"
+-\tweak #'self-alignment-X #RIGHT
+^"right-aligned"
+-\tweak #'self-alignment-X #-2.5
+^"aligned further to the right"
+@end lilypond
+
+@emph{オブジェクトを自動的に垂直方向に揃える}
+
+オブジェクトの @code{Y-offset} プロパティに
+@code{ly:self-alignment-interface::y-aligned-on-self} がセットされていれば、@c
+水平方向の揃えと同じように、垂直方向に揃えることができます。@c
+しかしながら、垂直方向の揃えには他のメカニズムも関与します:
+@code{Y-offset} の値は、垂直方向の揃えに関与する変数の 1 つに過ぎません。@c
+このことにより、いくつかのオブジェクトの @code{Y-offset} 値の調整は@c
+ややこしくなります。@c
+単位はそのオブジェクトの垂直方向の広がりの半分です。@c
+通常これは非常に小さいため、非常に大きな数値が必要になる可能性があります。@c
+値が @code{-1} であればそのオブジェクトの下端が親オブジェクトの参照ポイントに@c
+揃えられ、@c
+値が @code{0} であればそのオブジェクトの中央が親オブジェクトの参照ポイントに@c
+揃えられ、@c
+値が @code{1} であればそのオブジェクトの上端が親オブジェクトの参照ポイントに@c
+揃えられます。@c
+記号 @code{DOWN}, @code{CENTER}, それに @code{UP} は@c
+それぞれ @w{@code{-1}, @code{0}, それに @code{1}} に対応します。
+
+@emph{オブジェクトを自動的に両方向に揃える}
+
+@code{X-offset} と @code{Y-offset} の両方の設定を行うことで、@c
+オブジェクトの水平方向と垂直方向の揃えを同時に行うことができます。
+
+以下の例は、運指記号を符頭に近づけるための調整方法を示しています。
+
+@c KEEP LY
+@lilypond[quote,verbatim,relative=2]
+a
+-\tweak #'self-alignment-X #0.5 % 左方向に移動させます
+-\tweak #'Y-offset #ly:self-alignment-interface::y-aligned-on-self
+-\tweak #'self-alignment-Y #-1 % 上方向に移動させます
+-3 % 3 の指
+@end lilypond
+
+@ignore
+@unnumberedsubsubsec Using the @code{aligned-on-parent} procedures
+
+@c Cannot document as they do not seem to operate consistently on all objects -td
+@c TODO investigate further
+
+The @code{aligned-on-parent} procedures are used in the same way
+as the @code{aligned-on-self} procedures, they difference being
+that they permit an object to be aligned with the @emph{edges} of
+the parent rather than the parent's reference point. The following
+example shows the difference:
+
+@c TODO Add example
+
+@lilypond[verbatim,quote]
+@end lilypond
+
+@end ignore
+
+@ignore
+@unnumberedsubsubsec Using the @code{centered-on-parent} procedures
+
+@c Cannot document as they do not seem to operate consistently on all objects -td
+@c TODO investigate further
+
+@end ignore
+
+@c TODO The align-interface, BassFigureAlignment and VerticalAlignment
+
+@node break-alignable-interface を使用する
+@unnumberedsubsubsec @code{break-alignable-interface} を使用する
+@translationof Using the @code{break-alignable-interface}
+
+@cindex align to objects (オブジェクトに揃える)
+@cindex break-align-symbols
+
+リハーサル記号と小節番号を小節線ではなく、@c
+記譜オブジェクトに揃えることができます。@c
+対象となる記譜オブジェクトには、@code{ambitus},
+@code{breathing-sign}, @code{clef}, @code{custos}, @code{staff-bar},
+@code{left-edge}, @code{key-cancellation}, @code{key-signature}, それに
+@code{time-signature} があります。
+
+デフォルトでは、@c
+リハーサル記号と小節番号はオブジェクトの上で水平方向に中央揃えされます:
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=1]
+% リハーサル記号は音部記号の上に中央揃えされます
+\override Score.RehearsalMark #'break-align-symbols = #'(clef)
+\key a \major
+\clef treble
+\mark "↓"
+e1
+% リハーサル記号は拍子記号の上に中央揃えされます
+\override Score.RehearsalMark #'break-align-symbols = #'(time-signature)
+\key a \major
+\clef treble
+\time 3/4
+\mark "↓"
+e2.
+% リハーサル記号はブレス記号の上に中央揃えされます
+\override Score.RehearsalMark #'break-align-symbols = #'(breathing-sign)
+\key a \major
+\clef treble
+\time 4/4
+e1
+\breathe
+\mark "↓"
+@end lilypond
+
+揃えの対象となり得るオブジェクトのリストを指定することができます。@c
+揃えを行う時点で対象リストの中にあるオブジェクトのいくつかが不可視である
+-- @code{break-visibility} の設定や、@c
+調号と音部に対する明示的な可視性の設定により --
+場合、リハーサル記号あるいは小節番号はリストの中にある@c
+最初の可視のオブジェクトに揃えられます。@c
+リストの中にあるオブジェクトがすべて不可視である場合、小節線に揃えられます。@c
+小節線が不可視である場合、小節線があるはずの場所に揃えられます。
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=1]
+% リハーサル記号は調号の上に中央揃えされます
+\override Score.RehearsalMark #'break-align-symbols = #'(key-signature clef)
+\key a \major
+\clef treble
+\mark "↓"
+e1
+% リハーサル記号は音部記号の上に中央揃えされます
+\set Staff.explicitKeySignatureVisibility = #all-invisible
+\override Score.RehearsalMark #'break-align-symbols = #'(key-signature clef)
+\key a \minor
+\clef bass
+\mark "↓"
+gis,,1
+% リハーサル記号は小節線の上に中央揃えされます
+\set Staff.explicitKeySignatureVisibility = #all-invisible
+\set Staff.explicitClefVisibility = #all-invisible
+\override Score.RehearsalMark #'break-align-symbols = #'(key-signature clef)
+\key a \major
+\clef treble
+\mark "↓"
+e''1
+@end lilypond
+
+以下の例で示すように、@c
+記譜オブジェクトに対するリハーサル記号の揃えを変更することができます。@c
+複数の譜を持つ楽譜では、この設定はすべての譜に適用されます。
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=1]
+% RehearsalMark は KeySignature の上に中央揃えされます
+\override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
+\key a \major
+\clef treble
+\time 4/4
+\mark "↓"
+e1
+% RehearsalMark は KeySignature の左端に揃えられます
+\once \override Score.KeySignature #'break-align-anchor-alignment = #LEFT
+\mark "↓"
+\key a \major
+e
+% RehearsalMark は KeySignature の右端に揃えられます
+\once \override Score.KeySignature #'break-align-anchor-alignment = #RIGHT
+\key a \major
+\mark "↓"
+e
+@end lilypond
+
+また、リハーサル記号を左端に揃えて、@c
+さらに任意の量だけ右あるいは左にずらすことができます。@c
+単位は譜スペースです:
+
+@c KEEP LY
+@lilypond[verbatim,quote,relative=1]
+% リハーサル記号は調号の左端に揃えられて
+% さらに 3.5 譜スペース右にずらされます
+\override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
+\once \override Score.KeySignature #'break-align-anchor = #3.5
+\key a \major
+\mark "↓"
+e1
+% リハーサル記号は調号の左端に揃えられて
+% さらに 2 譜スペース左にずらされます
+\once \override Score.KeySignature #'break-align-anchor = #-2
+\key a \major
+\mark "↓"
+e1
+@end lilypond
+
+
+@node グラフィカル オブジェクトを垂直方向にグループ化する
+@subsection グラフィカル オブジェクトを垂直方向にグループ化する
+@translationof Vertical grouping of grobs
+
+@c FIXME Expand this section
+
+VerticalAlignment グラフィカル オブジェクトと
+VerticalAxisGroup グラフィカル オブジェクトは対で機能します。@c
+VerticalAxisGroup は Staff, Lyrics, 等のような@c
+異なるグラフィカル オブジェクトをグループにまとめます。@c
+それから、VerticalAlignment が
+VerticalAxisGroup によってグループ化されたグラフィカル オブジェクトを@c
+垂直方向に揃えます。@c
+通常、楽譜には VerticalAlignment は 1 つしかありませんが、@c
+Staff, Lyrics 等はそれ自体でそれぞれに VerticalAxisGroup を持ちます。
+
+
+@node ステンシルを変更する
+@subsection ステンシルを変更する
+@translationof Modifying stencils
+
+すべてのレイアウト オブジェクトは、@c
+@code{grob-interface} の一部である @code{stencil} プロパティを持ちます。@c
+通常、デフォルトでこのプロパティには、@c
+出力でそのオブジェクトを具現化する記号を描画するための@c
+特有の関数がセットされています。@c
+例えば、@code{MultiMeasureRest} オブジェクトの @code{stencil} プロパティに@c
+対する標準設定は、@code{ly:multi-measure-rest::print} です。
+
+@code{stencil} プロパティを変更して異なる描画関数を参照させることにより、@c
+オブジェクトの標準記号を置き換えることができます。@c
+これには LilyPond 内部機能についての高い知識が求められます。@c
+しかしながら、多くの場合にまずまずの結果を生み出すもっと簡単な方法があります。
+
+簡単な方法では、@code{stencil} プロパティにテキストを描画する関数
+-- @code{ly:text-interface::print} -- をセットし、@c
+必要な記号を生み出すマークアップ テキストを保持するよう設定された
+ @code{text} プロパティ与えます。@c
+マークアップの自由度の高さにより、多くのことを達成できます。@c
+詳細は、@ref{マークアップ内部でのグラフィック記譜法} を参照してください。
+
+以下の例では、この方法を用いて符頭記号を内部に×を持つ円に変更しています。
+
+@lilypond[verbatim,quote]
+XinO = {
+ \once \override NoteHead #'stencil = #ly:text-interface::print
+ \once \override NoteHead #'text = \markup {
+ \combine
+ \halign #-0.7 \draw-circle #0.85 #0.2 ##f
+ \musicglyph #"noteheads.s2cross"
+ }
+}
+\relative c'' {
+ a a \XinO a a
+}
+@end lilypond
+
+@code{\musicglyph} マークアップ コマンドには、@c
+Feta フォントに含まれる任意の図柄を提供することができます。@c
+@ref{The Feta font} を参照してください。
+
+@c TODO Add inserting eps files or ref to later
+
+@c TODO Add inserting Postscript or ref to later
+
+
+@seealso
+記譜法リファレンス:
+@ref{マークアップ内部でのグラフィック記譜法},
+@ref{テキストをフォーマットする},
+@ref{Text markup commands},
+@ref{The Feta font}
+
+
+@node 形状を変更する
+@subsection 形状を変更する
+@translationof Modifying shapes
+
+@menu
+* タイとスラーの形状を変更する::
+@end menu
+
+@node タイとスラーの形状を変更する
+@unnumberedsubsubsec タイとスラーの形状を変更する
+@translationof Modifying ties and slurs
+
+@cindex slurs, modifying (スラーの形状を変更する)
+@cindex ties, modifying (タイの形状を変更する)
+@cindex Bézier curves (ベジエ曲線)
+@cindex Bézier control points (ベジエ曲線の制御ポイント)
+
+タイ、スラー、それにフレージング スラーは 3 次のベジエ曲線として描かれます。@c
+自動的に算出されるタイあるいはスラーの形状が最適ではない場合、@c
+3 次ベジエ曲線を定義するのに必要な 4 つの制御ポイントを@c
+明示的に指定することによって、形状を変更することができます。
+
+3 次あるいは 3 乗のベジエ曲線は、4 つの制御ポイントによって定義されます。@c
+1 番目と 4 番目の制御ポイントは曲線の始点と終点になります。@c
+間にある 2 つの制御ポイントは曲線の形状を定義します。@c
+Web でベジエ曲線が描かれる様子を示すアニメーションを@c
+見つけることができるでしょう。@c
+しかしながら、以下の記述も役に立つかもしれません。@c
+ベジエ曲線は最初の制御ポイントから 2 番目の制御ポイントに進み、@c
+徐々に 3 番目の制御ポイントの方へ向きを変えながら
+4 番目の制御ポイントの方へ向かい続け、@c
+3 番目の制御ポイントから 4 番目の制御ポイントに到達します。@c
+ベジエ曲線は 4 つの制御ポイントからなる四角形の中に納まります。
+
+ここで、@c
+タイが最適化されず、@code{\tieDown} が役に立たないケースを例として挙げます。
+
+@lilypond[verbatim,quote,relative=1]
+<<
+ { e1 ~ e }
+\\
+ { r4 <g c,> <g c,> <g c,> }
+>>
+@end lilypond
+
+以下のようにタイの制御ポイントを手動で変更することにより、@c
+このタイの形状を改善することができます。
+
+ベジエ制御ポイントの座標は譜スペースを単位として指定されます。@c
+X@tie{}座標はそのタイあるいはスラーを取り付けられる音符の参照ポイントからの@c
+相対座標であり、Y@tie{}座標は譜の中央線からの相対座標です。@c
+制御ポイント座標は 10 進数 (実数) のペアを 4 つ持つリストとして設定されます。@c
+最適な制御ポイントを決定するための手順は、
+2 つの終点の座標を見積もり、それから 2 つの中間ポイントを推測することで、@c
+制御ポイントの座標を決定します。@c
+最適値はトライ&エラーで見つけ出します。
+
+左右対称の曲線にするには制御ポイントを左右対称に配置する必要があるということを@c
+覚えておくと役に立ちます。@c
+また、ベジエ曲線の制御ポイントに平行移動、回転、それに拡大縮小などの変換を@c
+適用することにより、@c
+その曲線を変換できるという特性があるとも覚えておいてください。
+
+上記の実例として、以下の例のオーバライドで満足のいくタイが得られています。@c
+オーバライドを配置する場所
+-- タイ (あるいはスラー) が開始する音符の直前に配置する必要があります --
+に注意してください。
+
+@lilypond[verbatim,quote,relative=1]
+<<
+ {
+ \once \override Tie
+ #'control-points = #'((1 . -1) (3 . 0.6) (12.5 . 0.6) (14.5 . -1))
+ e1 ~ e
+ }
+\\
+ { r4 <g c,> <g c,> <g c,> }
+>>
+@end lilypond
+
+@knownissues
+
+同じ音楽タイミングに複数のタイあるいはスラーが存在する場合、@c
+@code{control-points} プロパティを変更しても@c
+それらの形状を変更することはできません。@c
+@code{\tweak} コマンドを用いたとしても変更できません。@c
+しかしながら、@code{TieColumn} の @code{tie-configuration} プロパティを@c
+オーバライドすることで、タイの垂直方向の位置と領域を変更することができます。
+
+@seealso
+内部リファレンス:
+@rinternals{TieColumn}
+
+
+@node 音楽関数を使用する
+@section 音楽関数を使用する
+@translationof Using music functions
+
+@c TODO -- add @seealso, etc. to these subsections
+
+調整を異なる音楽表記に再利用する必要がある場合、@c
+その調整を音楽関数にしておくと便利です。@c
+このセクションでは、@emph{置換} 関数についてだけ議論します。@c
+置換関数は変数を LilyPond 入力コードに置き換えます。@c
+他のもっと複雑な関数については、@rextend{Music functions} で記述されています。
+
+@menu
+* 置換関数の構文::
+* 置換関数の例::
+@end menu
+
+@node 置換関数の構文
+@subsection 置換関数の構文
+@translationof Substitution function syntax
+
+変数を LilyPond コードに置換する関数を作成することは簡単にできます。@c
+置換関数の一般的な形式は以下のようなものです:
+
+@example
+function =
+#(define-music-function
+ (parser location @var{arg1} @var{arg2} @dots{})
+ (@var{type1?} @var{type2?} @dots{})
+ #@{
+ @var{@dots{}music@dots{}}
+ #@})
+@end example
+
+@noindent
+ここで
+
+@multitable @columnfractions .33 .66
+@item @code{@var{argN}}
+@tab @var{n} 番目の引数
+
+@item @code{@var{typeN?}}
+@tab @code{@var{argN}} が @code{#t} を返す Scheme の @emph{型述語} (type predicate)。
+
+@item @code{@var{@dots{}music@dots{}}}
+@tab 通常の LilyPond 入力。@code{$} を用いて引数を参照します
+(例: @samp{$arg1})。
+@end multitable
+
+です。
+
+@ignore
+共通の変数タイプについては @ref{共通の引数タイプ} で記述されています。@c
+変数タイプについてのもっと完全な記述は
+@rextend{Music function syntax} にあります。
+@end ignore
+
+引数 @code{parser} と @code{location} を省略することはできず、@c
+@rextend{Music function syntax} で記述されている高度な状況で@c
+使用されることがあります。
+置換関数において、必ずこれらの引数を記述してください。
+
+引数として、型述語のリストも必須です。@c
+音楽関数で用いられる一般的な型述語には下記のものがあります:
+
+@example
+boolean?
+cheap-list? @emph{(}@q{list?}@emph{ の代わりに用いることで、処理を高速にします)}
+ly:music?
+markup?
+number?
+pair?
+string?
+symbol?
+@end example
+
+@noindent
+利用可能な型述語のリストは、@c
+@ref{Predefined type predicates} を参照してください。@c
+ユーザが型述語を定義することもできます。
+
+
+@seealso
+
+記譜法リファレンス:
+@ref{Predefined type predicates}
+
+拡張:
+@rextend{Music function syntax}
+
+インストールされているファイル:
+@file{lily/music-scheme.cc},
+@file{scm/c++.scm},
+@file{scm/lily.scm}
+
+
+@ignore
+@node 共通の引数タイプ
+@subsection 共通の引数タイプ
+@translationof Common argument types
+
+エラー チェックを考慮して、@c
+音楽関数に渡される各引数タイプを定義しておく必要があります。@c
+共通の引数タイプのいくつかを以下の表で示します。@c
+
+以下の入力タイプを音楽関数で変数として使用することができます。@c
+このリストは完全なものではありません。@c
+取り得る変数タイプについての更なる情報は、
+@rextend{Music function syntax} にあります。
+
+@multitable @columnfractions .33 .66
+@headitem 入力タイプ @tab @var{vari-type?} での記述方法
+@item 整数 @tab @code{integer?}
+@item 浮動小数点数 (10 進数) @tab @code{number?}
+@item テキスト文字列 @tab @code{string?}
+@item マークアップ @tab @code{markup?}
+@item 音楽表記 @tab @code{ly:music?}
+@item Scheme ペア @tab @code{pair?}
+@end multitable
+
+@seealso
+
+LilyPond の拡張:
+@rextend {Music function syntax}
+
+インストール済みファイル:
+@file{lily/music-scheme.cc},
+@file{scm/c++.scm}
+@end ignore
+
+
+@c ここから L3796
+@node 置換関数の例
+@subsection 置換関数の例
+@translationof Substitution function examples
+
+このセクションでは、置換関数の例をいくつか紹介します。@c
+高度なことはしていませんが、シンプルな置換関数を実現する方法を示しています。
+
+最初の例では、@c
+@code{TextScript} のパディング設定を容易にするための関数が定義されています:
+
+@lilypond[quote,verbatim,ragged-right]
+padText =
+#(define-music-function
+ (parser location padding)
+ (number?)
+ #{
+ \once \override TextScript #'padding = $padding
+ #})
+
+\relative c''' {
+ c4^"piu mosso" b a b
+ \padText #1.8
+ c4^"piu mosso" d e f
+ \padText #2.6
+ c4^"piu mosso" fis a g
+}
+@end lilypond
+
+数値のほかに、音符などの音楽表記を音楽関数への引数にすることができます:
+
+@c TODO: use a better example (the music argument is redundant).
+
+@lilypond[quote,verbatim,ragged-right]
+custosNote =
+#(define-music-function
+ (parser location note)
+ (ly:music?)
+ #{
+ \once \override Voice.NoteHead #'stencil =
+ #ly:text-interface::print
+ \once \override Voice.NoteHead #'text =
+ \markup \musicglyph #"custodes.mensural.u0"
+ \once \override Voice.Stem #'stencil = ##f
+ $note
+ #})
+
+\relative c' { c4 d e f \custosNote g }
+@end lilypond
+
+複数の引数をとる置換関数を定義することもできます:
+
+@lilypond[quote,verbatim,ragged-right]
+tempoPadded =
+#(define-music-function
+ (parser location padding tempotext)
+ (number? string?)
+ #{
+ \once \override Score.MetronomeMark #'padding = $padding
+ \tempo \markup { \bold $tempotext }
+ #})
+
+\relative c'' {
+ \tempo \markup { "Low tempo" }
+ c4 d e f g1
+ \tempoPadded #4.0 #"High tempo"
+ g4 f e d c1
+}
+@end lilypond
+
+@c TODO: add appropriate @@ref's here.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{avoiding-collisions-with-chord-fingerings.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{default-direction-of-stems-on-the-center-line-of-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{grid-lines--changing-their-appearance.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{modifying-default-values-for-articulation-shorthand-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-vertical-ordering-of-scripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-a-delayed-turn.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-hairpin-behavior-at-bar-lines.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-minimum-length-of-hairpins.ly}
@c 未訳
@cindex al niente (アル ニエンテ)
@cindex niente, al (アル ニエンテ)
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-hairpins-using-al-niente-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligned-dynamics-and-textscripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{hiding-the-extender-line-for-text-dynamics.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-text-and-spanner-styles-for-text-dynamics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-double-slurs-for-legato-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-text-markups-inside-slurs.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-slurs-with-complex-dash-structure.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-breath-mark-symbol.ly}
@c 未訳
@cindex railroad tracks
@c 未訳
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{inserting-a-caesura.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adjusting-the-shape-of-falls-and-doits.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{contemporary-glissando.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-a-piano-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-other-contexts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-arpeggios-across-notes-in-different-voices.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-midi-output-to-one-channel-per-voice.ly}
@knownissues
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle,ragged-right]
+@lilypondfile[verbatim,quote,texidoc,doctitle,ragged-right]
{hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-extra-naturals-from-being-automatically-added.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{transposing-pitches-with-minimum-accidentals-smart-transpose.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-clef-properties.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ottava-text.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ottava-text.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dodecaphonic-style-accidentals-for-each-note-including-naturals.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-ambitus-per-voice.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ambitus-with-multiple-voices.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-ambitus-gap.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{numbers-as-easy-note-heads.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{applying-note-head-styles-depending-on-the-step-of-the-scale.ly}
すべての符頭スタイルを調べるには、@ref{Note head styles} を参照してください。
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{shortening-volta-brackets.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-volta-brackets-to-additional-staves.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-double-repeat-default-for-volte.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-counter.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-count-visibility.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{isolated-percent-repeats.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{cross-staff-tremolos.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-number-of-augmentation-dots-per-note.ly}
@funindex tupletNumberFormatFunction
@funindex tupletSpannerDuration
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{entering-several-tuplets-using-only-one--times-command.ly}
@cindex Tuplet number changes (連符の数の変更)
@funindex TupletNumber
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-tuplet-number.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{non-default-tuplet-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-tuplet-bracket-visibility.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{permitting-line-breaks-within-beamed-tuplets.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-ties-with-arpeggios.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{engraving-ties-manually.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{rest-styles.ly}
@cindex rest, church
@cindex kirchenpausen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-form-of-multi-measure-rests.ly}
@cindex multi-measure rests, positioning
@cindex positioning multi-measure rests
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{positioning-multi-measure-rests.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{multi-measure-rest-markup.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-time-signature-without-affecting-the-beaming.ly}
@cindex compound time signatures
@cindex time signature, compound
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
@c perhaps also an example of how to move it horizontally?
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-tempo-without-a-metronome-mark.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-metronome-marks-in-markup-mode.ly}
詳細は @ref{Formatting text} を参照してください。
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{compound-time-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{guitar-strum-rhythms.ly}
@funindex breakable
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beams-across-line-breaks.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-beam-knee-gap.ly}
@cindex \partcombine and \autoBeamOff (\partcombine と \autoBeamOff)
@cindex \autoBeamOff and \partcombine (\autoBeamOff と \partcombine)
-@lilypondfile [verbatim, lilyquote, ragged-right, texidoc, doctitle]
+@lilypondfile [verbatim, quote, ragged-right, texidoc, doctitle]
{partcombine-and-autobeamoff.ly}
@cindex beams, subdividing (連桁をサブ グループ化する)
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{subdividing-beams.ly}
@cindex measure groupings (小節をグループ化する)
@cindex grouping beats (拍をグループ化する)
@cindex measure sub-grouping (小節をサブ グループ化する)
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{conducting-signs,-measure-grouping-signs.ly}
@cindex beam, last in score (楽譜の最後の連桁)
@cindex beam, last in polyphonic voice (多声ボイスの最後の連桁)
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beam-endings-in-score-context.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{flat-flags-and-beam-nibs.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-the-bar-number-for-the-first-measure.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-at-regular-intervals.ly}
@cindex measure number, format
@cindex bar number, format
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-inside-boxes-or-circles.ly}
@cindex bar number alignment
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{aligning-bar-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{removing-bar-numbers-from-a-score.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-grace-note-slashes-with-normal-heads.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-grace-layout-within-music.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{redefining-grace-note-global-defaults.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-grace-notes-with-floating-space.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{additional-voices-to-avoid-collisions.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{forcing-horizontal-shift-of-notes.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{combining-two-parts-on-the-same-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-partcombine-texts.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{use-square-bracket-at-the-start-of-a-staff-group.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{display-bracket-with-only-one-staff-in-a-system.ly}
@c 未訳
@cindex transcription of mensural music
@cindex mensural music, transcription of
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{nesting-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-some-staff-lines-thicker-than-the-others.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligning-ossias-and-lyrics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{removing-the-first-empty-line.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
@c perhaps also an example of how to move it horizontally?
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-tempo-without-a-metronome-mark.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-metronome-marks-in-markup-mode.ly}
更なる詳細は、@ref{テキストをフォーマットする} を参照してください。
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{quoting-another-voice-with-transposition.ly}
@cindex note-event
@funindex quotedEventTypes
@funindex quotedCueEventTypes
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{quoting-another-voice.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-text-spanner-postfix.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-custom-text-spanner-postfix.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-at-the-end-of-a-line.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{aligning-marks-with-various-notation-objects.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-on-every-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{stand-alone-two-column-markup.ly}
@seealso
@end html
@end ifhtml
-@emph{最終更新日 Wed Jul 13 10:59:12 UTC 2011
+@emph{最終更新日 Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 一般的な記譜法
@*
-4184
+4187
@tab Yoshiki Sawada
@tab
@tab
@item
1.4 繰り返し
@*
-945
+944
@tab Yoshiki Sawada
@tab
@tab
@ifhtml
@html
-<span style="background-color: #39ff22">partially</span>
+<span style="background-color: #40fe23">partially</span>
@end html
@end ifhtml
@ifnothtml
@item
1.6 譜の記譜法
@*
-2345
+2341
@tab Yoshiki Sawada
@tab
@tab
@ifhtml
@html
-<span style="background-color: #9eff30">partially</span>
+<span style="background-color: #a5ff31">partially</span>
@end html
@end ifhtml
@ifnothtml
@tab
@ifhtml
+@html
+<span style="background-color: #1fff1f">はい</span>
+@end html
+@end ifhtml
+@ifnothtml
+はい
+@end ifnothtml
+@tab post-GDP
+@item
+2 入出力全般
+@*
+7686
+@tab Yoshiki Sawada
+@tab
+@tab
+@ifhtml
+
+@html
+<span style="background-color: #1fff1f">はい</span>
+@end html
+@end ifhtml
+@ifnothtml
+はい
+@end ifnothtml
+@tab
+@ifhtml
+
+@html
+<span style="background-color: #1fff1f">はい</span>
+@end html
+@end ifhtml
+@ifnothtml
+はい
+@end ifnothtml
+@tab post-GDP
+@item
+3 スペースの問題
+@*
+11087
+@tab Yoshiki Sawada
+@tab
+@tab
+@ifhtml
+
+@html
+<span style="background-color: #1fff1f">はい</span>
+@end html
+@end ifhtml
+@ifnothtml
+はい
+@end ifnothtml
+@tab
+@ifhtml
+
@html
<span style="background-color: #1fff1f">はい</span>
@end html
@item
1 @command{lilypond} を実行する
@*
-3622
+3681
@tab Yoshiki Sawada
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">はい</span>
+<span style="background-color: #25fe1f">partially</span>
@end html
@end ifhtml
@ifnothtml
-はい
+partially
@end ifnothtml
@tab post-GDP
@item
@item
3 @command{lilypond-book}: Integrating text and music
@*
-3952
+3978
@tab Yoshiki Sawada
@tab
@tab
@item
4 外部プログラム
@*
-2170
+2180
@tab Yoshiki Sawada
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">はい</span>
+<span style="background-color: #25fe1f">partially</span>
@end html
@end ifhtml
@ifnothtml
-はい
+partially
@end ifnothtml
@tab post-GDP
@item
@item
マニュアル
@*
-1203
+1214
@tab Yoshiki Sawada
@tab
@tab
@item
コミュニティ
@*
-1755
+1888
@tab Yoshiki Sawada
@tab
@tab
@ifhtml
@html
-<span style="background-color: #1fff1f">はい</span>
+<span style="background-color: #40fe23">partially</span>
@end html
@end ifhtml
@ifnothtml
-はい
+partially
@end ifnothtml
@tab pre-GDP
@end multitable
@file{foo.texidoc@var{LANG}} will be included instead of
@file{foo.texidoc}.
-@item lilyquote
-(Only for Texinfo output.) This option is similar to quote, but only
-the music snippet (and the optional verbatim block implied by
-@code{verbatim} option) is put into a quotation block. This option is
-useful if you want to @code{quote} the music snippet but not the
-@code{texidoc} documentation block.
-
@item doctitle
(Only for Texinfo output.) This option works similarly to
@code{texidoc} option: if @command{lilypond} is called with the
If the above seems confusing, consider this: if you were playing a
piano, which key would you hit? If you would press a black key,
-then you @emph{must} add @code{-is} or @code{-es} to the note
+then you @emph{must} add @w{@code{-is}} or @w{@code{-es}} to the note
name!
Adding all alterations explicitly might require a little more
@appendixsubsec Notes only
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-only-notes.ly}
@appendixsubsec Notes and lyrics
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,addversion]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion]
{single-staff-template-with-notes-and-lyrics.ly}
@appendixsubsec Notes and chords
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes-and-chords.ly}
@appendixsubsec Notes, lyrics, and chords.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{single-staff-template-with-notes,-lyrics,-and-chords.ly}
@appendixsubsec Solo piano
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-simple.ly}
@appendixsubsec Piano and melody with lyrics
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-melody-and-lyrics.ly}
@appendixsubsec Piano centered lyrics
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-lyrics.ly}
@appendixsubsec Piano centered dynamics
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{piano-template-with-centered-dynamics.ly}
@appendixsubsec String quartet
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-simple.ly}
@appendixsubsec String quartet parts
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{string-quartet-template-with-separate-parts.ly}
@appendixsubsec SATB vocal score
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template.ly}
@appendixsubsec SATB vocal score and automatic piano reduction
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-automatic-piano-reduction.ly}
@appendixsubsec SATB with aligned contexts
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly}
@appendixsubsec SATB on four staves
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{satb-choir-template---four-staves.ly}
@appendixsubsec Solo verse and two-part refrain
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{vocal-ensemble-template-with-verse-and-refrain.ly}
@appendixsubsec Hymn tunes
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{hymn-template.ly}
@appendixsubsec Psalms
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{anglican-psalm-template.ly}
@appendixsec Orchestral templates
@appendixsubsec Orchestra, choir and piano
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{orchestra,-choir-and-piano-template.ly}
@appendixsubsec Transcription of mensural music
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-mensural-music.ly}
@appendixsubsec Gregorian transcription template
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@appendixsubsec Jazz combo
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc]
+@lilypondfile[verbatim,quote,ragged-right,texidoc]
{jazz-combo-template.ly}
easily understood.
For now, don't worry about the @code{#'}, which must precede the
-layout property, and the @code{#}, which must precede the value.
+layout property, and the@tie{}@code{#}, which must precede the value.
These must always be present in exactly this form. This is the
most common command used in tweaking, and most of the rest of
this chapter will be directed to presenting examples of how it is
@end example
Don't forget the @code{#'} preceding the
-property name and a @code{#} preceding the new value!
+property name and a@tie{}@code{#} preceding the new value!
The final question is, @q{Where should this command be
placed?} While you are unsure and learning, the best
@tab A valid direction constant or its numerical equivalent (decimal
values between -1 and 1 are allowed)
@tab @code{LEFT}, @code{CENTER}, @code{UP},
- @code{1}, @code{-1}
+ @code{1}, @w{@code{-1}}
@item Integer
@tab A positive whole number
@tab @code{3}, @code{1}
@code{(ly:make-moment 3 8)}
@item Number
@tab Any positive or negative decimal value
- @tab @code{3.5}, @code{-2.45}
+ @tab @code{3.5}, @w{@code{-2.45}}
@item Pair (of numbers)
@tab Two numbers separated by a @q{space . space} and enclosed
in brackets preceded by an apostrophe
need is @code{'#(#f #f #f)}. Let's try that, remembering to include
the @code{Staff} context. Note also that in writing this value we
have @code{#'#} before the opening bracket. The @code{'#} is required
-as part of the value to introduce a vector, and the first @code{#} is
+as part of the value to introduce a vector, and the first@tie{}@code{#} is
required, as always, to precede the value itself in the
@code{\override} command.
@end lilypond
Here we use the constants @code{DOWN} and @code{UP}.
-These have the values @code{-1} and @code{+1} respectively, and
+These have the values @w{@code{-1}} and @code{+1} respectively, and
these numerical values may be used instead. The value @code{0}
may also be used in some cases. It is simply treated as meaning
@code{UP} for stems, but for some objects it means @q{center}.
@noindent
If the fingering seems a little crowded the @code{font-size}
could be reduced. The default value can be seen from the
-@code{Fingering} object in the IR to be @code{-5}, so let's
-try @code{-7}:
+@code{Fingering} object in the IR to be @w{@code{-5}}, so let's
+try @w{@code{-7}}:
@lilypond[quote,fragment,ragged-right,verbatim,relative=1]
\override Fingering #'font-size = #-7
the @code{self-alignment-interface}. In general these are objects
that contain text. The values are @code{LEFT}, @code{RIGHT}
or @code{CENTER}. Alternatively, a numerical value between
-@code{-1} and @code{+1} may be specified, where @code{-1} is
+@w{@code{-1}} and @code{+1} may be specified, where @w{@code{-1}} is
left-aligned, @code{+1} is right-aligned, and numbers in between
move the text progressively from left-aligned to right-aligned.
Numerical values greater than @code{1} may be specified to move
-the text even further to the left, or less than @code{-1} to
+the text even further to the left, or less than @w{@code{-1}} to
move the text even further to the right. A change of @code{1}
in the value corresponds to a movement of half the text's length.
the rest is in voice two. The default in @code{\voiceTwo} (i.e. in
the second voice of a @code{<<@{...@} \\ @{...@}>>} construct) is that
@code{staff-position} is set to -4 for MultiMeasureRest, so we need to
-move it, say, four half-staff spaces down to @code{-8}.
+move it, say, four half-staff spaces down to @w{@code{-8}}.
@cindex MultiMeasureRest, example of overriding
@cindex staff-position property, example
<<
{
\once \override Stem #'transparent = ##t
+ \once \override Flag #'transparent = ##t
b8~ b\noBeam
}
\\
<<
{
\once \override Stem #'transparent = ##t
+ \once \override Flag #'transparent = ##t
\once \override Stem #'length = #8
b8~ b\noBeam
}
### makeinfo_like_foot_line_and_ref
### makeinfo_like_foot_lines
### makeinfo_like_paragraph
+### -) In tables, don't wrap <p> around the contents. Implemented in
+### makeinfo_like_paragraph
###
###
### Useful helper functions:
return $text if (($format eq 'itemize' or $format eq 'enumerate') and
($$paragraph_number == 1));
}
+ # The cells of a table should not be wrapped in a <p> tag, so just return the text
+ if (defined($command_stack_at_begin->[0]) and $command_stack_at_begin->[0] eq 'multitable')
+ {
+ return $text;
+ }
+
+ # Adjust all footnotes so that they look like good old makeinfo
my $open = '<p';
if ($align)
{
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@end html
@end ifhtml
-@emph{Meest recente update Wed Jul 13 10:59:12 UTC 2011
+@emph{Meest recente update Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
2 Algemene muzieknotatie
@*
-4184
+4187
@tab Jan Nieuwenhuizen
@tab
@tab
@item
Handleidingen
@*
-1203
+1214
@tab Jan Nieuwenhuizen
@tab Tineke de Munnik
@tab
only the @code{mensural} style is supported.
@lilypond[quote,fragment,ragged-right,verbatim]
-\override Stem #'flag-style = #'mensural
+\override Flag #'style = #'mensural
\override Stem #'thickness = #1.0
\override NoteHead #'style = #'mensural
\autoBeamOff
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'vaticana.punctum
\clef "vaticana-do2"
c
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'vaticana.punctum
\clef "vaticana-fa2"
c
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'medicaea.punctum
\clef "medicaea-do2"
c
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'medicaea.punctum
\clef "medicaea-fa2"
c
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'hufnagel.punctum
\clef "hufnagel-do2"
c
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'hufnagel.punctum
\clef "hufnagel-fa2"
c
\override Staff.StaffSymbol #'color = #red
\override Staff.LedgerLineSpanner #'color = #red
\override Voice.Stem #'transparent = ##t
+ \override Voice.Flag #'transparent = ##t
\override NoteHead #'style = #'hufnagel.punctum
\clef "hufnagel-do-fa"
c
trying to access an unsupported accidental, LilyPond will switch to a
different style.
-@c @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,texidoc,doctitle]
@c {ancient-accidentals.ly}
The style for accidentals and key signatures is controlled by the
orientation aids that bar lines give.
-@lilypondfile[verbatim,lilyquote,texidoc]
+@lilypondfile[verbatim,quote,texidoc]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@c This simple setup will take care of the
one can use either @code{\override Stem #'transparent = ##t} or
@code{\override Stem #'length = #0} instead, and restore the stem
when needed with the corresponding @code{\once \override Stem
-#'transparent = ##f} (see example below).
+#'transparent = ##f} (see example below). When using stems that
+carry flags, make sure to set @code{\override Flag #'transparent
+= ##t} as well.
@b{Timing.} For unmetered chant, there are several alternatives.
To avoid that syllables of different width (such as @qq{-ri} and
@qq{-rum}) spread the syllable note groups unevenly apart, the
-@code{#'X-extent} property of the @code{LyricText} object may be
+@code{'X-extent} property of the @code{LyricText} object may be
set to a fixed value. Another, more cumbersome way would be to
add the syllables as @code{\markup} elements. If further
adjustments are necessary, this can be easily done with
\remove "Time_signature_engraver"
\override BarLine #'X-extent = #'(-1 . 1)
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
\override Beam #'transparent = ##t
\override BarLine #'transparent = ##t
\override TupletNumber #'transparent = ##t
Internally, LilyPond uses Scheme (a LISP dialect) to provide
infrastructure. Overriding layout decisions in effect accesses the
program internals, which requires Scheme input. Scheme elements are
-introduced in a @file{.ly} file with the hash mark
-@code{#}.@footnote{@rextend{Scheme tutorial}, contains a short tutorial
-on entering numbers, lists, strings, and symbols in Scheme.}
+introduced in a @file{.ly} file with the hash
+mark@tie{}@code{#}.@footnote{@rextend{Scheme tutorial}, contains a
+short tutorial on entering numbers, lists, strings, and symbols in
+Scheme.}
@menu
@example
\override NoteHead #'style = #'slash
\override Stem #'transparent = ##t
+\override Flag #'transparent = ##t
@end example
All these plug-ins have to cooperate, and this is achieved with a
squashedPosition = #0
\override NoteHead #'style = #'slash
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
\alias Voice
@}
@end example
on @code{FingeringEvent} and one on @code{Fingering}.
The page on @code{FingeringEvent} describes the properties of the music
-expression for the input @code{-2}. The page contains many links
+expression for the input @w{@code{-2}}. The page contains many links
forward. For example, it says
@quotation
@end example
@var{value} is a Scheme object, which is why it must be preceded by
-the @code{#} character.
+the @code{#}@tie{}character.
Contexts properties are usually named in
@code{studlyCaps}. They mostly control the translation from
@cindex internal documentation
For many properties, regardless of the data type of the property, setting the
-property to false ( @code{##f} ) will result in turning it off, causing
+property to false (@code{#f}) will result in turning it off, causing
LilyPond to ignore that property entirely. This is particularly useful for
turning off grob properties which may otherwise be causing problems.
@item @code{\markup} commands
@item @code{\tag} commands
@item string markups, e.g. -"string"
-@item fingering instructions, e.g. @code{-1}
-@item articulation shortcuts, e.g. @code{-.}, @code{->}, @code{--}
+@item fingering instructions, e.g. @w{@code{-1}}
+@item articulation shortcuts, e.g. @w{@code{-.}}, @w{@code{->}}, @w{@code{--}}
@end itemize
Direction indicators affect only the next note:
by the @code{direction} property.
The value of the @code{direction} property may be
-set to @code{1}, meaning @qq{up} or @qq{above}, or to @code{-1},
+set to @code{1}, meaning @qq{up} or @qq{above}, or to @w{@code{-1}},
meaning @qq{down} or @qq{below}. The symbols @code{UP} and
-@code{DOWN} may be used instead of @code{1} and @code{-1}
+@code{DOWN} may be used instead of @code{1} and @w{@code{-1}}
respectively. The default direction may be specified by setting
@code{direction} to @code{0} or @code{CENTER}. Alternatively,
in many cases predefined commands
In a few cases, arpeggio being the only common example, the value
of the @code{direction} property specifies whether the object
is to be placed to the right or left of the parent object. In
-this case @code{-1} or @code{LEFT} means @qq{to the left} and
+this case @w{@code{-1}} or @code{LEFT} means @qq{to the left} and
@code{1} or @code{RIGHT} means @qq{to the right}. @code{0}
or @code{CENTER} means @qq{use the default} direction, as before.
@item attach-dir
This determines where the line starts and ends in the X-direction,
-relative to the bound object. So, a value of @code{-1} (or
+relative to the bound object. So, a value of @w{@code{-1}} (or
@code{LEFT}) makes the line start/end at the left side of the note
head it is attached to.
@end lilypond
Note that negative values move the text @emph{up}, contrary to the
-effect that might be expected, as a value of @code{-1} or
+effect that might be expected, as a value of @w{@code{-1}} or
@code{DOWN} means align the @emph{bottom} edge of the text with
the spanner line. A value of @code{1} or @code{UP} aligns
the top edge of the text with the spanner line.
value of @code{1}, is drawn after the staff lines (default
@code{layer} value @code{0}), so overwriting them. To change this,
the @code{Clef} object must be given in a lower value of
-@code{layer}, say @code{-1}, so that it is drawn earlier:
+@code{layer}, say @w{@code{-1}}, so that it is drawn earlier:
@lilypond[quote,verbatim,relative=2]
\override Staff.Clef #'color = #white
e2 \glissando f
@end lilypond
-The value for @code{Y} is set to @code{-2} for the right end
+The value for @code{Y} is set to @w{@code{-2}} for the right end
point. The left side may be similarly adjusted by specifying
@code{left} instead of @code{right}.
real value, in units of half the total X extent of the
object. Negative values move the object to the right, positive
to the left. A value of @code{0} centers the object on the
-reference point of its parent, a value of @code{-1} aligns the
+reference point of its parent, a value of @w{@code{-1}} aligns the
left edge of the object on the reference point of its parent,
and a value of @code{1} aligns the right edge of the object on the
reference point of its parent. The symbols @code{LEFT},
-@code{CENTER} and @code{RIGHT} may be used instead of the values
-@code{-1, 0, 1} respectively.
+@code{CENTER}, and @code{RIGHT} may be used instead of the values
+@w{@code{-1}}, @code{0}, and @code{1}, respectively.
Normally the @code{\override} command would be used to modify the
value of @code{self-alignment-X}, but the @code{\tweak} command
This may make adjusting the value of some objects tricky.
The units are just half the vertical extent of the object, which
is usually quite small, so quite large numbers may be required.
-A value of @code{-1} aligns the lower edge of the object with
+A value of @w{@code{-1}} aligns the lower edge of the object with
the reference point of the parent object, a value of @code{0}
aligns the center of the object with the reference point of the
parent, and a value of @code{1} aligns the top edge of the object
with the reference point of the parent. The symbols @code{DOWN},
-@code{CENTER}, @code{UP} may be substituted for @code{-1, 0, 1}
-respectively.
+@code{CENTER}, and @code{UP} may be substituted for @w{@code{-1}},
+@code{0}, and @code{1}, respectively.
@emph{Self-aligning objects in both directions}
}
@end lilypond
+@cindex Transposing guitar chords for capo
+
+If the @code{capoPitch} property is set, then the chords will additionally be printed
+transposed for a guitar with the capo set appropriately. By default the chords are
+printed on one line, but if the @code{capoVertical} property is set, the chords will be
+printed one above the other.
+
+In make-pitch, leave the first argument at 0, the second argument is the
+interval (-2 is a third), and the third argument adjusts it up or down a
+semitone.
+
+@lilypond[verbatim,quote,ragged-right]
+<<
+ \new ChordNames \chordmode {
+ c1
+ r1
+ g1
+ c1
+ \break
+ c1
+ r1
+ g1
+ c1
+ \break
+ c1
+ r1
+ g1
+ c1
+ }
+ \chordmode {
+ c1
+ r1
+ g1
+ c1
+ \break
+ \set ChordNames.capoPitch = #(ly:make-pitch 0 -2 -1/2)
+ c1
+ r1
+ g1
+ c1
+ \break
+ \set ChordNames.capoVertical = ##t
+ c1
+ r1
+ g1
+ c1
+ }
+>>
+@end lilypond
+
@snippets
@c Keep index entries with following snippet
@cindex chords, suppressing repeated
@funindex chordChanges
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{showing-chords-at-changes.ly}
-@c @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
@c {adding-bar-lines-to-chordnames-context.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@snippets
@cindex exceptions, chord names.
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-name-exceptions.ly}
@c TODO - tweak snippet to use \blackTriangleMarkup as well
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-name-major7.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-bar-lines-to-chordnames-context.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{volta-below-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-chord-separator.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-positions-of-figured-bass-alterations.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{avoiding-collisions-with-chord-fingerings.ly}
similarly named normal color.
Not all X11 colors are distinguishable in a web browser, i.e.,
-a web browser might not display a difference between @code{'LimeGreen}
-and @code{'ForestGreen}. For web use normal colors are recommended
-(i.e., @code{#blue}, @code{#green}, @code{#red}).
+a web browser might not display a difference between @code{LimeGreen}
+and @code{ForestGreen}. For web use normal colors are recommended
+(i.e., @code{blue}, @code{green}, @code{red}).
Notes in a chord cannot be colored with @code{\override}; use
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{default-direction-of-stems-on-the-center-line-of-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{grid-lines--changing-their-appearance.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{modifying-default-values-for-articulation-shorthand-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-vertical-ordering-of-scripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-a-delayed-turn.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-hairpin-behavior-at-bar-lines.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-minimum-length-of-hairpins.ly}
@cindex al niente
@cindex niente, al
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-hairpins-using-al-niente-notation.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligned-dynamics-and-textscripts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{hiding-the-extender-line-for-text-dynamics.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-text-and-spanner-styles-for-text-dynamics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-double-slurs-for-legato-chords.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-text-markups-inside-slurs.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-slurs-with-complex-dash-structure.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-breath-mark-symbol.ly}
@cindex caesura
@cindex railroad tracks
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{inserting-a-caesura.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adjusting-the-shape-of-falls-and-doits.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{contemporary-glissando.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-a-piano-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-cross-staff-arpeggios-in-other-contexts.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-arpeggios-across-notes-in-different-voices.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{controlling-the-placement-of-chord-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{allowing-fingerings-to-be-printed-inside-the-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{stem-and-beam-behavior-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{polyphony-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{open-string-harmonics-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fretted-string-harmonics-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{slides-in-tablature.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chord-glissando-in-tablature.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-fret-orientations.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-markup-fret-diagrams.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{customizing-fretboard-fret-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{defining-predefined-fretboards-for-other-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{chordchanges-for-fretboards.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fretboards-alternate-tables.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{placement-of-right-hand-fingerings.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingerings,-string-indications,-and-right-hand-fingerings.ly}
@item After every command or variable, i.e. every item that
begins with a @code{\} sign.
@item After every item that is to be interpreted as a Scheme
-expression, i.e. every item that begins with a @code{#} sign.
+expression, i.e. every item that begins with a @code{#}@tie{}sign.
@item To separate all elements of a Scheme expression.
@item In @code{lyricmode} to separate all the terms in both
@code{\override} and @code{\set} commands. In particular, spaces
must all be relative to the directory containing the main file,
not the directory containing the included file. However,
this behavior can be changed by passing the option
-@code{-drelative-includes} option at the command line
+@option{-drelative-includes} option at the command line
(or by adding @code{#(ly:set-option 'relative-includes #t)}
at the top of the main input file). With @code{relative-includes}
set, the path for each @code{\include} command will be taken
rhythmic-locations to the list.
In order to use this feature, LilyPond must be invoked with
-@code{-dclip-systems}. The clips are output as EPS files, and are
+@option{-dclip-systems}. The clips are output as EPS files, and are
converted to PDF and PNG if these formats are switched on as well.
For more information on output formats, see @rprogram{Invoking lilypond}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-midi-output-to-one-channel-per-voice.ly}
@knownissues
@end itemize
@c @snippets
-@c @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@c @lilypondfile[verbatim,quote,texidoc,doctitle]
@c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\RemoveEmptyStaffContext.ly}
@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312
% extend the stems to reach the other staff
\override Stem #'length = #12
% do not print extra flags
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
% prevent beaming as needed
a8 g4 f8 f bes\noBeam g4
}
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{indicating-cross-staff-chords-with-arpeggio-bracket.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{accordion-discant-symbols.ly}
* Bracket-tip glyphs::
* Pedal glyphs::
* Accordion glyphs::
+* Tie glyphs::
* Vaticana glyphs::
* Medicaea glyphs::
* Hufnagel glyphs::
@end lilypond
+@node Tie glyphs
+@unnumberedsubsec Tie glyphs
+
+@lilypond[quote]
+\include "font-table.ly"
+\markuplines \override-lines #'(word-space . 4)
+ \doc-chars #ties
+@end lilypond
+
+
@node Vaticana glyphs
@unnumberedsubsec Vaticana glyphs
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle,ragged-right]
+@lilypondfile[verbatim,quote,texidoc,doctitle,ragged-right]
{hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-extra-naturals-from-being-automatically-added.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{transposing-pitches-with-minimum-accidentals-smart-transpose.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-clef-properties.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ottava-text.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-ambitus-per-voice.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{ambitus-with-multiple-voices.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-ambitus-gap.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{numbers-as-easy-note-heads.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{applying-note-head-styles-depending-on-the-step-of-the-scale.ly}
To see all note head styles, see @ref{Note head styles}.
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{shortening-volta-brackets.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{adding-volta-brackets-to-additional-staves.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-double-repeat-default-for-volte.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-counter.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{percent-repeat-count-visibility.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{isolated-percent-repeats.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{cross-staff-tremolos.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{alternative-breve-note.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-number-of-augmentation-dots-per-note.ly}
@funindex tupletNumberFormatFunction
@funindex tupletSpannerDuration
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{entering-several-tuplets-using-only-one--times-command.ly}
@cindex Tuplet number changes
@funindex TupletNumber
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-tuplet-number.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{non-default-tuplet-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{controlling-tuplet-bracket-visibility.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{permitting-line-breaks-within-beamed-tuplets.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-ties-with-arpeggios.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{engraving-ties-manually.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{rest-styles.ly}
@cindex rest, church
@cindex kirchenpausen
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-form-of-multi-measure-rests.ly}
@cindex multi-measure rests, positioning
@cindex positioning multi-measure rests
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{positioning-multi-measure-rests.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{multi-measure-rest-markup.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-the-time-signature-without-affecting-the-beaming.ly}
@cindex compound time signatures
@cindex time signature, compound
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
@c perhaps also an example of how to move it horizontally?
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-tempo-without-a-metronome-mark.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{creating-metronome-marks-in-markup-mode.ly}
For more details, see @ref{Formatting text}.
The property @code{measurePosition} contains a rational number
indicating how much of the measure has passed at this point. Note
that this is set to a negative number by the @code{\partial} command:
-i.e., @code{\partial 4} is internally translated to @code{-4}, meaning
+i.e., @code{\partial 4} is internally translated to @w{@code{-4}}, meaning
@qq{there is a quarter note left in the measure.}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{compound-time-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{guitar-strum-rhythms.ly}
@funindex breakable
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beams-across-line-breaks.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{changing-beam-knee-gap.ly}
@cindex beams, \partcombine with \autoBeamOff
@cindex voices, \partcombine with \autoBeamOff
-@lilypondfile [verbatim, lilyquote, ragged-right, texidoc, doctitle]
+@lilypondfile [verbatim, quote, ragged-right, texidoc, doctitle]
{partcombine-and-autobeamoff.ly}
@seealso
of beaming-rules.
At this time the only available value of rule-type is
-@code{#'end} for beam ending.
+@code{'end} for beam ending.
Beaming-rules is a scheme alist (or list of pairs) that indicates the
beam type and the grouping to be applied to beams containing notes with
@cindex beams, subdividing
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{subdividing-beams.ly}
@cindex measure groupings
@cindex grouping beats
@cindex measure sub-grouping
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{conducting-signs,-measure-grouping-signs.ly}
@cindex beam, endings in a score
@cindex beam, endings with multiple voices
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{beam-endings-in-score-context.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{flat-flags-and-beam-nibs.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-the-bar-number-for-the-first-measure.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-at-regular-intervals.ly}
@cindex measure number, format
@cindex bar number, format
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-inside-boxes-or-circles.ly}
@cindex bar number alignment
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{aligning-bar-numbers.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{removing-bar-numbers-from-a-score.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{using-grace-note-slashes-with-normal-heads.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{tweaking-grace-layout-within-music.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{redefining-grace-note-global-defaults.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{positioning-grace-notes-with-floating-space.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{additional-voices-to-avoid-collisions.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{forcing-horizontal-shift-of-notes.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{combining-two-parts-on-the-same-staff.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-partcombine-texts.ly}
The relative importance of page (vertical) spacing and line
(horizontal) spacing. High values will make page spacing more
-important. Default: @code{#10}.
+important. Default: @code{10}.
@item print-all-headers
@funindex print-all-headers
There are also analogous settings to @code{ragged-right} and
@code{ragged-last} which have the same effect on vertical spacing:
@code{ragged-bottom} and @code{ragged-last-bottom}. If set to
-@code{##t} the systems on all pages or just the last page
+@code{#t} the systems on all pages or just the last page
respectively will not be justified vertically. See
@ref{Fixed vertical spacing \paper variables}.
The @code{Page_turn_engraver} reads the context property
@code{minimumPageTurnLength} to determine how long a note-free section must
be before a page turn is considered. The default value for
-@code{minimumPageTurnLength} is @code{#(ly:make-moment 1 1)}. If you want
+@code{minimumPageTurnLength} is @code{(ly:make-moment 1 1)}. If you want
to disable page turns, you can set it to something very large.
@example
spaced. Note that @code{@var{item2}} is not necessarily below
@code{@var{item1}}; for example,
@code{nonstaff-relatedstaff-spacing} will measure upwards from the
-non-staff line if @code{staff-affinity} is @code{#UP}.
+non-staff line if @code{staff-affinity} is @code{UP}.
Each distance is measured between the @emph{reference points} of
the two items. The reference point for a staff is the vertical
duration is taken as the basis for the spacing, with the stipulation
that this shortest duration should always be equal to or shorter than
an 8th note. The shortest duration is printed when you run
-@code{lilypond} with the @code{--verbose} option.
+@code{lilypond} with the @option{--verbose} option.
These durations may also be customized. If you set the
@code{common-shortest-duration} in @rinternals{SpacingSpanner}, then
which is the reference duration against that all music will be spaced.
The LilyPond Scheme function @code{make-moment} takes two arguments
-- a numerator and denominator which together express some fraction of
-a whole note. The call @code{#(ly:make-moment 1 20)} therefore produces
+a whole note. The call @code{(ly:make-moment 1 20)} therefore produces
a reference duration of a twentieth note. Values such as
-@code{#(ly:make-moment 1 16)}, @code{#(ly:make-moment 1 8)}, and
-@code{#(ly:make-moment 3 97)} are all possible as well.
+@code{(ly:make-moment 1 16)}, @code{(ly:make-moment 1 8)}, and
+@code{(ly:make-moment 3 97)} are all possible as well.
How do we select the right reference duration to pass to
@code{proportionalNotationDuration}? Usually by a process of trial
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{use-square-bracket-at-the-start-of-a-staff-group.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{display-bracket-with-only-one-staff-in-a-system.ly}
@cindex mensurstriche layout
@cindex transcription of mensural music
@cindex mensural music, transcription of
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{mensurstriche-layout-bar-lines-between-the-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{nesting-staves.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{making-some-staff-lines-thicker-than-the-others.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{vertically-aligning-ossias-and-lyrics.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{removing-the-first-empty-line.ly}
It is possible to adjust which aspects of the music are quoted with
@code{\cueDuring} by setting the @code{quotedCueEventTypes}
-property. Its default value is @code{#'(note-event rest-event
+property. Its default value is @code{'(note-event rest-event
tie-event beam-event tuplet-span-event)}, which means that only
notes, rests, ties, beams and tuplets are quoted, but not
articulations, dynamic marks, markup etc.
-In this example, the @code{Voice} context must be
-explicitly declared, or else the entire music expression would
-belong to the @code{CueVoice} context.
+@warning{When a @code{Voice} starts with @code{\cueDuring}, as in the
+following example, the @code{Voice} context must be explicitly declared,
+or else the entire music expression would belong to the @code{CueVoice}
+context.}
@lilypond[verbatim,quote]
oboeNotes = \relative c'' {
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-text-spanner-postfix.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{dynamics-custom-text-spanner-postfix.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-at-the-end-of-a-line.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{aligning-marks-with-various-notation-objects.ly}
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-marks-on-every-staff.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{stand-alone-two-column-markup.ly}
A @code{\markup} block may also contain quoted text strings. Such
strings are treated as minimal text expressions, and therefore any
-markup command or special character (such as @code{\} and @code{#})
+markup command or special character (such as @code{\} and@tie{}@code{#})
will be printed verbatim without affecting the formatting of the text.
Double quotation marks themselves may be printed by preceding them
with backslashes.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{formatting-lyrics-syllables.ly}
In order to assign more than one syllable to a single note with
spaces between the syllables, you can surround the phrase with
quotes or use a @code{_} character. Alternatively, you can use
-code the tilde symbol (@code{~}) to get a lyric tie. The lyric
-tie is implemented with the Unicode character U+203F, so be
-sure to use a font for this glyph which actually contains it.
-Freely available fonts with a lyric tie are, for example,
-`FreeSerif' (a Times clone), `DejaVuSans' (but not
-`DejaVuSerif'), or `TeXGyreSchola' (a Century Schoolbook
-clone).
+the tilde symbol (@code{~}) to get a lyric tie.
@lilypond[quote,ragged-right,verbatim]
{
\time 3/4
\relative c' { c2 e4 g2 e4 }
- \addlyrics { gran- de_a- mi- go }
- \addlyrics { pu- "ro y ho-" nes- to }
- \addlyrics { pu- ro~y~ho- nes- to }
+ \addlyrics { gran -- de_a -- mi -- go }
+ \addlyrics { pu -- "ro y ho" -- nes -- to }
+ \addlyrics { pu -- ro~y~ho -- nes -- to }
}
@end lilypond
When a melisma occurs on a syllable other that the last one in a
word, that syllable is usually joined to the following one with a
hyphenated line. This is indicated by placing a double hyphen,
-@code{--}, immediately after the syllable.
+@w{@code{--}}, immediately after the syllable.
Alternatively, when a melisma occurs on the last or only syllable in
a word an extender line is usually drawn from the end of the syllable
@rlearning{Vocal ensembles} templates in the Learning Manual.
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{lyrics-old-spacing-settings.ly}
@seealso
@end lilypond
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{lyrics-alignment.ly}
@c TODO: move to LSR -vv
@q{chord mode}; this syntax is explained in @ref{Chord notation}.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{simple-lead-sheet.ly}
@seealso
@cindex voices, divided
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{using-arpeggiobracket-to-make-divisi-more-visible.ly}
@seealso
specify its key so the conversion of its cue notes will be done
automatically. The example below shows this transposition for a
B-flat clarinet. The notes in this example are low on the staff so
-@code{#DOWN} is specified in @code{\cueDuring} (so the stems are
+@code{DOWN} is specified in @code{\cueDuring} (so the stems are
down) and the instrument name is positioned below the staff. Note
also that the piano right-hand voice is explicitly declared. This
is because the cue notes in this example begin at the start of the
and to make the piano notes clearer.
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{adding-orchestral-cues-to-a-vocal-score.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{chant-or-psalms-notation.ly}
Canticles and other liturgical texts may be set more freely, and
are spaced in accordance with the syllables rather than the notes'
durations.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{ancient-notation-template----modern-transcription-of-gregorian-music.ly}
@seealso
the start of the music and @code{\bar "|"} or @code{\bar "||"}
commands at the end of each line.
-@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{hymn-template.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing--flageolet-mark-size.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{fingering-symbols-for-wind-instruments.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{recorder-fingering-chart.ly}
@seealso
@endpredefined
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-listing.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{graphical-and-text-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{changing-the-size-of-woodwind-diagrams.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{woodwind-diagrams-key-lists.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{makam-example.ly}
@seealso
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{non-traditional-key-signatures.ly}
@snippets
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{compound-time-signatures.ly}
-@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+@lilypondfile[verbatim,quote,texidoc,doctitle]
{arabic-improvisation.ly}
msgid "Accordion glyphs"
msgstr "Glyphes d'accordéon"
+#. @node in Documentation/notation/notation-appendices.itely
+#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely
+msgid "Tie glyphs"
+msgstr "Glyphes de liaison"
+
#. @node in Documentation/notation/notation-appendices.itely
#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely
msgid "Vaticana glyphs"
texidoc = "
When writing a figured bass, you can place the figures above or below
the bass notes, by defining the @code{BassFigureAlignmentPositioning
-#'direction} property (exclusively in a @code{Staff} context). Choices
-are @code{#UP} (or @code{#1}), @code{#CENTER} (or @code{#0}) and
-@code{#DOWN} (or @code{#-1}).
+#'direction} property (exclusively in a @code{Staff} context). Choices
+are @code{UP} (or @code{1}), @code{CENTER} (or @code{0}) and
+@code{DOWN} (or @w{@code{-1}}).
This property can be changed as many times as you wish. Use
@code{\\once \\override} if you don't want the override to apply to the
(ly:bar-line::print grob)
X RIGHT
(grob-interpret-markup grob splitStaffBarLineMarkup)
- 0 0))
+ 0))
\break
}
piano reduction in a vocal score. The music function @code{\\cueWhile}
takes four arguments: the music from which the cue is to be taken, as
defined by @code{\\addQuote}, the name to be inserted before the cue
-notes, then either @code{#UP} or @code{#DOWN} to specify either
+notes, then either @code{UP} or @code{DOWN} to specify either
@code{\\voiceOne} with the name above the staff or @code{\\voiceTwo}
with the name below the staff, and finally the piano music in parallel
with which the cue notes are to appear. The name of the cued
-%% DO NOT EDIT this file manually; it is automatically
-%% generated from LSR http://lsr.dsi.unimi.it
-%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
-%% and then run scripts/auxiliar/makelsr.py
-%%
+% DO NOT EDIT this file manually; it is automatically
+% generated from Documentation/snippets/new
+% Make any changes in Documentation/snippets/new/
+% and then run scripts/auxiliar/makelsr.py
+%
+% This file is in the public domain.
+%% Note: this file works from version 2.15.9
%% This file is in the public domain.
-\version "2.15.7"
+\version "2.15.9"
\header {
- lsrtags = "ancient-notation"
-
%% Translation of GIT committish: 70f5f30161f7b804a681cd080274bfcdc9f4fe8c
texidoces = "
Aquí se muestran muchos de (¿o quizá todos?) los símbolos que
"
doctitlefr = "Gravure de musique ancienne"
+ lsrtags = "ancient-notation"
+
texidoc = "
Shown here are many (all?) of the symbols that are included in
LilyPond's support for ancient notation.
-
-
-
"
doctitle = "Ancient fonts"
} % begin verbatim
s32*1
% \break % 12 (32*1)
- }
+ } % begin verbatim
+
>>
>>
\MensuralVoice
\override NoteHead #'style = #'neomensural
\override Rest #'style = #'neomensural
- \override Stem #'flag-style = #'mensural
+ \override Flag #'style = #'mensural
\override Stem #'thickness = #1.0
}
\context {
Inside the chord (within the brackets @code{< >}), before the note to
be altered, place the @code{\\tweak} command, followed by
-@code{#'font-size} and define the proper size like @code{#-2} (a tiny
+@code{'font-size} and define the proper size like @w{@code{-2}} (a tiny
note head).
} % begin verbatim
\relative c' {
- <\tweak #'font-size #+2 c e g c \tweak #'font-size #-2 e>1^\markup { A tiny e }_\markup { A big c }
+ <\tweak #'font-size #+2 c e g c \tweak #'font-size #-2 e>1
+ ^\markup { A tiny e }_\markup { A big c }
}
texidoc = "
Though the simplest way to resize staves is to use
-@code{#(set-global-staff-size xx)}, an individual staff's size can be
+@code{#(set-global-staff-size @var{xx})}, an individual staff's size can be
changed by scaling the properties @code{'staff-space} and
@code{fontSize}.
texidoc = "
This code shows how to clip (extract) snippets from a full score.
-This file needs to be run separately with @code{-dclip-systems}; the
+This file needs to be run separately with @option{-dclip-systems}; the
snippets page may not adequately show the results.
The result will be files named
unless there is a beam of the same length as the tuplet. To control the
visibility of tuplet brackets, set the property
@code{'bracket-visibility} to either @code{#t} (always print a
-bracket), @code{#f} (never print a bracket) or @code{#'if-no-beam}
+bracket), @code{#f} (never print a bracket) or @code{'if-no-beam}
(only print a bracket if there is no beam).
"
\once \override NoteHead #'X-offset = #1.7
\once \override Stem #'rotation = #'(45 0 0)
\once \override Stem #'extra-offset = #'(-0.2 . -0.2)
- \once \override Stem #'flag-style = #'no-flag
+ \once \override Flag #'style = #'no-flag
\once \override Accidental #'extra-offset = #'(4 . 0)
}
\once \override TabNoteHead #'transparent = ##t
\once \override NoteHead #'transparent = ##t
\once \override Stem #'transparent = ##t
+ \once \override Flag #'transparent = ##t
\once \override NoteHead #'no-ledgers = ##t
\once \override Glissando #'(bound-details left padding) = #0.3
}
texidoc = "
Horizontal alignment for lyrics cam be set by overriding the
@code{self-alignment-X} property of the @code{LyricText} object.
-@code{#-1} is left, @code{#0} is center and @code{#1} is right;
-however, you can use @code{#LEFT}, @code{#CENTER} and @code{#RIGHT} as
+@w{@code{-1}} is left, @code{0} is center and @code{1} is right;
+however, you can use @code{LEFT}, @code{CENTER} and @code{RIGHT} as
well.
"
(grob-interpret-markup grob
(markup #:center-align #:fontsize -4
#:musicglyph "noteheads.s2cross"))
- -2.3 0))))
+ -2.3))))
}
speakOff = {
@code{dashBar}, @code{dashLarger}, @code{dashDot}, and
@code{dashUnderscore} are assigned default values. The default values
for the shorthands can be modified. For example, to associate the
-@code{-+} (@code{dashPlus}) shorthand with the trill symbol instead of
+@w{@code{-+}} (@code{dashPlus}) shorthand with the trill symbol instead of
the default + symbol, assign the value @code{trill} to the variable
@code{dashPlus}:
--- /dev/null
+%% This file is in the public domain.
+\version "2.15.9"
+
+\header {
+ lsrtags = "ancient-notation"
+
+ texidoc = "
+Shown here are many (all?) of the symbols that are included in
+LilyPond's support for ancient notation.
+"
+ doctitle = "Ancient fonts"
+} % begin verbatim
+
+upperStaff = \new VaticanaStaff = "upperStaff" <<
+ \context VaticanaVoice <<
+ \transpose c c {
+
+ \override NoteHead #'style = #'vaticana.punctum
+ \key es \major
+ \clef "vaticana-fa2"
+ c1 des e f ges
+
+ \override NoteHead #'style = #'vaticana.inclinatum
+ a! b ces'
+ \bar "|"
+ % \break % 1 (8*1)
+
+ \override NoteHead #'style = #'vaticana.quilisma
+ b! des'! ges! fes!
+ \breathe
+ \clef "vaticana-fa1"
+ \override NoteHead #'style = #'vaticana.plica
+ es d
+ \override NoteHead #'style = #'vaticana.reverse.plica
+ c d
+ \bar "|"
+ % \break %2 (8*1)
+
+ \override NoteHead #'style = #'vaticana.punctum.cavum
+ es f
+ \override NoteHead #'style = #'vaticana.lpes
+ g as
+ \override NoteHead #'style = #'vaticana.upes
+ bes as
+ \override NoteHead #'style = #'vaticana.vupes
+ g f
+ \override NoteHead #'style = #'vaticana.linea.punctum
+ \once \override Staff.BarLine #'bar-extent = #'(-1 . 1) \bar "|"
+ % \break % 3 (8*1)
+
+ es d
+ \override NoteHead #'style = #'vaticana.epiphonus
+ c d
+ \override NoteHead #'style = #'vaticana.cephalicus
+ es f
+
+ \override Staff.KeySignature #'glyph-name-alist = #alteration-medicaea-glyph-name-alist
+ \override Staff.Accidental #'glyph-name-alist = #alteration-medicaea-glyph-name-alist
+ \override Staff.Custos #'style = #'medicaea
+ \override NoteHead #'style = #'medicaea.punctum
+ \clef "medicaea-fa2"
+ ces des
+ \bar "|"
+ % \break % 4 (8*1)
+
+ e! f! ges
+ \clef "medicaea-do2"
+ \override NoteHead #'style = #'medicaea.inclinatum
+ a! b! ces'
+ \override NoteHead #'style = #'medicaea.virga
+ b! a!
+ \bar "|"
+ % \break % 5 (8*1)
+
+ ges fes
+ \clef "medicaea-fa1"
+ \override NoteHead #'style = #'medicaea.rvirga
+ e des ces
+
+ \override Staff.KeySignature #'glyph-name-alist = #alteration-hufnagel-glyph-name-alist
+ \override Staff.Accidental #'glyph-name-alist = #alteration-hufnagel-glyph-name-alist
+ \override Staff.Custos #'style = #'hufnagel
+ \override NoteHead #'style = #'hufnagel.punctum
+ \clef "hufnagel-fa2"
+ ces des es
+ \bar "|"
+ % \break % 6 (8*1)
+
+ fes ges
+ \clef "hufnagel-do2"
+ \override NoteHead #'style = #'hufnagel.lpes
+ as! bes! ces'
+ \override NoteHead #'style = #'hufnagel.virga
+ bes! as!
+ \bar "|"
+ % \break % 7 (8*1)
+
+ ges! fes!
+ \clef "hufnagel-do-fa"
+ \override NoteHead #'style = #'hufnagel.punctum
+ es! des ces des! es! fes!
+ \bar "||"
+ % \break % 8 (8*1)
+
+ s32*1
+ % \break % 12 (32*1)
+ }
+ >>
+>>
+
+lowerStaff = \new MensuralStaff = "lowerStaff" <<
+ \context MensuralVoice <<
+ \transpose c c {
+
+ \key a \major
+ cis'1 d'\breve gis'\breve e'\breve \[ e'\longa fis'\longa \]
+ \set Staff.forceClef = ##t
+ \clef "neomensural-c2"
+ cis1
+ \bar "|"
+ % \break % 2 (16*1)
+
+ \[ g\breve dis''\longa \]
+ b\breve \[ a\longa d\longa \]
+ \clef "petrucci-c2"
+ % \break % 4 (16*1)
+
+ fis1 ces1
+ \clef "petrucci-c2"
+ r\longa
+ \set Staff.forceClef = ##t
+ \clef "mensural-c2"
+ r\breve
+ \bar "|"
+ % \break % 5 (8*1)
+
+ r2
+ \clef "mensural-g"
+ r4 r8 r16 r16
+ \override NoteHead #'style = #'mensural
+ \override Rest #'style = #'mensural
+ \clef "petrucci-f"
+ c8 b, c16 b, c32 b, c64 b, c64 b,
+ d8 e d16 e d32 e d64 e d64 e
+ r\longa
+ \set Staff.forceClef = ##t
+ \clef "petrucci-f"
+ r\breve
+ \bar "|"
+ % \break % 6 (8*1)
+
+ r\breve
+ \clef "mensural-f"
+ r2 r4 r8 r16 r16
+
+ \set Staff.forceClef = ##t
+ \clef "mensural-f"
+ e\breve f g a1
+ \clef "mensural-g"
+ % \break % 7 (8*1)
+
+ \[ bes'!\longa a'!\longa c''!\longa \]
+ e'1 d' c' d' \bar "|"
+ \bar "|"
+ % \break % 9 (16*1)
+
+ bes'!\longa fis'!1 as'!1 ges'!\longa % lig
+ \set Staff.forceClef = ##t
+ \clef "mensural-g"
+ e'2 d' c' \bar "|"
+ % \break % 11 (16*1)
+
+ \set Staff.forceClef = ##t
+ \clef "petrucci-g"
+ c'2 d' e' f'
+ \clef "petrucci-g"
+ g' as'! bes'! cis''!
+ bes'! as'! gis'! fis'!
+ \set Staff.forceClef = ##t
+ \clef "mensural-g"
+ es'! des'! cis'!1 \bar "||"
+ % \break % 12 (8*1)
+ }
+ >>
+>>
+
+\paper {
+ line-thickness = #(/ staff-space 5.0)
+}
+
+\score {
+ <<
+ \upperStaff
+ \lowerStaff
+ >>
+ \layout {
+ indent = 0.0
+ line-width = 17.25\cm
+ \context {
+ \Score
+ timing = ##f
+ }
+ \context {
+ \MensuralVoice
+ \override NoteHead #'style = #'neomensural
+ \override Rest #'style = #'neomensural
+ \override Flag #'style = #'mensural
+ \override Stem #'thickness = #1.0
+ }
+ \context {
+ \MensuralStaff
+ \revert BarLine #'transparent
+ \override KeySignature #'glyph-name-alist = #alteration-mensural-glyph-name-alist
+ clefGlyph = #"clefs.petrucci.c2"
+ }
+ \context {
+ \VaticanaStaff
+ \revert BarLine #'transparent
+ \override StaffSymbol #'thickness = #2.0
+ \override KeySignature #'glyph-name-alist = #alteration-vaticana-glyph-name-alist
+ \override Custos #'neutral-position = #4
+ }
+ }
+}
+
texidoc = "
This code shows how to clip (extract) snippets from a full score.
-This file needs to be run separately with @code{-dclip-systems}; the
+This file needs to be run separately with @option{-dclip-systems}; the
snippets page may not adequately show the results.
The result will be files named
\once \override NoteHead #'X-offset = #1.7
\once \override Stem #'rotation = #'(45 0 0)
\once \override Stem #'extra-offset = #'(-0.2 . -0.2)
- \once \override Stem #'flag-style = #'no-flag
+ \once \override Flag #'style = #'no-flag
\once \override Accidental #'extra-offset = #'(4 . 0)
}
\once \override TabNoteHead #'transparent = ##t
\once \override NoteHead #'transparent = ##t
\once \override Stem #'transparent = ##t
+ \once \override Flag #'transparent = ##t
\once \override NoteHead #'no-ledgers = ##t
\once \override Glissando #'(bound-details left padding) = #0.3
}
%% Flag [Note Head - Stem]
%%
-noflag = \once \override Stem #'flag-style = #'no-flag
+noflag = \once \override Flag #'style = #'no-flag
%%%
%%% Functions
In accordance with standard typesetting rules, a natural sign is
printed before a sharp or flat if a previous accidental on the same
note needs to be canceled. To change this behavior, set the
-@code{extraNatural} property to @code{f} in the @code{Staff} context.
+@code{extraNatural} property to @code{#f} in the @code{Staff} context.
%% Flag [Note Head - Stem]
%%
-noflag = \once \override Stem #'flag-style = #'no-flag
+noflag = \once \override Flag #'style = #'no-flag
%%%
%%% Functions
Since @code{repeatCommands} takes a list, the simplest method of
including markup is to use an identifier for the text and embed it in
-the command list using the Scheme syntax @code{#(list (list 'volta
+the command list using the Scheme syntax @code{(list (list 'volta
textIdentifier))}. Start- and end-repeat commands can be added as
separate list elements:
@end html
@end ifhtml
-@emph{Last updated Wed Jul 13 10:59:12 UTC 2011
+@emph{Last updated Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.5 0.5
@item
Section titles
@*
-(1779)
+(193)
@tab Francisco Vila
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #ff7855">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@item
LilyPond --- \TITLE\
@item
2 Interfaces for programmers
@*
-(3568)
+(3899)
@tab Till Paala
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">translated</span>
+<span style="background-color: #dfef77">partially translated (98 %)</span>
@end html
@end ifhtml
@ifnothtml
-translated
+partially translated (98 %)
@end ifnothtml
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #39ff22">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Francisco Vila
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">translated</span>
+<span style="background-color: #dfef77">partially translated (98 %)</span>
@end html
@end ifhtml
@ifnothtml
-translated
+partially translated (98 %)
@end ifnothtml
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #39ff22">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@item
A GNU Free Documentation License
@item
2 Common notation
@*
-(4184)
+(4187)
@tab Pavel Fric
@*
@item
1.4 Repeats
@*
-(945)
+(944)
@tab Till Paala
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Francisco Vila
@*
@ifhtml
@html
-<span style="background-color: #39ff22">partially up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #39ff22">partially up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@item
1.6 Staff notation
@*
-(2345)
+(2341)
@tab Till Paala
@*
@ifhtml
@html
-<span style="background-color: #9eff30">partially up to date</span>
+<span style="background-color: #a5ff31">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #9eff30">partially up to date</span>
+<span style="background-color: #a5ff31">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #9eff30">partially up to date</span>
+<span style="background-color: #a5ff31">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@item
2.2 Keyboard and other multi-staff instruments
@*
-(864)
+(862)
@tab Till Paala
@*
@item
3 General input and output
@*
-(7671)
+(7686)
@tab Till Paala
@*
@ifhtml
@html
-<span style="background-color: #83fe2c">partially up to date</span>
+<span style="background-color: #8aff2d">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #91ff2e">partially up to date</span>
+<span style="background-color: #97ff2f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #d0f0f8">not translated</span>
+<span style="background-color: #1fff1f">translated</span>
@end html
@end ifhtml
@ifnothtml
-not translated
+translated
@end ifnothtml
@*
@ifhtml
@html
-<span style="background-color: #dfef77">partially translated (96 %)</span>
+<span style="background-color: #1fff1f">translated</span>
@end html
@end ifhtml
@ifnothtml
-partially translated (96 %)
+translated
@end ifnothtml
@*
@ifhtml
@html
-<span style="background-color: #d0f0f8">not translated</span>
+<span style="background-color: #1fff1f">translated</span>
@end html
@end ifhtml
@ifnothtml
-not translated
+translated
@end ifnothtml
@*
@item
5 Changing defaults
@*
-(12248)
+(12258)
@tab Till Paala
@*
@item
A Notation manual tables
@*
-(1989)
+(2017)
@tab Till Paala
@*
@ifhtml
@html
-<span style="background-color: #dfef77">partially translated (85 %)</span>
+<span style="background-color: #dfef77">partially translated (84 %)</span>
@end html
@end ifhtml
@ifnothtml
-partially translated (85 %)
+partially translated (84 %)
@end ifnothtml
@*
@item
1 Running @command{lilypond}
@*
-(3622)
+(3681)
@tab Reinhold Kainhofer
@*
Till Paala
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Team-hu
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@item
2 Updating files with @command{convert-ly}
@item
3 Running @command{lilypond-book}
@*
-(3952)
+(3978)
@tab Reinhold Kainhofer
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Federico Bruni
@*
@item
4 External programs
@*
-(2170)
+(2180)
@tab Till Paala
@*
Reinhold Kainhofer
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Francisco Vila
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Jean-Charles Malahieude
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Team-hu
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Yoshiki Sawada
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #25fe1f">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@item
5 Suggestions for writing files
@item
Manuals
@*
-(1203)
+(1214)
@tab Pavel Fric
@*
@item
Community
@*
-(1755)
+(1888)
@tab Pavel Fric
@*
@ifhtml
@html
-<span style="background-color: #25fe1f">partially up to date</span>
+<span style="background-color: #4efe25">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Francisco Vila
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Jean-Charles Malahieude
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Harmath Dénes
@*
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Federico Bruni
@*
@ifhtml
@html
-<span style="background-color: #25fe1f">partially up to date</span>
+<span style="background-color: #4efe25">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
@ifhtml
@html
-<span style="background-color: #1fff1f">up to date</span>
+<span style="background-color: #40fe23">partially up to date</span>
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Jan Nieuwenhuizen
@*
It is possible to record a MIDI file using a digital keyboard, and
then convert it to @file{.ly}. However, human players are not
rhythmically exact enough to make a MIDI to LY conversion trivial.
-When invoked with quantizing (@code{-s} and @code{-d} options)
+When invoked with quantizing (@option{-s} and @option{-d} options)
@command{midi2ly} tries to compensate for these timing errors, but is not
very good at this. It is therefore not recommended to use @command{midi2ly}
for human-generated midi files.
Running @command{lilypond-book} and @command{latex} creates a lot of
temporary files, which would clutter up the working directory. To
-remedy this, use the @code{--output=@var{dir}} option. It will create
+remedy this, use the @option{--output=@var{dir}} option. It will create
the files in a separate subdirectory @file{dir}.
Finally the result of the @LaTeX{} example shown above.@footnote{This
@emph{The Not So Short Introduction to @LaTeX{}}} for an overview on how
to use @LaTeX{}.
-Music is entered using
+@code{lilypond-book} provides the following commands and environments to include
+music in @LaTeX{} files:
+
+@itemize
+
+@item
+the @code{\lilypond@{...@}} command, where you can directly enter short
+lilypond code
+
+@item
+the @code{\begin@{lilypond@}...\end@{lilypond@}} environment, where you
+can directly enter longer lilypond code
+
+@item
+the @code{\lilypondfile@{...@}} command to insert a lilypond file
+
+@item
+the @code{\musicxmlfile@{...@}} command to insert a MusicXML file, which
+will be processed by @code{musicxml2ly} and @code{lilypond}.
+
+@end itemize
+
+In the input file, music is specified with any of the following commands:
@example
\begin@{lilypond@}[options,go,here]
YOUR LILYPOND CODE
\end@{lilypond@}
-@end example
-@noindent
-or
+\lilypond[options,go,here]@{ YOUR LILYPOND CODE @}
-@example
\lilypondfile[options,go,here]@{@var{filename}@}
+
+\musicxmlfile[options,go,here]@{@var{filename}@}
@end example
-@noindent
-or
-@example
-\lilypond[options,go,here]@{ YOUR LILYPOND CODE @}
-@end example
+@noindent
Additionally, @code{\lilypondversion} displays the current version
of lilypond.
example of a Texinfo document is this manual. The HTML, PDF, and Info
versions of the manual are made from the Texinfo document.
-In the input file, music is specified with
+@code{lilypond-book} provides the following commands and environments to include
+music into Texinfo files:
+
+@itemize
+
+@item
+the @code{@@lilypond@{...@}} command, where you can directly enter short
+lilypond code
+
+@item
+the @code{@@lilypond...@@end lilypond} environment, where you can directly
+enter longer lilypond code
+
+@item
+the @code{@@lilypondfile@{...@}} command to insert a lilypond file
+
+@item
+the @code{@@musicxmlfile@{...@}} command to insert a MusicXML file, which
+will be processed by @code{musicxml2ly} and @code{lilypond}.
+
+@end itemize
+
+In the input file, music is specified with any of the following commands
@example
@@lilypond[options,go,here]
YOUR LILYPOND CODE
@@end lilypond
-@end example
-
-@noindent
-or
-@example
@@lilypond[options,go,here]@{ YOUR LILYPOND CODE @}
-@end example
-@noindent
-or
-
-@example
@@lilypondfile[options,go,here]@{@var{filename}@}
+
+@@musicxmlfile[options,go,here]@{@var{filename}@}
@end example
Additionally, @code{@@lilypondversion} displays the current version
@node HTML
@subsection HTML
-Music is entered using
+@code{lilypond-book} provides the following commands and environments to include
+music in HTML files:
+
+@itemize
+
+@item
+the @code{<lilypond .... />} command, where you can directly enter short lilypond code
+
+@item
+the @code{<lilyond>...</lilypond>} environment, where you can directly enter longer
+lilypond code
+
+@item
+the @code{<lilypondfile>...</lilypondfile>} command to insert a lilypond file
+
+@item
+the @code{<musicxmlfile>...</musicxmlfile>} command to insert a MusicXML file, which
+will be processed by @code{musicxml2ly} and @code{lilypond}.
+
+@end itemize
+
+In the input file, music is specified with any of the following commands:
+\begin@{lilypond@}[options,go,here]
+ YOUR LILYPOND CODE
+\end@{lilypond@}
+
+\lilypond[options,go,here]@{ YOUR LILYPOND CODE @}
+
+\lilypondfile[options,go,here]@{@var{filename}@}
+
+\musicxmlfile[options,go,here]@{@var{filename}@}
+@example
+<lilypond options go here>
+ YOUR LILYPOND CODE
+</lilypond>
+
+<lilypond options go here: YOUR LILYPOND CODE />
+
+<lilypondfile options go here>@var{filename}</lilypondfile>
+
+<musicxmlfile options go here>@var{filename}</musicxmlfile>
+@end example
+
+For example, you can write
@example
<lilypond fragment relative=2>
\key c \minor c4 es g2
<lilypondfile @var{option1} @var{option2} ...>@var{filename}</lilypondfile>
@end example
+@code{<musicxmlfile>} uses the same syntax as @code{<lilypondfile>}, but simply
+references a MusicXML file rather than a LilyPond file.
+
For a list of options to use with the @code{lilypond} or
@code{lilypondfile} tags, see @ref{Music fragment options}.
@item ragged-right
Produce ragged-right lines with natural spacing, i.e.,
-@code{ragged-right = ##t} is added to the LilyPond snippet. This is the
-default for the @code{\lilypond@{@}} command if no @code{line-width}
-option is present. It is also the default for the @code{lilypond}
-environment if the @code{fragment} option is set, and no line width is
-explicitly specified.
+@code{ragged-right = ##t} is added to the LilyPond snippet. Single-line
+snippets will always be typeset by default as ragged-right, unless
+@code{noragged-right} is explicitly given.
@item noragged-right
For single-line snippets, allow the staff length to be stretched to
called @file{foo.ly}, it creates a file @file{foo.texidoc} if there
is a @code{texidoc} field in the @code{\header}. The @code{texidoc}
option makes @command{lilypond-book} include such files, adding its
-contents as a documentation block right before the music snippet.
+contents as a documentation block right before the music snippet (but
+outside the @code{example} environment generated by a @code{quote}
+option).
Assuming the file @file{foo.ly} contains
@file{foo.texidoc@var{LANG}} will be included instead of
@file{foo.texidoc}.
-@item lilyquote
-(Only for Texinfo output.) This option is similar to quote, but only
-the music snippet (and the optional verbatim block implied by
-@code{verbatim} option) is put into a quotation block. This option is
-useful if you want to @code{quote} the music snippet but not the
-@code{texidoc} documentation block.
-
@item doctitle
(Only for Texinfo output.) This option works similarly to
@code{texidoc} option: if @command{lilypond} is called with the
Running @command{dvips} may produce some warnings about fonts; these
are harmless and may be ignored. If you are running @command{latex} in
-twocolumn mode, remember to add @code{-t landscape} to the
+twocolumn mode, remember to add @option{-t landscape} to the
@command{dvips} options.
@subsubheading Texinfo
for already compiled snippets in the include path, and does not write
them back to the output directory, so in some cases it is necessary to
invoke further processing commands such as @command{makeinfo} or
-@command{latex} with the same @code{-I @var{dir}} options.
+@command{latex} with the same @option{-I @var{dir}} options.
@item -o @var{dir}
@itemx --output=@var{dir}
LilyPond Info documentation without images.
@itemx --lily-output-dir=@var{dir}
-Write lily-XXX files to directory @var{dir}, link into @code{--output}
+Write lily-XXX files to directory @var{dir}, link into @option{--output}
directory. Use this option to save building time for documents in
different directories which share a lot of identical snippets.
@item -P @var{command}
@itemx --process=@var{command}
Process LilyPond snippets using @var{command}. The default command is
-@code{lilypond}. @code{lilypond-book} will not @code{--filter} and
-@code{--process} at the same time.
+@code{lilypond}. @code{lilypond-book} will not @option{--filter} and
+@option{--process} at the same time.
@item --pdf
Create PDF files for use with PDF@LaTeX{}.
@itemx --use-source-file-names
Write snippet output files with the same base name as their source file.
This option works only for snippets included with @code{lilypondfile}
-and only if directories implied by @code{--output-dir} and
-@code{--lily-output-dir} options are different.
+and only if directories implied by @option{--output-dir} and
+@option{--lily-output-dir} options are different.
@item -V
@itemx --verbose
If you use the same filename extension for the input file than the
extension @command{lilypond-book} uses for the output file, and if the
input file is in the same directory as @command{lilypond-book} working
-directory, you must use @code{--output} option to make
+directory, you must use @option{--output} option to make
@command{lilypond-book} running, otherwise it will exit with an error
message like @qq{Output would overwrite input file}.
@item -e,--evaluate=@var{expr}
Evaluate the Scheme @var{expr} before parsing any @file{.ly} files.
-Multiple @code{-e} options may be given, they will be evaluated
+Multiple @option{-e} options may be given, they will be evaluated
sequentially.
The expression will be evaluated in the @code{guile-user} module, so
@table @samp
@item help
-Running @code{lilypond -dhelp} will print all of the @code{-d} options
+Running @code{lilypond -dhelp} will print all of the @option{-d} options
available.
@cindex paper-size, command line
Do not trust the @code{.ly} input.
When LilyPond formatting is available through a web server, either the
-@code{--safe} or the @code{--jail} option @b{MUST} be passed. The
-@code{--safe} option will prevent inline Scheme code from wreaking
+@option{--safe} or the @option{--jail} option @b{MUST} be passed. The
+@option{--safe} option will prevent inline Scheme code from wreaking
havoc, for example
@quotation
@end verbatim
@end quotation
-The @code{-dsafe} option works by evaluating in-line Scheme
+The @option{-dsafe} option works by evaluating in-line Scheme
expressions in a special safe module. This safe module is derived from
GUILE @file{safe-r5rs} module, but adds a number of functions of the
LilyPond API. These functions are listed in @file{scm/safe-lily.scm}.
In safe mode, it is not possible to import LilyPond variables
into Scheme.
-@code{-dsafe} does @emph{not} detect resource overuse. It is still possible to
+@option{-dsafe} does @emph{not} detect resource overuse. It is still possible to
make the program hang indefinitely, for example by feeding cyclic data
structures into the backend. Therefore, if using LilyPond on a
publicly accessible webserver, the process should be limited in both
CPU and memory usage.
The safe mode will prevent many useful LilyPond snippets from being
-compiled. The @code{--jail} is a more secure alternative, but
+compiled. The @option{--jail} is a more secure alternative, but
requires more work to set up.
@cindex output format, setting
for a dump of the raw, internal Scheme-based drawing commands.
@item null
- do not output a printed score; has the same effect as @code{-dno-print-pages}.
+ do not output a printed score; has the same effect as @option{-dno-print-pages}.
@end table
Example: @code{lilypond -dbackend=svg @var{filename}.ly}
Note to Windows users: By default @code{lilypond.exe} outputs all
progress information to the command window, @code{lilypond-windows.exe}
does not and returns a prompt, with no progress information, immediately
-at the command line. The @code{-dgui} option can be used in this case
+at the command line. The @option{-dgui} option can be used in this case
to redirect output to a log file.
@item print-pages
-Generate the full pages, the default. @code{-dno-print-pages} is
-useful in combination with @code{-dpreview}.
+Generate the full pages, the default. @option{-dno-print-pages} is
+useful in combination with @option{-dpreview}.
@end table
@item -i,--init=@var{file}
Set init file to @var{file} (default: @file{init.ly}).
+@cindex loglevel
+@cindex output verbosity, setting
+
+@item -l,--loglevel=@var{LEVEL}
+Set the verbosity of the console output to @var{LEVEL}. Possible values are:
+@table @code
+@item NONE
+No output at all, not even error messages.
+
+@item ERROR
+Only error messages, no warnings or progress messages.
+
+@item WARN
+Warnings and error messages, no progress.
+
+@item BASIC_PROGRESS
+Basic progress messages (success), warnings and errors.
+
+@item PROGRESS
+All progress messages, warnings and errors.
+
+@item INFO (default)
+Progress messages, warnings, errors and further execution information.
+
+@item DEBUG
+All possible messages, including verbose debug output.
+@end table
+
+
@cindex folder, directing output to
@cindex output filename, setting
@item --png
Generate pictures of each page, in PNG format. This implies
-@code{--ps}. The resolution in DPI of the image may be set with
+@option{--ps}. The resolution in DPI of the image may be set with
@example
-dresolution=110
@end example
@cindex Portable Document Format (PDF) output
@item --pdf
-Generate PDF. This implies @code{--ps}.
+Generate PDF. This implies @option{--ps}.
@item -j,--jail=@var{user},@var{group},@var{jail},@var{dir}
Run @command{lilypond} in a chroot jail.
-The @code{--jail} option provides a more flexible alternative to
-@code{--safe} when LilyPond formatting is available through a web
+The @option{--jail} option provides a more flexible alternative to
+@option{--safe} when LilyPond formatting is available through a web
server or whenever LilyPond executes externally provided
sources.
-The @code{--jail} option works by changing the root of @command{lilypond} to
+The @option{--jail} option works by changing the root of @command{lilypond} to
@var{jail} just before starting the actual compilation process. The user
and group are then changed to match those provided, and the current
directory is changed to @var{dir}. This setup guarantees that it is not
possible (at least in theory) to escape from the jail. Note that for
-@code{--jail} to work @command{lilypond} must be run as root, which is usually
+@option{--jail} to work @command{lilypond} must be run as root, which is usually
accomplished in a safe way using @command{sudo}.
Setting up a jail is a slightly delicate matter, as we must be sure that
@item LANG
This selects the language for the warning messages.
+@item LILYPOND_LOGLEVEL
+The default loglevel. If LilyPond is called without an explicit loglevel (i.e.
+no @option{--loglevel} command line option), this value is used.
+
@item LILYPOND_GC_YIELD
A variable, as a percentage, that tunes memory management
behavior. A higher values means the program uses more memory, a
@cindex call trace
@cindex Scheme error
Errors that occur while executing Scheme code are caught by the Scheme
-interpreter. If running with the verbose option (@code{-V} or
-@code{--verbose}) then a call trace of the offending
+interpreter. If running with the verbose option (@option{-V} or
+@option{--verbose}) then a call trace of the offending
function call is printed.
@item Programming error
@item -f,--from=@var{from-patchlevel}
Set the version to convert from. If this is not set, @command{convert-ly}
will guess this, on the basis of @code{\version} strings in the file.
-E.g. @code{--from=2.10.25}
+E.g. @option{--from=2.10.25}
@item -n,--no-version
Normally, @command{convert-ly} adds a @code{\version} indicator
@item --to=@var{to-patchlevel}
Set the goal version of the conversion. It defaults to the latest
-available version. E.g. @code{--to=2.12.2}
+available version. E.g. @option{--to=2.12.2}
@item -h, --help
Print usage help.
@divEnd
+@divClass{column-right-bottom}
+@subheading Sensitive emails
+
+Private matters should be sent to Graham Percival (project
+manager), who will discuss it with those concerned.
+
+@divEnd
@node Tiny examples
@imageFloat{text-input-1-annotate,png,center}
@imageFloat{text-input-1-output,png,center}
-Alterations are made with different names: add @code{-is} for
-sharp, and @code{-es} for flat (these are Dutch note names, other
+Alterations are made with different names: add @w{@code{-is}} for
+sharp, and @w{@code{-es}} for flat (these are Dutch note names, other
languages are available). LilyPond figures out where to put
accidentals.
s32 s32_\appassmolto s8. \voiceOne r8 <bes'' es bes'>-> s4
\override Stem #'cross-staff = ##t
\override Stem #'length = #28
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
s8 \voiceTwo g,8 aes4 s4
}
middleVoiceOne = \relative c' {
\override Stem #'cross-staff = ##t
\override Stem #'length = #32
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
d!8\noBeam s8 s8 s8_\crmolto s4 % 1
s4 <g bes\arpeggio>8[ <es' g>] \voiceOne e,8( dis16 e) | % 2
\revert Stem #'length
s2. | % 1
\override Stem #'cross-staff = ##t
\override Stem #'length = #24
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
s2 \voiceTwo e!4 | % 2
s4 \voiceTwo <bes c es f>8 <f' aes es'>16 d' <bes, f' aes c>8 <bes' fis'> | % 3
}
@c used for news about the upcoming release; see CG 10.2
+@newsItem
+@subsubheading LilyPond 2.15.9 released! @emph{August 30, 2011}
+
+We are happy to announce the release of LilyPond 2.15.9. This
+release contains the usual number of bugfixes, and also adds
+support for MacOS X 10.7.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version. Please
+note that due to a few outstanding Critical bugs, this is not the
+next release candidate.
+
+@newsEnd
+
+
@newsItem
@subsubheading Release candidate 1 of 2.16 - LilyPond 2.15.8 released! @emph{Aug 01, 2011}
@subsubheading February 2, 2004
LilyPond 2.1.17 is out. It adds texts
(solo, a due) for the part combiner. It also reinstates the
-@code{--safe} option which prevents havoc by Scheme exploits. More
+@option{--safe} option which prevents havoc by Scheme exploits. More
information in the
@ref{Changes}.
@newsEnd
</div>
@end html
@iftex
-@image{ly-examples/\IMAGE-FILE\-small,,,\IMAGE-FILE\,png}
+@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png}
@end iftex
@ifinfo
@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png}
@end html
@end ifhtml
-@emph{最近更新 Wed Jul 13 10:59:12 UTC 2011
+@emph{最近更新 Sat Aug 13 14:15:49 UTC 2011
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@item
手册
@*
-1203
+1214
@tab Ben Luo
@tab
@tab
@item
社区
@*
-1755
+1888
@tab
@tab
@tab
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=15
-PATCH_LEVEL=9
+PATCH_LEVEL=10
MY_PATCH_LEVEL=
VERSION_STABLE=2.14.2
-VERSION_DEVEL=2.15.8
+VERSION_DEVEL=2.15.9
get_working_directory ()
{
char cwd[PATH_MAX];
- getcwd (cwd, PATH_MAX);
-
- return string (cwd);
+ // getcwd returns NULL upon a failure, contents of cwd would be undefined!
+ return string (getcwd (cwd, PATH_MAX));
}
/* Join components to full file_name. */
Real lc () const;
void print () const;
Real eval (Real) const;
+ Real minmax (Real, Real, bool) const;
void print_sols (vector<Real>) const;
void check_sols (vector<Real>) const;
void check_sol (Real x) const;
#include "std-string.hh"
-void error (string s);
-void message (string s);
-void non_fatal_error (string);
-void programming_error (string s);
-void progress_indication (string s);
-void warning (string s);
-void successful (string s);
+/* Log-level bitmasks */
+#define LOG_NONE 0
+#define LOG_ERROR 1<<0
+#define LOG_WARN 1<<1
+#define LOG_BASIC 1<<2 // undocumented basic_progress, i.e. input file name and success
+#define LOG_PROGRESS 1<<3
+#define LOG_INFO 1<<4
+#define LOG_DEBUG 1<<8
+
+/* Log-level definitions (or'ed bitmasks) */
+#define LOGLEVEL_NONE (LOG_NONE)
+#define LOGLEVEL_ERROR (LOG_ERROR)
+#define LOGLEVEL_WARN (LOGLEVEL_ERROR | LOG_WARN)
+#define LOGLEVEL_BASIC (LOGLEVEL_WARN | LOG_BASIC)
+#define LOGLEVEL_PROGRESS (LOGLEVEL_BASIC | LOG_PROGRESS)
+#define LOGLEVEL_INFO (LOGLEVEL_PROGRESS | LOG_INFO)
+#define LOGLEVEL_DEBUG (LOGLEVEL_INFO | LOG_DEBUG)
+
+extern int loglevel;
+
+/* output messages, in decreasing order of importance */
+void error (string s, string location = ""); // Fatal error, exits lilypond!
+void programming_error (string s, string location = "");
+void non_fatal_error (string, string location = "");
+void warning (string s, string location = "");
+void basic_progress (string s, string location = "");
+/* progress_indication does by default *NOT* start on a new line */
+void progress_indication (string s, bool newline = false, string location = "");
+void message (string s, bool newline = true, string location = "");
+void debug_output (string s, bool newline = true, string location = "");
+
+/* Helper functions that always print out the message. Callers should ensure
+ that the loglevel is obeyed */
+void print_message (int level, string location, string s, bool newline = true);
+
+bool is_loglevel (int level);
+void set_loglevel (int level);
+void set_loglevel (string level);
#endif /* WARN_HH */
return dest;
}
+Real
+Polynomial::minmax (Real l, Real r, bool ret_max) const
+{
+ vector<Real> sols;
+ if (l > r)
+ {
+ programming_error ("left bound greater than right bound for polynomial minmax. flipping bounds.");
+ l = l + r;
+ r = l - r;
+ l = l - r;
+ }
+
+ sols.push_back (eval (l));
+ sols.push_back (eval (r));
+
+ Polynomial deriv (*this);
+ deriv.differentiate ();
+ vector<Real> maxmins = deriv.solve ();
+ for (vsize i = 0; i < maxmins.size (); i++)
+ if (maxmins[i] >= l && maxmins[i] <= r)
+ sols.push_back (eval (maxmins[i]));
+ vector_sort (sols, less<Real> ());
+
+ return ret_max ? sols.back () : sols[0];
+}
+
void
Polynomial::differentiate ()
{
using namespace std;
-/* Is progress indication at NEWLINE? */
-static bool progress_newline = true;
+/** We have several different loglevels, each with its own message function(s):
+ ERROR: error, non_fatal_error, programming_error
+ WARN: warning
+ BASIC_PROGRESS: success/...
+ PROGRESS: progress_indication
+ INFO: message
+ DEBUG: debug
+ All these functions check whether the corresponding loglevel bit is set
+ and print the message only if that's the case
+*/
+
+/* Define the loglevel (default is INFO) */
+int loglevel = LOGLEVEL_INFO;
+
+bool
+is_loglevel (int level)
+{
+ // Check the bitmask containing the loglevel
+ return (loglevel & level);
+}
+
+void
+set_loglevel (int level)
+{
+ loglevel = level;
+ debug_output (_f ("Log level set to %d\n", loglevel));
+}
+
+void
+set_loglevel (string level)
+{
+ /* Convert the loglevel string to lower-case, so we allow
+ both upper- and lower-case loglevels */
+ std::transform (level.begin (), level.end (), level.begin (), ::tolower);
+
+ /* Compare just the first few characters, so the loglevels
+ can be abbreviated */
+ if (level.compare (0, 5, "debug") == 0) // debug
+ set_loglevel (LOGLEVEL_DEBUG);
+ else if (level.compare (0, 4, "info") == 0) // info
+ set_loglevel (LOGLEVEL_INFO);
+ else if (level.compare (0, 4, "prog") == 0) // progress
+ set_loglevel (LOGLEVEL_PROGRESS);
+ else if (level.compare (0, 5, "basic") == 0) // basic progress
+ set_loglevel (LOGLEVEL_BASIC);
+ else if (level.compare (0, 4, "warn") == 0) // warning
+ set_loglevel (LOGLEVEL_WARN);
+ else if (level.compare (0, 3, "err") == 0) // error
+ set_loglevel (LOGLEVEL_ERROR);
+ else if (level.compare (0, 4, "none") == 0) // none
+ set_loglevel (LOGLEVEL_NONE);
+ else
+ {
+ int l;
+ if (sscanf (level.c_str (), "%d", &l))
+ set_loglevel (l);
+ else
+ {
+ non_fatal_error (_f ("unknown log level `%s', using default (INFO)",
+ level));
+ set_loglevel (LOGLEVEL_INFO);
+ }
+ }
+}
+
+
+/**
+ * Helper functions: print_message_part (no newline prepended)
+ * print_message (always starts on a new line)
+ */
+
+/* Is output message at NEWLINE? */
+static bool message_newline = true;
-/* Display user information that is not a full message. */
+/* Display user information as a full message.
+ if newline is true, start the message on a new line.
+*/
void
-progress_indication (string s)
+print_message (int level, string location, string s, bool newline)
{
+ /* Only print the message if the current loglevel allows it: */
+ if (!is_loglevel (level))
+ return;
+ if (newline && !message_newline)
+ fputc ('\n', stderr);
+
/* Test if all silly progress_indication ("\n") can be dropped now. */
if (s == "\n")
return;
+ if (!location.empty ())
+ s = location + ": " + s;
fputs (s.c_str (), stderr);
fflush (stderr);
if (s.length ())
- progress_newline = s[s.length () - 1] == '\n';
+ message_newline = s[s.length () - 1] == '\n';
}
-/* Display a single user message. Always starts on a new line. */
+
+/** The actual output functions to be called in lilypond code.
+ * Sorted in descending order of importance (errors, warnings, progress, info,
+ * debug). Each prints a message on a separate line.
+ */
+
+/* Display a fatal error message. Also exits lilypond. */
void
-message (string s)
+error (string s, string location)
{
- if (!progress_newline)
- fputc ('\n', stderr);
- progress_indication (s);
+ print_message (LOG_ERROR, location, _f ("fatal error: %s", s) + "\n");
+ exit (1);
}
-/* Display a success message. Always starts on a new line. */
+/* Display a severe programming error message, but don't exit. */
void
-successful (string s)
+programming_error (string s, string location)
{
- message (_f ("success: %s", s.c_str ()) + "\n");
+ print_message (LOG_ERROR, location, _f ("programming error: %s", s) + "\n");
+ print_message (LOG_ERROR, location, _ ("continuing, cross fingers") + "\n");
}
-/* Display a warning message. Always starts on a new line. */
+/* Display a non-fatal error message, don't exit. */
void
-warning (string s)
+non_fatal_error (string s, string location)
{
- message (_f ("warning: %s", s.c_str ()) + "\n");
+ print_message (LOG_ERROR, location, _f ("error: %s", s) + "\n");
}
+/* Display a warning message. */
void
-non_fatal_error (string s)
+warning (string s, string location)
{
- message (_f ("error: %s", s.c_str ()) + "\n");
+ print_message (LOG_WARN, location, _f ("warning: %s", s) + "\n");
}
-/* Display an error message. Always starts on a new line. */
+/* Display a success message. */
void
-error (string s)
+basic_progress (string s, string location)
{
- non_fatal_error (s);
- exit (1);
+ print_message (LOG_BASIC, location, s + "\n", true);
+}
+
+/* Display information about the progress. */
+void
+progress_indication (string s, bool newline, string location)
+{
+ print_message (LOG_PROGRESS, location, s, newline);
}
+/* Display a single info message. */
void
-programming_error (string s)
+message (string s, bool newline, string location)
{
- message (_f ("programming error: %s", s) + "\n");
- message (_ ("continuing, cross fingers") + "\n");
+ // Use the progress loglevel for all normal messages (including progress msg)
+ print_message (LOG_INFO, location, s, newline);
}
+/* Display a debug information, not necessarily on a new line. */
+void
+debug_output (string s, bool newline, string location)
+{
+ print_message (LOG_DEBUG, location, s, newline);
+}
+++ /dev/null
-\version "2.14.0"
-
-\header {
- texidoc = "Cautionary accidentals applied to tied notes after a
-bar line are valid for the whole measure."
-}
-
-notes = \relative c' {
- fis1 ~
- fis!2 fis ~
- fis?2 fis
-}
-
-<<
- \new NoteNames \notes
- \new Staff \notes
->>
\version "2.14.0"
\header {
- texidoc = "Accidentals can be forced with ! and ? even if the notes are tied."
+ texidoc = "Accidentals can be forced with ! and ? even if the
+notes are tied. Cautionary accidentals applied to tied notes
+after a bar line are valid for the whole measure.
+"
}
\layout {
}
\relative c'' {
- gis4 ~ gis!~ gis?
+ gis4 ~ gis!~ gis? r4
+ fis1 ~
+ fis!2 fis ~
+ fis?2 fis
}
+
+++ /dev/null
-\version "2.14.0"
-
-\header {
- texidoc = "The presence of an accidental after a broken tie can be
-overridden."
-}
-\layout {
- ragged-right = ##t
-}
-
-mus = \relative c' {
- \override Accidental #'hide-tied-accidental-after-break = ##t
- f1~
- f2~f4 % ~ f8
- fis8 gis8 ~
- \break
- gis1
-}
-
-<<
- \new NoteNames \mus
- \new Voice { \key g \major \mus }
->>
texidoc = "The second and third notes should not get accidentals,
because they are tied to a note. However, an accidental is
present if the line is broken at the tie, which happens for the G
- sharp."
+ sharp.
+ The presence of an accidental after a broken tie can be
+ overridden.
+"
}
\layout {
ragged-right = ##t
fis8 gis8 ~
\break
gis1
+ \override Accidental #'hide-tied-accidental-after-break = ##t
+ f1~
+ f2~f4 % ~ f8
+ fis8 gis8 ~
+ \break
+ gis1
}
<<
+\version "2.14.0"
%{
#(ly:set-option 'backend 'svg)
#(set! output-count 1)
\include "typography-demo.ly"
-\version "2.14.0"
#(define outname (ly:parser-output-name parser))
+++ /dev/null
-
-\header { texidoc = "The dashes in a dashed bar line covers staff
- lines exactly. Dashed barlines between staves start and end on a
- half dash precisely." }
-
-\version "2.14.0"
-
-\paper { ragged-right = ##t }
-
-\relative \new StaffGroup <<
- \new Staff {
- c4 \bar "dashed" c }
- \new Staff {
- c c
- }
->>
-
+++ /dev/null
-
-\header {
- texidoc = "The dots in a dotted bar line are in spaces."
-
-}
-
-\version "2.14.0"
-
-\paper { ragged-right = ##t }
-
-\relative \new StaffGroup <<
- \new Staff {
- c4 \bar ":" c }
- \new Staff {
- c c
- }
->>
-
+++ /dev/null
-
-\header { texidoc = "A thick bar line is created by \bar \".\", which is consistent with e.g. \bar \"|.\"" }
-
-\version "2.14.0"
-
-\paper { ragged-right = ##t }
-
-\relative \new StaffGroup <<
- \new Staff {
- c4 \bar "." c }
- \new Staff {
- c c
- }
->>
-
+++ /dev/null
-
-\header { texidoc = "A ticked bar line is a short line of the same length as a
- staff space, centered on the top-most barline." }
-
-\version "2.14.0"
-
-\paper { ragged-right = ##t }
-
-\relative \new StaffGroup <<
- \new Staff {
- c4 \bar "'" c }
- \new Staff {
- c c
- }
->>
-
--- /dev/null
+\version "2.14.0"
+
+\header { texidoc = "Various types of bar lines can be drawn.
+
+The dashes in a dashed bar line covers staff lines exactly. Dashed
+barlines between staves start and end on a half dash precisely.
+
+The dots in a dotted bar line are in spaces.
+
+A thick bar line is created by \bar \".\", which is consistent
+with e.g. \bar \"|.\"
+
+A ticked bar line is a short line of the same length as a staff
+space, centered on the top-most barline.
+
+" }
+
+\relative \new StaffGroup <<
+ \new Staff = "1" {
+ c2 \bar "dashed" c
+ s1
+ c2 \bar ":" c
+ s1
+ c2 \bar "." c
+ s1
+ c2 \bar "'" c
+ }
+ \new Staff = "2" {
+ c2 c
+ s1
+ c2 c
+ s1
+ c2 c
+ s1
+ c2 c
+ }
+>>
+
\header {
texidoc = "Point-symmetric beams should receive the same
- quanting. There is no up/down bias in the quanting code."
+quanting. There is no up/@/down bias in the quanting code."
}
\layout{
g'4\rest
b,8[ b16 \stemDown b''16 b ]
- }
+ }
>>
is printed over the beam."
}
+%% FIXME: This file should actually NOT produce any warnings!
+#(ly:set-option 'warning-as-error #f)
\version "2.14.0"
\hideNotes
e4 e
}
- %
+%
%%
%% Ross p108--112
e4 e4.
}
- % Ross, p122
+% Ross, p122
primeSixteenths = \relative c' {
\stemUp
\assertBeamQuant #'(0 . -1) #'(0 . -1)
--- /dev/null
+\version "2.15.9"
+
+\header {
+ texidoc = "Beamed rests are given a pure height approximation
+that gets their spacing correct in the majority of circumstances.
+"
+}
+
+\relative c'' {
+ <f b c f>16[ r <f bes c f> <f b c f>]
+ <f b c f>16[ r <f'' bes c f> <f b c f>]
+ <f b c f>16[ r <f,, bes c f> <f b c f>]
+ <f'' b c f>16[ r <f bes c f> <f b c f>]
+}
--- /dev/null
+#(ly:set-option 'warning-as-error #f)
+ \version "2.15.9"
+
+
+\header {
+ texidoc = "This input file contains a UTF-8 BOM not at the very beginning,
+ but on the first line after the first byte. LilyPond should gracefully
+ ignore this BOM as specified in RFC 3629, but print a warning."
+}
+
+{ c }
\version "2.14.0"
\header {
- texidoc = "The default callback for break-align-anchor in clefs and time/key
-signatures reads the break-align-anchor-aligment property to align
+ texidoc = "The default callback for break-align-anchor in clefs and time/@/key
+signatures reads the @code{break-align-anchor-aligment} property to align
the anchor to the extent of the break-aligned grob."
}
\header{
texidoc="
Gregorian chant notation sometimes also uses commas and ticks, but in
-smaller font size (we call it 'virgula' and 'caesura'). However, the
-most common breathing signs are divisio minima/maior/maxima and
+smaller font size (we call it `virgula' and `caesura'). However, the
+most common breathing signs are divisio minima/@/maior/@/maxima and
finalis, the latter three looking similar to bar glyphs.
-
" }
\include "gregorian.ly"
--- /dev/null
+\version "2.14.0"
+
+\header{
+ texidoc="Properties capoPitch, capoVertical: display chordnames, suitably
+transposed for a guitar capo, either in a line or one above the other.
+"
+}
+
+<<
+ \new ChordNames \chordmode {
+ c1
+ g1
+ c1
+ g1
+ c1
+ g1
+ }
+ \chordmode {
+ c1
+ g1
+ \set ChordNames.capoPitch = #(ly:make-pitch 0 -2 -1/2)
+ c1
+ g1
+ \set ChordNames.capoVertical = ##t
+ c1
+ g1
+ }
+>>
@item Regions can span multiple systems. In this case, multiple EPS files are generated.
@end itemize
-This file needs to be run separately with @code{-dclip-systems}; the
+This file needs to be run separately with @option{-dclip-systems}; the
collated-files.html of the regression test does not adequately show
the results.
b
\override NoteHead #'color = #green
\override Stem #'color = #blue
+ \override Flag #'color = #magenta
e8 es d dis e4 r
}
"
}
-#(set-paper-size "a6")
-
\layout { ragged-right= ##t }
"
}
-#(set-paper-size "a6")
-
\layout { ragged-right= ##t }
--- /dev/null
+\version "2.14.0"
+
+\header {
+ texidoc="
+Using \contextStringTuning does not break compiling.
+"
+}
+
+mynotes = {
+ c'4 e' g' c'' |
+ e''4 g'' b'' c'''
+}
+
+<<
+ \new Staff {
+ \clef treble
+ \mynotes
+ }
+ \new TabStaff {
+ \contextStringTuning #'custom-tuning <c' g' d'' a''>
+ \mynotes
+ }
+>>
+
\header {
texidoc = "Clefs for cue notes at the start of a score should print the
-standard clef plus a small cue clef after the time/key signature."
+standard clef plus a small cue clef after the time/@/key signature."
}
vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 }
printed at the end of the line.
Cue notes going over a line break should print the standard clef on the new
-line plus an additional cue clef after the time/key signature."
+line plus an additional cue clef after the time/@/key signature."
}
vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 }
(display c out))))))
`(let* ((parser-clone (ly:parser-clone parser))
(input-str (string-trim-both ,lily-string))
- (music (car (ly:music-property (parse-string-result input-str
- parser-clone)
- 'elements)))
+ (music (ly:parse-string-expression parser-clone input-str))
(result-str (string-trim-both (music->lily-string music parser-clone))))
(cons input-str result-str))))
texidoc = "When figures appear inside a voice, @code{ignoreFiguredBassRest}
causes all figures on rests to be discarded and all spanners ended.
- If set to @code{##f}, figures on rests are printed.
+ If set to @code{#f}, figures on rests are printed.
"
}
\header {
texidoc = "Ordering of the fingerings depends on vertical ordering of the notes, and
-is independent of up/down direction."
+is independent of up/@/down direction."
}
\header {
texidoc = "Default flag styles: '(), 'mensural and 'no-flag.
- Compare all three methods to print them: (1) C++ default implementation,
- (2) Scheme implementation using the 'flag-style grob property and
+ Compare all three methods to print them: (1) C++ default implementation,
+ (2) Scheme implementation using the 'style grob property and
(3) setting the 'flag property explicitly to the desired Scheme function.
All three systems should be absolutely identical."
}
c''8 d''16 c''32 d''64 \acciaccatura {c''8} d''64
}
-% Old settings: flag-style set to default, 'mensural, 'no-flag; using the
+% Old settings: style set to default, 'mensural, 'no-flag; using the
% default C++ function ly:stem::calc-stem
{
\override Score.RehearsalMark #'self-alignment-X = #LEFT
\testnotes
\mark "Symbol: 'mensural (C++)"
- \override Stem #'flag-style = #'mensural
+ \override Flag #'style = #'mensural
\testnotes
\mark "Symbol: 'no-flag (C++)"
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
\testnotes
}
\override Score.RehearsalMark #'self-alignment-X = #LEFT
\time 2/4
- \override Stem #'flag = #default-flag
- \revert Stem #'flag-style
+ \override Flag #'stencil = #default-flag
+ \revert Flag #'style
\mark "Default flags (Scheme)"
\testnotes
\mark "Symbol: 'mensural (Scheme)"
- \override Stem #'flag-style = #'mensural
+ \override Flag #'style = #'mensural
\testnotes
\mark "Symbol: 'no-flag (Scheme)"
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
\testnotes
}
\time 2/4
\mark "Function: normal-flag"
- \override Stem #'flag = #normal-flag
+ \override Flag #'stencil = #normal-flag
\testnotes
\mark "Function: mensural-flag"
- \override Stem #'flag = #mensural-flag
+ \override Flag #'stencil = #mensural-flag
\testnotes
\mark "Function: no-flag"
- \override Stem #'flag = #no-flag
+ \override Flag #'stencil = #no-flag
\testnotes
}
\version "2.14.0"
\header {
- texidoc = "The 'flag property of the Stem grob can be set to a custom
+ texidoc = "The 'stencil property of the Flag grob can be set to a custom
scheme function to generate the glyph for the flag."
}
% test notes, which will be shown in different style:
testnotes = { \autoBeamOff c'8 d'16 c'32 d'64 \acciaccatura {c'8} d'64 c''8 d''16 c''32 d''64 \acciaccatura {c''8} d''64 }
-#(define-public (weight-flag stem-grob)
- (let* ((log (- (ly:grob-property stem-grob 'duration-log) 2))
+#(define-public (weight-flag grob)
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (log (- (ly:grob-property stem-grob 'duration-log) 2))
(is-up (eqv? (ly:grob-property stem-grob 'direction) UP))
(yext (if is-up (cons (* log -0.8) 0) (cons 0 (* log 0.8))))
(flag-stencil (make-filled-box-stencil '(-0.4 . 0.4) yext))
- (stroke-style (ly:grob-property stem-grob 'stroke-style))
+ (stroke-style (ly:grob-property grob 'stroke-style))
(stroke-stencil (if (equal? stroke-style "grace") (make-line-stencil 0.2 -0.9 -0.4 0.9 -0.4) empty-stencil)))
(ly:stencil-add flag-stencil stroke-stencil)))
% Create a flag stencil by looking up the glyph from the font
-#(define (inverted-flag stem-grob)
- (let* ((dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "d" "u"))
- (flag (retrieve-glyph-flag "" dir "" stem-grob))
- (line-thickness (ly:staff-symbol-line-thickness stem-grob))
+#(define (inverted-flag grob)
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "d" "u"))
+ (flag (retrieve-glyph-flag "" dir "" grob))
+ (line-thickness (ly:staff-symbol-line-thickness grob))
(stem-thickness (ly:grob-property stem-grob 'thickness))
(stem-width (* line-thickness stem-thickness))
- (stroke-style (ly:grob-property stem-grob 'stroke-style))
+ (stroke-style (ly:grob-property grob 'stroke-style))
(stencil (if (null? stroke-style) flag
- (add-stroke-glyph flag stem-grob dir stroke-style "")))
+ (add-stroke-glyph flag grob dir stroke-style "")))
(rotated-flag (ly:stencil-rotate-absolute stencil 180 0 0)))
(ly:stencil-translate rotated-flag (cons (- (/ stem-width 2)) 0))))
\override Score.RehearsalMark #'self-alignment-X = #LEFT
\time 2/4
\mark "Function: weight-flag (custom)"
- \override Stem #'flag = #weight-flag
+ \override Flag #'stencil = #weight-flag
\testnotes
\mark "Function: inverted-flag (custom)"
- \override Stem #'flag = #inverted-flag
+ \override Flag #'stencil = #inverted-flag
\testnotes
}
{
\autoBeamOff
\time 3/8
- \override Stem #'flag = #modern-straight-flag
+ \override Flag #'stencil = #modern-straight-flag
\override Stem #'length-fraction = #'1.5
r8
\acciaccatura {
\override Score.RehearsalMark #'self-alignment-X = #LEFT
\time 2/4
\mark "modern straight"
- \override Stem #'flag = #modern-straight-flag
+ \override Flag #'stencil = #modern-straight-flag
\testnotes
\mark "old straight (large angles)"
- \override Stem #'flag = #old-straight-flag
+ \override Flag #'stencil = #old-straight-flag
\testnotes
%
% \mark "custom slant"
% % flag thickness and spacing
% % up-flag angle and length
% % down-flag angle and length
-% \override Stem #'flag = #(straight-flag 0.35 0.8 -5 0.5 60 2.0)
+% \override Flag #'stencil = #(straight-flag 0.35 0.8 -5 0.5 60 2.0)
% \testnotes
}
\header
{
- texidoc = "TM and No should not be changed into trademark/number symbols.
+ texidoc = "TM and No should not be changed into trademark/@/number symbols.
This may happen with incorrect font versions.
"
}
\book {
\markup {
- a \footnote b c
- \footnote d e
- \footnote f g
+ a \auto-footnote b c
+ \auto-footnote d e
+ \auto-footnote f g
}
\markup { h i }
\pageBreak
-\markup { k \footnote l m }
+\markup { k \auto-footnote l m }
\relative c' { a1 }
\book {
\markup {
- a \footnote b c
- \footnote d e
- \footnote f g
+ a \auto-footnote b c
+ \auto-footnote d e
+ \auto-footnote f g
}
\markup { h i }
\pageBreak
-\markup { k \footnote l m }
+\markup { k \auto-footnote l m }
\relative c' { a1 }
#(set-default-paper-size "a6")
-\paper {
- footnote-auto-numbering = ##f
-}
-
\book {
\new Staff \with { \consists "Footnote_engraver" }
#(set-default-paper-size "a6")
-\paper {
- footnote-footer-padding = 1\in
-}
-
\book {
\relative c' {
\paper {
ragged-last-bottom = ##f
- footnote-auto-numbering = ##f
}
\book {
texidoc = "Lilypond does footnotes."
}
-\paper {
- footnote-auto-numbering = ##f
-}
-
#(set-default-paper-size "a6")
\book {
\header {
texidoc="
Fret diagrams can be scaled using the @code{size} property.
-The position and size of first fret label, mute/open signs, fingers,
+The position and size of first fret label, mute/@/open signs, fingers,
relative to the diagram grid, shall be the same in all cases.
"
--- /dev/null
+\header {
+ texidoc = "Glissandi stop before hitting accidentals."
+
+}
+\version "2.15.9"
+
+\relative c'' {
+ a1\glissando cis
+}
\version "2.14.0"
\header {
- texidoc = "Grace notes in different voices/staves are synchronized."
+ texidoc = "Grace notes in different voices/@/staves are synchronized."
}
\layout { ragged-right = ##t}
#(whitelist-grob 'NoteHead)
#(whitelist-grob 'Stem)
+#(whitelist-grob 'Flag)
#(whitelist-grob "NoteHead")
#(whitelist-grob "Stem")
+#(whitelist-grob "Flag")
#(map whitelist-symbol '(stencil style duration-log
stem-attachment end-position staff-position
\override NoteHead #'transparent = ##t
\override NoteHead #'no-ledgers = ##t
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
\override Beam #'transparent = ##t
<< \skips
\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
\header {
>>
\grace {
- \override Stem #'stroke-style = #"grace"
+ \override Flag #'stroke-style = #"grace"
s8
s16 s s
\clef bass
<e,,, e,>32(\sustainOff\sustainOn
- \revert Stem #'stroke-style
+ \revert Flag #'stroke-style
}
<gis' e>2)
include $(depth)/make/stepmake.make
TITLE=lilypond-book Test Suite
+
+EXTRA_DIST_FILES = include.mxl
+EXTRA_DIST_FILES += $(call src-wildcard,*.ly)
+EXTRA_DIST_FILES += $(call src-wildcard,*.ily)
+EXTRA_DIST_FILES += $(call src-wildcard,*.tely)
+EXTRA_DIST_FILES += $(call src-wildcard,*.itely)
+
+
--- /dev/null
+<html>
+<body>
+Including a compressed MusicXML file:
+<musicxmlfile language="deutsch" absolute no-beaming printfilename>include.mxl</musicxmlfile>
+</body>
+</html>
--- /dev/null
+<html>
+<body>
+Including a MusicXML file:
+<musicxmlfile language="deutsch" absolute no-beaming printfilename>include.xml</musicxmlfile>
+</body>
+</html>
--- /dev/null
+<html>
+<body>
+Including a MusicXML file:
+<musicxmlfile>include.xml</musicxmlfile>
+</body>
+</html>
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 0.6 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise>
+ <identification>
+ <miscellaneous>
+ <miscellaneous-field name="description">One simple chord
+ consisting of two notes.</miscellaneous-field>
+ </miscellaneous>
+ </identification>
+ <part-list>
+ <score-part id="P0">
+ <part-name>MusicXML Part</part-name>
+ </score-part>
+ </part-list>
+ <part id="P0">
+ <measure number="1">
+ <attributes>
+ <divisions>960</divisions>
+ <time>
+ <beats>4</beats>
+ <beat-type>4</beat-type>
+ </time>
+ <clef>
+ <sign>G</sign>
+ <line>2</line>
+ </clef>
+ </attributes>
+ <note>
+ <pitch>
+ <step>B</step>
+ <octave>4</octave>
+ </pitch>
+ <duration>960</duration>
+ <voice>1</voice>
+ <type>quarter</type>
+ </note>
+ <note>
+ <chord/>
+ <pitch>
+ <step>G</step>
+ <octave>4</octave>
+ </pitch>
+ <duration>960</duration>
+ <voice>1</voice>
+ <type>quarter</type>
+ </note>
+ <note>
+ <rest/>
+ <duration>960</duration>
+ <voice>1</voice>
+ <type>quarter</type>
+ </note>
+ </measure>
+ </part>
+</score-partwise>
--- /dev/null
+\documentclass{article}
+\begin{document}
+Including MusicMXL file:
+\musicxmlfile[language=deutsch,absolute,no-beaming]{include.xml}
+\end{document}
--- /dev/null
+\documentclass{article}
+\begin{document}
+Including MusicMXL file:
+\musicxmlfile{include.xml}
+\end{document}
--- /dev/null
+\input texinfo @c -*- coding: utf-8; mode: texinfo; -*-
+@setfilename texinfo-musicxml-file.info
+@settitle MusicXML inside texinfo
+
+@node Top
+@top MusicMXL in texinfo
+
+MusicXML included in texinfo
+@musicxmlfile[language=deutsch,absolute,no-beaming]{include.xml}
+
+
+@bye
--- /dev/null
+\input texinfo @c -*- coding: utf-8; mode: texinfo; -*-
+@setfilename texinfo-musicxml-file.info
+@settitle MusicXML inside texinfo
+
+@node Top
+@top MusicMXL in texinfo
+
+MusicXML included in texinfo
+@musicxmlfile{include.xml}
+
+
+@bye
--- /dev/null
+\version "2.15.9"
+
+#(ly:set-option 'warning-as-error #f)
+
+\header{
+ texidoc="
+Test the different loglevels of lilypond. Run this file with --loglevel=NONE,
+ERROR, WARNING, PROGRESS, DEBUG to see the different loglevels. The errors
+are commented out. Comment them in to check the output manually.
+"
+}
+
+%%%% message functions of the Input class:
+#(display "\nMessage functions of the Input class:\n")
+
+messageTest = #(define-music-function (parser location) ()
+ (ly:input-message location "Test ly:input-message" )
+ (make-music 'Music))
+
+{
+% #(display "-) Testing message\n")
+ \messageTest % message
+% #(display "-) Testing warning\n")
+ c4( c( c) % warning
+% #(display "-) Testing error\n")
+% sr % error
+}
+
+%%%% message functions in the warn.hh file:
+#(display "Message functions in the warn.hh file:\n")
+
+% #(display "-) Testing debug\n")
+#(ly:debug "Test debug\n")
+% #(display "-) Testing progress\n")
+#(ly:progress "Test progress\n")
+% #(display "-) Testing message\n")
+#(ly:message "Test message\n")
+% #(display "-) Testing warning\n")
+#(ly:warning "Test warning\n")
+% #(display "-) Testing error\n")
+% #(ly:error "Test error\n")
have melismata either by setting a property melismaBusy, or by setting
automaticMelismas (which will set melismas during slurs and ties). If
you want a different order than first Music, then Lyrics, you must
-precook a chord of staves/lyrics and label those. Of course, the
+precook a chord of staves/@/lyrics and label those. Of course, the
lyrics ignore any other rhythms in the piece."
}
\header{
texidoc="
-The tempo command supports text markup and/or duration=count. Using
-@code{Score.tempoHideNote}, one can hide the duration=count in the tempo mark.
+The tempo command supports text markup and/@/or `duration=count'. Using
+@code{Score.tempoHideNote}, one can hide the `duration=count' in the tempo mark.
"
}
% included from ./out-www/option-key.header
\header {
-texidoc="midi2ly @code{--key} works, this is F major"
+texidoc="@code{midi2ly}'s option @option{--key} works, this is F major."
options="--key=-1"
}
% end
}
\header {
-texidoc="midi2ly @code{--duration-quant} preserves first note length (16)"
+texidoc="@code{midi2ly}'s option @option{--duration-quant} preserves first note length (16)."
options="--duration-quant=16"
}
% included from ./out-www/voice-2.header
\header {
-texidoc="midi2ly @code{--duration-quant} quantizes durations of notes"
+texidoc="@code{midi2ly}'s option @option{--duration-quant} quantizes durations of notes."
options="--duration-quant=4"
}
% end
% included from ./out-www/voice-2.header
\header {
-texidoc="midi2ly @code{--start-quant} quantizes start of notes"
+texidoc="@code{midi2ly}'s option @option{--start-quant} quantizes start of notes."
options="--start-quant=4"
}
% end
%
-longgrace = \override Stem #'stroke-style = #'()
-endlonggrace = \revert Stem #'stroke-style
+longgrace = \override Flag #'stroke-style = #'()
+endlonggrace = \revert Flag #'stroke-style
ritenuto = \markup { \italic "rit." }
\version "2.14.0"
STEPMAKE_TEMPLATES=documentation texinfo tex
LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc musicxml
-EXTRA_DIST_FILES = LICENSE
+EXTRA_DIST_FILES = LICENSE book-musicxml-testsuite.py
TEXI2HTML_FLAGS += --nomenu
-# Urgh, how can I do two replacements at once without messing up the order of the list?
-TMP = $(sort $(MUSICXML_FILES) $(MUSICMXL_FILES) $(TEXINFO_SOURCES) )
-TMP1 = ${TMP:%.xml=$(outdir)/%.ly}
-COLLATED_FILES = ${TMP1:%.mxl=$(outdir)/%.ly}
+COLLATED_FILES = $(sort $(MUSICXML_FILES) $(MUSICMXL_FILES) $(TEXINFO_SOURCES) )
include $(depth)/make/stepmake.make
TITLE=Unofficial MusicXML test suite
+AUTHOR=Reinhold Kainhofer
TEST_SUITE_VERSION=0.1
+LILYPOND_BOOK_FLAGS += --load-custom-package=$(src-dir)/book-musicxml-testsuite.py
+# This breaks since *.tex and *.texi still contains ac/lily-xxxxxx references!
+#LILYPOND_BOOK_FLAGS += --use-source-file-names
ifeq ($(out),www)
local-WWW-2: zip
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import book_base as BookBase
+import book_texinfo as BookTexinfo
+import book_snippets as BookSnippet
+import lilylib as ly
+
+MusicXMLOutputImage = r'''@noindent
+@ifinfo
+@image{%(info_image_path)s,,,%(alt)s,%(ext)s}
+@end ifinfo
+@html
+<p>
+ <a href="%(base)s%(ext)s">
+ <img align="middle" border="0" src="%(image)s" alt="%(alt)s">
+ </a>
+</p>
+@end html
+'''
+
+MusicXMLOutput = r'''
+@iftex
+@include %(base)s-systems.texi
+@end iftex
+'''
+
+MusicXMLPrintFilename = r'''
+@html
+<a href="%(base)s%(ext)s">
+@end html
+@file{%(filename)s}
+@html
+</a>
+@end html
+'''
+
+
+
+
+class BookMusicXML (BookTexinfo.BookTexinfoOutputFormat):
+ def __init__ (self):
+ BookTexinfo.BookTexinfoOutputFormat.__init__ (self)
+ self.format = "MusicXMLTest"
+ self.output[BookBase.OUTPUTIMAGE] = MusicXMLOutputImage
+ self.output[BookBase.OUTPUT] = MusicXMLOutput
+ self.output[BookBase.PRINTFILENAME] = MusicXMLPrintFilename
+ def snippet_class (self, type):
+ if type == "musicxml_file":
+ return MusicXMLTestSuiteSnippet
+ else:
+ return BookSnippet.snippet_type_to_class.get (type, BookSnippet.Snippet)
+ def snippet_output (self, basename, snippet):
+ return BookTexinfo.BookTexinfoOutputFormat.snippet_output (self, basename, snippet)
+
+
+class MusicXMLTestSuiteSnippet (BookSnippet.MusicXMLFileSnippet):
+ def __init__ (self, type, match, formatter, line_number, global_options):
+ BookSnippet.MusicXMLFileSnippet.__init__ (self, type, match, formatter, line_number, global_options)
+
+## TODO: Customize output with renderings from other MusicXML-supporting
+# applications. Also add some link to the intermediate .ly file
+
+
+BookBase.register_format (BookMusicXML ());
\header{
texidoc="The optimal page breaker will make trade-offs between
horizontal and vertical stretching so that the overall spacing
-will be more acceptable. The page-spacing-weight parameter
-controls the relative importance of vertical/horizontal spacing.
-Because ragged-last-bottom is on, there is no penalty for odd
+will be more acceptable. The @code{page-spacing-weight} parameter
+controls the relative importance of vertical/@/horizontal spacing.
+Because @code{ragged-last-bottom} is on, there is no penalty for odd
vertical spacing on the final page. As a result, only the first
page should be horizontally stretched.
"
--- /dev/null
+\version "2.14.1"
+
+\header {
+ texidoc = "Page breaks are allowed by default at the end of the score,
+but the user can override them. There should be one line on the first
+page and two (colliding) lines on the second page."
+}
+
+\paper {
+ paper-height = 4\cm
+}
+
+\book {
+{ c'4 }
+
+{ c'4 } \noPageBreak
+
+{ c'4 }
+}
texidoc ="The new part combiner stays apart from:
@itemize @bullet
@item different durations,
-@item different articulations (taking into account only slur/beam/tie), and
+@item different articulations (taking into account only slur/@/beam/@/tie), and
@item wide pitch ranges.
@end itemize
"
\set Staff.instrumentName = "orig+quote"
\set Staff.quotedEventTypes = #'(note-event articulation-event)
- \new Voice {
+ \new Voice {\voiceOne
\override Voice . Beam #'collision-voice-only = ##t
\original }
- { s4 \quoteDuring #"quoteMe" { s2. } }
+ \new Voice {\voiceTwo s4 \quoteDuring #"quoteMe" { s2. } }
>>
>>
}
mus = \relative c' {
- % Acciaccaturas contain a slur and \override Stem #'stroke-style
+ % Acciaccaturas contain a slur and \override Flag #'stroke-style
% Thus, we're checking \override here
c4 \acciaccatura d8 c4
% Checking \set and \unset
% Checking \once \override
\once \override Stem #'thickness = #8.0 d8
% Checking two overrides
- \override Stem #'thickness = #8.0 \override Stem #'stroke-style = "grace"
+ \override Stem #'thickness = #8.0 \override Flag #'stroke-style = "grace"
d8
% reverting one of them
\revert Stem #'thickness d8
% and the other
- \revert Stem #'stroke-style c8
+ \revert Flag #'stroke-style c8
% checking tweaks
c2-\tweak #'color #red ->
\new Staff \relative c'' <<
\set Staff.instrumentName = "orig+quote"
\set Staff.quotedEventTypes = #'(note-event articulation-event)
- \new Voice {
- \override Voice . Beam #'collision-voice-only = ##t
+ \new Voice {\voiceOne
\original }
- \new Voice {
+ \new Voice {\voiceTwo
s4
\set fontSize = #-4
\override Stem #'length-fraction = #(magstep -4)
Unfolded behavior:"
}
+#(ly:set-option 'warning-as-error #f)
+
\context Voice \relative c'' {
\repeat unfold 3 { c^"3x 0a" d }
%% less alts than body
\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
\header{
texidoc="
\header {
- texidoc = "Beam/rest collision resolution and normal rest/note
+ texidoc = "Beam/rest collision resolution and normal rest/@/note
collisions can be combined."
}
\version "2.14.0"
\header {
- texidoc = "Rests can have pitches--these will be affected by
-transposition and relativization. If a rest has a pitch, rest/rest and
-beam/rest collision resolving will leave it alone."
+ texidoc = "Rests can have pitches -- these will be affected by
+transposition and relativization. If a rest has a pitch, rest/@/rest and
+beam/@/rest collision resolving will leave it alone."
}
\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
\header {
\header {
- texidoc = "@code{-ddebug-skyline} draws the outline of the skyline used."
+ texidoc = "@option{-ddebug-skyline} draws the outline of the skyline used."
}
\version "2.14.0"
--- /dev/null
+
+\version "2.15.9"
+
+\header {
+ texidoc = "Slurs handle avoid objects better.
+"
+}
+
+{
+ a'8 ( b''4 \fermata )
+}
one big file, since changing one score parameter for one situation
may affect several other situations.
- Tunable parameters are in @file{scm/slur.scm}.
+ Tunable parameters are in @file{scm/@/slur.scm}.
"
}
\header {
texidoc = "An accidental following a bar gets space so
- the left edge of the acc is at 0.3 - 0.6 staff space of the bar line"
+ the left edge of the acc is at 0.3 staff space from the bar line"
}
\header
{
-
+
texidoc = "Even in case of incorrect contexts (eg. shortlived
contexts) that break linking of columns through spacing wishes,
- @code{strict-note-spacing} defaults to a robust solution."
+ @code{strict-note-spacing} defaults to a robust solution.
+ This test passes if it does not seg fault; instead it should
+ produce three programming error messages. Note that, in tight
+ music with strict note spacing, grace notes will collide with
+ normal notes. This is expected."
}
\version "2.14.0"
-
%% \new Staff cause shortlived, disconnected Voice contexts
%% breaking spacing-wishes links.
-\new Staff {
- \override Score.SpacingSpanner #'strict-note-spacing = ##t
- \afterGrace c'4 {c'32 c'32 }
- c'4
+\score {
+ \new Staff {
+ \override Score.SpacingSpanner #'strict-note-spacing = ##t
+ \afterGrace c'4 {c'32 c'32 }
+ c'4
+ }
+ \layout {
+ ragged-right = ##f
+ }
}
\version "2.14.0"
\header {
- texidoc = "Span bars can be turned on/off on a staff-by-staff basis."
+ texidoc = "Span bars can be turned on/@/off on a staff-by-staff basis."
}
\layout {
--- /dev/null
+\version "2.15.8"
+
+\header {
+ texidoc = "Spanners align to musical grobs in paper columns,
+ignoring things like pedal marks.
+
+"
+}
+
+\score {
+ <<
+ \new PianoStaff <<
+ \new Staff = "up" {
+ \clef treble
+ \repeat unfold 32 c'4
+ }
+ \new Dynamics = "dynamics" {
+ \repeat unfold 2 {
+ s1\cresc s1\f s1\dim s1\p
+ }
+ }
+ \new Staff = "down" {
+ \clef bass
+ \repeat unfold 32 c4
+ }
+ \new Dynamics= "pedal" {
+ \repeat unfold 2 {
+ s1\sustainOn s1\sustainOff
+ }
+ }
+ >>
+ >>
+}
\version "2.14.0"
\header {
- texidoc = "Stems with overridden 'length should not confuse height estimation.
-This example should fit snugly on one page.
+ texidoc = "Stems with overridden 'Y-extent should
+not confuse height estimation. This example should fit snugly
+on one page.
"
}
\score {
\new Voice {
\voiceTwo
- \override Stem #'length = #0
+ \override Stem #'Y-extent = #'(0.0 . 0.0)
\repeat unfold 144 a4
}
\layout {
--- /dev/null
+
+\version "2.15.9"
+
+\header {
+ texidoc = "Stem length and stem-begin-position can be set manually.
+"
+}
+
+\relative c' {
+ \autoBeamOff
+ \stemUp
+ a8 aes''8
+ \override Stem #'length = #20
+ a,,8
+ \revert Stem #'length
+ aes''!8
+ \stemNeutral
+ \override Stem #'stem-begin-position = #-2
+ c,8
+}
--- /dev/null
+\version "2.15.9"
+
+\header {
+ texidoc = "Lilypond gets beamed stem pure heights correct
+to avoid outside staff collisions.
+"
+}
+
+{
+ \stemUp
+ gis''8 a bes'' a
+ bes''! a bes''! a
+}
"
}
-
+#(ly:set-option 'warning-as-error #f)
\context Voice \relative c''{
\textSpannerUp
\relative c'' {
\textLengthOn
- <c\3>4-"inside"( d' <e,\2>-"inside" g
+ <c\3>4-"outside"( d' <e,\2>-"inside" g
<c\1>1-"outside")
}
f4\f g a^\fermata |
R2.*3 |
c8\<\( c16 c ~ c2\! |
- c'2.\) |
\mark \default
- R2. |
+ c'2.\) |
\ottava #1
r4 d'4 r8 e |
\ottava #0
\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
\header {
\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
\header {
texidoc="
+\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
+
\header
{
texidoc =
-
"when @code{tieWaitForNote} is set, the right-tied note does not
have to follow the lef-tied note directly. When @code{tieWaitForNote}
is set to false, any tie will erase all pending ties."
}
-\version "2.14.0"
-
\paper { ragged-right = ##t }
\relative c' {
c~ e~ g~ <c, e g>
\header {
-
texidoc = "In chords, ties keep closer to the note head vertically,
-but never collide with heads or stems. Seconds are formatted up/down;
+but never collide with heads or stems. Seconds are formatted up/@/down;
the rest of the ties are positioned according to their vertical
position.
-The code does not handle all cases. Sometimes ties will printed on top
-of or very close to each other. This happens in the last chords of
-each system. "
-
+The code does not handle all cases. Sometimes ties will printed on top
+of or very close to each other. This happens in the last chords of
+each system."
}
texidoc = "Like normal ties, single semities (LaissezVibrerTie or
RepeatTie) get their direction from the stem direction, and may be
-tweaked with @code{#'direction}."
+tweaked with @code{'direction}."
}
\header {
texidoc = "Individual ties may be formatted manually by
-specifying their @code{direction} and/or @code{staff-position}."
+specifying their @code{direction} and/@/or @code{staff-position}."
}
@code{#f} (never print a bracket)
@item
-@code{#'if-no-beam} (only print a bracket if there is no beam)
+@code{'if-no-beam} (only print a bracket if there is no beam)
@end itemize
"
--- /dev/null
+
+\version "2.15.10"
+
+\header {
+ texidoc = "unpure-pure containers take two arguments: an unpure property and
+a pure property. The pure property is evaluated (and cached) for all
+pure calculations, and the unpure is evaluated for all unpure calculations.
+In this regtest, there are three groups of two eighth notes. In the first
+group, the second note should move to accommodate the flag, whereas it should
+not in the second group because it registers the flag as being higher. The
+flag, however, remains at the Y-offset dictated by ly:flag::calc-y-offset.
+In the third set of two 8th notes, the flag should be pushed up to a Y-offset
+of 8.
+"
+}
+
+\relative c'' {
+ \stemUp \autoBeamOff
+ d,8 eis'
+ \once \override Flag #'Y-offset =
+ #(ly:make-unpure-pure-container ly:flag::calc-y-offset 8)
+ d,8 eis'!
+ \once \override Flag #'Y-offset = #8
+ d,8 eis'!
+}
\version "2.14.0"
+#(ly:set-option 'warning-as-error #f)
\header {
texidoc = "If you specify two different key signatures at one point, a
SCM val;
if (!pango_dict_->try_retrieve (key, &val))
{
- if (be_verbose_global)
- progress_indication ("\n[" + string (pango_fn));
+ debug_output ("[" + string (pango_fn), true); // start on a new line
Pango_font *pf = new Pango_font (pango_ft2_fontmap_,
description,
pango_dict_->set (key, val);
pf->unprotect ();
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
pf->description_ = scm_cons (SCM_BOOL_F,
scm_from_double (1.0));
if (file_name.empty ())
return 0;
- if (be_verbose_global)
- progress_indication ("\n[" + file_name);
+ debug_output ("[" + file_name, true); // start on a new line
val = Open_type_font::make_otf (file_name);
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
unsmob_metrics (val)->file_name_ = file_name;
SCM name_string = ly_string2scm (name);
#include "stencil.hh"
#include "system.hh"
#include "warn.hh"
+#include "unpure-pure-container.hh"
static bool
pure_staff_priority_less (Grob *const &g1, Grob *const &g2);
Interval
Axis_group_interface::relative_group_extent (vector<Grob *> const &elts,
Grob *common, Axis a)
+{
+ return relative_maybe_bound_group_extent (elts, common, a, false);
+}
+
+Interval
+Axis_group_interface::relative_maybe_bound_group_extent (vector<Grob *> const &elts,
+ Grob *common, Axis a, bool bound)
{
Interval r;
for (vsize i = 0; i < elts.size (); i++)
Grob *se = elts[i];
if (!to_boolean (se->get_property ("cross-staff")))
{
- Interval dims = se->extent (common, a);
+ Interval dims = (bound && has_interface (se)
+ ? generic_bound_extent (se, common, a)
+ : se->extent (common, a));
if (!dims.is_empty ())
r.unite (dims);
}
return r;
}
+Interval
+Axis_group_interface::generic_bound_extent (Grob *me, Grob *common, Axis a)
+{
+ /* trigger the callback to do skyline-spacing on the children */
+ if (a == Y_AXIS)
+ (void) me->get_property ("vertical-skylines");
+
+ extract_grob_set (me, "elements", elts);
+ vector<Grob *> new_elts;
+
+ SCM interfaces = me->get_property ("bound-alignment-interfaces");
+
+ for (vsize i = 0; i < elts.size (); i++)
+ for (SCM l = interfaces; scm_is_pair (l); l = scm_cdr (l))
+ if (elts[i]->internal_has_interface (scm_car (l)))
+ new_elts.push_back (elts[i]);
+
+ if (!new_elts.size ())
+ return robust_relative_extent (me, common, a);
+
+ if (!common)
+ common = common_refpoint_of_array (new_elts, me, a);
+
+ return relative_maybe_bound_group_extent (new_elts, common, a, true);
+}
+
Interval
Axis_group_interface::sum_partial_pure_heights (Grob *me, int start, int end)
{
vector<Grob *> current_elts;
current_elts.push_back (elements[i]);
while (i + 1 < elements.size ()
- && scm_eq_p (elements[i + 1]->get_property ("outside-staff-priority"), priority))
+ && scm_is_eq (elements[i + 1]->get_property ("outside-staff-priority"), priority))
{
if (!to_boolean (elements[i + 1]->get_property ("cross-staff")))
current_elts.push_back (elements[i + 1]);
/* properties */
"adjacent-pure-heights "
"axes "
+ "bound-alignment-interfaces "
"default-staff-staff-spacing "
"elements "
"max-stretch "
- beam->relative_coordinate (common[Y_AXIS], Y_AXIS);
Real factor = parameters.STEM_COLLISION_FACTOR;
- if (!unsmob_grob (s->get_object ("beam"))
- && !Stem::flag (s).is_empty ())
+ if (!unsmob_grob (s->get_object ("beam")))
factor = 1.0;
add_collision (x, y, factor);
}
#include "pointer-group-interface.hh"
#include "rhythmic-head.hh"
#include "spanner.hh"
+#include "staff-symbol.hh"
#include "staff-symbol-referencer.hh"
#include "stem.hh"
#include "warn.hh"
stem_y += thick * 0.5 * get_grob_direction (s);
/*
- Do set_stemend for invisible stems too, so tuplet brackets
+ Do set_stem_positions for invisible stems too, so tuplet brackets
have a reference point for sloping
*/
- Stem::set_stemend (s, 2 * stem_y / staff_space);
+ Stem::set_stem_positions (s, 2 * stem_y / staff_space);
}
return posns;
return scm_from_double (offset + staff_space * shift);
}
+MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, pure_rest_collision_callback, 4, 1, "");
+SCM
+Beam::pure_rest_collision_callback (SCM smob,
+ SCM, /* prev_offset */
+ SCM, /* start */
+ SCM /* end */)
+{
+ Real amount = 0.0;
+
+ Grob *me = unsmob_grob (smob);
+ Grob *stem = unsmob_grob (me->get_object ("stem"));
+ if (!stem)
+ return scm_from_double (amount);
+ Grob *beam = unsmob_grob (stem->get_object ("beam"));
+ if (!beam
+ || !Beam::normal_stem_count (beam))
+ return scm_from_double (amount);
+
+ Real ss = Staff_symbol_referencer::staff_space (me);
+
+ /*
+ This gives the extrema of rest positions.
+ In general, beams are never typeset more than one staff space away
+ from the staff in either direction.
+ */
+ Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
+ Interval rest_max_pos = staff ? Staff_symbol::line_span (staff) : Interval (0.0, 0.0);
+ rest_max_pos.widen (1);
+ rest_max_pos *= ss / 2;
+
+ extract_grob_set (beam, "stems", stems);
+ vector<Grob *> my_stems;
+
+ for (vsize i = 0; i < stems.size (); i++)
+ if (Stem::head_count (stems[i]) || stems[i] == stem)
+ my_stems.push_back (stems[i]);
+
+ vsize idx = -1;
+
+ for (vsize i = 0; i < my_stems.size (); i++)
+ if (my_stems[i] == stem)
+ {
+ idx = i;
+ break;
+ }
+ Grob *left;
+ Grob *right;
+
+ if (idx == (vsize)-1 || my_stems.size () == 1)
+ return scm_from_double (amount);
+ else if (idx == 0)
+ left = right = my_stems[1];
+ else if (idx == my_stems.size () - 1)
+ left = right = my_stems[idx - 1];
+ else
+ {
+ left = my_stems[idx - 1];
+ right = my_stems[idx + 1];
+ }
+ Direction beamdir = get_grob_direction (beam);
+ /*
+ Take the position between the two bounding head_positions,
+ then bound it by the minimum and maximum positions outside the staff.
+ 4.0 = 2.0 to get out of staff space * 2.0 for the average
+ */
+ amount = min (max ((Stem::head_positions (left)[beamdir] + Stem::head_positions (right)[beamdir]) / 4.0, rest_max_pos[DOWN]), rest_max_pos[UP]);
+
+ return scm_from_double (amount);
+}
+
+
bool
Beam::is_knee (Grob *me)
{
return curve_coordinate (ts[0], other);
}
+vector<Real>
+Bezier::get_other_coordinates (Axis a, Real x) const
+{
+ Axis other = other_axis (a);
+ vector<Real> ts = solve_point (a, x);
+ vector<Real> sols;
+ for (vsize i = 0; i < ts.size (); i++)
+ sols.push_back (curve_coordinate (ts[i], other));
+ return sols;
+}
+
Real
Bezier::curve_coordinate (Real t, Axis a) const
{
return filter_solutions (sol);
}
+Real
+Bezier::minmax (Axis ax, Real l, Real r, Direction d) const
+{
+ return minmax (ax, l, r, d, 0, 0);
+}
+
+Real
+Bezier::minmax (Axis axis, Real l, Real r, Direction d, vsize left_index, vsize right_index) const
+{
+ Axis other = other_axis (axis);
+ Interval lr (l, r);
+ Drul_array<vector<Real> > sol;
+ Direction dir = LEFT;
+ do
+ {
+ Polynomial p (polynomial (axis));
+ p.coefs_[0] -= lr[dir];
+
+ sol[dir] = filter_solutions (p.solve ());
+ }
+ while (flip (&dir) != LEFT);
+
+ if (!sol[LEFT].size () || !sol[RIGHT].size ())
+ {
+ programming_error ("no solution found for Bezier intersection");
+ return 0.0;
+ }
+
+ Polynomial p (polynomial (other));
+
+ Drul_array<vsize> indices(left_index, right_index);
+ do
+ {
+ vector_sort (sol[dir], less<Real> ());
+ if (!Interval (0, sol[LEFT].size () - 1).contains (indices[dir]))
+ {
+ programming_error ("requested bezier solution outside range of solutions. defaulting to lowest solution.");
+ indices[dir] = 0;
+ }
+ }
+ while (flip (&dir) != LEFT);
+
+ return p.minmax (sol[LEFT][indices[LEFT]], sol[RIGHT][indices[RIGHT]], d != LEFT);
+}
+
/**
Compute the bounding box dimensions in direction of A.
*/
vector<Grob *> elems = ordered_elements (me);
vector<Interval> extents;
- int last_nonempty = -1;
for (vsize i = 0; i < elems.size (); i++)
{
Interval y = elems[i]->extent (elems[i], X_AXIS);
extents.push_back (y);
- if (!y.is_empty ())
- last_nonempty = i;
}
vsize idx = 0;
Breathing_sign::divisio_maior (SCM smob)
{
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"));
/*
pitches = scm_sort_list (pitches, Pitch::less_p_proc);
- SCM name_proc = get_property ("chordNameFunction");
- markup = scm_call_4 (name_proc, pitches, bass, inversion,
+ SCM capo_proc = ly_lily_module_constant ("capo-handler");
+ markup = scm_call_4 (capo_proc, pitches, bass, inversion,
context ()->self_scm ());
}
/*
{
Music *mus = get_music ();
Input *origin = mus->origin ();
- Moment l = mus->get_length ();
Music *body = Repeated_music::body (mus);
bool body_is_sequential = body->is_mus_type ("sequential-music");
if (scm_is_pair (footnotes))
for (SCM s = footnotes; scm_is_pair (s); s = scm_cdr (s))
- footnotes_.push_back (unsmob_stencil (scm_cadar (s)));
+ footnotes_.push_back (unsmob_stencil (scm_caddar (s)));
last_column_ = 0;
force_ = 0;
SCM def = get_default_child (user_mod);
if (scm_is_symbol (def))
{
- if (scm_memq (def, acc))
- acc = scm_delete_x (def, acc);
+ acc = scm_delete_x (def, acc);
acc = scm_cons (def, acc);
}
#include "main.hh"
#include "simple-closure.hh"
#include "spanner.hh"
+#include "unpure-pure-container.hh"
#include "warn.hh"
/*
target_alist = scm_acons (symbol, new_value, target_alist);
bool ok = true;
- if (!ly_is_procedure (new_value)
- && !is_simple_closure (new_value))
- ok = type_check_assignment (symbol, new_value,
- ly_symbol2scm ("backend-type?"));
+ bool pc = is_unpure_pure_container (new_value);
+ SCM vals[] = {pc ? unpure_pure_container_unpure_part (new_value) : new_value,
+ pc ? unpure_pure_container_pure_part (new_value) : SCM_BOOL_F};
+
+ for (int i = 0; i < 2; i++)
+ if (!ly_is_procedure (vals[i])
+ && !is_simple_closure (vals[i]))
+ ok = ok && type_check_assignment (symbol, vals[i],
+ ly_symbol2scm ("backend-type?"));
/*
tack onto alist. We can use set_car, since
{
Stream_event *ev = unsmob_stream_event (sev);
SCM class_symbol = ev->get_property ("class");
- if (!scm_symbol_p (class_symbol))
+ if (!scm_is_symbol (class_symbol))
{
warning (_ ("Event class should be a symbol"));
return;
ev->origin ()->warning (_f ("Unknown event class %s", ly_symbol2string (class_symbol).c_str ()));
return;
}
+#if 0
bool sent = false;
+#endif
int num_classes = scm_ilength (class_list);
/*
Listener *l = unsmob_listener (scm_cdar (lists[0].list));
l->listen (ev->self_scm ());
+#if 0
sent = true;
+#endif
}
// go to the next listener; bubble-sort the class list.
SCM next = scm_cdr (lists[0].list);
lists[i].list = next;
}
- /* TODO: Uncomment.
+#if 0
+ /* TODO: Uncomment. */
if (!sent)
warning (_f ("Junking event: %s", ly_symbol2string (class_symbol).c_str ()));
- */
+#endif
}
void
i != stems.end (); i++)
{
Grob *stem = (*i);
- Stencil flag = Stem::flag (stem);
- if (!flag.is_empty ())
+ Grob *flag = Stem::flag (stem);
+ if (flag)
{
- Interval y = flag.extent (Y_AXIS)
- * (2 / ss)
- + Stem::stem_end_position (stem);
-
- Interval x = stem->relative_coordinate (commonx, X_AXIS)
- + flag.extent (X_AXIS);
+ Grob *commony = stem->common_refpoint (flag, Y_AXIS);
+ Interval y = flag->extent (commony, Y_AXIS) * (2 / ss);
+ Interval x = flag->extent (commonx, X_AXIS);
boxes.push_back (Box (x, y));
}
Axis_group_interface::add_element (line_spanner_, script_);
}
- Stream_event *stop_ev = accepted_spanevents_drul_ [STOP]
- ? accepted_spanevents_drul_[STOP] : script_ev_;
-
if (accepted_spanevents_drul_[STOP] || script_ev_)
{
/*
current_cresc_ev_ = 0;
}
else if (accepted_spanevents_drul_[STOP])
- {
- accepted_spanevents_drul_[STOP]->origin ()->warning (_ ("cannot find start of (de)crescendo"));
- stop_ev = 0;
- }
+ accepted_spanevents_drul_[STOP]->origin ()->warning (_ ("cannot find start of (de)crescendo"));
}
if (accepted_spanevents_drul_[START])
void
Figured_bass_engraver::center_continuations (vector<Spanner *> const &consecutive_lines)
{
- if (consecutive_lines.size () == 2)
- {
- vector<Grob *> left_figs;
- for (vsize j = consecutive_lines.size (); j--;)
- left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
+ vector<Grob *> left_figs;
+ for (vsize j = consecutive_lines.size (); j--;)
+ left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
- SCM ga = Grob_array::make_array ();
- unsmob_grob_array (ga)->set_array (left_figs);
+ SCM ga = Grob_array::make_array ();
+ unsmob_grob_array (ga)->set_array (left_figs);
- for (vsize j = consecutive_lines.size (); j--;)
- consecutive_lines[j]->set_object ("figures",
- unsmob_grob_array (ga)->smobbed_copy ());
- }
+ for (vsize j = consecutive_lines.size (); j--;)
+ consecutive_lines[j]->set_object ("figures",
+ unsmob_grob_array (ga)->smobbed_copy ());
}
void
--- /dev/null
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stem.hh"
+
+#include "directional-element-interface.hh"
+#include "font-interface.hh"
+#include "grob.hh"
+#include "international.hh"
+#include "output-def.hh"
+#include "staff-symbol-referencer.hh"
+#include "stencil.hh"
+#include "warn.hh"
+
+class Flag
+{
+public:
+ DECLARE_SCHEME_CALLBACK (print, (SCM));
+ DECLARE_SCHEME_CALLBACK (width, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM));
+ DECLARE_GROB_INTERFACE ();
+};
+
+
+
+MAKE_SCHEME_CALLBACK (Flag, width, 1);
+SCM
+Flag::width (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Stencil *sten = unsmob_stencil (me->get_property ("stencil"));
+ if (!sten)
+ return ly_interval2scm (Interval (0.0, 0.0));
+
+ Grob *stem = me->get_parent (X_AXIS);
+
+ /*
+ TODO:
+ This reproduces a bad hard-coding that has been in the code for quite some time:
+ the bounding boxes for the flags are slightly off and need to be fixed.
+ */
+
+ return ly_interval2scm (sten->extent (X_AXIS) - stem->extent (stem, X_AXIS)[RIGHT]);
+}
+MAKE_SCHEME_CALLBACK (Flag, print, 1);
+SCM
+Flag::print (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Grob *stem = me->get_parent (X_AXIS);
+
+ Direction d = get_grob_direction (stem);
+ int log = Stem::duration_log (stem);
+ string flag_style;
+
+ SCM flag_style_scm = me->get_property ("style");
+ if (scm_is_symbol (flag_style_scm))
+ flag_style = ly_symbol2string (flag_style_scm);
+
+ if (flag_style == "no-flag")
+ return Stencil ().smobbed_copy ();
+
+ bool adjust = true;
+
+ string staffline_offs;
+ if (flag_style == "mensural")
+ /* Mensural notation: For notes on staff lines, use different
+ flags than for notes between staff lines. The idea is that
+ flags are always vertically aligned with the staff lines,
+ regardless if the note head is on a staff line or between two
+ staff lines. In other words, the inner end of a flag always
+ touches a staff line.
+ */
+ {
+ if (adjust)
+ {
+ Real ss = Staff_symbol_referencer::staff_space (me);
+ int p = (int) (rint (stem->extent (stem, Y_AXIS)[d] * 2 / ss));
+ staffline_offs
+ = Staff_symbol_referencer::on_line (stem, p) ? "0" : "1";
+ }
+ else
+ staffline_offs = "2";
+ }
+ else
+ staffline_offs = "";
+
+ char dir = (d == UP) ? 'u' : 'd';
+ string font_char = flag_style
+ + to_string (dir) + staffline_offs + to_string (log);
+ Font_metric *fm = Font_interface::get_default_font (me);
+ Stencil flag = fm->find_by_name ("flags." + font_char);
+ if (flag.is_empty ())
+ me->warning (_f ("flag `%s' not found", font_char));
+
+ /*
+ TODO: maybe property stroke-style should take different values,
+ e.g. "" (i.e. no stroke), "single" and "double" (currently, it's
+ '() or "grace"). */
+ SCM stroke_style_scm = me->get_property ("stroke-style");
+ if (scm_is_string (stroke_style_scm))
+ {
+ string stroke_style = ly_scm2string (stroke_style_scm);
+ if (!stroke_style.empty ())
+ {
+ string font_char = flag_style + to_string (dir) + stroke_style;
+ Stencil stroke = fm->find_by_name ("flags." + font_char);
+ if (stroke.is_empty ())
+ {
+ font_char = to_string (dir) + stroke_style;
+ stroke = fm->find_by_name ("flags." + font_char);
+ }
+ if (stroke.is_empty ())
+ me->warning (_f ("flag stroke `%s' not found", font_char));
+ else
+ flag.add_stencil (stroke);
+ }
+ }
+
+ return flag.smobbed_copy ();
+}
+
+MAKE_SCHEME_CALLBACK (Flag, calc_y_offset, 1);
+SCM
+Flag::calc_y_offset (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Grob *stem = me->get_parent (X_AXIS);
+ Direction d = get_grob_direction (stem);
+
+ Real blot
+ = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
+
+ Real y2 = stem->extent (stem, Y_AXIS)[d];
+
+ return scm_from_double (y2 - d * blot / 2);
+}
+
+MAKE_SCHEME_CALLBACK (Flag, calc_x_offset, 1);
+SCM
+Flag::calc_x_offset (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Grob *stem = me->get_parent (X_AXIS);
+ return scm_from_double (stem->extent (stem, X_AXIS)[RIGHT]);
+}
+
+ADD_INTERFACE (Flag,
+ "A flag that gets attached to a stem."
+ "The style property is symbol determining"
+ " what style of flag glyph is typeset on a"
+ " @code{Stem}. Valid options include @code{'()}"
+ " for standard flags, @code{'mensural} and"
+ " @code{'no-flag}, which switches off the flag.",
+
+ /* properties */
+ "style "
+ "stroke-style "
+ );
\ No newline at end of file
if (!FcConfigAppFontAddDir (0, (const FcChar8 *)d.c_str ()))
error (_f ("failed adding font directory: %s", d.c_str ()));
- else if (be_verbose_global)
- message (_f ("adding font directory: %s", d.c_str ()));
+ else
+ debug_output (_f ("Adding font directory: %s", d.c_str ()));
return SCM_UNSPECIFIED;
}
if (!FcConfigAppFontAddFile (0, (const FcChar8 *)f.c_str ()))
error (_f ("failed adding font file: %s", f.c_str ()));
- else if (be_verbose_global)
- message (_f ("adding font file: %s", f.c_str ()));
+ else
+ debug_output (_f ("Adding font file: %s", f.c_str ()));
return SCM_UNSPECIFIED;
}
void
init_fontconfig ()
{
- if (be_verbose_global)
- message (_ ("Initializing FontConfig..."));
+ debug_output (_ ("Initializing FontConfig..."));
/* TODO: Find a way for Fontconfig to update its cache, if needed. */
font_config_global = FcInitLoadConfig ();
string dir = dirs[i];
if (!FcConfigAppFontAddDir (font_config_global, (FcChar8 *)dir.c_str ()))
error (_f ("failed adding font directory: %s", dir.c_str ()));
- else if (be_verbose_global)
- message (_f ("adding font directory: %s", dir.c_str ()));
+ else
+ debug_output (_f ("Adding font directory: %s", dir.c_str ()));
}
- if (be_verbose_global)
- message (_ ("Building font database..."));
+ debug_output (_ ("Building font database..."));
FcConfigBuildFonts (font_config_global);
FcConfigSetCurrent (font_config_global);
- if (be_verbose_global)
- message ("\n");
+ debug_output ("\n");
}
return select_pango_font (layout, chain);
else
#endif
- if (scm_instance_p (name))
+ if (scm_is_true (scm_instance_p (name)))
{
SCM base_size = scm_slot_ref (name, ly_symbol2scm ("default-size"));
SCM vec = scm_slot_ref (name, ly_symbol2scm ("size-vector"));
#include "performance.hh"
#include "spanner.hh"
#include "stream-event.hh"
+#include "unpure-pure-container.hh"
void
init_func_doc ()
ly_add_type_predicate ((void *) &unsmob_moment, "Moment");
ly_add_type_predicate ((void *) &unsmob_paper_score, "Paper_score");
ly_add_type_predicate ((void *) &unsmob_performance, "Performance");
+ ly_add_type_predicate ((void *) &is_unpure_pure_container, "unpure pure container");
ly_add_type_predicate ((void *) &is_axis, "axis");
ly_add_type_predicate ((void *) &is_number_pair, "number pair");
#include "version.hh"
#include "warn.hh"
+/* Declaration of log function(s) */
+SCM ly_progress (SCM, SCM);
+
LY_DEFINE (ly_start_environment, "ly:start-environment",
0, 0, 0, (),
"Return the environment (a list of strings) that was in"
return scm_from_locale_stringn (contents.c_str (), contents.length ());
}
-LY_DEFINE (ly_error, "ly:error",
- 1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to issue the error @var{str}."
- " The error is formatted with @code{format} and @var{rest}.")
-{
- LY_ASSERT_TYPE (scm_is_string, str, 1);
- str = scm_simple_format (SCM_BOOL_F, str, rest);
- error (ly_scm2string (str));
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_message, "ly:message",
- 1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to issue the message @var{str}."
- " The message is formatted with @code{format} and @var{rest}.")
-{
- LY_ASSERT_TYPE (scm_is_string, str, 1);
- str = scm_simple_format (SCM_BOOL_F, str, rest);
- message (ly_scm2string (str));
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_progress, "ly:progress",
- 1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to print progress @var{str}."
- " The message is formatted with @code{format} and @var{rest}.")
-{
- LY_ASSERT_TYPE (scm_is_string, str, 1);
- str = scm_simple_format (SCM_BOOL_F, str, rest);
- progress_indication (ly_scm2string (str));
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_programming_error, "ly:programming-error",
- 1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to issue the internal warning"
- " @var{str}. The message is formatted with @code{format}"
- " and @var{rest}.")
-{
- LY_ASSERT_TYPE (scm_is_string, str, 1);
- str = scm_simple_format (SCM_BOOL_F, str, rest);
-
- if (get_program_option ("warning-as-error"))
- error (ly_scm2string (str));
- else
- programming_error (ly_scm2string (str));
-
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_success, "ly:success",
- 1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to issue a success message @var{str}."
- " The message is formatted with @code{format} and @var{rest}.")
-{
- LY_ASSERT_TYPE (scm_is_string, str, 1);
- str = scm_simple_format (SCM_BOOL_F, str, rest);
- successful (ly_scm2string (str));
- return SCM_UNSPECIFIED;
-
-}
-LY_DEFINE (ly_warning, "ly:warning",
- 1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to issue the warning @var{str}."
- " The message is formatted with @code{format} and @var{rest}.")
-{
- LY_ASSERT_TYPE (scm_is_string, str, 1);
- str = scm_simple_format (SCM_BOOL_F, str, rest);
-
- if (get_program_option ("warning-as-error"))
- error (ly_scm2string (str));
- else
- warning (ly_scm2string (str));
-
- return SCM_UNSPECIFIED;
-}
LY_DEFINE (ly_dir_p, "ly:dir?",
1, 0, 0, (SCM s),
- "Is @var{s} a direction? Valid directions are @code{-1},"
- " @code{0}, or@tie{}@code{1}, where @code{-1} represents"
+ "Is @var{s} a direction? Valid directions are @w{@code{-1}},"
+ " @code{0}, or@tie{}@code{1}, where @w{@code{-1}} represents"
" left or down, @code{1}@tie{}represents right or up, and @code{0}"
" represents a neutral direction.")
{
1, 0, 0, (SCM str),
"Encode all characters in string @var{str} with hexadecimal"
" percent escape sequences, with the following exceptions:"
- " characters @code{-}, @code{.}, @code{/}, and @code{_}; and"
+ " characters @w{@code{-},} @code{.}, @code{/}, and @code{_}; and"
" characters in ranges @code{0-9}, @code{A-Z}, and @code{a-z}.")
{
LY_ASSERT_TYPE (scm_is_string, str, 1);
LY_ASSERT_TYPE (scm_is_string, file_name, 1);
string m = "w";
+ string f = ly_scm2string (file_name);
FILE *stderrfile;
- if (mode != SCM_UNDEFINED && scm_string_p (mode))
+ if (scm_is_string (mode))
m = ly_scm2string (mode);
/* dup2 and (fileno (current-error-port)) do not work with mingw'c
gcc -mwindows. */
fflush (stderr);
- stderrfile = freopen (ly_scm2string (file_name).c_str (), m.c_str (), stderr);
+ stderrfile = freopen (f.c_str (), m.c_str (), stderr);
+ if (!stderrfile)
+ error (_f ("failed redirecting stderr to `%s'", f.c_str ()));
return SCM_UNSPECIFIED;
}
char *standard_output = 0;
char *standard_error = 0;
- int exit_status = be_verbose_global
- ? ly_run_command (argv, &standard_output, &standard_error)
- : ly_run_command (argv, 0, 0);
+ // Always get the pointer to the stdout/stderr messages
+ int exit_status = ly_run_command (argv, &standard_output, &standard_error);
- if (be_verbose_global)
- {
- fprintf (stderr, "\n%s", standard_output);
- fprintf (stderr, "%s", standard_error);
- }
+ // Print out stdout and stderr only in debug mode
+ debug_output (string ("\n") + standard_output + standard_error, true);
for (int i = 0; i < n; i++)
free (argv[i]);
continue;
int n1 = robust_scm2int (scm_car (candidate), -1);
int n2 = robust_scm2int (scm_cdr (candidate), -1);
- if (n1 < 0 || n2 < 0 || n1 >= note_heads.size ())
+ if ((n1 < 0) || (n2 < 0) || (size_t(n1) >= note_heads.size ()))
continue;
note_column_1.push_back (vsize (n1));
note_column_2.push_back (vsize (n2));
send_stream_event (g, "Finish", 0, 0);
- if (be_verbose_global)
- message (_f ("elapsed time: %.2f seconds", timer.read ()));
+ debug_output (_f ("elapsed time: %.2f seconds", timer.read ()));
return ctx;
}
#include "program-option.hh"
#include "profile.hh"
#include "simple-closure.hh"
+#include "unpure-pure-container.hh"
#include "warn.hh"
#include "protected-scm.hh"
{
if (!ly_is_procedure (v)
&& !is_simple_closure (v)
+ && !is_unpure_pure_container (v)
&& v != ly_symbol2scm ("calculation-in-progress"))
type_check_assignment (sym, v, ly_symbol2scm ("backend-type?"));
if (do_internal_type_checking_global && scm_is_pair (handle))
{
SCM val = scm_cdr (handle);
- if (!ly_is_procedure (val) && !is_simple_closure (val))
+ if (!ly_is_procedure (val) && !is_simple_closure (val) && !is_unpure_pure_container (val))
type_check_assignment (sym, val, ly_symbol2scm ("backend-type?"));
check_interfaces_for_property (this, sym);
}
#endif
+ if (is_unpure_pure_container (val))
+ val = unpure_pure_container_unpure_part (val);
if (ly_is_procedure (val)
|| is_simple_closure (val))
{
Grob::internal_get_pure_property (SCM sym, int start, int end) const
{
SCM val = internal_get_property_data (sym);
- if (ly_is_procedure (val))
+ if (ly_is_procedure (val) || is_unpure_pure_container (val))
return call_pure_function (val, scm_list_1 (self_scm ()), start, end);
if (is_simple_closure (val))
return evaluate_with_simple_closure (self_scm (),
{
SCM val = scm_cdr (s);
if (ly_is_procedure (val)
- || is_simple_closure (val))
+ || is_simple_closure (val)
+ || is_unpure_pure_container (val))
{
Grob *me = ((Grob *)this);
val = me->try_callback_on_alist (&me->object_alist_, sym, val);
return SCM_UNSPECIFIED;
}
+LY_DEFINE (ly_grob_pure_property, "ly:grob-pure-property",
+ 4, 1, 0, (SCM grob, SCM sym, SCM beg, SCM end, SCM val),
+ "Return the pure value for property @var{sym} of @var{grob}."
+ " If no value is found, return @var{val} or @code{'()}"
+ " if @var{val} is not specified.")
+{
+ Grob *sc = unsmob_grob (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
+ LY_ASSERT_TYPE (scm_is_integer, beg, 3);
+ LY_ASSERT_TYPE (scm_is_integer, end, 4);
+ if (val == SCM_UNDEFINED)
+ val = SCM_EOL;
+
+ SCM retval = sc->internal_get_pure_property (sym, scm_to_int (beg), scm_to_int (end));
+ if (retval == SCM_EOL)
+ retval = val;
+
+ return retval;
+}
+
LY_DEFINE (ly_grob_property, "ly:grob-property",
2, 1, 0, (SCM grob, SCM sym, SCM val),
"Return the value for property @var{sym} of @var{grob}."
self_scm_ = SCM_EOL;
immutable_property_alist_ = s.immutable_property_alist_;
- mutable_property_alist_ = ly_deep_copy (s.mutable_property_alist_);
+ mutable_property_alist_ = SCM_EOL;
interfaces_ = s.interfaces_;
object_alist_ = SCM_EOL;
layout_ = 0;
smobify_self ();
+
+ mutable_property_alist_ = ly_deep_copy (s.mutable_property_alist_);
+
}
Grob::~Grob ()
MESSAGES
****************************************************************/
void
-Grob::warning (string s) const
+Grob::programming_error (string s) const
{
- if (get_program_option ("warning-as-error"))
- error (s);
+ SCM cause = self_scm ();
+ while (Grob *g = unsmob_grob (cause))
+ cause = g->get_property ("cause");
+
+ /* ES TODO: cause can't be Music*/
+ if (Music *m = unsmob_music (cause))
+ m->origin ()->programming_error (s);
+ else if (Stream_event *ev = unsmob_stream_event (cause))
+ ev->origin ()->programming_error (s);
+ else
+ ::programming_error (s);
+}
+void
+Grob::warning (string s) const
+{
SCM cause = self_scm ();
while (Grob *g = unsmob_grob (cause))
cause = g->get_property ("cause");
return scm_is_symbol (nm) ? ly_symbol2string (nm) : this->class_name ();
}
-void
-Grob::programming_error (string s) const
-{
- if (get_program_option ("warning-as-error"))
- error (s);
-
- SCM cause = self_scm ();
- while (Grob *g = unsmob_grob (cause))
- cause = g->get_property ("cause");
-
- s = _f ("programming error: %s", s);
-
- /* ES TODO: cause can't be Music*/
- if (Music *m = unsmob_music (cause))
- m->origin ()->message (s);
- else if (Stream_event *ev = unsmob_stream_event (cause))
- ev->origin ()->message (s);
- else
- ::message (s);
-}
-
ADD_INTERFACE (Grob,
"A grob represents a piece of music notation.\n"
"\n"
for (vsize i = scm_init_funcs_->size (); i--;)
(scm_init_funcs_->at (i)) ();
- if (be_verbose_global)
+ if (is_loglevel (LOG_DEBUG))
{
- progress_indication ("[");
+ debug_output ("[", true);
scm_display (scm_c_eval_string ("(%search-load-path \"lily.scm\")"),
scm_current_error_port ());
- progress_indication ("]\n");
+ debug_output ("]\n", false);
}
scm_primitive_load_path (scm_from_locale_string ("lily.scm"));
#include "hairpin.hh"
+#include "axis-group-interface.hh"
#include "dimensions.hh"
#include "international.hh"
#include "line-interface.hh"
else
{
bool neighbor_found = false;
- Spanner *adjacent;
+ Spanner *adjacent = NULL;
extract_grob_set (me, "adjacent-spanners", neighbors);
for (vsize i = 0; i < neighbors.size (); i++)
{
}
}
- Interval e = robust_relative_extent (b, common, X_AXIS);
+ Interval e = (Axis_group_interface::has_interface (b)
+ ? Axis_group_interface::generic_bound_extent (b, common, X_AXIS)
+ : robust_relative_extent (b, common, X_AXIS));
if (neighbor_found)
{
if (Hairpin::has_interface (adjacent))
if (yy_current_buffer)
state_stack_.push_back (yy_current_buffer);
- if (be_verbose_global)
- {
- string spaces = "";
- for (size_t i = 0; i < state_stack_.size (); i++)
- spaces += " ";
- progress_indication (string ("\n") + spaces + string ("[") + file->name_string ());
- }
+ debug_output (string (state_stack_.size (), ' ') // indentation!
+ + string ("[") + file->name_string ());
include_stack_.push_back (file);
if (yy_current_buffer)
state_stack_.push_back (yy_current_buffer);
- if (be_verbose_global)
- {
- string spaces = "";
- for (size_t i = 0; i < state_stack_.size (); i++)
- spaces += " ";
- progress_indication (string ("\n") + spaces + string ("[") + name);
- }
+ debug_output (string (state_stack_.size (), ' ') // indentation!
+ + string ("[") + name);
include_stack_.push_back (file);
yy_switch_to_buffer (yy_create_buffer (file->get_istream (), YY_BUF_SIZE));
{
include_stack_.pop_back ();
char_count_stack_.pop_back ();
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
yy_delete_buffer (yy_current_buffer);
#if HAVE_FLEXLEXER_YY_CURRENT_BUFFER
yy_current_buffer = 0;
struct Axis_group_interface
{
static SCM generic_group_extent (Grob *me, Axis a);
+ static Interval generic_bound_extent (Grob *me, Grob *common, Axis a);
static Interval pure_group_height (Grob *me, int start, int end);
DECLARE_SCHEME_CALLBACK (width, (SCM smob));
DECLARE_SCHEME_CALLBACK (calc_x_common, (SCM smob));
DECLARE_SCHEME_CALLBACK (calc_pure_y_common, (SCM));
static Interval relative_group_extent (vector<Grob *> const &list,
Grob *common, Axis);
+ static Interval relative_maybe_bound_group_extent (vector<Grob *> const &list,
+ Grob *common, Axis, bool);
static Interval relative_pure_height (Grob *me, int start, int end);
static Interval combine_pure_heights (Grob *me, SCM, int, int);
static Interval sum_partial_pure_heights (Grob *me, int, int);
static Interval no_visible_stem_positions (Grob *me, Interval default_value);
DECLARE_SCHEME_CALLBACK (rest_collision_callback, (SCM element, SCM prev_off));
+ DECLARE_SCHEME_CALLBACK (pure_rest_collision_callback, (SCM element, SCM prev_off, SCM, SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (calc_beaming, (SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_shorten, (SCM));
Bezier extract (Real, Real) const;
Real get_other_coordinate (Axis a, Real x) const;
+ vector<Real> get_other_coordinates (Axis a, Real x) const;
vector<Real> solve_point (Axis, Real coordinate) const;
+ Real minmax (Axis, Real, Real, Direction) const;
+ Real minmax (Axis, Real, Real, Direction, vsize, vsize) const;
vector<Real> solve_derivative (Offset) const;
Interval extent (Axis) const;
Interval control_point_extent (Axis) const;
char const *end () const;
void set (Source_file *, char const *, char const *);
- void warning (string) const;
+ void error (string) const;
void programming_error (string) const;
void non_fatal_error (string) const;
- void error (string) const;
+ void warning (string) const;
void message (string) const;
+ void debug_output (string) const;
void set_spot (Input const &);
void step_forward ();
void set_location (Input const &, Input const &);
Input (Input const &i);
Input ();
+protected:
+ void print_message (int level, string s) const;
};
#include "smobs.hh"
virtual void handle_prebroken_dependencies ();
virtual Interval_t<int> spanned_rank_interval () const;
virtual Interval pure_height (Grob *ref, int start, int end);
+ virtual void cache_pure_height (Interval height);
DECLARE_GROB_INTERFACE ();
protected:
virtual void discretionary_processing ();
SCM lookup_identifier (string s);
SCM lookup_identifier_symbol (SCM s);
void push_extra_token (int token_type);
+ void push_embedded_token ();
void push_chord_state (SCM tab);
void push_figuredbass_state ();
void push_lyric_state ();
void push_note_state (SCM tab);
void pop_state ();
void LexerError (char const *);
+ void LexerWarning (char const *);
void set_identifier (SCM path, SCM val);
int get_state () const;
bool is_note_state () const;
void include_string (string ly_code);
void parse_file (string init, string name, string out_name);
void parse_string (string ly_code);
+ SCM parse_string_expression (string ly_code);
void parser_error (string);
void parser_error (Input const &, string);
void set_yydebug (bool);
extern string output_backend_global;
extern string output_name_global;
extern bool be_safe_global;
-extern bool be_verbose_global;
extern bool do_internal_type_checking_global;
extern bool point_and_click_global;
extern string lilypond_datadir;
void stop_translation_timestep ();
void start_translation_timestep ();
void process_music ();
+ void handle_manual_breaks (bool);
virtual void initialize ();
virtual void finalize ();
public:
DECLARE_GROB_INTERFACE ();
- static Spring get_spacing (Grob *, Grob *right_col);
+ static Spring get_spacing (Grob *, Grob *, Real);
static Interval bar_y_positions (Grob *);
};
DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (calc_slope, (SCM));
DECLARE_SCHEME_CALLBACK (calc_width, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
+ DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (width, (SCM));
DECLARE_SCHEME_CALLBACK (calc_style, (SCM));
DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));
static Stencil raw_stencil (Grob *, Real slope, Direction stemdir);
- static Stencil translated_stencil (Grob *, Real slope);
+ static Real y_offset (Grob *, bool pure);
static Stencil untranslated_stencil (Grob *, Real slope);
static Real get_beam_translation (Grob *me);
static Real vertical_length (Grob *me);
static void add_head (Grob *me, Grob *n);
static Stem_info get_stem_info (Grob *);
static Real chord_start_y (Grob *);
- static void set_stemend (Grob *, Real);
+ static void set_stem_positions (Grob *, Real);
+ static void cache_pure_height (Grob *, Interval, Interval);
static Slice beam_multiplicity (Grob *);
static Direction get_default_dir (Grob *);
static Real thickness (Grob *);
+ static Real beam_end_corrective (Grob *);
static int head_count (Grob *);
static bool is_invisible (Grob *);
static bool is_normal_stem (Grob *);
static bool is_cross_staff (Grob *);
static Interval head_positions (Grob *);
- static Real stem_end_position (Grob *);
- static Stencil flag (Grob *);
- static Stencil get_translated_flag (Grob *);
+ static Interval internal_pure_height (Grob *, bool);
+ static Interval internal_height (Grob *, bool);
+ static bool is_valid_stem (Grob *);
+ static Grob *get_reference_head (Grob *);
+ static Real internal_calc_stem_end_position (Grob *, bool);
+ static Real internal_calc_stem_begin_position (Grob *, bool);
+
DECLARE_GROB_INTERFACE ();
static void set_spacing_hints (Grob *);
+ static Grob *flag (Grob *);
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (calc_default_direction, (SCM));
DECLARE_SCHEME_CALLBACK (offset_callback, (SCM element));
DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
DECLARE_SCHEME_CALLBACK (calc_beaming, (SCM));
- DECLARE_SCHEME_CALLBACK (calc_length, (SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_begin_position, (SCM));
+ DECLARE_SCHEME_CALLBACK (pure_calc_stem_begin_position, (SCM, SCM, SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_end_position, (SCM));
+ DECLARE_SCHEME_CALLBACK (pure_calc_stem_end_position, (SCM, SCM, SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_info, (SCM));
DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
DECLARE_SCHEME_CALLBACK (width, (SCM smob));
DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));
DECLARE_SCHEME_CALLBACK (height, (SCM));
DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
- DECLARE_SCHEME_CALLBACK (calc_flag, (SCM));
};
#endif
--- /dev/null
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 2005--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef UNPURE_PURE_CONTAINER_HH
+#define UNPURE_PURE_CONTAINER_HH
+
+#include "lily-guile.hh"
+
+bool is_unpure_pure_container (SCM s);
+SCM unpure_pure_container_unpure_part (SCM smob);
+SCM unpure_pure_container_pure_part (SCM smob);
+SCM ly_make_unpure_pure_container (SCM, SCM);
+
+#endif /* UNPURE_PURE_CONTAINER_HH */
return unsmob_input (x) ? SCM_BOOL_T : SCM_BOOL_F;
}
+LY_DEFINE (ly_input_warning, "ly:input-warning", 2, 0, 1, (SCM sip, SCM msg, SCM rest),
+ "Print @var{msg} as a GNU compliant warning message, pointing"
+ " to the location in @var{sip}. @var{msg} is interpreted"
+ " similar to @code{format}'s argument, using @var{rest}.")
+{
+ Input *ip = unsmob_input (sip);
+
+ LY_ASSERT_TYPE (unsmob_input, sip, 1);
+ LY_ASSERT_TYPE (scm_is_string, msg, 2);
+
+ msg = scm_simple_format (SCM_BOOL_F, msg, rest);
+
+ string m = ly_scm2string (msg);
+ ip->warning (m);
+
+ return SCM_UNSPECIFIED;
+}
+
LY_DEFINE (ly_input_message, "ly:input-message", 2, 0, 1, (SCM sip, SCM msg, SCM rest),
"Print @var{msg} as a GNU compliant error message, pointing"
" to the location in @var{sip}. @var{msg} is interpreted"
[file:line:column:][warning:]message
*/
void
-Input::message (string s) const
+Input::print_message (int level, string s) const
{
+ string location;
if (source_file_)
- s = location_string () + ": " + s + "\n"
- + source_file_->quote_input (start_) + "\n";
- ::message (s);
+ ::print_message (level, location_string (),
+ s + "\n" + source_file_->quote_input (start_) + "\n");
+ else
+ ::print_message (level, "", s);
+}
+
+void
+Input::error (string s) const
+{
+ print_message (LOG_ERROR, _f ("error: %s", s));
+ // UGH, fix naming or usage (use non_fatal_error in most places, instead)
+ // exit (1);
}
void
Input::programming_error (string s) const
{
if (get_program_option ("warning-as-error"))
- ::error (s);
+ error (s);
else
{
- message (_f ("programming error: %s", s.c_str ()));
- message (_ ("continuing, cross fingers") + "\n");
+ print_message (LOG_ERROR, _f ("programming error: %s", s));
+ print_message (LOG_ERROR, _ ("continuing, cross fingers") + "\n");
}
}
+void
+Input::non_fatal_error (string s) const
+{
+ print_message (LOG_ERROR, _f ("error: %s", s));
+}
+
void
Input::warning (string s) const
{
if (get_program_option ("warning-as-error"))
- ::error (s);
+ error (s);
else
- message (_f ("warning: %s", s));
+ print_message (LOG_WARN, _f ("warning: %s", s));
}
void
-Input::error (string s) const
+Input::message (string s) const
{
- message (_f ("error: %s", s));
- // UGH, fix naming or usage
- // exit (1);
+ print_message (LOG_INFO, s);
}
void
-Input::non_fatal_error (string s) const
+Input::debug_output (string s) const
{
- message (_f ("error: %s", s));
+ print_message (LOG_DEBUG, s);
}
string
LY_DEFINE (ly_item_break_dir, "ly:item-break-dir",
1, 0, 0, (SCM it),
- "The break status direction of item @var{it}. @code{-1} means"
+ "The break status direction of item @var{it}. @w{@code{-1}} means"
" end of line, @code{0}@tie{}unbroken, and"
" @code{1}@tie{}beginning of line.")
{
if (cached_pure_height_valid_)
return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
- cached_pure_height_ = Grob::pure_height (this, start, end);
- cached_pure_height_valid_ = true;
+ cache_pure_height (Grob::pure_height (this, start, end));
return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
}
+void
+Item::cache_pure_height (Interval height)
+{
+ cached_pure_height_ = height;
+ cached_pure_height_valid_ = true;
+}
+
ADD_INTERFACE (Item,
"Grobs can be distinguished in their role in the horizontal"
" spacing. Many grobs define constraints on the spacing by"
"Whether these versions are visible and take up space is"
" determined by the outcome of the @code{break-visibility}"
" grob property, which is a function taking a direction"
- " (@code{-1}, @code{0} or@tie{}@code{1}) as an argument. It"
+ " (@w{@code{-1}}, @code{0} or@tie{}@code{1}) as an argument. It"
" returns a cons of booleans, signifying whether this grob"
" should be transparent and have no extent.\n"
"\n"
&& !scm_is_eq (last, key))
{
SCM restore = SCM_EOL;
- SCM *tail = &restore;
for (SCM s = last; scm_is_pair (s); s = scm_cdr (s))
{
SCM new_alter_pair = scm_assoc (scm_caar (s), key);
|| ((ly_scm2rational (scm_cdr (new_alter_pair)) - old_alter) * old_alter
< Rational (0)))
{
- *tail = scm_cons (scm_car (s), *tail);
- tail = SCM_CDRLOC (*tail);
+ restore = scm_cons (scm_car (s), restore);
}
}
key_event_
? key_event_->self_scm () : SCM_EOL);
- cancellation_->set_property ("alteration-alist", scm_reverse (restore));
+ cancellation_->set_property ("alteration-alist", restore);
cancellation_->set_property ("c0-position",
get_property ("middleCPosition"));
}
ACCENT \\[`'"^]
NATIONAL [\001-\006\021-\027\031\036]
TEX {AA}|-|{PUNCT}|{ACCENT}|{NATIONAL}
-WORD {A}{AN}*
DASHED_WORD {A}({AN}|-)*
DASHED_KEY_WORD \\{DASHED_WORD}
FRACTION {N}+\/{N}+
INT -?{UNSIGNED}
REAL ({INT}\.{N}*)|(-?\.{N}+)
-KEYWORD \\{WORD}
WHITE [ \n\t\f\r]
HORIZONTALWHITE [ \t]
BLACK [^ \n\t\f\r]
<*>\r {
- // windows-suck-suck-suck
+ // swallow and ignore carriage returns
}
<extratoken>{ANY_CHAR} {
return type;
}
+<extratoken><<EOF>> {
+ /* Generate a token without swallowing anything */
+
+ /* produce requested token */
+ int type = extra_token_types_.back ();
+ extra_token_types_.pop_back ();
+ if (extra_token_types_.empty ())
+ yy_pop_state ();
+
+ return type;
+}
+
/* Use the trailing context feature. Otherwise, the BOM will not be
found if the file starts with an identifier definition. */
<INITIAL,chords,lyrics,figures,notes>{BOM_UTF8}/.* {
if (this->lexloc_->line_number () != 1 || this->lexloc_->column_number () != 0)
{
- LexerError (_ ("stray UTF-8 BOM encountered").c_str ());
- exit (1);
+ LexerWarning (_ ("stray UTF-8 BOM encountered").c_str ());
+ // exit (1);
}
- if (be_verbose_global)
- message (_ ("Skipping UTF-8 BOM"));
+ debug_output (_ ("Skipping UTF-8 BOM"));
}
<INITIAL,chords,figures,incl,lyrics,markup,notes>{
this->here_input ().get_source_file ()->set_line (here_input ().start (), i);
}
-<version>. {
+<version>{ANY_CHAR} {
LexerError (_ ("quoted string expected after \\version").c_str ());
yy_pop_state ();
}
-<sourcefilename>. {
+<sourcefilename>{ANY_CHAR} {
LexerError (_ ("quoted string expected after \\sourcefilename").c_str ());
yy_pop_state ();
}
-<sourcefileline>. {
+<sourcefileline>{ANY_CHAR} {
LexerError (_ ("integer expected after \\sourcefileline").c_str ());
yy_pop_state ();
}
"%"+"}" {
yy_pop_state ();
}
- <<EOF>> {
- LexerError (_ ("EOF found inside a comment").c_str ());
- is_main_input_ = false; // should be safe , can't have \include in --safe.
- if (! close_input ())
- yyterminate (); // can't move this, since it actually rets a YY_NULL
- }
}
new_input (s, sources_);
yy_pop_state ();
}
-<incl>\\{BLACK}*{WHITE} { /* got the include identifier */
+<incl>\\{BLACK}*{WHITE}? { /* got the include identifier */
string s = YYText () + 1;
strip_trailing_white (s);
if (s.length () && (s[s.length () - 1] == ';'))
scm_display (sid, err);
}
}
-<incl>\"[^"]* { // backup rule
+<incl,version,sourcefilename>\"[^"]* { // backup rule
error (_ ("end quote missing"));
exit (1);
}
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
-
{DIGIT} {
yylval.i = String_convert::dec2int (string (YYText ()));
return DIGIT;
}
+ {UNSIGNED}/\/[^0-9] { // backup rule
+ yylval.i = String_convert::dec2int (string (YYText ()));
+ return UNSIGNED;
+ }
+ {UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.i = String_convert::dec2int (string (YYText ()));
return UNSIGNED;
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
+ {UNSIGNED}/\/[^0-9] { // backup rule
+ yylval.i = String_convert::dec2int (string (YYText ()));
+ return UNSIGNED;
+ }
+ {UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.i = String_convert::dec2int (string (YYText ()));
return UNSIGNED;
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
+ {UNSIGNED}/\/[^0-9] { // backup rule
+ yylval.i = String_convert::dec2int (string (YYText ()));
+ return UNSIGNED;
+ }
+ {UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.i = String_convert::dec2int (string (YYText ()));
return UNSIGNED;
}
}
-<*><<EOF>> {
- if (is_main_input_)
+<longcomment><<EOF>> {
+ LexerError (_ ("EOF found inside a comment").c_str ());
+ is_main_input_ = false; // should be safe , can't have \include in --safe.
+ if (!close_input ())
+ yyterminate (); // can't move this, since it actually rets a YY_NULL
+ }
+
+<<EOF>> { if (is_main_input_)
{
/* 2 = init.ly + current file.
> because we're before closing, but is_main_input_ should
}
}
-{WORD} {
- return scan_bare_word (YYText ());
-}
-{KEYWORD} {
- return scan_escaped_word (YYText () + 1);
-}
+-{UNSIGNED} | // backup rule
{REAL} {
Real r;
int cnv = sscanf (YYText (), "%lf", &r);
yylval.scm = scm_from_double (r);
return REAL;
}
+-\. { // backup rule
+ yylval.scm = scm_from_double (0.0);
+ return REAL;
+}
{UNSIGNED} {
yylval.i = String_convert::dec2int (string (YYText ()));
extra_token_types_.push_back (token_type);
}
+void
+Lily_lexer::push_embedded_token ()
+{
+ push_extra_token (EMBEDDED_LILY);
+}
+
void
Lily_lexer::push_chord_state (SCM tab)
{
return s;
}
- if (be_verbose_global)
- progress_indication ("[" + s);
+ debug_output ("[" + s, true);
vector<char> chars = gulp_file (s, size);
string result (&chars[0], chars.size ());
- if (be_verbose_global)
- progress_indication ("]\n");
+ debug_output ("]\n", false);
return result;
}
Lily_lexer::LexerError (char const *s)
{
if (include_stack_.empty ())
- message (_f ("error at EOF: %s", s) + "\n");
+ non_fatal_error (s, _f ("%s:EOF", s));
else
{
error_level_ |= 1;
}
}
+void
+Lily_lexer::LexerWarning (char const *s)
+{
+ if (include_stack_.empty ())
+ warning (s, _f ("%s:EOF", s));
+ else
+ {
+ Input spot (*lexloc_);
+ spot.warning (s);
+ }
+}
+
char
Lily_lexer::escaped_char (char c) const
{
else
{
File_name out (output_name);
- if (is_dir (out.dir_part ()))
- {
- dir = out.dir_part ();
- out_file_name = out.file_part ();
- }
+ dir = out.dir_part ();
+ out_file_name = out.file_part ();
}
if (dir != "" && dir != "." && dir != get_working_directory ())
{
global_path.prepend (get_working_directory ());
- message (_f ("Changing working directory to: `%s'",
- dir.c_str ()));
- chdir (dir.c_str ());
+ message (_f ("Changing working directory to: `%s'", dir));
+ // If we can't change to the output dir (not existing, wrong
+ // permissions), exit lilypond
+ if (chdir (dir.c_str ()) != 0)
+ error (_f ("unable to change directory to: `%s'", dir));
}
else
out_file_name = File_name (output_name);
sources.set_path (&global_path);
string mapped_fn = map_file_name (file_name);
- message (_f ("Processing `%s'", mapped_fn.c_str ()));
- progress_indication ("\n");
+ basic_progress (_f ("Processing `%s'", mapped_fn.c_str ()));
Lily_parser *parser = new Lily_parser (&sources);
return SCM_UNSPECIFIED;
}
+LY_DEFINE (ly_parse_string_expression, "ly:parse-string-expression",
+ 2, 0, 0, (SCM parser_smob, SCM ly_code),
+ "Parse the string @var{ly-code} with @var{parser-smob}."
+" Return the contained music expression.")
+{
+ LY_ASSERT_SMOB (Lily_parser, parser_smob, 1);
+ Lily_parser *parser = unsmob_lily_parser (parser_smob);
+ LY_ASSERT_TYPE (scm_is_string, ly_code, 2);
+
+ if (!parser->lexer_->is_clean ())
+ {
+ parser->parser_error (_ ("ly:parse-string-expression is only valid with a new parser."
+ " Use ly:parser-include-string instead."));
+ return SCM_UNSPECIFIED;
+ }
+
+ return parser->parse_string_expression (ly_scm2string (ly_code));
+}
+
LY_DEFINE (ly_parser_include_string, "ly:parser-include-string",
2, 0, 0, (SCM parser_smob, SCM ly_code),
"Include the string @var{ly-code} into the input stream"
error_level_ = error_level_ | lexer_->error_level_;
}
+SCM
+Lily_parser::parse_string_expression (string ly_code)
+{
+ // TODO: use $parser
+ lexer_->set_identifier (ly_symbol2scm ("parser"),
+ self_scm ());
+
+ lexer_->main_input_name_ = "<string>";
+ lexer_->is_main_input_ = true;
+ lexer_->new_input (lexer_->main_input_name_, ly_code, sources_);
+
+ SCM mod = lexer_->set_current_scope ();
+ lexer_->push_embedded_token ();
+ do_yyparse ();
+ SCM result = lexer_->lookup_identifier_symbol (ly_symbol2scm ("$parseStringResult"));
+ // $parseStringResult is set in the grammar rule for embedded_lilypond
+
+ scm_set_current_module (mod);
+
+ if (!define_spots_.empty ())
+ {
+ if (define_spots_.empty ()
+ && !error_level_)
+ programming_error ("define_spots_ don't match, but error_level_ not set.");
+ }
+
+ error_level_ = error_level_ | lexer_->error_level_;
+ return result;
+}
+
void
Lily_parser::include_string (string ly_code)
{
#include "item.hh"
#include "lily-proto.hh"
#include "line-interface.hh"
+#include "note-column.hh"
#include "output-def.hh"
+#include "paper-column.hh"
#include "pointer-group-interface.hh"
#include "spanner.hh"
#include "staff-symbol-referencer.hh"
? columns[0] : columns.back ();
}
+ Real x_coord = (Paper_column::has_interface (bound_grob)
+ ? Axis_group_interface::generic_bound_extent (bound_grob, commonx, X_AXIS)
+ : robust_relative_extent (bound_grob, commonx, X_AXIS)).linear_combination (attach);
+
+ Grob *acc = Note_column::accidentals (bound_grob->get_parent (X_AXIS));
+ if (acc && to_boolean (ly_assoc_get (ly_symbol2scm ("end-on-accidental"), details, SCM_BOOL_F)))
+ x_coord = robust_relative_extent (acc, commonx, X_AXIS).linear_combination (attach);
+
details = scm_acons (ly_symbol2scm ("X"),
- scm_from_double (robust_relative_extent (bound_grob, commonx, X_AXIS)
- .linear_combination (attach)),
+ scm_from_double (x_coord),
details);
}
IMPLEMENT_LISTENER (Lyric_combine_music_iterator, check_new_context)
void
-Lyric_combine_music_iterator::check_new_context (SCM sev)
+Lyric_combine_music_iterator::check_new_context (SCM /*sev*/)
{
if (!ok ())
return;
/* Provide URI links to the original file */
bool point_and_click_global = true;
-/* Verbose progress indication? */
-bool be_verbose_global = false;
-
/* Scheme code to execute before parsing, after .scm init.
This is where -e arguments are appended to. */
string init_scheme_code_global;
"and cd into DIR")
},
#endif
+ {
+ _i ("LOGLEVEL"), "loglevel", 'l', _i ("print log messages according to"
+ " LOGLEVEL. Possible values are:\n"
+ "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG.")
+ },
{_i ("FILE"), "output", 'o', _i ("write output to FILE (suffix will be added)")},
{0, "relocate", 0, _i ("relocate using directory of lilypond program")},
+ {0, "silent", 's', _i ("no progress, only error messages (equivalent to loglevel=ERROR)")},
{0, "version", 'v', _i ("show version number and exit")},
- {0, "verbose", 'V', _i ("be verbose")},
+ {0, "verbose", 'V', _i ("be verbose (equivalent to loglevel=DEBUG)")},
{0, "warranty", 'w', _i ("show warranty and copyright")},
{0, 0, 0, 0}
};
prepend_load_path (lilypond_datadir);
prepend_load_path (lilypond_datadir + "/scm");
- if (be_verbose_global)
+ if (is_loglevel (LOG_DEBUG))
dir_info (stderr);
init_scheme_variables_global = "(list " + init_scheme_variables_global + ")";
show_help = true;
break;
case 'V':
- be_verbose_global = true;
+ set_loglevel (LOGLEVEL_DEBUG);
+ break;
+ case 's':
+ set_loglevel (LOGLEVEL_ERROR);
+ break;
+ case 'l':
+ set_loglevel (option_parser->optional_argument_str0_);
break;
default:
programming_error (to_string ("unhandled short option: %c",
if (show_help)
{
ly_usage ();
- if (be_verbose_global)
+ if (is_loglevel (LOG_DEBUG))
dir_info (stdout);
exit (0);
}
start_environment_global.push_back (*p);
if (getenv ("LILYPOND_VERBOSE"))
- be_verbose_global = true;
+ set_loglevel (LOGLEVEL_DEBUG);
+ if (getenv ("LILYPOND_LOGLEVEL"))
+ set_loglevel (getenv ("LILYPOND_LOGLEVEL"));
setup_localisation ();
parse_argv (argc, argv);
- if (isatty (STDIN_FILENO))
+ if (isatty (STDIN_FILENO) && (is_loglevel (LOG_BASIC)))
identify (stderr);
setup_paths (argv[0]);
Stencil mol;
mol.add_stencil (symbol_stencil (me, space));
- int measure_count = 0;
- SCM m (me->get_property ("measure-count"));
- if (scm_is_number (m))
- measure_count = scm_to_int (m);
-
mol.translate_axis (x_off, X_AXIS);
return mol.smobbed_copy ();
}
Grob *f = ft.script_;
f->set_parent (ft.head_, X_AXIS);
f->set_parent (ft.head_, Y_AXIS);
- f->set_property ("avoid-slur", SCM_BOOL_F);
+ f->set_property ("avoid-slur", ly_symbol2scm ("inside"));
if (hordir == LEFT
&& unsmob_grob (ft.head_->get_object ("accidental-grob")))
Side_position_interface::add_support (f,
&& Rhythmic_head::dot_count (head_up) < Rhythmic_head::dot_count (head_down))
{
shift_amount = -1;
- if (!touch || full_collide)
+ if (!touch)
// remember to leave clearance between stems
stem_to_stem = true;
}
&& (up_style == ly_symbol2scm ("fa") || up_style == ly_symbol2scm ("faThin"))
&& (down_style == ly_symbol2scm ("fa") || down_style == ly_symbol2scm ("faThin")))
{
- Interval uphead_size = head_up->extent (head_up, Y_AXIS);
Offset att = Offset (0.0, -1.0);
head_up->set_property ("stem-attachment", ly_offset2scm (att));
head_up->set_property ("transparent", SCM_BOOL_T);
#include "separation-item.hh"
#include "spacing-interface.hh"
#include "staff-spacing.hh"
+#include "staff-symbol-referencer.hh"
#include "stem.hh"
#include "warn.hh"
Interval hp = Stem::head_positions (stem);
if (!hp.is_empty ())
{
- Real chord_start = hp[stem_dir];
-
- /*
- can't look at stem-end-position, since that triggers
- beam slope computations.
- */
- Real stem_end = hp[stem_dir]
- + stem_dir * robust_scm2double (stem->get_property ("length"), 7);
-
- stem_posns[d] = Interval (min (chord_start, stem_end),
- max (chord_start, stem_end));
+ Real ss = Staff_symbol_referencer::staff_space (stem);
+ stem_posns[d] = stem->pure_height (stem, 0, INT_MAX) * (2 / ss);
head_posns[d].unite (hp);
}
}
if (beams_drul[LEFT] && beams_drul[LEFT] == beams_drul[RIGHT])
{
correction = knee_correction (me, stems_drul[RIGHT], increment);
- *fixed += correction;
}
else
{
&& !acc_right)
correction = same_direction_correction (me, head_posns);
+ *fixed += correction;
*space += correction;
/* there used to be a correction for bar_xextent () here, but
footnote_padding_ = robust_scm2double (pb->paper_->c_variable ("footnote-padding"), 0.0);
footnote_footer_padding_ = robust_scm2double (pb->paper_->c_variable ("footnote-footer-padding"), 0.0);
- footnote_number_raise_ = (to_boolean (pb->paper_->c_variable ("footnote-auto-numbering"))
- ? robust_scm2double (pb->paper_->c_variable ("footnote-number-raise"), 0.0)
- : 0.0);
+ footnote_number_raise_ = robust_scm2double (pb->paper_->c_variable ("footnote-number-raise"), 0.0);
if (systems_per_page_ && (max_systems_per_page_ || min_systems_per_page_))
{
// now, make the footnote stencils with the numbering function
SCM numbers = SCM_EOL;
SCM in_text_numbers = SCM_EOL;
- bool do_numbering = to_boolean (paper->c_variable ("footnote-auto-numbering"));
- // if there's no numbering, skip all this
/*
TODO: This recalculates numbering every time this function is called, including once
after the balloon prints are called. Although it is not a huge computational drain,
in duplicated work, either by making this process less complicated or (preferably)
by passing its results downstream.
*/
- if (do_numbering)
+ vector<SCM> footnote_number_markups; // Holds the numbering markups.
+ vector<Stencil *> footnote_number_stencils; // Holds translated versions of the stencilized numbering markups.
+ for (vsize i = 0; i < fn_count; i++)
{
- vector<SCM> footnote_number_markups; // Holds the numbering markups.
- vector<Stencil *> footnote_number_stencils; // Holds translated versions of the stencilized numbering markups.
- for (vsize i = 0; i < fn_count; i++)
+ SCM markup = scm_call_1 (numbering_function, scm_from_int (counter));
+ Stencil *s = unsmob_stencil (Text_interface::interpret_markup (layout, props, markup));
+ if (!s)
{
- SCM markup = scm_call_1 (numbering_function, scm_from_int (counter));
- Stencil *s = unsmob_stencil (Text_interface::interpret_markup (layout, props, markup));
- if (!s)
- {
- programming_error ("Your numbering function needs to return a stencil.");
- markup = SCM_EOL;
- s = new Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL);
- }
- footnote_number_markups.push_back (markup);
- footnote_number_stencils.push_back (s);
- counter++;
+ programming_error ("Your numbering function needs to return a stencil.");
+ markup = SCM_EOL;
+ s = new Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL);
}
+ footnote_number_markups.push_back (markup);
+ footnote_number_stencils.push_back (s);
+ counter++;
+ }
- // find the maximum X_AXIS length
- Real max_length = -infinity_f;
- for (vsize i = 0; i < fn_count; i++)
- max_length = max (max_length, footnote_number_stencils[i]->extent (X_AXIS).length ());
+ // find the maximum X_AXIS length
+ Real max_length = -infinity_f;
+ for (vsize i = 0; i < fn_count; i++)
+ max_length = max (max_length, footnote_number_stencils[i]->extent (X_AXIS).length ());
- /*
- translate each stencil such that it attains the correct maximum length and bundle the
- footnotes into a scheme object.
- */
- SCM *tail = &numbers;
- SCM *in_text_tail = &in_text_numbers;
+ /*
+ translate each stencil such that it attains the correct maximum length and bundle the
+ footnotes into a scheme object.
+ */
+ SCM *tail = &numbers;
+ SCM *in_text_tail = &in_text_numbers;
- for (vsize i = 0; i < fn_count; i++)
- {
- *in_text_tail = scm_cons (footnote_number_markups[i], SCM_EOL);
- in_text_tail = SCM_CDRLOC (*in_text_tail);
- footnote_number_stencils[i]->translate_axis (max_length - footnote_number_stencils[i]->extent (X_AXIS).length (), X_AXIS);
- *tail = scm_cons (footnote_number_stencils[i]->smobbed_copy (), SCM_EOL);
- tail = SCM_CDRLOC (*tail);
- }
+ for (vsize i = 0; i < fn_count; i++)
+ {
+ *in_text_tail = scm_cons (footnote_number_markups[i], SCM_EOL);
+ in_text_tail = SCM_CDRLOC (*in_text_tail);
+ footnote_number_stencils[i]->translate_axis (max_length - footnote_number_stencils[i]->extent (X_AXIS).length (), X_AXIS);
+ *tail = scm_cons (footnote_number_stencils[i]->smobbed_copy (), SCM_EOL);
+ tail = SCM_CDRLOC (*tail);
}
// build the footnotes
props, footnote_markup);
Stencil *footnote_stencil = unsmob_stencil (footnote_stl);
+ bool do_numbering = to_boolean (footnote->get_property ("automatically-numbered"));
+ if (Spanner *orig = dynamic_cast<Spanner *>(footnote))
+ {
+ if (orig->is_broken ())
+ for (vsize i = 0; i < orig->broken_intos_.size (); i++)
+ do_numbering = do_numbering || to_boolean (orig->broken_intos_[i]->get_property ("automatically-numbered"));
+ }
if (do_numbering)
{
SCM annotation_scm = scm_car (in_text_numbers);
for (SCM st = stencils; scm_is_pair (st); st = scm_cdr (st))
{
Stencil mol;
- Stencil *footnote = unsmob_stencil (scm_cadar (st));
+ Stencil *footnote = unsmob_stencil (scm_caddar (st));
mol.add_stencil (*footnote);
+ bool do_numbering = to_boolean (scm_cadar (st));
+ SCM in_text_stencil = Stencil ().smobbed_copy ();
if (do_numbering)
{
Stencil *annotation = unsmob_stencil (scm_car (numbers));
SCM in_text_annotation = scm_car (in_text_numbers);
- SCM in_text_stencil = Text_interface::interpret_markup (layout, props, in_text_annotation);
+ in_text_stencil = Text_interface::interpret_markup (layout, props, in_text_annotation);
if (!unsmob_stencil (in_text_stencil))
in_text_stencil = SCM_EOL;
- number_footnote_table = scm_cons (scm_cons (scm_caar (st), in_text_stencil), number_footnote_table);
annotation->translate_axis (mol.extent (Y_AXIS)[UP] + number_raise - annotation->extent (Y_AXIS)[UP], Y_AXIS);
mol.add_at_edge (X_AXIS, LEFT, *annotation, 0.0);
numbers = scm_cdr (numbers);
in_text_numbers = scm_cdr (in_text_numbers);
}
+ number_footnote_table = scm_cons (scm_cons (scm_caar (st), in_text_stencil), number_footnote_table);
footnote_stencil.add_at_edge (Y_AXIS, DOWN, mol, padding);
}
footnotes = scm_cons (footnote_stencil.smobbed_copy (), footnotes);
SCM_EOL);
tail = SCM_CDRLOC (*tail);
}
-
+ pango_fc_font_unlock_face (fcfont);
pango_glyph_string_free (pgs);
pgs = 0;
PangoFontDescription *descr = pango_font_describe (pa->font);
if (command_column_)
{
+ // At the end of the score, allow page breaks and turns by default, but...
+ command_column_->set_property ("page-break-permission", ly_symbol2scm ("allow"));
+ command_column_->set_property ("page-turn-permission", ly_symbol2scm ("allow"));
+
+ // ...allow the user to override them.
+ handle_manual_breaks (true);
+
+ // On the other hand, line breaks are always allowed at the end of a score,
+ // even if they try to stop us.
if (!scm_is_symbol (command_column_->get_property ("line-break-permission")))
command_column_->set_property ("line-break-permission", ly_symbol2scm ("allow"));
+
system_->set_bound (RIGHT, command_column_);
}
}
}
void
-Paper_column_engraver::process_music ()
+Paper_column_engraver::handle_manual_breaks (bool only_do_permissions)
{
for (vsize i = 0; i < break_events_.size (); i++)
{
SCM pen = break_events_[i]->get_property ("break-penalty");
SCM perm = break_events_[i]->get_property ("break-permission");
- if (scm_is_number (pen))
+ if (!only_do_permissions && scm_is_number (pen))
{
Real new_pen = robust_scm2double (cur_pen, 0.0) + scm_to_double (pen);
command_column_->set_property (pen_str.c_str (), scm_from_double (new_pen));
else
command_column_->set_property (perm_str.c_str (), perm);
}
+}
+
+void
+Paper_column_engraver::process_music ()
+{
+ handle_manual_breaks (false);
for (vsize i = 0; i < label_events_.size (); i++)
{
void
Paper_score::process ()
{
- if (be_verbose_global)
- message (_f ("Element count %d (spanners %d) ",
- system_->element_count (),
- system_->spanner_count ()));
+ debug_output (_f ("Element count %d (spanners %d) ",
+ system_->element_count (),
+ system_->spanner_count ()));
message (_ ("Preprocessing graphical objects..."));
%token <i> UNSIGNED
/* Artificial tokens, for more generic function syntax */
-%token <i> EXPECT_MARKUP;
-%token <i> EXPECT_MUSIC;
-%token <i> EXPECT_PITCH;
-%token <i> EXPECT_DURATION;
-%token <i> EXPECT_SCM;
-%token <i> EXPECT_MARKUP_LIST
+%token <i> EXPECT_MARKUP "markup?"
+%token <i> EXPECT_MUSIC "ly:music?"
+%token <i> EXPECT_PITCH "ly:pitch?"
+%token <i> EXPECT_DURATION "ly:duration?"
+%token <i> EXPECT_SCM "scheme?"
+%token <i> EXPECT_MARKUP_LIST "markup-list?"
/* After the last argument. */
%token <i> EXPECT_NO_MORE_ARGS;
+/* An artificial token for parsing embedded Lilypond */
+%token <i> EMBEDDED_LILY "#{"
+
%token <scm> BOOK_IDENTIFIER
%token <scm> CHORDMODIFIER_PITCH
%token <scm> CHORD_MODIFIER
%type <scm> context_change
%type <scm> direction_less_event
%type <scm> direction_reqd_event
+%type <scm> embedded_lilypond
%type <scm> event_chord
%type <scm> gen_text_def
%type <scm> music_property_def
%type <scm> relative_music
%type <scm> simple_element
%type <scm> simple_music_property_def
+%type <scm> start_symbol
%type <scm> string_number_event
%type <scm> tempo_event
%type <scm> closed_function_arglist
%type <scm> open_function_arglist
%type <scm> identifier_init
+%type <scm> lilypond
%type <scm> lilypond_header
%type <scm> lilypond_header_body
%type <scm> lyric_element
%%
-lilypond: /* empty */
+start_symbol:
+ lilypond
+ | EMBEDDED_LILY {
+ SCM nn = PARSER->lexer_->lookup_identifier ("pitchnames");
+ PARSER->lexer_->push_note_state (alist_to_hashq (nn));
+ } embedded_lilypond {
+ PARSER->lexer_->pop_state ();
+ PARSER->lexer_->set_identifier (ly_symbol2scm ("$parseStringResult"), $3);
+ }
+ ;
+
+lilypond: /* empty */ { }
| lilypond toplevel_expression {
}
| lilypond assignment {
| SCM_IDENTIFIER
;
+embedded_lilypond:
+ { $$ = MAKE_SYNTAX ("void-music", @$, SCM_UNDEFINED); }
+ | identifier_init
+ | music music music_list {
+ $$ = MAKE_SYNTAX ("sequential-music", @$,
+ scm_cons2 ($1, $2, scm_reverse_x ($3, SCM_EOL)));
+ }
+ | error {
+ PARSER->error_level_ = 1;
+ }
+ | embedded_lilypond INVALID {
+ PARSER->error_level_ = 1;
+ }
+ ;
+
lilypond_header_body:
{
Status last_playing_;
/*
- TODO: this is getting of hand...
+ TODO: this is getting off hand...
*/
Context_handle handles_[NUM_OUTLETS];
split_list_ = SCM_EOL;
state_ = APART;
playing_state_ = APART;
+ last_playing_ = APART;
busy_ = false;
notice_busy_ = false;
Outlet_type c1 = (last_playing_ == SOLO2) ? CONTEXT_NULL : CONTEXT_SHARED;
Outlet_type c2 = (last_playing_ == SOLO2) ? CONTEXT_SHARED : CONTEXT_NULL;
substitute_both (c1, c2);
- kill_mmrest ((last_playing_ == SOLO2)
- ? CONTEXT_ONE : CONTEXT_TWO);
+ kill_mmrest ((last_playing_ == SOLO2) ? CONTEXT_ONE : CONTEXT_TWO);
kill_mmrest (CONTEXT_SHARED);
if (playing_state_ != UNISONO
* though), we have to prepend it manually. */
if (g_without_BOM) // conversion to UTF-16be might have failed (shouldn't!)
{
- g = new char[bytes_written + 3];
+ g = (char*)malloc ( sizeof(char) * (bytes_written + 3));
char const *BOM = "\xFE\xFF";
strcpy (g, BOM);
memcpy (&g[2], g_without_BOM, bytes_written + 1); // Copy string + \0
- free (g_without_BOM);
+ g_free (g_without_BOM);
bytes_written += 2;
}
}
int tracks_ = audio_staffs_.size ();
midi_stream.write (Midi_header (1, tracks_, 384));
- if (be_verbose_global)
- progress_indication (_ ("Track...") + " ");
+ debug_output (_ ("Track...") + " ", false);
for (vsize i = 0; i < audio_staffs_.size (); i++)
{
Audio_staff *s = audio_staffs_[i];
- if (be_verbose_global)
- progress_indication ("[" + to_string (i));
+ debug_output ("[" + to_string (i), true);
s->output (midi_stream, i, ports_);
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
}
}
string file_name = ly_scm2string (pfb_file_name);
- if (be_verbose_global)
- progress_indication ("\n[" + file_name);
+ debug_output ("[" + file_name); // start message on a new line
vector<char> pfb_string = gulp_file (file_name, 0);
char *pfa = pfb2pfa ((Byte *) &pfb_string[0], pfb_string.size ());
SCM pfa_scm = scm_from_locale_string (pfa);
free (pfa);
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
return pfa_scm;
}
LY_ASSERT_TYPE (scm_is_string, otf_file_name, 1);
string file_name = ly_scm2string (otf_file_name);
- if (be_verbose_global)
- progress_indication ("\n[" + file_name);
+ debug_output ("[" + file_name); // start message on a new line
FT_Face face = open_ft_face (file_name, 0 /* index */);
string table = get_otf_table (face, "CFF ");
SCM asscm = scm_from_locale_stringn ((char *) table.data (),
table.length ());
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
return asscm;
}
vector<Stream_event *> stop_events_;
vector<Grob *> slurs_;
vector<Grob *> end_slurs_;
+ vector<Grob_info> objects_to_acknowledge_;
protected:
DECLARE_TRANSLATOR_LISTENER (phrasing_slur);
void
Phrasing_slur_engraver::acknowledge_extra_object (Grob_info info)
{
- Slur::auxiliary_acknowledge_extra_object (info, slurs_, end_slurs_);
+ objects_to_acknowledge_.push_back (info);
}
void
void
Phrasing_slur_engraver::stop_translation_timestep ()
{
+ for (vsize i = 0; i < objects_to_acknowledge_.size (); i++)
+ Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_, end_slurs_);
+
end_slurs_.clear ();
start_events_.clear ();
stop_events_.clear ();
+ objects_to_acknowledge_.clear ();
}
ADD_ACKNOWLEDGER (Phrasing_slur_engraver, accidental);
return ly_string2scm (init_scheme_code_global);
}
-LY_DEFINE (ly_command_line_verbose_p, "ly:command-line-verbose?", 0, 0, 0, (),
- "Was @code{be_verbose_global} set?")
+LY_DEFINE (ly_verbose_output_p, "ly:verbose-output?", 0, 0, 0, (),
+ "Was verbose output requested, i.e. loglevel at least @code{DEBUG}?")
{
- return scm_from_bool (be_verbose_global);
+ return scm_from_bool (is_loglevel (LOG_DEBUG));
}
LY_DEFINE (ly_all_options, "ly:all-options",
string combine = string (key) + "=" + value;
char *s = strdup (combine.c_str ());
- if (be_verbose_global)
- progress_indication (_f ("Setting %s to %s", key, value.c_str ())
- + "\n");
+ debug_output (_f ("Setting %s to %s", key, value.c_str ())
+ + "\n");
int retval = putenv (s);
/*
{
if (is_file (value))
return sane_putenv (key, value, overwrite);
- else if (be_verbose_global)
+ else if (is_loglevel (LOG_DEBUG))
+ // this warning should only be printed in debug mode!
warning (_f ("no such file: %s for %s", value, key));
return -1;
}
{
if (is_dir (value))
return sane_putenv (key, value, false);
- else if (be_verbose_global)
+ else if (is_loglevel (LOG_DEBUG))
+ // this warning should only be printed in debug mode!
warning (_f ("no such directory: %s for %s", value, key));
return -1;
}
{
if (is_dir (value))
{
- if (be_verbose_global)
- progress_indication (_f ("%s=%s (prepend)\n", key, value.c_str ()));
+ debug_output (_f ("%s=%s (prepend)\n", key, value.c_str ()), false);
if (char const *cur = getenv (key))
value += to_string (PATHSEP) + cur;
return sane_putenv (key, value.c_str (), true);
}
- else if (be_verbose_global)
+ else if (is_loglevel (LOG_DEBUG))
+ // this warning should only be printed in debug mode
warning (_f ("no such directory: %s for %s", value, key));
return -1;
}
prepend_env_path ("PATH", bindir);
- if (be_verbose_global)
- warning (_f ("Relocation: compile datadir=%s, new datadir=%s",
- old_lilypond_datadir.c_str (),
- lilypond_datadir.c_str ()));
+ debug_output (_f ("Relocation: compile datadir=%s, new datadir=%s",
+ old_lilypond_datadir.c_str (),
+ lilypond_datadir.c_str ()));
}
/*
static void
framework_relocation (string prefix)
{
- if (be_verbose_global)
- warning (_f ("Relocation: framework_prefix=%s", prefix));
+ debug_output (_f ("Relocation: framework_prefix=%s", prefix));
sane_putenv ("INSTALLER_PREFIX", prefix, true);
if (argv0_filename.is_absolute ())
{
argv0_abs = argv0_filename.to_string ();
- if (be_verbose_global)
- warning (_f ("Relocation: is absolute: argv0=%s", argv0_ptr));
+ debug_output (_f ("Relocation: is absolute: argv0=%s\n", argv0_ptr));
}
else if (argv0_filename.dir_.length ())
{
argv0_abs = get_working_directory ()
+ "/" + string (argv0_filename.to_string ());
- if (be_verbose_global)
- warning (_f ("Relocation: from cwd: argv0=%s", argv0_ptr));
+ debug_output (_f ("Relocation: from cwd: argv0=%s\n", argv0_ptr));
}
else
{
argv0_abs = path.find (argv0_filename.to_string (), ext);
#endif /* __MINGW32__ */
- if (be_verbose_global)
- warning (_f ("Relocation: from PATH=%s\nargv0=%s",
- path.to_string ().c_str (), argv0_ptr));
+ debug_output (_f ("Relocation: from PATH=%s\nargv0=%s",
+ path.to_string ().c_str (), argv0_ptr), true);
if (argv0_abs.empty ())
programming_error ("cannot find absolute argv0");
void
read_relocation_file (string filename)
{
- if (be_verbose_global)
- progress_indication (_f ("Relocation file: %s", filename.c_str ())
- + "\n");
-
+ debug_output (_f ("Relocation file: %s", filename.c_str ()) + "\n");
char const *cname = filename.c_str ();
FILE *f = fopen (cname, "r");
if (!f)
amount += ss / 2;
if (!position_override)
- amount += 2 * ss * get_grob_direction (me);;
+ amount += 2 * ss * get_grob_direction (me);
+
return scm_from_double (amount);
}
{
vector<Grob *> rheads_;
Grob *stem_;
+ Grob *flag_;
Grob *note_column_;
- Grob *dotcol_;
Grob *arpeggio_;
TRANSLATOR_DECLARATIONS (Rhythmic_column_engraver);
protected:
DECLARE_ACKNOWLEDGER (stem);
+ DECLARE_ACKNOWLEDGER (flag);
DECLARE_ACKNOWLEDGER (rhythmic_head);
DECLARE_ACKNOWLEDGER (arpeggio);
void process_acknowledged ();
{
stem_ = 0;
+ flag_ = 0;
note_column_ = 0;
arpeggio_ = 0;
}
}
if (arpeggio_)
- note_column_->set_object ("arpeggio", arpeggio_->self_scm ());
+ {
+ Pointer_group_interface::add_grob (note_column_, ly_symbol2scm ("elements"), arpeggio_);
+ note_column_->set_object ("arpeggio", arpeggio_->self_scm ());
+ }
+ if (flag_)
+ Pointer_group_interface::add_grob (note_column_, ly_symbol2scm ("elements"), flag_);
}
}
stem_ = i.grob ();
}
+void
+Rhythmic_column_engraver::acknowledge_flag (Grob_info i)
+{
+ flag_ = i.grob ();
+}
+
void
Rhythmic_column_engraver::acknowledge_rhythmic_head (Grob_info i)
{
note_column_ = 0;
stem_ = 0;
arpeggio_ = 0;
+ flag_ = 0;
}
ADD_ACKNOWLEDGER (Rhythmic_column_engraver, stem);
+ADD_ACKNOWLEDGER (Rhythmic_column_engraver, flag);
ADD_ACKNOWLEDGER (Rhythmic_column_engraver, rhythmic_head);
ADD_ACKNOWLEDGER (Rhythmic_column_engraver, arpeggio);
if (left)
elts = Accidental_placement::get_relevant_accidentals (read_only_elts, left);
else
- {
- elts = read_only_elts;
-
- /* This is a special-case for NoteColumn: we want to include arpeggio in its
- skyline (so spacing takes it into account) but we don't want to include it
- in the NoteColumn's extent because some spanners (eg. Hairpin) bound themselves
- on the NoteColumn and we don't want them to include arpeggios in their bounds.
- */
- if (Grob *a = Note_column::arpeggio (me))
- {
- elts.push_back (a);
- }
- }
+ elts = read_only_elts;
Grob *ycommon = common_refpoint_of_array (elts, me, Y_AXIS);
{
Music *m = get_music ();
SCM proc = m->get_property ("elements-callback");
- if (scm_procedure_p (proc))
+ if (ly_is_procedure (proc))
return scm_call_1 (proc, m->self_scm ());
else
return SCM_EOL;
added to it.
*/
-Skyline::Skyline (Skyline const &src, Real horizon_padding, Axis a)
+Skyline::Skyline (Skyline const &src, Real horizon_padding, Axis /*a*/)
{
/*
We extract boxes from the skyline, then build a new skyline from
list<Box> boxes;
// establish a baseline box
+ // FIXME: This has hardcoded logic, assuming a == X_AXIS!
boxes.push_back (Box (Interval (-infinity_f, infinity_f),
Interval (0, 0)));
list<Building>::const_iterator end = src.buildings_.end ();
Skyline const *padded_this = this;
Skyline const *padded_other = &other;
+ bool created_tmp_skylines = false;
/*
For systems, padding is not added at creation time. Padding is
{
padded_this = new Skyline (*padded_this, horizon_padding, X_AXIS);
padded_other = new Skyline (*padded_other, horizon_padding, X_AXIS);
+ created_tmp_skylines = true;
}
list<Building>::const_iterator i = padded_this->buildings_.begin ();
j++;
start = end;
}
+
+ if (created_tmp_skylines)
+ {
+ delete padded_this;
+ delete padded_other;
+ }
+
return dist;
}
vector<Stream_event *> stop_events_;
vector<Grob *> slurs_;
vector<Grob *> end_slurs_;
+ vector<Grob_info> objects_to_acknowledge_;
void set_melisma (bool);
void
Slur_engraver::acknowledge_extra_object (Grob_info info)
{
- Slur::auxiliary_acknowledge_extra_object (info, slurs_, end_slurs_);
+ objects_to_acknowledge_.push_back (info);
}
void
s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn")));
announce_end_grob (s, SCM_EOL);
}
+
+ for (vsize i = 0; i < objects_to_acknowledge_.size (); i++)
+ Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_, end_slurs_);
+
+ objects_to_acknowledge_.clear ();
end_slurs_.clear ();
start_events_.clear ();
stop_events_.clear ();
0.0);
yext.widen (slur_padding);
- const Real EPS = 1e-3;
- Interval bezext (curve.control_[0][X_AXIS], curve.control_[3][X_AXIS]);
- bool consider[] = {false, false, false};
- Real ys[] = {0, 0, 0};
+ Interval exts[] = {xext, yext};
bool do_shift = false;
-
- for (int d = LEFT, k = 0; d <= RIGHT; d++, k++)
+ Real EPS = 1.0e-5;
+ if (avoid == ly_symbol2scm ("outside"))
{
- Real x = xext.linear_combination ((Direction) d);
- consider[k] = bezext.contains (x);
-
- if (consider[k])
+ Direction d = LEFT;
+ do
{
- ys[k]
- = (fabs (bezext[LEFT] - x) < EPS)
- ? curve.control_[0][Y_AXIS]
- : ((fabs (bezext[RIGHT] - x) < EPS)
- ? curve.control_[3][Y_AXIS]
- : curve.get_other_coordinate (X_AXIS, x));
-
- /* Request shift if slur is contained script's Y, or if
- script is inside slur and avoid == outside. */
- if (yext.contains (ys[k])
- || (dir * ys[k] > dir * yext[-dir] && avoid == ly_symbol2scm ("outside")))
- do_shift = true;
+ Real x = minmax (-d, xext[d], curve.control_[d == LEFT ? 0 : 3][X_AXIS] + -d * EPS);
+ Real y = curve.get_other_coordinate (X_AXIS, x);
+ do_shift = y == minmax (dir, yext[-dir], y);
+ if (do_shift)
+ break;
}
+ while (flip (&d) != LEFT);
}
-
- Real avoidance_offset = 0.0;
- if (do_shift)
+ else
{
- for (int d = LEFT, k = 0; d <= RIGHT; d++, k++)
- if (consider[k])
- avoidance_offset = dir * (max (dir * avoidance_offset,
- dir * (ys[k] - yext[-dir] + dir * slur_padding)));
+ for (int a = X_AXIS; a < NO_AXES; a++)
+ {
+ Direction d = LEFT;
+ do
+ {
+ vector<Real> coords = curve.get_other_coordinates (Axis (a), exts[a][d]);
+ for (vsize i = 0; i < coords.size (); i++)
+ {
+ do_shift = exts[(a + 1) % NO_AXES].contains (coords[i]);
+ if (do_shift)
+ break;
+ }
+ if (do_shift)
+ break;
+ }
+ while (flip (&d) != LEFT);
+ if (do_shift)
+ break;
+ }
}
+
+ Real avoidance_offset = do_shift ? curve.minmax (X_AXIS, max (xext[LEFT], curve.control_[0][X_AXIS] + EPS), min (xext[RIGHT], curve.control_[3][X_AXIS] - EPS), dir) - yext[-dir] : 0.0;
+
return scm_from_double (offset + avoidance_offset);
}
int *column,
int *byte_offset) const
{
+ // Initialize arguments to defaults, needed if pos_str0 is not in source
*line_number = 0;
+ *line_char = 0;
+ *column = 0;
+ *byte_offset = 0;
if (!contains (pos_str0))
return;
string line_begin (line_start, left);
char const *line_chars = line_begin.c_str ();
- *line_char = 0;
- *column = 0;
- *byte_offset = 0;
-
while (left > 0)
{
size_t thislen = utf8_char_len (*line_chars);
}
else if (Staff_spacing::has_interface (sp))
{
- Spring spring = Staff_spacing::get_spacing (sp, rc);
+ Spring spring = Staff_spacing::get_spacing (sp, rc, 0.0);
dists[d] = max (dists[d], spring.min_distance ());
}
Stream_event *ev = playing_durations_[i].info_.event_cause ();
if (ev)
{
- Moment now = now_mom ();
Moment m = get_event_length (ev);
shortest_playing = min (shortest_playing, m);
}
vector<Spring> springs;
Spring spring;
+ Real full_measure_space = 0.0;
+ if (Paper_column::is_musical (r)
+ && l->break_status_dir () == CENTER
+ && fills_measure (me, l, r))
+ full_measure_space = robust_scm2double (l->get_property ("full-measure-extra-space"), 1.0);
+
Moment dt = Paper_column::when_mom (r) - Paper_column::when_mom (l);
if (dt == Moment (0, 0))
*/
assert (spacing_grob->get_column () == l);
- springs.push_back (Staff_spacing::get_spacing (spacing_grob, r));
+ springs.push_back (Staff_spacing::get_spacing (spacing_grob, r,
+ full_measure_space));
}
}
spring *= 0.8;
}
- if (Paper_column::is_musical (r)
- && l->break_status_dir () == CENTER
- && fills_measure (me, l, r))
- {
- Real full_measure_extra_space = robust_scm2double (l->get_property ("full-measure-extra-space"), 1.0);
- spring.set_distance (spring.distance () + full_measure_extra_space);
- spring.set_default_compress_strength ();
- }
-
if (options->stretch_uniformly_ && l->break_status_dir () != RIGHT)
{
spring.set_min_distance (0.0);
LY_DEFINE (ly_spanner_bound, "ly:spanner-bound",
2, 0, 0, (SCM spanner, SCM dir),
- "Get one of the bounds of @var{spanner}. @var{dir} is @code{-1}"
+ "Get one of the bounds of @var{spanner}. @var{dir} is @w{@code{-1}}"
" for left, and @code{1} for right.")
{
LY_ASSERT_TYPE (unsmob_spanner, spanner, 1);
Direction d = get_grob_direction (stem);
if (Stem::is_normal_stem (stem) && d == DOWN)
{
-
- /*
- can't look at stem-end-position, since that triggers
- beam slope computations.
- */
- Real stem_start = Stem::head_positions (stem) [d];
- Real stem_end = stem_start
- + d * robust_scm2double (stem->get_property ("length"), 7);
-
- Interval stem_posns (min (stem_start, stem_end),
- max (stem_end, stem_start));
+ Interval stem_posns = stem->pure_height (stem, 0, INT_MAX);
stem_posns.intersect (bar_height);
We arrange things so that the fixed distance will be attained when the
line is compressed with a force of 1.0 */
Spring
-Staff_spacing::get_spacing (Grob *me, Grob *right_col)
+Staff_spacing::get_spacing (Grob *me, Grob *right_col, Real situational_space)
{
Item *me_item = dynamic_cast<Item *> (me);
Grob *left_col = me_item->get_column ();
}
SCM alist = last_grob->get_property ("space-alist");
- if (!scm_list_p (alist))
+ if (!ly_is_list (alist))
return Spring ();
SCM space_def = scm_sloppy_assq (ly_symbol2scm ("first-note"), alist);
ideal = fixed;
}
+ Real stretchability = ideal - fixed;
+
+ /* 'situational_space' passed by the caller
+ could include full-measure-extra-space */
+ ideal += situational_space;
+
Real optical_correction = next_notes_correction (me, last_grob);
+ fixed += optical_correction;
+ ideal += optical_correction;
+
Real min_dist = Paper_column::minimum_distance (left_col, right_col);
/* ensure that the "fixed" distance will leave a gap of at least 0.3 ss. */
Real min_dist_correction = max (0.0, 0.3 + min_dist - fixed);
- Real correction = max (optical_correction, min_dist_correction);
-
- fixed += correction;
- ideal += correction;
+ fixed += min_dist_correction;
+ ideal = max (ideal, fixed);
Spring ret (ideal, min_dist);
- ret.set_inverse_stretch_strength (max (0.0, ideal - fixed));
+ ret.set_inverse_stretch_strength (max (0.0, stretchability));
+ ret.set_inverse_compress_strength (max (0.0, ideal - fixed));
return ret;
}
{
Grob *stem_;
Grob *tremolo_;
+ vector <Grob *> maybe_flags_;
Stream_event *rhythmic_ev_;
Stream_event *tremolo_ev_;
DECLARE_TRANSLATOR_LISTENER (tremolo);
DECLARE_ACKNOWLEDGER (rhythmic_head);
void stop_translation_timestep ();
+ void finalize ();
+ void kill_unused_flags ();
};
Stem_engraver::Stem_engraver ()
/* Announce the cause of the head as cause of the stem. The
stem needs a rhythmic structure to fit it into a beam. */
stem_ = make_item ("Stem", gi.grob ()->self_scm ());
-
if (tremolo_ev_)
{
/* Stem tremolo is never applied to a note by default,
}
Stem::add_head (stem_, gi.grob ());
+
+ if (Stem::is_normal_stem (stem_)
+ && Stem::duration_log (stem_) > 2)
+ {
+ Item *flag = make_item ("Flag", stem_->self_scm ());
+ flag->set_parent (stem_, X_AXIS);
+ stem_->set_object ("flag", flag->self_scm ());
+ maybe_flags_.push_back (flag);
+ }
+}
+
+void
+Stem_engraver::kill_unused_flags ()
+{
+ for (vsize i = 0; i < maybe_flags_.size (); i++)
+ if (unsmob_grob (maybe_flags_[i]->get_parent (X_AXIS)->get_object ("beam")))
+ maybe_flags_[i]->suicide ();
+}
+
+void
+Stem_engraver::finalize ()
+{
+ kill_unused_flags ();
}
void
Stem_engraver::stop_translation_timestep ()
{
+ if (scm_is_string (get_property ("whichBar")))
+ kill_unused_flags ();
+
tremolo_ = 0;
if (stem_)
{
/* read */
"tremoloFlags "
"stemLeftBeamCount "
- "stemRightBeamCount ",
+ "stemRightBeamCount "
+ "whichBar ",
/* write */
""
SCM
Stem_tremolo::pure_height (SCM smob, SCM, SCM)
{
- Grob *me = unsmob_grob (smob);
+ Item *me = unsmob_item (smob);
/*
Cannot use the real slope, since it looks at the Beam.
*/
Stencil s1 (untranslated_stencil (me, 0.35));
+ Item *stem = unsmob_item (me->get_object ("stem"));
+ if (!stem)
+ return ly_interval2scm (s1.extent (Y_AXIS));
+
+ Direction stemdir = get_grob_direction (stem);
+ if (stemdir == 0)
+ stemdir = UP;
+
+ Spanner *beam = Stem::get_beam (stem);
- return ly_interval2scm (s1.extent (Y_AXIS));
+ if (!beam)
+ return ly_interval2scm (s1.extent (Y_AXIS));
+
+ Interval ph = stem->pure_height (stem, 0, INT_MAX);
+ Stem_info si = Stem::get_stem_info (stem);
+ ph[-stemdir] = si.shortest_y_;
+ int beam_count = Stem::beam_multiplicity (stem).length () + 1;
+ Real beam_translation = get_beam_translation (me);
+
+ ph = ph - stemdir * max (beam_count, 1) * beam_translation;
+ ph = ph - ph.center ();
+
+ return ly_interval2scm (ph);
}
MAKE_SCHEME_CALLBACK (Stem_tremolo, width, 1);
return raw_stencil (me, slope, stencil_dir);
}
-Stencil
-Stem_tremolo::translated_stencil (Grob *me, Real slope)
+MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_y_offset, 1);
+SCM
+Stem_tremolo::calc_y_offset (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ return scm_from_double (y_offset (me, false));
+}
+
+MAKE_SCHEME_CALLBACK (Stem_tremolo, pure_calc_y_offset, 3);
+SCM
+Stem_tremolo::pure_calc_y_offset (SCM smob,
+ SCM, /* start */
+ SCM /* end */)
{
- Stencil mol = untranslated_stencil (me, slope);
+ Grob *me = unsmob_grob (smob);
+ return scm_from_double (y_offset (me, true));
+}
- Grob *stem = unsmob_grob (me->get_object ("stem"));
+Real
+Stem_tremolo::y_offset (Grob *me, bool pure)
+{
+ Item *stem = unsmob_item (me->get_object ("stem"));
if (!stem)
- return Stencil ();
+ return 0.0;
Direction stemdir = get_grob_direction (stem);
if (stemdir == 0)
Real beam_translation = get_beam_translation (me);
int beam_count = beam ? (Stem::beam_multiplicity (stem).length () + 1) : 0;
- Real ss = Staff_symbol_referencer::staff_space (me);
+
+ if (pure && beam)
+ {
+ Interval ph = stem->pure_height (stem, 0, INT_MAX);
+ Stem_info si = Stem::get_stem_info (stem);
+ ph[-stemdir] = si.shortest_y_;
+
+ return (ph - stemdir * max (beam_count, 1) * beam_translation)[stemdir] - stemdir * 0.5 * me->pure_height (me, 0, INT_MAX).length ();
+ }
Real end_y
- = Stem::stem_end_position (stem) * ss / 2
+ = stem->extent (stem, Y_AXIS)[stemdir]
- stemdir * max (beam_count, 1) * beam_translation;
if (!beam && Stem::duration_log (stem) >= 3)
{
/* we shouldn't position relative to the end of the stem since the stem
is invisible */
+ Real ss = Staff_symbol_referencer::staff_space (me);
vector<int> nhp = Stem::note_head_positions (stem);
Real note_head = (stemdir == UP ? nhp.back () : nhp[0]) * ss / 2;
end_y = note_head + stemdir * 1.5;
}
- mol.translate_axis (end_y, Y_AXIS);
- return mol;
+ return end_y;
}
MAKE_SCHEME_CALLBACK (Stem_tremolo, print, 1);
{
Grob *me = unsmob_grob (grob);
- Stencil s = translated_stencil (me, robust_scm2double (me->get_property ("slope"), 0.25));
+ Stencil s = untranslated_stencil (me, robust_scm2double (me->get_property ("slope"), 0.25));
return s.smobbed_copy ();
}
along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
+/*
+ Note that several internal functions have a calc_beam bool argument.
+ This argument means: "If set, acknowledge the fact that there is a beam
+ and deal with it. If not, give me the measurements as if there is no beam."
+ Most pure functions are called WITHOUT calc_beam, whereas non-pure functions
+ are called WITH calc_beam.
+
+ The only exception to this is ::pure_height, which calls internal_pure_height
+ with "true" for calc_beam in order to trigger the calculations of other
+ pure heights in case there is a beam. It passes false, however, to
+ internal_height and internal_pure_height for all subsequent iterations.
+*/
+
#include "stem.hh"
#include "spanner.hh"
}
void
-Stem::set_stemend (Grob *me, Real se)
+Stem::set_stem_positions (Grob *me, Real se)
{
// todo: margins
Direction d = get_grob_direction (me);
+ Grob *beam = unsmob_grob (me->get_object ("beam"));
if (d && d * head_positions (me)[get_grob_direction (me)] >= se * d)
me->warning (_ ("weird stem size, check for narrow beams"));
- me->set_property ("stem-end-position", scm_from_double (se));
+ Interval height = me->pure_height (me, 0, INT_MAX);
+ Real staff_space = Staff_symbol_referencer::staff_space (me);
+ Real half_space = staff_space * 0.5;
+
+ height[d] = se * half_space + beam_end_corrective (me);
+
+ Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"),
+ 0.0);
+ bool stemlet = stemlet_length > 0.0;
+
+ Grob *lh = get_reference_head (me);
+
+ if (!lh)
+ {
+ if (stemlet && beam)
+ {
+ Real beam_translation = Beam::get_beam_translation (beam);
+ Real beam_thickness = Beam::get_beam_thickness (beam);
+ int beam_count = beam_multiplicity (me).length () + 1;
+
+ height[-d] = (height[d] - d
+ * (0.5 * beam_thickness
+ + beam_translation * max (0, (beam_count - 1))
+ + stemlet_length));
+ }
+ else if (!stemlet && beam)
+ height[-d] = height[d];
+ else if (stemlet && !beam)
+ me->programming_error ("Can't have a stemlet without a beam.");
+ }
+
+ me->set_property ("stem-begin-position", scm_from_double (height[-d] * 2 / staff_space));
+ me->set_property ("length", scm_from_double (height.length () * 2 / staff_space));
+ (void) me->extent (me, Y_AXIS);
}
/* Note head that determines hshift for upstems
SCM /* end */)
{
Grob *me = unsmob_grob (smob);
- Interval iv;
+ return ly_interval2scm (internal_pure_height (me, true));
+}
+Interval
+Stem::internal_pure_height (Grob *me, bool calc_beam)
+{
if (!is_normal_stem (me))
- return ly_interval2scm (iv);
+ return Interval (0.0, 0.0);
- Real ss = Staff_symbol_referencer::staff_space (me);
- Real rad = Staff_symbol_referencer::staff_radius (me);
+ Grob *beam = unsmob_grob (me->get_object ("beam"));
+
+ Interval iv = internal_height (me, false);
- if (!to_boolean (me->get_property ("cross-staff")))
+ if (!beam)
+ return iv;
+ if (!to_boolean (me->get_property ("cross-staff")) && calc_beam)
{
- Real len_in_halfspaces;
- SCM user_set_len_scm = me->get_property_data ("length");
- if (scm_is_number (user_set_len_scm))
- len_in_halfspaces = scm_to_double (user_set_len_scm);
- else
- len_in_halfspaces = scm_to_double (calc_length (smob));
- Real len = len_in_halfspaces * ss / 2;
+ Interval overshoot;
Direction dir = get_grob_direction (me);
+ Direction d = DOWN;
+ do
+ overshoot[d] = d == dir ? dir * infinity_f : iv[d];
+ while (flip (&d) != DOWN);
- Interval hp = head_positions (me);
- if (dir == UP)
- iv = Interval (0, len);
- else
- iv = Interval (-len, 0);
+ vector<Interval> heights;
+ vector<Grob *> my_stems;
+ extract_grob_set (beam, "normal-stems", normal_stems);
+ for (vsize i = 0; i < normal_stems.size (); i++)
+ if (normal_stems[i] != me && get_grob_direction (normal_stems[i]) == dir)
+ {
+ heights.push_back (Stem::internal_pure_height (normal_stems[i], false));
+ my_stems.push_back (normal_stems[i]);
+ iv.unite (heights.back ());
+ }
+ for (vsize i = 0; i < my_stems.size (); i++)
+ cache_pure_height (my_stems[i], iv, heights[i]);
+ iv.intersect (overshoot);
+ }
- if (!hp.is_empty ())
- {
- iv.translate (hp[dir] * ss / 2);
- iv.add_point (hp[-dir] * ss / 2);
- }
+ return iv;
+}
- /* extend the stem (away from the head) to cover the staff */
- if (dir == UP)
- iv[UP] = max (iv[UP], rad * ss);
- else
- iv[DOWN] = min (iv[DOWN], -rad * ss);
- }
- else
- iv = Interval (-rad * ss, rad * ss);
+void
+Stem::cache_pure_height (Grob *me, Interval iv, Interval my_iv)
+{
+ Interval overshoot;
+ Direction dir = get_grob_direction (me);
+ Direction d = DOWN;
+ do
+ overshoot[d] = d == dir ? dir * infinity_f : my_iv[d];
+ while (flip (&d) != DOWN);
- return ly_interval2scm (iv);
+ iv.intersect (overshoot);
+ dynamic_cast<Item *> (me)->cache_pure_height (iv);
}
MAKE_SCHEME_CALLBACK (Stem, calc_stem_end_position, 1)
Stem::calc_stem_end_position (SCM smob)
{
Grob *me = unsmob_grob (smob);
+ return scm_from_double (internal_calc_stem_end_position (me, true));
+}
+
+MAKE_SCHEME_CALLBACK (Stem, pure_calc_stem_end_position, 3)
+SCM
+Stem::pure_calc_stem_end_position (SCM smob,
+ SCM, /* start */
+ SCM /* end */)
+{
+ Grob *me = unsmob_grob (smob);
+ return scm_from_double (internal_calc_stem_end_position (me, false));
+}
+Real
+Stem::internal_calc_stem_end_position (Grob *me, bool calc_beam)
+{
if (!head_count (me))
- return scm_from_double (0.0);
+ return 0.0;
+
+ Grob *beam = get_beam (me);
+ Real ss = Staff_symbol_referencer::staff_space (me);
+ Direction dir = get_grob_direction (me);
- if (Grob *beam = get_beam (me))
+ if (beam && calc_beam)
{
(void) beam->get_property ("quantized-positions");
- return me->get_property ("stem-end-position");
+ return robust_scm2double (me->get_property ("length"), 0.0)
+ + dir * robust_scm2double (me->get_property ("stem-begin-position"), 0.0);
}
vector<Real> a;
/* WARNING: IN HALF SPACES */
- Real length = robust_scm2double (me->get_property ("length"), 7);
-
- Direction dir = get_grob_direction (me);
- Interval hp = head_positions (me);
- Real stem_end = dir ? hp[dir] + dir * length : 0;
-
- /* TODO: change name to extend-stems to staff/center/'() */
- bool no_extend = to_boolean (me->get_property ("no-stem-extend"));
- if (!no_extend && dir * stem_end < 0)
- stem_end = 0.0;
-
- return scm_from_double (stem_end);
-}
-
-/* Length is in half-spaces (or: positions) here. */
-MAKE_SCHEME_CALLBACK (Stem, calc_length, 1)
-SCM
-Stem::calc_length (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
-
SCM details = me->get_property ("details");
int durlog = duration_log (me);
- Real ss = Staff_symbol_referencer::staff_space (me);
Real staff_rad = Staff_symbol_referencer::staff_radius (me);
Real length = 7;
SCM s = ly_assoc_get (ly_symbol2scm ("lengths"), details, SCM_EOL);
if (scm_is_pair (s))
length = 2 * scm_to_double (robust_list_ref (durlog - 2, s));
- Direction dir = get_grob_direction (me);
/* Stems in unnatural (forced) direction should be shortened,
according to [Roush & Gourlay] */
/* Tremolo stuff. */
Grob *t_flag = unsmob_grob (me->get_object ("tremolo-flag"));
- if (t_flag && !unsmob_grob (me->get_object ("beam")))
+ if (t_flag && (!unsmob_grob (me->get_object ("beam")) || !calc_beam))
{
/* Crude hack: add extra space if tremolo flag is there.
length = max (length, minlen + 1.0);
}
- return scm_from_double (length);
+ Real stem_end = dir ? hp[dir] + dir * length : 0;
+
+ /* TODO: change name to extend-stems to staff/center/'() */
+ bool no_extend = to_boolean (me->get_property ("no-stem-extend"));
+ if (!no_extend && dir * stem_end < 0)
+ stem_end = 0.0;
+
+ return stem_end;
}
+
/* The log of the duration (Number of hooks on the flag minus two) */
int
Stem::duration_log (Grob *me)
return scm_from_int (dir);
}
+// note - height property necessary to trigger quantized beam positions
+// otherwise, we could just use Grob::stencil_height_proc
MAKE_SCHEME_CALLBACK (Stem, height, 1);
SCM
Stem::height (SCM smob)
{
Grob *me = unsmob_grob (smob);
- if (!is_normal_stem (me))
- return ly_interval2scm (Interval ());
-
- Direction dir = get_grob_direction (me);
+ return ly_interval2scm (internal_height (me, true));
+}
- Grob *beam = get_beam (me);
- if (beam)
- {
- /* trigger set-stem-lengths. */
- beam->get_property ("quantized-positions");
- }
+Grob*
+Stem::get_reference_head (Grob *me)
+{
+ return to_boolean (me->get_property ("avoid-note-head"))
+ ? last_head (me)
+ : first_head (me);
+}
- /*
- Can't get_stencil (), since that would cache stencils too early.
- This causes problems with beams.
- */
- Stencil *stencil = unsmob_stencil (print (smob));
- Interval iv = stencil ? stencil->extent (Y_AXIS) : Interval ();
+Real
+Stem::beam_end_corrective (Grob *me)
+{
+ Grob *beam = unsmob_grob (me->get_object ("beam"));
+ Direction dir = get_grob_direction (me);
if (beam)
{
if (dir == CENTER)
programming_error ("no stem direction");
dir = UP;
}
- iv[dir] += dir * Beam::get_beam_thickness (beam) * 0.5;
+ return dir * Beam::get_beam_thickness (beam) * 0.5;
}
-
- return ly_interval2scm (iv);
+ return 0.0;
}
-Real
-Stem::stem_end_position (Grob *me)
+Interval
+Stem::internal_height (Grob *me, bool calc_beam)
{
- return robust_scm2double (me->get_property ("stem-end-position"), 0);
-}
+ Grob *beam = get_beam (me);
+ if (!is_valid_stem (me) && ! beam)
+ return Interval ();
-MAKE_SCHEME_CALLBACK (Stem, calc_flag, 1);
-SCM
-Stem::calc_flag (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
+ Direction dir = get_grob_direction (me);
- int log = duration_log (me);
- /*
- TODO: maybe property stroke-style should take different values,
- e.g. "" (i.e. no stroke), "single" and "double" (currently, it's
- '() or "grace"). */
- string flag_style;
-
- SCM flag_style_scm = me->get_property ("flag-style");
- if (scm_is_symbol (flag_style_scm))
- flag_style = ly_symbol2string (flag_style_scm);
-
- if (flag_style == "no-flag")
- return Stencil ().smobbed_copy ();
-
- bool adjust = true;
-
- string staffline_offs;
- if (flag_style == "mensural")
- /* Mensural notation: For notes on staff lines, use different
- flags than for notes between staff lines. The idea is that
- flags are always vertically aligned with the staff lines,
- regardless if the note head is on a staff line or between two
- staff lines. In other words, the inner end of a flag always
- touches a staff line.
- */
- {
- if (adjust)
- {
- int p = (int) (rint (stem_end_position (me)));
- staffline_offs
- = Staff_symbol_referencer::on_line (me, p) ? "0" : "1";
- }
- else
- staffline_offs = "2";
- }
- else
- staffline_offs = "";
-
- char dir = (get_grob_direction (me) == UP) ? 'u' : 'd';
- string font_char = flag_style
- + to_string (dir) + staffline_offs + to_string (log);
- Font_metric *fm = Font_interface::get_default_font (me);
- Stencil flag = fm->find_by_name ("flags." + font_char);
- if (flag.is_empty ())
- me->warning (_f ("flag `%s' not found", font_char));
-
- SCM stroke_style_scm = me->get_property ("stroke-style");
- if (scm_is_string (stroke_style_scm))
+ if (beam && calc_beam)
{
- string stroke_style = ly_scm2string (stroke_style_scm);
- if (!stroke_style.empty ())
- {
- string font_char = flag_style + to_string (dir) + stroke_style;
- Stencil stroke = fm->find_by_name ("flags." + font_char);
- if (stroke.is_empty ())
- {
- font_char = to_string (dir) + stroke_style;
- stroke = fm->find_by_name ("flags." + font_char);
- }
- if (stroke.is_empty ())
- me->warning (_f ("flag stroke `%s' not found", font_char));
- else
- flag.add_stencil (stroke);
- }
+ /* trigger set-stem-lengths. */
+ (void) beam->get_property ("quantized-positions");
}
- return flag.smobbed_copy ();
-}
+ Real y1 = robust_scm2double ((calc_beam
+ ? me->get_property ("stem-begin-position")
+ : me->get_pure_property ("stem-begin-position", 0, INT_MAX)),
+ 0.0);
-Stencil
-Stem::flag (Grob *me)
-{
- int log = duration_log (me);
- if (log < 3
- || unsmob_grob (me->get_object ("beam")))
- return Stencil ();
+ Real y2 = dir * robust_scm2double ((calc_beam
+ ? me->get_property ("length")
+ : me->get_pure_property ("length", 0, INT_MAX)),
+ 0.0)
+ + y1;
- if (!is_normal_stem (me))
- return Stencil ();
+ Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
- // This get_property call already evaluates the scheme function with
- // the grob passed as argument! Thus, we only have to check if a valid
- // stencil is returned.
- SCM flag_style_scm = me->get_property ("flag");
- if (Stencil *flag = unsmob_stencil (flag_style_scm))
- {
- return *flag;
- }
- else
- {
- return Stencil ();
- }
+ Interval stem_y = Interval (min (y1, y2), max (y2, y1)) * half_space;
+
+ return stem_y;
}
MAKE_SCHEME_CALLBACK (Stem, width, 1);
if (is_invisible (me))
r.set_empty ();
- else if (unsmob_grob (me->get_object ("beam"))
- || abs (duration_log (me)) <= 2)
+ else
{
r = Interval (-1, 1);
r *= thickness (me) / 2;
}
- else
- {
- r = Interval (-1, 1) * thickness (me) * 0.5;
- r.unite (flag (me).extent (X_AXIS));
- }
+
return ly_interval2scm (r);
}
Stem::calc_stem_begin_position (SCM smob)
{
Grob *me = unsmob_grob (smob);
+ return scm_from_double (internal_calc_stem_begin_position (me, true));
+}
+
+MAKE_SCHEME_CALLBACK (Stem, pure_calc_stem_begin_position, 3);
+SCM
+Stem::pure_calc_stem_begin_position (SCM smob,
+ SCM, /* start */
+ SCM /* end */)
+{
+ Grob *me = unsmob_grob (smob);
+ return scm_from_double (internal_calc_stem_begin_position (me, false));
+}
+
+Real
+Stem::internal_calc_stem_begin_position (Grob *me, bool calc_beam)
+{
+ Grob *beam = get_beam (me);
+ Real ss = Staff_symbol_referencer::staff_space (me);
+ if (beam && calc_beam)
+ {
+ (void) beam->get_property ("quantized-positions");
+ return robust_scm2double (me->get_property ("stem-begin-position"), 0.0);
+ }
+
Direction d = get_grob_direction (me);
- Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
- Grob *lh
- = to_boolean (me->get_property ("avoid-note-head"))
- ? last_head (me)
- : first_head (me);
+ Grob *lh = get_reference_head (me);
+
+ if (!lh)
+ return 0.0;
Real pos = Staff_symbol_referencer::get_position (lh);
Real y_attach = Note_head::stem_attachment_coordinate (head, Y_AXIS);
y_attach = head_height.linear_combination (y_attach);
- pos += d * y_attach / half_space;
+ pos += d * y_attach * 2 / ss;
}
- return scm_from_double (pos);
+ return pos;
}
-MAKE_SCHEME_CALLBACK (Stem, print, 1);
-SCM
-Stem::print (SCM smob)
+bool
+Stem::is_valid_stem (Grob *me)
{
- Grob *me = unsmob_grob (smob);
- Grob *beam = get_beam (me);
-
- Stencil mol;
- Direction d = get_grob_direction (me);
-
- Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"),
- 0.0);
- bool stemlet = stemlet_length > 0.0;
-
/* TODO: make the stem start a direction ?
This is required to avoid stems passing in tablature chords. */
- Grob *lh
- = to_boolean (me->get_property ("avoid-note-head"))
- ? last_head (me)
- : first_head (me);
+ Grob *lh = get_reference_head (me);
+ Grob *beam = unsmob_grob (me->get_object ("beam"));
- if (!lh && !stemlet)
- return SCM_EOL;
-
- if (!lh && stemlet && !beam)
- return SCM_EOL;
+ if (!lh && !beam)
+ return false;
if (lh && robust_scm2int (lh->get_property ("duration-log"), 0) < 1)
- return SCM_EOL;
+ return false;
if (is_invisible (me))
+ return false;
+
+ return true;
+}
+
+MAKE_SCHEME_CALLBACK (Stem, print, 1);
+SCM
+Stem::print (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ if (!is_valid_stem (me))
return SCM_EOL;
- Real y2 = robust_scm2double (me->get_property ("stem-end-position"), 0.0);
- Real y1 = y2;
+ Direction dir = get_grob_direction (me);
+ Real y1 = robust_scm2double (me->get_property ("stem-begin-position"), 0.0);
+ Real y2 = dir * robust_scm2double (me->get_property ("length"), 0.0) + y1;
+
Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
- if (lh)
- y2 = robust_scm2double (me->get_property ("stem-begin-position"), 0.0);
- else if (stemlet)
- {
- Real beam_translation = Beam::get_beam_translation (beam);
- Real beam_thickness = Beam::get_beam_thickness (beam);
- int beam_count = beam_multiplicity (me).length () + 1;
-
- y2 -= d
- * (0.5 * beam_thickness
- + beam_translation * max (0, (beam_count - 1))
- + stemlet_length) / half_space;
- }
+ Interval stem_y = Interval (min (y1, y2), max (y2, y1)) * half_space;
- Interval stem_y (min (y1, y2), max (y2, y1));
+ stem_y[dir] -= beam_end_corrective (me);
// URG
Real stem_width = thickness (me);
= me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
Box b = Box (Interval (-stem_width / 2, stem_width / 2),
- Interval (stem_y[DOWN] * half_space, stem_y[UP] * half_space));
+ stem_y);
+ Stencil mol;
Stencil ss = Lookup::round_filled_box (b, blot);
mol.add_stencil (ss);
- mol.add_stencil (get_translated_flag (me));
-
return mol.smobbed_copy ();
}
-Stencil
-Stem::get_translated_flag (Grob *me)
-{
- Stencil fl = flag (me);
- if (!fl.is_empty ())
- {
- Direction d = get_grob_direction (me);
- Real blot
- = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
- Real stem_width = thickness (me);
- Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
- Real y2 = robust_scm2double (me->get_property ("stem-end-position"), 0.0);
- fl.translate_axis (y2 * half_space - d * blot / 2, Y_AXIS);
- fl.translate_axis (stem_width / 2, X_AXIS);
- }
- return fl;
-}
-
/*
move the stem to right of the notehead if it is up.
*/
return scm_from_bool (is_cross_staff (unsmob_grob (smob)));
}
+Grob*
+Stem::flag (Grob *me)
+{
+ return unsmob_grob (me->get_object ("flag"));
+}
+
/* FIXME: Too many properties */
ADD_INTERFACE (Stem,
"The stem represents the graphical stem. In addition, it"
"direction "
"duration-log "
"flag "
- "flag-style "
"french-beaming "
"length "
"length-fraction "
"positioning-done "
"rests "
"stem-begin-position "
- "stem-end-position "
"stem-info "
"stemlet-length "
- "stroke-style "
"thickness "
"tremolo-flag "
);
}
LY_DEFINE (ly_stencil_combine_at_edge, "ly:stencil-combine-at-edge",
- 4, 2, 0, (SCM first, SCM axis, SCM direction,
+ 4, 1, 0, (SCM first, SCM axis, SCM direction,
SCM second,
- SCM padding,
- SCM minimum),
+ SCM padding),
"Construct a stencil by putting @var{second} next to @var{first}."
" @var{axis} can be 0 (x-axis) or@tie{}1 (y-axis)."
" @var{direction} can be -1 (left or down) or@tie{}1 (right or"
- " up). The stencils are juxtaposed with @var{padding} as extra"
- " space. If this puts the reference points closer than"
- " @var{minimum}, they are moved by the latter amount."
- " @var{first} and @var{second} may also be @code{'()} or"
+ " up). The stencils are juxtaposed with @var{padding} as extra"
+ " space. @var{first} and @var{second} may also be @code{'()} or"
" @code{#f}.")
{
Stencil *s1 = unsmob_stencil (first);
LY_ASSERT_TYPE (scm_is_number, padding, 5);
p = scm_to_double (padding);
}
- Real m = 0.0;
- if (minimum != SCM_UNDEFINED)
- {
- LY_ASSERT_TYPE (scm_is_number, minimum, 6);
- m = scm_to_double (minimum);
- }
if (s1)
result = *s1;
LY_DEFINE (ly_stencil_aligned_to, "ly:stencil-aligned-to",
3, 0, 0, (SCM stil, SCM axis, SCM dir),
"Align @var{stil} using its own extents. @var{dir} is a number."
- " @code{-1} and @code{1} are left and right, respectively."
+ " @w{@code{-1}} and @code{1} are left and right, respectively."
" Other values are interpolated (so @code{0} means the center).")
{
LY_ASSERT_SMOB (Stencil, stil, 1);
#include "staff-symbol-referencer.hh"
#include "text-interface.hh"
#include "warn.hh"
+#include "unpure-pure-container.hh"
System::System (System const &src)
: Spanner (src)
}
}
- if (be_verbose_global)
- message (_f ("Element count %d", count + element_count ()) + "\n");
+ debug_output (_f ("Element count %d", count + element_count ()) + "\n");
}
SCM
SCM lines = scm_c_make_vector (broken_intos_.size (), SCM_EOL);
for (vsize i = 0; i < broken_intos_.size (); i++)
{
- if (be_verbose_global)
- progress_indication ("[");
+ debug_output ("[", false);
System *system = dynamic_cast<System *> (broken_intos_[i]);
scm_vector_set_x (lines, scm_from_int (i),
system->get_paper_system ());
- if (be_verbose_global)
- progress_indication (to_string (i) + "]");
+ debug_output (to_string (i) + "]", false);
}
return lines;
}
for (vsize i = 0; i < all_elements_->size (); i++)
all_elements_->grob (i)->discretionary_processing ();
- if (be_verbose_global)
- message (_f ("Grob count %d", element_count ()));
+ debug_output (_f ("Grob count %d", element_count ()));
/*
order is significant: broken grobs are added to the end of the
else
{
if (use_horizontal_spacing_ || !Stem::get_beam (stem))
- stem_end_position = Stem::stem_end_position (stem) * staff_space * .5;
+ stem_end_position = stem->extent (stem, Y_AXIS)[get_grob_direction (stem)];
else
+ // May want to change this to the stem's pure height...
stem_end_position = Stem::note_head_positions (stem)[get_grob_direction (stem)]
* staff_space * .5;
}
if (dir == LEFT)
{
- Box flag_box = Stem::get_translated_flag (stem).extent_box ();
- flag_box.translate ( Offset (x[RIGHT], X_AXIS));
- boxes.push_back (flag_box);
+ Grob *flag = Stem::flag (stem);
+ if (flag)
+ {
+ Grob* commony = stem->common_refpoint (flag, Y_AXIS);
+ boxes.push_back (Box (flag->extent (x_refpoint_, X_AXIS),
+ flag->extent (commony, Y_AXIS)));
+ }
}
}
else
// (*it).moment_ already stores the end of the tied note!
Moment skip = now_mom () - (*it).end_moment_;
an->tie_to (th, skip);
- // this invalidates the iterator, we are leaving the loop anyway
- heads_to_tie_.erase (it);
+ it = heads_to_tie_.erase (it);
}
}
}
Tie_formatting_problem problem;
problem.from_tie (me);
- Tie_specification spec = problem.get_tie_specification (0);
if (!me->is_live ())
return SCM_EOL;
}
string file_name = ly_scm2string (ttf_file_name);
- if (be_verbose_global)
- progress_indication ("\n[" + file_name);
+ debug_output ("\n[" + file_name, false);
FT_Face face;
SCM ps_name = scm_from_locale_string (ps_name_str0 ? ps_name_str0 : "");
FT_Done_Face (face);
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
return ps_name;
}
}
string file_name = ly_scm2string (ttf_file_name);
- if (be_verbose_global)
- progress_indication ("\n[" + file_name);
+ debug_output ("[" + file_name); // Debug message should start on a new line
Memory_out_stream stream;
SCM asscm = scm_from_locale_stringn (stream.get_string (),
stream.get_length ());
- if (be_verbose_global)
- progress_indication ("]");
+ debug_output ("]", false);
return asscm;
}
&& Note_column::get_stem (columns[0])
&& Note_column::get_stem (columns.back ()))
{
- /*
- trigger set_stem_ends
- */
- (void) par_beam->get_property ("quantized-positions");
-
Drul_array<Grob *> stems (Note_column::get_stem (columns[0]),
Note_column::get_stem (columns.back ()));
- Real ss = 0.5 * Staff_symbol_referencer::staff_space (me);
- Real lp = ss * robust_scm2double (stems[LEFT]->get_property ("stem-end-position"), 0.0)
- + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
- Real rp = ss * robust_scm2double (stems[RIGHT]->get_property ("stem-end-position"), 0.0)
- + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
+ Interval poss;
+ Direction side = LEFT;
+ do
+ {
+ // Trigger setting of stem lengths if necessary.
+ if (Grob *beam = Stem::get_beam (stems[side]))
+ (void) beam->get_property ("quantized-positions");
+ poss[side] = stems[side]->extent (stems[side], Y_AXIS)[get_grob_direction (stems[side])]
+ + stems[side]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
+ }
+ while (flip (&side) != LEFT);
- *dy = rp - lp;
- points.push_back (Offset (stems[LEFT]->relative_coordinate (commonx, X_AXIS) - x0, lp));
- points.push_back (Offset (stems[RIGHT]->relative_coordinate (commonx, X_AXIS) - x0, rp));
+ *dy = poss[RIGHT] - poss[LEFT];
+ points.push_back (Offset (stems[LEFT]->relative_coordinate (commonx, X_AXIS) - x0, poss[LEFT]));
+ points.push_back (Offset (stems[RIGHT]->relative_coordinate (commonx, X_AXIS) - x0, poss[RIGHT]));
}
else
{
--- /dev/null
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 2011 Mike Solomon <mike@apollinemike.com>
+
+
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "unpure-pure-container.hh"
+
+#include "grob.hh"
+
+static scm_t_bits unpure_pure_container_tag;
+
+bool
+is_unpure_pure_container (SCM s)
+{
+ return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == unpure_pure_container_tag);
+}
+
+SCM
+unpure_pure_container_unpure_part (SCM smob)
+{
+ LY_ASSERT_TYPE (is_unpure_pure_container, smob, 1);
+ return (SCM) SCM_CELL_WORD_1 (smob);
+}
+
+SCM
+unpure_pure_container_pure_part (SCM smob)
+{
+ LY_ASSERT_TYPE (is_unpure_pure_container, smob, 1);
+ return (SCM) SCM_CELL_WORD_2 (smob);
+}
+
+LY_DEFINE (ly_unpure_pure_container_p, "ly:unpure-pure-container?",
+ 1, 0, 0, (SCM clos),
+ "Is @var{clos} an unpure pure container?")
+{
+ return scm_from_bool (is_unpure_pure_container (clos));
+}
+
+LY_DEFINE (ly_make_unpure_pure_container, "ly:make-unpure-pure-container",
+ 1, 1, 0, (SCM unpure, SCM pure),
+ "Make an unpure-pure container. @var{unpure} should be an unpure"
+ " expression, and @var{pure} should be a pure expression. If @var{pure}"
+ " is ommitted, the value of @var{unpure} will be used twice.")
+{
+ SCM z;
+
+ if (pure == SCM_UNDEFINED)
+ pure = unpure;
+
+ SCM_NEWSMOB2 (z, unpure_pure_container_tag, SCM_UNPACK (unpure), SCM_UNPACK (pure));
+ return z;
+}
+
+LY_DEFINE (ly_unpure_pure_container_unpure_part, "ly:unpure-pure-container-unpure-part",
+ 1, 0, 0, (SCM pc),
+ "Return the unpure part of @var{pc}.")
+{
+ LY_ASSERT_TYPE (is_unpure_pure_container, pc, 1);
+ return unpure_pure_container_unpure_part (pc);
+}
+
+LY_DEFINE (ly_unpure_pure_container_pure_part, "ly:unpure-pure-container-pure-part",
+ 1, 0, 0, (SCM pc),
+ "Return the pure part of @var{pc}.")
+{
+ LY_ASSERT_TYPE (is_unpure_pure_container, pc, 1);
+ return unpure_pure_container_pure_part (pc);
+}
+
+int
+print_unpure_pure_container (SCM s, SCM port, scm_print_state *)
+{
+ scm_puts ("#<unpure-pure-container ", port);
+ scm_display (unpure_pure_container_unpure_part (s), port);
+ scm_puts (" ", port);
+ scm_display (unpure_pure_container_pure_part (s), port);
+ scm_puts (" >", port);
+ return 1;
+}
+
+SCM
+pure_mark (SCM pure)
+{
+ scm_gc_mark (unpure_pure_container_unpure_part (pure));
+ scm_gc_mark (unpure_pure_container_pure_part (pure));
+ return pure;
+}
+
+void init_unpure_pure_container ()
+{
+ unpure_pure_container_tag = scm_make_smob_type ("unpure-pure-container", 0);
+ scm_set_smob_mark (unpure_pure_container_tag, pure_mark);
+ scm_set_smob_print (unpure_pure_container_tag, print_unpure_pure_container);
+};
+
+ADD_SCM_INIT_FUNC (unpure_pure_container, init_unpure_pure_container);
--- /dev/null
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 1998--2011 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.hh"
+
+#include "lily-guile.hh"
+#include "program-option.hh"
+#include "version.hh"
+#include "warn.hh"
+
+/*
+ Error / warning / progress / debug message output functions
+*/
+
+LY_DEFINE (ly_error, "ly:error",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to issue the error @var{str}."
+ " The error is formatted with @code{format} and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+ error (ly_scm2string (str));
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_programming_error, "ly:programming-error",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to issue the internal warning"
+ " @var{str}. The message is formatted with @code{format}"
+ " and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+
+ if (get_program_option ("warning-as-error"))
+ error (ly_scm2string (str));
+ else
+ programming_error (ly_scm2string (str));
+
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_warning, "ly:warning",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to issue the warning @var{str}."
+ " The message is formatted with @code{format} and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+
+ if (get_program_option ("warning-as-error"))
+ error (ly_scm2string (str));
+ else
+ warning (ly_scm2string (str));
+
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_progress, "ly:progress",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to print progress @var{str}."
+ " The message is formatted with @code{format} and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+ // Calls to ly:progress should in general not start a new line
+ progress_indication (ly_scm2string (str), false);
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_basic_progress, "ly:basic-progress",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to issue a basic progress message @var{str}."
+ " The message is formatted with @code{format} and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+ basic_progress (ly_scm2string (str));
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_message, "ly:message",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to issue the message @var{str}."
+ " The message is formatted with @code{format} and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+ message (ly_scm2string (str));
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_debug, "ly:debug",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to issue a debug message @var{str}."
+ " The message is formatted with @code{format} and @var{rest}.")
+{
+ // TODO: Add the newline flag!
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+ debug_output (ly_scm2string (str));
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_warning_located, "ly:warning-located",
+ 2, 0, 1, (SCM location, SCM str, SCM rest),
+ "A Scheme callable function to issue the warning @var{str} at"
+ " the specified location in an input file."
+ " The message is formatted with @code{format} and @var{rest}.")
+{
+ LY_ASSERT_TYPE (scm_is_string, location, 1);
+ LY_ASSERT_TYPE (scm_is_string, str, 2);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+
+ if (get_program_option ("warning-as-error"))
+ error (ly_scm2string (str), ly_scm2string (location));
+ else
+ warning (ly_scm2string (str), ly_scm2string (location));
+
+ return SCM_UNSPECIFIED;
+}
(ly:stencil-combine-at-edge
(ly:accidental-interface::print grob) Y UP
(grob-interpret-markup grob (markup #:line
- (#:fontsize -1 (#:musicglyph "flags.ugrace")))) -1.3 0))
+ (#:fontsize -1 (#:musicglyph "flags.ugrace")))) -1.3))
}
%
graceSettings = #`(
(Voice Stem direction ,UP)
(Voice Stem font-size -3)
+ (Voice Flag font-size -3)
(Voice NoteHead font-size -3)
(Voice TabNoteHead font-size -4)
(Voice Dots font-size -3)
\remove "Accidental_engraver"
%% make the Stems as short as possible to minimize their influence
%% on the slur::calc-control-points routine
- \override Stem #'length = #0
\override Stem #'no-stem-extend = ##t
- \override Stem #'flag-style = #'no-flag
+ \override Flag #'style = #'no-flag
\override Stem #'details = #'((lengths 0 0 0 0 0 0)
(beamed-lengths 0 0 0)
(beamed-minimum-free-lengths 0 0 0)
startAcciaccaturaMusic = {
s1*0\startGraceSlur
- \override Stem #'stroke-style = #"grace"
+ \override Flag #'stroke-style = #"grace"
}
stopAcciaccaturaMusic = {
- \revert Stem #'stroke-style
+ \revert Flag #'stroke-style
s1*0\stopGraceSlur
}
startSlashedGraceMusic = {
- \override Stem #'stroke-style = #"grace"
+ \override Flag #'stroke-style = #"grace"
}
stopSlashedGraceMusic = {
- \revert Stem #'stroke-style
+ \revert Flag #'stroke-style
}
\consists Vaticana_ligature_engraver
\override NoteHead #'style = #'vaticana.punctum
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
}
}
(lambda (c)
(let ((cbn (ly:context-property c 'currentBarNumber)))
(if (and (number? cbn) (not (= cbn n)))
- (ly:input-message location
+ (ly:input-warning location
"Barcheck failed got ~a expect ~a"
cbn n))))))
(_i "Attach @var{text} to @var{grob-name} at offset @var{offset},
with @var{text} referring to @var{footnote} (use like @code{\\once})")
(make-music 'FootnoteEvent
+ 'automatically-numbered #f
'symbol grob-name
'X-offset (car offset)
'Y-offset (cdr offset)
the number appears at @var{offset}. Note that, for this to take effect,
auto-numbering must be turned on in the paper block. Otherwise, no
number will appear. Use like @code{\\once})")
- #{
- \footnoteGrob $grob-name $offset \markup { \null } $footnote
- #})
+ (make-music 'FootnoteEvent
+ 'automatically-numbered #t
+ 'symbol grob-name
+ 'X-offset (car offset)
+ 'Y-offset (cdr offset)
+ 'text (make-null-markup)
+ 'footnote-text footnote))
+
footnote =
#(define-music-function (parser location offset text footnote)
(_i "Attach @var{text} at @var{offset} with @var{text} referring
to @var{footnote} (use like @code{\\tweak})")
(make-music 'FootnoteEvent
+ 'automatically-numbered #f
'X-offset (car offset)
'Y-offset (cdr offset)
'text text
'footnote-text footnote))
-% this function can't be a simple copy and past of the above because
-% it needs to be encapsulated in a Sequential Music.
-% so, there's a code dup of above :-(
autoFootnote =
#(define-music-function (parser location offset footnote)
(number-pair? markup?)
take effect, auto-numbering must be turned on in the paper block.
Otherwise, no number will appear. Use like @code{\\tweak})")
(make-music 'FootnoteEvent
+ 'automatically-numbered #t
'X-offset (car offset)
'Y-offset (cdr offset)
'text (make-null-markup)
(instrument-def (if handle (cdr handle) '())))
(if (not handle)
- (ly:input-message location "No such instrument: ~a" name))
+ (ly:input-warning location "No such instrument: ~a" name))
(context-spec-music
(make-music 'SimultaneousMusic
'elements
(begin
(set! pitchnames previous-pitchnames)
(ly:parser-set-note-names parser pitchnames))
- (ly:warning (_ "No other language was defined previously. Ignoring.")))
+ (ly:input-warning location (_ "No other language was defined previously. Ignoring.")))
(make-music 'Music 'void #t))
(let ((moment-reference (ly:music-length (car seqs))))
(for-each (lambda (seq moment)
(if (not (equal? moment moment-reference))
- (ly:music-message seq
+ (ly:music-warning seq
"Bars in parallel music don't have the same length")))
seqs (map-in-order ly:music-length seqs))))
voices)
(for-each (lambda (m)
(ly:music-set-property! m 'pitch trill-pitch)) trill-events)
(begin
- (ly:warning (_ "Second argument of \\pitchedTrill should be single note: "))
+ (ly:input-warning location (_ "Second argument of \\pitchedTrill should be single note: "))
(display sec-note-events)))
(if (eq? forced #t)
shiftDurations =
#(define-music-function (parser location dur dots arg)
(integer? integer? ly:music?)
- (_i "Scale @var{arg} up by a factor of @var{2^dur*(2-(1/2)^dots)}.")
+ (_i "Scale @var{arg} up by a factor of 2^@var{dur}*(2-(1/2)^@var{dots}).")
(music-map
(lambda (x)
(if (equal? (object-property sym 'backend-type?) #f)
(begin
- (ly:warning (_ "cannot find property type-check for ~a") sym)
+ (ly:input-warning location (_ "cannot find property type-check for ~a") sym)
(ly:warning (_ "doing assignment anyway"))))
(set!
(ly:music-property arg 'tweaks)
footnote-padding = 0.5\mm
footnote-footer-padding = 0.5\mm
footnote-number-raise = 0.5\mm
- footnote-auto-numbering = ##t
footnote-numbering-function = #numbered-footnotes
reset-footnotes-on-new-page = ##t
#(define-music-function (parser location key-symbol tuning shape-definition)
(symbol? pair? string-or-pair?)
(_i "Add chord shape @var{shape-definition} to the @var{chord-shape-table}
-hash with the key @var{(cons key-symbol tuning)}.")
+hash with the key @code{(cons @var{key-symbol} @var{tuning})}.")
(hash-set! chord-shape-table
(cons key-symbol tuning)
shape-definition)
\override NoteHead #'transparent = ##t
\override NoteHead #'no-ledgers = ##t
\override Stem #'transparent = ##t
+ \override Flag #'transparent = ##t
\override Beam #'transparent = ##t
\override Accidental #'transparent = ##t
}
\revert Accidental #'transparent
\revert Beam #'transparent
\revert Stem #'transparent
+ \revert Flag #'transparent
\revert NoteHead #'transparent
\revert NoteHead #'no-ledgers
\revert Dots #'transparent
% stems (the half note gets a double stem)
\revert TabVoice.Stem #'length
\revert TabVoice.Stem #'no-stem-extend
- \revert TabVoice.Stem #'flag-style
+ \revert TabVoice.Flag #'style
\revert TabVoice.Stem #'details
\revert TabVoice.Stem #'transparent
\override TabVoice.Stem #'stencil = #tabvoice::draw-double-stem-for-half-notes
\override NoteHead #'style = #'diamond
\override NoteHead #'color = #red
\override Stem #'color = #red
+ \override Flag #'color = #red
\override Beam #'color = #red
}
voiceTwoStyle = {
\override NoteHead #'style = #'triangle
\override NoteHead #'color = #blue
\override Stem #'color = #blue
+ \override Flag #'color = #blue
\override Beam #'color = #blue
}
voiceThreeStyle = {
\override NoteHead #'style = #'xcircle
\override NoteHead #'color = #green
\override Stem #'color = #green
+ \override Flag #'color = #green
\override Beam #'color = #green
}
voiceFourStyle = {
\override NoteHead #'style = #'cross
\override NoteHead #'color = #magenta
\override Stem #'color = #magenta
+ \override Flag #'color = #magenta
\override Beam #'color = #magenta
}
voiceNeutralStyle = {
\revert NoteHead #'style
\revert NoteHead #'color
\revert Stem #'color
+ \revert Flag #'color
\revert Beam #'color
}
@{chord} must be in absolute pitches and should have the highest
string number (generally the lowest pitch) first. @code{tuning}
should be a string that will be converted to a symbol.")
- (begin
- (chord->tuning parser tuning chord)
- #{
- \set TabStaff.stringTunings = $(ly:parser-lookup parser tuning)
- \set FretBoards.stringTunings = $(ly:parser-lookup parser tuning)
- #}))
+ (chord->tuning parser tuning chord)
+ #{ \set stringTunings = #(ly:parser-lookup $parser $tuning)
+ #})
%% A music function for converting an alist to string-tunings
makeDefaultStringTunings =
-$(outdir)/collated-files.tely: $(COLLATED_FILES)
- $(LYS_TO_TELY) --name=$(outdir)/collated-files.tely --title="$(TITLE)" --author="$(AUTHOR)" $^
+$(outdir)/collated-files.list: $(COLLATED_FILES)
+ echo "(Re-)Generating $@"
+ # We can't print the list in one go, as it might be longer than a
+ # shell command is allowed (as of linux 2.6.3x >131000 chars)
+ @echo $(wordlist 1, 299,$^)>$@
+ @echo $(wordlist 300, 599,$^)>>$@
+ @echo $(wordlist 600, 899,$^)>>$@
+ @echo $(wordlist 900,1199,$^)>>$@
+ @echo $(wordlist 1200,1499,$^)>>$@
+ @echo $(wordlist 1500,1799,$^)>>$@
+ @echo $(wordlist 1800,2099,$^)>>$@
+ @echo $(wordlist 2100,2399,$^)>>$@
+ @echo $(wordlist 2400,2699,$^)>>$@
+ @echo $(wordlist 2700,2999,$^)>>$@
+ # Print the rest, just in case the list is that long
+ echo $(wordlist 3000,$(words $^),$^)>>$@
+
+$(outdir)/collated-files.tely: $(outdir)/collated-files.list
+ $(LYS_TO_TELY) --name=$(outdir)/collated-files.tely --title="$(TITLE)" --author="$(AUTHOR)" --input-filename=$^
reduced_ss# = staff_space# * reduction;
define_pixels (reduced_ss);
+ % G clef has now a smaller upper loop than it used to have.
+ % Too small loop in reduced clef (G_change) interacts badly
+ % with stafflines, so we make reduced clef's loop a bit bigger.
+ reduced_loop_correction := min (max (0.94, (0.6 + 0.46 * reduction)), 1);
+
thinness = 0.095 staff_space + 0.75 linethickness;
downstroke_dir = unitvector (14, -75);
downstroke_angle = angle downstroke_dir;
breapth_factor = 21/14;
inner_thick_end = 45;
inner_start_angle = downstroke_angle - 43;
- thickness = .32 reduced_ss + 1.1 linethickness;
+ thickness = .33 reduced_ss + 1.1 linethickness;
thinnib = thinness;
set_char_box (0, 1.71 * breapth_factor * reduced_ss#,
- 2.6 * reduced_ss#, 5 * reduced_ss#);
+ 2.55 * reduced_ss#, 4.8 * reduced_ss# / reduced_loop_correction);
center := (breapth_factor * reduced_ss, 0);
y5r = .37 reduced_ss + ypart center;
penpos5 (thickness, upward_swoosh_angle);
- z6 = center + whatever * downstroke_dir;
- y6 = ypart center + 2 reduced_ss;
+ z6 = center + whatever * downstroke_dir + (-0.02, 0) * reduced_ss;
+ y6 = ypart center + 1.95 reduced_ss / reduced_loop_correction;
% penpos6 is computed later
- z7l - z6 = whatever * (z5 - z6) ;
- y7l = 3.5 reduced_ss;
+ z7l - z6 = whatever * (z5 - z6);
+ y7l = 3.38 reduced_ss / reduced_loop_correction;
penpos7 (thickness, upward_swoosh_angle);
- x9 = .7 [x10, x7r];
- top y9l = 5 reduced_ss;
+ x9 = .75 [x10, x7r];
+ top y9l = 4.78 reduced_ss / reduced_loop_correction;
penpos9 (1.45 thickness, -70);
- x11 - x13r = 1.5 reduced_ss + 0.5 thinnib;
- y11 = ypart center - 47/28 reduced_ss;
- y12 = ypart center - 71/28 reduced_ss;
+ x11 - x13r = 1.44 * reduced_ss + 0.5 thinnib;
+ y11 = ypart center - 45/28 reduced_ss;
+ y12 = ypart center - 69/28 reduced_ss;
y13 = .48 [y12, y4r];
x12r = xpart (.45 [z13r, z11] + .75 reduced_ss * downstroke_dir);
% z10 = center + whatever * dir (downstroke_angle - 1.5);
- x10 = x6 - 2 thinnib;
- y10 = ypart center + 3.5 reduced_ss;
+ x10 = x6 - 1.85 thinnib * reduction / reduced_loop_correction;
+ y10 = ypart center + 3.32 reduced_ss / reduced_loop_correction;
y10l - y10r = 1.0 thickness;
z10r - z10l = .7 thinnib * dir (downstroke_angle + 90)
+ whatever * downstroke_dir;
z10 = .5 [z10l, z10r];
- z11 = center + whatever * downstroke_dir + (-0.05 reduced_ss, 0);
+ z11 = center + whatever * downstroke_dir + (0.03 reduced_ss, 0);
penpos11 (thinnib, start_angle + 90);
penpos12 (thinnib, bot_angle + 90);
z10' = point 0.3 of pat;
penpos10' (1.3 thinnib, angle (direction 0.3 of pat) + 50);
- z11' = point 1.5 of pat;
+ z11' = point 1.5 of pat + (0.033, -0.5) * reduced_ss;
penpos11' (thinnib, angle (direction 1.5 of pat) + 90);
z21l = z20l;
input feta-pedals;
input feta-brackettips;
input feta-accordion;
+ input feta-ties;
else:
input feta-test-generic.mf;
fi
fet_endchar;
+fet_beginchar ("halfopen vertical", "halfopenvertical");
+ save thin, height, width, thick, factor, slash;
+
+ factor := 3/2;
+ height# = 5/4 width#;
+ height# = staff_space#;
+ thin = 0.6 linethickness + 0.06 staff_space;
+ slash# = 1.05 linethickness#;
+
+ set_char_box (width# / 2, width# / 2,
+ height# / 2, height# / 2);
+
+ define_pixels (width, height, slash);
+
+ 2 thick + 0.6 (height - 2 thin) = width;
+
+ penpos1 (thick, 0);
+ penpos2 (thin, 90);
+ penpos3 (thick, 180);
+ penpos4 (thin, 270);
+ z1r = (w, 0);
+ z2r = (0, h);
+ z3r = (-w, 0);
+ z4r = (0, -h);
+
+ penlabels (1, 2, 3, 4);
+
+ penstroke z1e{up}
+ .. z2e{left}
+ .. z3e{down}
+ .. z4e{right}
+ .. cycle;
+
+ draw_brush ((0, -h * factor), slash,
+ (0, h * factor), slash);
+fet_endchar;
+
+
fet_beginchar ("plus (stopped)", "stopped");
save hthick, vthick, size, outer_hsize, outer_vsize;
%input feta-timesignatures;
%input feta-pedals;
%input feta-accordion;
+%input feta-ties;
--- /dev/null
+% Feta (not the Font-En-Tja) music font -- small ties
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 2011 Bertrand Bordage <bordage.bertrand@gmail.com>
+%
+% LilyPond is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% LilyPond is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+
+fet_begingroup ("ties");
+
+fet_beginchar ("lyric tie", "lyric");
+ save padding;
+
+ padding := .4 staff_space;
+
+ set_char_box (0, 0,
+ .7 staff_space#, 0);
+
+ z1 = (-staff_space, -padding);
+ z2 = (0, -d);
+ z3 = (staff_space, -padding);
+
+ penpos1 (1.2 linethickness, 50);
+ penpos2 (2 linethickness, 90);
+ penpos3 (1.2 linethickness, 130);
+
+ fill z2l
+ .. simple_serif (z3l, z3r, 90)
+ .. z2r
+ .. simple_serif (z1r, z1l, 90)
+ .. cycle;
+
+ penlabels (1, 2, 3);
+fet_endchar;
+
+fet_endgroup ("ties");
rep = snippet.get_replacements ()
if PRINTFILENAME in snippet.option_dict:
rep['base'] = basename
- rep['filename'] = os.path.basename (snippet.substring ('filename'))
+ rep['filename'] = os.path.basename (snippet.filename)
+ rep['ext'] = snippet.ext
str = self.output[PRINTFILENAME] % rep
return str
PRINTFILENAME: r'''<textobject>
<simpara>
- <ulink url="%(base)s.ly">
+ <ulink url="%(base)s%(ext)s">
<filename>
%(filename)s
</filename>
'multiline_comment':
r'''(?smx)(?P<match>\s*(?!@c\s+)(?P<code><!--\s.*?!-->)\s)''',
+ 'musicxml_file':
+ r'''(?mx)
+ (?P<match>
+ <musicxmlfile\s*(?P<options>.*?)\s*>
+ \s*(?P<filename>.*?)\s*
+ </musicxmlfile\s*>)''',
+
'verb':
r'''(?x)(?P<match>(?P<code><pre>.*?</pre>))''',
</p>''',
BEFORE: r'''<p>
- <a href="%(base)s.ly">''',
+ <a href="%(base)s%(ext)s">''',
OUTPUT: r'''
<img align="middle"
src="%(image)s"
alt="%(alt)s">''',
- PRINTFILENAME: '<p><tt><a href="%(base)s.ly">%(filename)s</a></tt></p>',
+ PRINTFILENAME: '<p><tt><a href="%(base)s%(ext)s">%(filename)s</a></tt></p>',
QUOTE: r'''<blockquote>
%(str)s
str = ''
rep = snippet.get_replacements ();
rep['base'] = basename
+ rep['filename'] = os.path.basename (snippet.filename)
+ rep['ext'] = snippet.ext
str += self.output_print_filename (basename, snippet)
if VERBATIM in snippet.option_dict:
rep['verb'] = BookBase.verbatim_html (snippet.verb_ly ())
import re
import tempfile
import os
+import subprocess
import book_base as BookBase
from book_snippets import *
import lilylib as ly
(?P<filename>\S+?)
})''',
+ 'musicxml_file':
+ r'''(?smx)
+ ^[^%\n]*?
+ (?P<match>
+ \\musicxmlfile\s*(
+ \[
+ \s*(?P<options>.*?)\s*
+ \])?\s*\{
+ (?P<filename>\S+?)
+ })''',
+
'singleline_comment':
r'''(?mx)
^.*?
PRINTFILENAME: '''\\texttt{%(filename)s}
''',
- QUOTE: r'''\begin{quotation}
+ QUOTE: r'''\begin{quote}
%(str)s
-\end{quotation}''',
+\end{quote}''',
VERBATIM: r'''\noindent
\begin{verbatim}%(verb)s\end{verbatim}
tmp_handle.write (latex_document)
tmp_handle.close ()
- ly.system ('%s %s' % (global_options.latex_program, tmpfile),
- be_verbose=global_options.verbose)
- parameter_string = file (logfile).read()
-
+ progress (_ ("Running `%s' on file `%s' to detect default page settings.\n")
+ % (global_options.latex_program, tmpfile));
+ cmd = '%s %s' % (global_options.latex_program, tmpfile);
+ proc = subprocess.Popen (cmd,
+ universal_newlines=True, shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE);
+ if proc.returncode != 0:
+ warning (_ ("Unable to auto-detect default page settings:\n%s")
+ % proc.communicate ()[1]);
os.unlink (tmpfile)
- os.unlink (logfile)
+ parameter_string = ""
+ if os.path.exists (logfile):
+ parameter_string = file (logfile).read()
+ os.unlink (logfile)
columns = 0
m = re.search ('columns=([0-9.]+)', parameter_string)
FILENAME = 'filename'
FILTER = 'filter'
FRAGMENT = 'fragment'
-LANG = 'lang' ## TODO: This is handled nowhere!
LAYOUT = 'layout'
-LILYQUOTE = 'lilyquote'
LINE_WIDTH = 'line-width'
NOFRAGMENT = 'nofragment'
NOGETTEXT = 'nogettext'
NOINDENT = 'noindent'
-NOQUOTE = 'noquote'
INDENT = 'indent'
NORAGGED_RIGHT = 'noragged-right'
NOTES = 'body'
# NOTIME and NOGETTEXT have no opposite so they aren't part of this
# dictionary.
-# NOQUOTE is used internally only.
no_options = {
NOFRAGMENT: FRAGMENT,
NOINDENT: INDENT,
PRINTFILENAME,
DOCTITLE,
TEXIDOC,
- LANG,
VERBATIM,
FILENAME,
ALT,
INDENT: r'''indent = %(indent)s''',
LINE_WIDTH: r'''line-width = %(line-width)s''',
QUOTE: r'''line-width = %(line-width)s - 2.0 * %(exampleindent)s''',
- LILYQUOTE: r'''line-width = %(line-width)s - 2.0 * %(exampleindent)s''',
RAGGED_RIGHT: r'''ragged-right = ##t''',
NORAGGED_RIGHT: r'''ragged-right = ##f''',
},
-FRAGMENT_LY = r'''
-%(notes_string)s
-{
-
-
-%% ****************************************************************
-%% ly snippet contents follows:
-%% ****************************************************************
-%(code)s
-
-
-%% ****************************************************************
-%% end ly snippet
-%% ****************************************************************
-}
-'''
-
def classic_lilypond_book_compatibility (key, value):
+ if key == 'lilyquote':
+ return (QUOTE, value)
if key == 'singleline' and value == None:
return (RAGGED_RIGHT, None)
return (None, None)
+# TODO: Remove the 1mm additional padding in the line-width, once lilypond
+# creates tighter cropped images!
PREAMBLE_LY = '''%%%% Generated by %(program_name)s
%%%% Options: [%(option_string)s]
\\include "lilypond-book-preamble.ly"
\paper {
%(paper_string)s
- force-assignment = #""
- line-width = #(- line-width (* mm %(padding_mm)f))
+ %% offset the left padding, also add 1mm as lilypond creates cropped
+ %% images with a little space on the right
+ line-width = #(- line-width (* mm %(padding_mm)f) (* mm 1))
}
\layout {
%% ****************************************************************
'''
+FRAGMENT_LY = r'''
+%(notes_string)s
+{
+%% ****************************************************************
+%% ly snippet contents follows:
+%% ****************************************************************
+%(code)s
+%% ****************************************************************
+%% end ly snippet
+%% ****************************************************************
+}
+'''
+
self.option_dict[option] = None
- # If LINE_WIDTH is used without parameter, set it to default.
+ # Store if we have an explicit line-width given
has_line_width = self.option_dict.has_key (LINE_WIDTH)
if has_line_width and self.option_dict[LINE_WIDTH] == None:
has_line_width = False
del self.option_dict[LINE_WIDTH]
- # TODO: Can't we do that more efficiently (built-in python func?)
+ # Use default options (i.e. auto-detected line-width, etc)
for k in self.formatter.default_snippet_options:
if k not in self.option_dict:
self.option_dict[k] = self.formatter.default_snippet_options[k]
if has_relative and not self.option_dict.has_key (FRAGMENT):
self.option_dict[FRAGMENT] = None
- if not has_line_width:
- if type == 'lilypond' or FRAGMENT in self.option_dict:
- self.option_dict[RAGGED_RIGHT] = None
-
- if type == 'lilypond':
- if LINE_WIDTH in self.option_dict:
- del self.option_dict[LINE_WIDTH]
- else:
- if RAGGED_RIGHT in self.option_dict:
- if LINE_WIDTH in self.option_dict:
- del self.option_dict[LINE_WIDTH]
-
- if QUOTE in self.option_dict or type == 'lilypond':
- if LINE_WIDTH in self.option_dict:
- del self.option_dict[LINE_WIDTH]
-
if not INDENT in self.option_dict:
self.option_dict[INDENT] = '0\\mm'
# all settings before writing them in the \paper block.
if not LINE_WIDTH in self.option_dict:
if not QUOTE in self.option_dict:
- if not LILYQUOTE in self.option_dict:
- self.option_dict[LINE_WIDTH] = "#(- paper-width \
+ self.option_dict[LINE_WIDTH] = "#(- paper-width \
left-margin-default right-margin-default)"
def get_option_list (self):
return self.option_list
def compose_ly (self, code):
- if FRAGMENT in self.option_dict:
- body = FRAGMENT_LY
- else:
- body = FULL_LY
# Defaults.
relative = 1
d = globals().copy()
d.update (locals())
d.update (self.global_options.information)
+ if FRAGMENT in self.option_dict:
+ body = FRAGMENT_LY
+ else:
+ body = FULL_LY
return (PREAMBLE_LY + body) % d
def get_checksum (self):
os.makedirs (dst_path)
os.link (src, dst)
+ def additional_files_to_consider (self, base, full):
+ return []
+ def additional_files_required (self, base, full):
+ return []
+
def all_output_files (self, output_dir, output_dir_files):
"""Return all files generated in lily_output_dir, a set.
if 'ddump-signature' in self.global_options.process_cmd:
consider_file (systemfile + '.signature')
+ map (consider_file, self.additional_files_to_consider (base, full))
+ map (require_file, self.additional_files_required (base, full))
return (result, missing)
"""Pass input through cmd, and return the result."""
if self.global_options.verbose:
- progress (_ ("Opening filter `%s'\n") % cmd)
+ progress (_ ("Running through filter `%s'\n") % cmd)
# TODO: Use Popen once we resolve the problem with msvcrt in Windows:
(stdin, stdout, stderr) = os.popen3 (cmd)
status = 0
output = stdout.read ()
status = stdout.close ()
- error = stderr.read ()
+ err = stderr.read ()
if not status:
status = 0
signal = 0x0f & status
- if status or (not output and error):
+ if status or (not output and err):
exit_status = status >> 8
ly.error (_ ("`%s' failed (%d)") % (cmd, exit_status))
ly.error (_ ("The error log is as follows:"))
- ly.stderr_write (error)
+ ly.stderr_write (err)
ly.stderr_write (stderr.read ())
exit (status)
class LilypondFileSnippet (LilypondSnippet):
def __init__ (self, type, match, formatter, line_number, global_options):
LilypondSnippet.__init__ (self, type, match, formatter, line_number, global_options)
- self.contents = file (BookBase.find_file (self.substring ('filename'), global_options.include_path)).read ()
+ self.filename = self.substring ('filename')
+ self.ext = os.path.splitext (os.path.basename (self.filename))[1]
+ self.contents = file (BookBase.find_file (self.filename, global_options.include_path)).read ()
def get_snippet_code (self):
return self.contents;
return s
def ly (self):
- name = self.substring ('filename')
+ name = self.filename
return ('\\sourcefilename \"%s\"\n\\sourcefileline 0\n%s'
% (name, self.contents))
def final_basename (self):
if self.global_options.use_source_file_names:
- base = os.path.splitext (os.path.basename (self.substring ('filename')))[0]
+ base = os.path.splitext (os.path.basename (self.filename))[0]
return base
else:
return self.basename ()
+class MusicXMLFileSnippet (LilypondFileSnippet):
+ def __init__ (self, type, match, formatter, line_number, global_options):
+ LilypondFileSnippet.__init__ (self, type, match, formatter, line_number, global_options)
+ self.compressed = False
+ self.converted_ly = None
+ self.musicxml_options_dict = {
+ 'verbose': '--verbose',
+ 'lxml': '--lxml',
+ 'compressed': '--compressed',
+ 'relative': '--relative',
+ 'absolute': '--absolute',
+ 'no-articulation-directions': '--no-articulation-directions',
+ 'no-rest-positions': '--no-rest-positions',
+ 'no-page-layout': '--no-page-layout',
+ 'no-beaming': '--no-beaming',
+ 'language': '--language',
+ }
+
+ def snippet_options (self):
+ return self.musicxml_options_dict.keys ()
+
+ def convert_from_musicxml (self):
+ name = self.filename
+ xml2ly_option_list = []
+ for (key, value) in self.option_dict.items ():
+ cmd_key = self.musicxml_options_dict.get (key, None)
+ if cmd_key == None:
+ continue
+ if value == None:
+ xml2ly_option_list.append (cmd_key)
+ else:
+ xml2ly_option_list.append (cmd_key + '=' + value)
+ if ('.mxl' in name) and ('--compressed' not in xml2ly_option_list):
+ xml2ly_option_list.append ('--compressed')
+ self.compressed = True
+ opts = " ".join (xml2ly_option_list)
+ progress (_ ("Converting MusicXML file `%s'...\n") % self.filename)
+
+ ly_code = self.filter_pipe (self.contents, 'musicxml2ly %s --out=- - ' % opts)
+ return ly_code
+
+ def ly (self):
+ if self.converted_ly == None:
+ self.converted_ly = self.convert_from_musicxml ()
+ name = self.filename
+ return ('\\sourcefilename \"%s\"\n\\sourcefileline 0\n%s'
+ % (name, self.converted_ly))
+
+ def additional_files_required (self, base, full):
+ result = [];
+ if self.compressed:
+ result.append (base + '.mxl')
+ else:
+ result.append (base + '.xml')
+ return result
+
+ def write_ly (self):
+ base = self.basename ()
+ path = os.path.join (self.global_options.lily_output_dir, base)
+ directory = os.path.split(path)[0]
+ if not os.path.isdir (directory):
+ os.makedirs (directory)
+
+ # First write the XML to a file (so we can link it!)
+ if self.compressed:
+ xmlfilename = path + '.mxl'
+ else:
+ xmlfilename = path + '.xml'
+ if os.path.exists (xmlfilename):
+ diff_against_existing = self.filter_pipe (self.contents, 'diff -u %s - ' % xmlfilename)
+ if diff_against_existing:
+ warning (_ ("%s: duplicate filename but different contents of orginal file,\n\
+printing diff against existing file.") % xmlfilename)
+ ly.stderr_write (diff_against_existing)
+ else:
+ out = file (xmlfilename, 'w')
+ out.write (self.contents)
+ out.close ()
+
+ # also write the converted lilypond
+ filename = path + '.ly'
+ if os.path.exists (filename):
+ diff_against_existing = self.filter_pipe (self.full_ly (), 'diff -u %s -' % filename)
+ if diff_against_existing:
+ warning (_ ("%s: duplicate filename but different contents of converted lilypond file,\n\
+printing diff against existing file.") % filename)
+ ly.stderr_write (diff_against_existing)
+ else:
+ out = file (filename, 'w')
+ out.write (self.full_ly ())
+ out.close ()
+ file (path + '.txt', 'w').write ('image of music')
+
+
+
class LilyPondVersionString (Snippet):
"""A string that does not require extra memory."""
def __init__ (self, type, match, formatter, line_number, global_options):
'lilypond': LilypondSnippet,
'include': IncludeSnippet,
'lilypondversion': LilyPondVersionString,
+ 'musicxml_file': MusicXMLFileSnippet,
}
# -*- coding: utf-8 -*-
import re
+import tempfile
+import subprocess
import book_base as BookBase
from book_snippets import *
+import lilylib as ly
+global _;_=ly._
+
# Recognize special sequences in the input.
#
.*?
@end\s+ignore))\s''',
+ 'musicxml_file': r'''(?mx)
+ ^(?P<match>
+ @musicxmlfile\s*(
+ \[
+ \s*(?P<options>.*?)\s*
+ \])?\s*{
+ (?P<filename>\S+)
+ })''',
+
'singleline_comment': r'''(?mx)
^.*
(?P<match>
@end ifinfo
@html
<p>
- <a href="%(base)s.ly">
+ <a href="%(base)s%(ext)s">
<img align="middle"
border="0"
src="%(image)s"
PRINTFILENAME: '''
@html
-<a href="%(base)s.ly">
+<a href="%(base)s%(ext)s">
@end html
@file{%(filename)s}
@html
QUOTE: r'''@quotation
%(str)s@end quotation
-''',
-
- NOQUOTE: r'''@format
-%(str)s@end format
''',
VERBATIM: r'''@exampleindent 0
}
+###
+# Retrieve dimensions from texinfo
+TEXINFO_INSPECTION_DOCUMENT = r'''
+\input texinfo
+@setfilename Texinfo_width_test
+@settitle Texinfo width test
+%(preamble)s
+
+@message{Global: textwidth=@the@hsize,exampleindent=@the@lispnarrowing}
+
+@bye
+'''
+
+def get_texinfo_width_indent (source, global_options):
+ #TODO: Check for end of header command "@c %**end of header"
+ # only use material before that comment ?
+
+ # extract all relevant papter settings from the input:
+ pagesize = None
+ texinfo_paper_size_regexp = r'''(@(?:afourpaper|afourwide|afourlatex|afivepaper|smallbook|letterpaper))''';
+ m = re.search (texinfo_paper_size_regexp, source);
+ if m:
+ pagesize = m.group (1)
+
+ relevant_settings_regexp = r'''(@(?:fonttextsize|pagesizes|cropmarks|exampleindent).*)\n''';
+ m = re.findall (relevant_settings_regexp, source);
+ if pagesize:
+ m.insert (0, pagesize);
+ # all relevant options to insert into the test document:
+ preamble = "\n".join (m);
+
+ texinfo_document = TEXINFO_INSPECTION_DOCUMENT % {'preamble': preamble}
+
+ (handle, tmpfile) = tempfile.mkstemp('.texi')
+ outfile = os.path.splitext (tmpfile)[0] + '.pdf'
+
+ tmp_handle = os.fdopen (handle,'w')
+ tmp_handle.write (texinfo_document)
+ tmp_handle.close ()
+
+ # Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is
+ # used to detect relative/absolute pathes, so the absolute path is not
+ # detected as such and this command fails:
+ progress (_ ("Running texi2pdf on file %s to detect default page settings.\n") % tmpfile);
+
+ # execute the command and pipe stdout to the parameter_string:
+ cmd = 'LC_ALL=C %s -c -o %s %s' % (global_options.texinfo_program, outfile, tmpfile);
+ if (global_options.verbose):
+ progress ("Executing: %s\n" % cmd);
+
+ proc = subprocess.Popen (cmd,
+ universal_newlines=True, shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (parameter_string, error_string) = proc.communicate ()
+ if proc.returncode != 0:
+ warning (_ ("Unable to auto-detect default settings:\n%s")
+ % error_string)
+ os.unlink (tmpfile)
+ if os.path.exists(outfile):
+ os.unlink (outfile)
+
+ # Find textwidth and exampleindent and format it as \\mm or \\in
+ # Use defaults if they cannot be extracted
+ textwidth = 0
+ m = re.search ('textwidth=([0-9.]+)pt', parameter_string)
+ if m:
+ val = float (m.group (1))/72.27
+ if pagesize and pagesize.startswith ("@afour"):
+ textwidth = "%g\\mm" % round (val*25.4, 3);
+ else:
+ textwidth = "%g\\in" % round (val, 3);
+ else:
+ textwidth = texinfo_line_widths.get(pagesize, "6\\in")
+
+ exampleindent = 0
+ m = re.search ('exampleindent=([0-9.]+)pt', parameter_string)
+ if m:
+ val = float (m.group (1))/72.27
+ if pagesize and pagesize.startswith ("@afour"):
+ exampleindent = "%g\\mm" % round (val*25.4, 3);
+ else:
+ exampleindent = "%g\\in" % round (val, 3);
+ else:
+ exampleindent = "0.4\\in"
+
+ retval = {LINE_WIDTH: textwidth, EXAMPLEINDENT: exampleindent}
+ if (global_options.verbose):
+ progress ("Auto-detected values are: %s\n" % retval);
+ return retval;
+
+
texinfo_lang_re = re.compile ('(?m)^@documentlanguage (.*?)( |$)')
else:
return ''
- def get_line_width (self, source):
- for regex in texinfo_line_widths:
- # FIXME: @layout is usually not in
- # chunk #0:
- #
- # \input texinfo @c -*-texinfo-*-
- #
- # Bluntly search first K items of
- # source.
- # s = chunks[0].replacement_text ()
- if re.search (regex, source[:1024]):
- return texinfo_line_widths[regex]
- return None
+ def init_default_snippet_options (self, source):
+ texinfo_defaults = get_texinfo_width_indent (source, self.global_options);
+ self.default_snippet_options.update (texinfo_defaults)
+ BookBase.BookOutputFormat.init_default_snippet_options (self, source)
def adjust_snippet_command (self, cmd):
if '--formats' not in cmd:
rep['verb'] = snippet.verb_ly ()
substr = self.output[VERBATIM] % rep
substr += self.output_info (basename, snippet)
- if LILYQUOTE in snippet.option_dict:
+ if QUOTE in snippet.option_dict:
substr = self.output[QUOTE] % {'str': substr}
str += substr
-# str += ('@ifinfo\n' + self.output_info () + '\n@end ifinfo\n')
-# str += ('@tex\n' + self.output_latex () + '\n@end tex\n')
-# str += ('@html\n' + self.output_html () + '\n@end html\n')
-
- if QUOTE in snippet.option_dict:
- str = self.output[QUOTE] % {'str': str}
-
# need par after image
str += '\n'
str = re.sub (r'\\(cresc|dim|endcresc|enddim)\b', r'\\deprecated\1', str)
return str
+@rule ((2, 13, 27),
+ ("interval-translate -> coord-translate"))
+def conv (str):
+ str = re.sub ('interval-translate', 'coord-translate', str)
+ return str
+
@rule ((2, 13, 29),
_ ("Eliminate beamSettings, beatLength, \\setBeatGrouping, \\overrideBeamSettings and \\revertBeamSettings.\n\
\"accordion.accEtcbase\" -> \"accordion.etcbass\""))
def conv (str):
return str
-@rule ((2, 15, 2),
- _ ("Change in internal property for MultiMeasureRest"))
-def conv (str):
- if re.search (r'use-breve-rest',str):
- stderr_write (NOT_SMART % _("use-breve-rest. This internal property has been replaced by round-to-longer-rest and usable-duration-logs.\n"))
- stderr_write (UPDATE_MANUALLY)
- return str
-
@rule ((2, 15, 7),
_ ("Handling of non-automatic footnotes."))
def conv(str):
stderr_write (UPDATE_MANUALLY)
return str
+@rule ((2, 15, 9),
+ _ ("Change in internal property for MultiMeasureRest"))
+def conv (str):
+ if re.search (r'use-breve-rest',str):
+ stderr_write ("\n")
+ stderr_write (NOT_SMART % "use-breve-rest.\n")
+ stderr_write (_ ("This internal property has been replaced by round-up-to-longer-rest, round-up-exceptions and usable-duration-logs.\n"))
+ stderr_write (UPDATE_MANUALLY)
+ return str
+
# Guidelines to write rules (please keep this at the end of this file)
#
(ice-9 optargs))
(define-public (ly:system command)
- (if (ly:get-option 'verbose)
- (begin
- (ly:message (_ "Invoking `~a'...") (string-join command)))
- (ly:progress "\n"))
+ (ly:debug (_ "Invoking `~a'...") (string-join command))
(let ((status (apply ly:spawn command)))
(if (> status 0)
(begin
See @file{double-plus-new-chord-name.scm} for the signature of @var{style}.
@var{pitches}, @var{bass}, and @var{inversion} are lily pitches.
-@var{options} is an alist-alist (see @file{input/test/dpncnt.ly})."
+@var{options} is an alist-alist (see @file{input/@/test/@/dpncnt.ly})."
(define (step-nr pitch)
(let* ((pitch-nr (+ (* 7 (ly:pitch-octave pitch))
(list-ref '("eses" "es" "" "is" "isis") (+ 2 (cdr n-a)))))))))
(define-public ((chord-name->italian-markup re-with-eacute) pitch lowercase?)
- "Return pitch markup for @var{pitch}, using italian/french note names.
+ "Return pitch markup for @var{pitch}, using Italian/@/French note names.
If @var{re-with-eacute} is set to @code{#t}, french `ré' is returned for
pitch@tie{}D instead of `re'."
(alist (map chord-to-exception-entry elts)))
(filter (lambda (x) (cdr x)) alist)))
+(define-public (capo-handler pitches bass inversion context)
+ (let ((chord-function
+ (ly:context-property context 'chordNameFunction 'jazz-chord-names))
+ (capo-pitch (ly:context-property context 'capoPitch #f)))
+ (if (not capo-pitch)
+ (chord-function pitches bass inversion context) ;; call the chordNameFunction as of old
+ (let* ((new-pitches ;; else transpose the pitches and do the chord twice
+ (map (lambda (p)
+ (ly:pitch-transpose p capo-pitch))
+ pitches))
+ (new-bass
+ (if (ly:pitch? bass)
+ (ly:pitch-transpose bass capo-pitch)
+ '()))
+ (new-inversion
+ (if (ly:pitch? inversion)
+ (ly:pitch-transpose inversion capo-pitch)
+ '()))
+ (capo-markup
+ (make-parenthesize-markup
+ (chord-function new-pitches new-bass new-inversion context)))
+ (name-markup (chord-function pitches bass inversion context))
+ (capo-vertical (ly:context-property context 'capoVertical #f)))
+ (if capo-vertical
+ (make-column-markup (list name-markup capo-markup))
+ (make-line-markup (list name-markup
+ (make-hspace-markup 1)
+ capo-markup)))))))
@end table")
(autoBeamCheck ,procedure? "A procedure taking three
-arguments, @var{context}, @var{dir} [start/stop (-1 or 1)], and
+arguments, @var{context}, @var{dir} [start/@/stop (-1 or 1)], and
@var{test} [shortest note in the beam]. A non-@code{#f} return value
starts or stops the auto beam.")
(autoBeaming ,boolean? "If set to true then beams are generated
(beatStructure ,list? "List of @code{baseMoment}s that are combined
to make beats.")
+ (capoPitch ,ly:pitch? "The pitch to transpose chords down by when using the capo.")
+ (capoVertical ,boolean? "Whether to display actual and transposed pitches above each other or not.")
(chordChanges ,boolean? "Only show changes in chords scheme?")
(chordNameExceptions ,list? "An alist of chord exceptions.
Contains @code{(@var{chord} . @var{markup})} entries.")
(figuredBassPlusDirection ,ly:dir? "Where to put plus signs
relative to the main figure.")
(fingeringOrientations ,list? "A list of symbols, containing
-@samp{left}, @samp{right}, @samp{up} and/or @samp{down}. This list
+@samp{left}, @samp{right}, @samp{up} and/@/or @samp{down}. This list
determines where fingerings are put relative to the chord being
fingered.")
(firstClef ,boolean? "If true, create a new clef when starting a
(followVoice ,boolean? "If set, note heads are tracked across
staff switches by a thin line.")
(fontSize ,number? "The relative size of all grobs in a context.")
- (forbidBreak ,boolean? "If set to @code{##t}, prevent a line break
+ (forbidBreak ,boolean? "If set to @code{#t}, prevent a line break
at this point.")
(forceClef ,boolean? "Show clef symbol, even if it has not
changed. Only active for the first clef after the property is set, not
alterations, use symbols, e.g. @code{keySignature = #`((6 . ,FLAT))}.")
- (lyricMelismaAlignment ,ly:dir? "Alignment to use for a melisma syllable.")
+ (lyricMelismaAlignment ,number? "Alignment to use for a melisma syllable.")
(majorSevenSymbol ,markup? "How should the major 7th be formatted
(melismaBusyProperties ,list? "A list of properties (symbols) to
determine whether a melisma is playing. Setting this property will
influence how lyrics are aligned to notes. For example, if set to
-@code{#'(melismaBusy beamMelismaBusy)}, only manual melismata and
+@code{'(melismaBusy beamMelismaBusy)}, only manual melismata and
manual beams are considered. Possible values include
@code{melismaBusy}, @code{slurMelismaBusy}, @code{tieMelismaBusy}, and
@code{beamMelismaBusy}.")
(suggestAccidentals ,boolean? "If set, accidentals are typeset as
cautionary suggestions over the note.")
(systemStartDelimiter ,symbol? "Which grob to make for the start
-of the system/staff? Set to @code{SystemStartBrace},
+of the system/@/staff? Set to @code{SystemStartBrace},
@code{SystemStartBracket} or @code{SystemStartBar}.")
(systemStartDelimiterHierarchy ,pair? "A nested list, indicating
the nesting of a start delimiters.")
follow each other directly. This can be used for writing out
arpeggios.")
(timeSignatureFraction ,number-pair? "A pair of numbers,
-signifying the time signature. For example, @code{#'(4 . 4)} is a
+signifying the time signature. For example, @code{'(4 . 4)} is a
4/4 time signature.")
(timeSignatureSettings ,cheap-list? "A nested alist of settings for
time signatures. Contains elements for various time signatures. The
barcheck fail?")
(beamMelismaBusy ,boolean? "Signal if a beam is present.")
(busyGrobs ,list? "A queue of @code{(@var{end-moment} .
-@var{GROB})} cons cells. This is for internal (C++) use only. This
+@var{grob})} cons cells. This is for internal (C++) use only. This
property contains the grobs which are still busy (e.g. note heads,
spanners, etc.).")
(scriptDefinitions ,list? "The description of scripts. This is
used by the @code{Script_engraver} for typesetting note-superscripts
-and subscripts. See @file{scm/script.scm} for more information.")
+and subscripts. See @file{scm/@/script.scm} for more information.")
(slurMelismaBusy ,boolean? "Signal if a slur is present.")
(stavesFound ,grob-list? "A list of all staff-symbols found.")
(ly:add-interface
'footnote-interface
"Make a footnote."
- '(footnote-text))
+ '(automatically-numbered footnote-text))
(ly:add-interface
'footnote-spanner-interface
included in this script's support.")
(after-line-breaking ,boolean? "Dummy property, used to trigger
callback for @code{after-line-breaking}.")
- (align-dir ,ly:dir? "Which side to align? @code{-1}: left side,
+ (align-dir ,ly:dir? "Which side to align? @w{@code{-1}}: left side,
@code{0}: around center of width, @code{1}: right side.")
(allow-loose-spacing ,boolean? "If set, column can be detached
from main spacing.")
(auto-knee-gap ,ly:dimension? "If a gap is found between note
heads where a horizontal beam fits that is larger than this number,
make a kneed beam.")
+ (automatically-numbered ,boolean? "Should a footnote be automatically
+numbered?")
(average-spacing-wishes ,boolean? "If set, the spacing wishes are
averaged over staves.")
(avoid-note-head ,boolean? "If set, the stem of a chord does not
;;
(c0-position ,integer? "An integer indicating the position of
middle@tie{}C.")
- (circled-tip ,boolean? "Put a circle at start/end of
-hairpins (al/del niente).")
+ (circled-tip ,boolean? "Put a circle at start/@/end of
+hairpins (al/@/del niente).")
(clip-edges ,boolean? "Allow outward pointing beamlets at the
edges of beams?")
(collapse-height ,ly:dimension? "Minimum height of system start
-delimiter. If equal or smaller, the bracket/brace/line is removed.")
+delimiter. If equal or smaller, the bracket/@/brace/@/line is removed.")
(collision-interfaces ,list? "A list of interfaces for which
automatic beam-collision resolution is run.")
(collision-voice-only ,boolean? "Does automatic beam collsion apply
having a @code{details} property.")
(digit-names ,vector? "Names for string finger digits.")
(direction ,ly:dir? "If @code{side-axis} is @code{0} (or
-@code{#X}), then this property determines whether the object is placed
-@code{#LEFT}, @code{#CENTER} or @code{#RIGHT} with respect to the
+@code{X}), then this property determines whether the object is placed
+@code{LEFT}, @code{CENTER} or @code{RIGHT} with respect to the
other object. Otherwise, it determines whether the object is placed
-@code{#UP}, @code{#CENTER} or @code{#DOWN}. Numerical values may also
-be used: @code{#UP}=@code{1}, @code{#DOWN}=@code{-1},
-@code{#LEFT}=@code{-1}, @code{#RIGHT}=@code{1},
-@code{#CENTER}=@code{0}.")
+@code{UP}, @code{CENTER} or @code{DOWN}. Numerical values may also
+be used: @code{UP}=@code{1}, @code{DOWN}=@w{@code{-1}},
+@code{LEFT}=@w{@code{-1}}, @code{RIGHT}=@code{1},
+@code{CENTER}=@code{0}.")
(dot-count ,integer? "The number of dots.")
(dot-negative-kern ,number? "The space to remove between a dot
and a slash in percent repeat glyphs. Larger values bring the two
;;
;; f
;;
- (flag ,ly:stencil? "A function returning the full flag stencil
-for the @code{Stem}, which is passed to the function as the only
-argument. The default ly:stem::calc-stencil function uses the
-@code{flag-style} property to determine the correct glyph for the
-flag. By providing your own function, you can create arbitrary
-flags.")
(flag-count ,number? "The number of tremolo beams.")
- (flag-style ,symbol? "A symbol determining what style of flag
-glyph is typeset on a @code{Stem}. Valid options include @code{'()}
-for standard flags, @code{'mensural} and @code{'no-flag}, which
-switches off the flag.")
(font-encoding ,symbol? "The font encoding is the broadest
category for selecting a font. Currently, only lilypond's system
fonts (Emmentaler) are using this property. Available
include @code{upright}, @code{italic}, @code{caps}.")
(font-size ,number? "The font size, compared to the
@q{normal}@tie{}size. @code{0}@tie{}is style-sheet's normal size,
-@code{-1} is smaller, @code{+1} is bigger. Each step of@tie{}1 is
+@w{@code{-1}} is smaller, @code{+1} is bigger. Each step of@tie{}1 is
approximately 12% larger; 6@tie{}steps are exactly a factor@tie{}2
larger. Fractional values are allowed.")
(footnote-text ,markup? "A footnote for the grob.")
Default@tie{}0.
@item
@code{label-dir} -- Side to which the fret label is attached.
-@code{-1}, @code{#LEFT}, or @code{#DOWN} for left or down; @code{1},
-@code{#RIGHT}, or @code{#UP} for right or up. Default @code{#RIGHT}.
+@w{@code{-1}}, @code{LEFT}, or @code{DOWN} for left or down; @code{1},
+@code{RIGHT}, or @code{UP} for right or up. Default @code{RIGHT}.
@item
@code{mute-string} -- Character string to be used to indicate muted
string. Default @code{\"x\"}.
@itemize @bullet
@item
-@code{box-offset} -- Vertical shift of the center of flat/sharp pedal
-boxes above/below the horizontal line. Default value@tie{}0.8.
+@code{box-offset} -- Vertical shift of the center of flat/@/sharp pedal
+boxes above/@/below the horizontal line. Default value@tie{}0.8.
@item
@code{box-width} -- Width of each pedal box. Default value@tie{}0.4.
@item
(right-padding ,ly:dimension? "Space to insert on the right side
of an object (e.g., between note and its accidentals).")
(rotation ,list? "Number of degrees to rotate this object, and
-what point to rotate around. For example, @code{#'(45 0 0)} rotates
+what point to rotate around. For example, @code{'(45 0 0)} rotates
by 45 degrees around the center of this object.")
(round-up-to-longer-rest ,boolean? "Displays the longer multi-measure
rest when the length of a measure is between two values of
(script-priority ,number? "A sorting key that determines in what
order a script is within a stack of scripts.")
(self-alignment-X ,number? "Specify alignment of an object. The
-value @code{-1} means left aligned, @code{0}@tie{}centered, and
+value @w{@code{-1}} means left aligned, @code{0}@tie{}centered, and
@code{1}@tie{}right-aligned in X@tie{}direction. Other numerical
values may also be specified.")
(self-alignment-Y ,number? "Like @code{self-alignment-X} but for
shortest note playing here.")
(shortest-starter-duration ,ly:moment? "The duration of the
shortest note that starts here.")
- (side-axis ,number? "If the value is @code{#X} (or
+ (side-axis ,number? "If the value is @code{X} (or
equivalently@tie{}@code{0}), the object is placed horizontally next to
-the other object. If the value is @code{#Y} or@tie{}@code{1}, it is
+the other object. If the value is @code{Y} or@tie{}@code{1}, it is
placed vertically.")
(side-relative-direction ,ly:dir? "Multiply direction of
@code{direction-source} with this to get the direction of this
override:
@example
-\\override MultiMeasureRest #'spacing-pair = #'(staff-bar . staff-bar)
+\\override MultiMeasureRest
+ #'spacing-pair = #'(staff-bar . staff-bar)
@end example")
(spanner-id ,string? "An identifier to distinguish concurrent spanners.")
(springs-and-rods ,boolean? "Dummy variable for triggering
structure.")
(stem-attachment ,number-pair? "An @code{(@var{x} . @var{y})}
pair where the stem attaches to the notehead.")
- (stem-begin-position ,number? "Where does the stem begin (the
-position of the support-head)?")
- (stem-end-position ,number? "Where does the stem end (the end is
-opposite to the support-head)?")
+ (stem-begin-position ,number? "User override for the
+begin position of a stem.")
;;[TODO: doco]
(stem-spacing-correction ,number? "Optical correction amount for
stems that are placed in tight configurations. For opposite
@var{dir})} pairs, indicating the desired tie configuration, where
@var{position} is the offset from the center of the staff in staff
space and @var{dir} indicates the direction of the tie
-(@code{1}=>up, @code{-1}=>down, @code{0}=>center). A non-pair entry
+(@code{1}=>up, @w{@code{-1}}=>down, @code{0}=>center). A non-pair entry
in the list causes the corresponding tie to be formatted
automatically.")
(to-barline ,boolean? "If true, the spanner will stop at the bar
(bars ,ly:grob-array? "An array of bar line pointers.")
(beam ,ly:grob? "A pointer to the beam, if applicable.")
+ (bound-alignment-interfaces ,list "Interfaces to be used
+for positioning elements that align with a column.")
(bounded-by-me ,ly:grob-array? "An array of spanners that have this
-column as start/begin point. Only columns that have grobs or act as
+column as start/@/begin point. Only columns that have grobs or act as
bounds are spaced.")
(bracket ,ly:grob? "The bracket for a number.")
in addition to notes and stems.")
(figures ,ly:grob-array? "Figured bass objects for continuation line.")
+ (flag ,ly:grob? "A pointer to a @code{Flag} object.")
(glissando-index ,integer? "The index of a glissando in its note
column.")
(spanner-broken ,boolean? "Indicates whether spanner
alignment should be broken after the current spanner.")
(spanner-placement ,ly:dir? "The place of an annotation on a spanner.
-LEFT is for the first spanner, and RIGHT is for the last. CENTER will
-place it on the broken spanner that falls closest to the center of the length
-of the entire spanner, although this behavior is unpredictable in situations
-with lots of rhythmic diversity. For predictable results, use LEFT and RIGHT.")
+@code{LEFT} is for the first spanner, and @code{RIGHT} is for the last.
+@code{CENTER} will place it on the broken spanner that falls closest to the
+center of the length of the entire spanner, although this behavior is
+unpredictable in situations with lots of rhythmic diversity. For predictable
+results, use @code{LEFT} and @code{RIGHT}.")
(staff-grouper ,ly:grob? "The staff grouper we belong to.")
(staff-symbol ,ly:grob? "The staff symbol grob that we are in.")
(stem ,ly:grob? "A pointer to a @code{Stem} object.")
(cavum ,boolean? "Is this neume outlined?")
(context-info ,integer? "Within a ligature, the final glyph or shape of
-a head may be affected by the left and/or right neighbour head.
+a head may be affected by the left and/@/or right neighbour head.
@code{context-info} holds for each head such information about the left and
right neighbour, encoded as a bit mask.")
(clip-edges . #t)
(collision-interfaces . (beam-interface
clef-interface
+ flag-interface
inline-accidental-interface
key-signature-interface
note-head-interface
(key-signature . (minimum-space . 3.5))
(time-signature . (minimum-space . 4.2))
(first-note . (minimum-fixed-space . 5.0))
- (next-note . (extra-space . 0.5))
+ (next-note . (extra-space . 1.0))
(right-edge . (extra-space . 0.5))))
(stencil . ,ly:clef::print)
(Y-offset . ,ly:staff-symbol-referencer::callback)
(time-signature . (minimum-space . 4.2))
(custos . (minimum-space . 0.0))
(first-note . (minimum-fixed-space . 3.0))
- (next-note . (extra-space . 0.5))
+ (next-note . (extra-space . 1.0))
(right-edge . (extra-space . 0.5))))
(stencil . ,ly:clef::print)
(Y-offset . ,ly:staff-symbol-referencer::callback)
(key-signature . (minimum-space . 3.5))
(time-signature . (minimum-space . 4.2))
(first-note . (minimum-fixed-space . 5.0))
- (next-note . (extra-space . 0.5))
+ (next-note . (extra-space . 1.0))
(right-edge . (extra-space . 0.5))))
(stencil . ,ly:clef::print)
(Y-offset . ,ly:staff-symbol-referencer::callback)
;; sync with TextScript (?)
(avoid-slur . around)
- (cross-staff . ,ly:side-position-interface::calc-cross-staff)
+ (cross-staff . ,script-or-side-position-cross-staff)
(direction . ,ly:script-interface::calc-direction)
(font-encoding . fetaText)
(font-size . -5) ; don't overlap when next to heads.
text-interface
text-script-interface))))))
+ (Flag
+ . (
+ (stencil . ,ly:flag::print)
+ (X-extent . ,ly:flag::width)
+ (X-offset . ,ly:flag::calc-x-offset)
+ (Y-offset . ,ly:flag::calc-y-offset)
+ (meta . ((class . Item)
+ (interfaces . (flag-interface
+ font-interface))))))
+
(FootnoteItem
. (
(annotation-balloon . #f)
(annotation-line . #t)
+ (automatically-numbered . ,(grob::calc-property-by-copy 'automatically-numbered))
(break-visibility . ,inherit-y-parent-visibility)
(footnote-text . ,(grob::calc-property-by-copy 'footnote-text))
(stencil . ,ly:balloon-interface::print)
. (
(annotation-balloon . #f)
(annotation-line . #t)
+ (automatically-numbered . ,(grob::calc-property-by-copy 'automatically-numbered))
(footnote-text . ,(grob::calc-property-by-copy 'footnote-text))
(spanner-placement . ,LEFT)
(stencil . ,ly:balloon-interface::print-spanner)
(fret-diagram-details . ((finger-code . below-string)))
(stencil . ,fret-board::calc-stencil)
(extra-spacing-height . (0.2 . -0.2))
+ (extra-spacing-width . (-0.5 . 0.5))
(meta . ((class . Item)
(interfaces . (chord-name-interface
font-interface
(Glissando
. (
(after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
- (bound-details . ((right . ((attach-dir . ,CENTER)
- (padding . 1.5)
+ (bound-details . ((right . ((attach-dir . ,LEFT)
+ (end-on-accidental . #t)
+ (padding . 0.5)
))
- (left . ((attach-dir . ,CENTER)
- (padding . 1.5)
+ (left . ((attach-dir . ,RIGHT)
+ (padding . 0.5)
))
))
(gap . 0.5)
(key-signature . (extra-space . 0.5))
(cue-clef . (extra-space . 0.5))
(right-edge . (extra-space . 0.5))
- (first-note . (fixed-space . 2.5))))
+ (first-note . (semi-fixed-space . 2.5))))
(stencil . ,ly:key-signature-interface::print)
(extra-spacing-width . (0.0 . 0.5))
(Y-offset . ,ly:staff-symbol-referencer::callback)
(staff-bar . (extra-space . 1.1))
(cue-clef . (extra-space . 0.5))
(right-edge . (extra-space . 0.5))
- (first-note . (fixed-space . 2.5))))
+ (first-note . (semi-fixed-space . 2.5))))
(stencil . ,ly:key-signature-interface::print)
(extra-spacing-width . (0.0 . 0.5))
(Y-offset . ,ly:staff-symbol-referencer::callback)
(NoteColumn
. (
(axes . (,X ,Y))
+ (bound-alignment-interfaces . (rhythmic-head-interface stem-interface))
(horizontal-skylines . ,ly:separation-item::calc-skylines)
(skyline-vertical-padding . 0.15)
(X-extent . ,ly:axis-group-interface::width)
(allow-loose-spacing . #t)
(axes . (,X))
(before-line-breaking . ,ly:paper-column::before-line-breaking)
+ (bound-alignment-interfaces . (note-column-interface))
(horizontal-skylines . ,ly:separation-item::calc-skylines)
(keep-inside-line . #t)
;; (stencil . ,ly:paper-column::print)
(side-axis . ,Y)
;; padding set in script definitions.
+ (slur-padding . 0.2)
(staff-padding . 0.25)
(stencil . ,ly:script-interface::print)
(direction . ,ly:stem::calc-direction)
(duration-log . ,stem::calc-duration-log)
- (flag . ,ly:stem::calc-flag)
- (length . ,ly:stem::calc-length)
+ (length . ,stem::length)
(neutral-direction . ,DOWN)
(positioning-done . ,ly:stem::calc-positioning-done)
- (stem-begin-position . ,ly:stem::calc-stem-begin-position)
- (stem-end-position . ,ly:stem::calc-stem-end-position)
(stem-info . ,ly:stem::calc-stem-info)
+ (stem-begin-position . ,ly:stem::calc-stem-begin-position)
(stencil . ,ly:stem::print)
(thickness . 1.3)
(X-extent . ,ly:stem::width)
(Y-extent . ,ly:stem::height)
(Y-offset . ,ly:staff-symbol-referencer::callback)
(meta . ((class . Item)
- (interfaces . (font-interface
- stem-interface))))))
+ (interfaces . (stem-interface))))))
(StemTremolo
. (
(stencil . ,ly:stem-tremolo::print)
(style . ,ly:stem-tremolo::calc-style)
(X-extent . ,ly:stem-tremolo::width)
+ (Y-offset . ,ly:stem-tremolo::calc-y-offset)
(meta . ((class . Item)
(interfaces . (stem-tremolo-interface))))))
(StringNumber
. (
(avoid-slur . around)
+ (cross-staff . ,script-or-side-position-cross-staff)
(font-encoding . fetaText)
(font-size . -5) ; don't overlap when next to heads.
(padding . 0.5)
(TextScript
. (
(avoid-slur . around)
- (cross-staff . ,ly:script-interface::calc-cross-staff)
+ (cross-staff . ,script-or-side-position-cross-staff)
(direction . ,DOWN)
(extra-spacing-width . (+inf.0 . -inf.0))
(outside-staff-priority . 450)
(non-musical . #t)
(space-alist . (
(cue-clef . (extra-space . 1.5))
- (first-note . (fixed-space . 2.0))
+ (first-note . (semi-fixed-space . 2.0))
(right-edge . (extra-space . 0.5))
(staff-bar . (minimum-space . 2.0))))
(stencil . ,ly:time-signature::print)
ly:note-head::print
ly:dots::print
ly:clef::print
+ ly:flag::print
+ default-flag
+ normal-flag
+ mensural-flag
+ no-flag
+ modern-straight-flag
+ old-straight-flag
ly:key-signature-interface::print
ly:percent-repeat-item-interface::beat-slash
ly:text-interface::print
(,ly:accidental-interface::height . ,ly:accidental-interface::pure-height)
(,ly:axis-group-interface::calc-staff-staff-spacing . ,ly:axis-group-interface::calc-pure-staff-staff-spacing)
(,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
+ (,ly:beam::rest-collision-callback . ,ly:beam::pure-rest-collision-callback)
(,ly:grob::stencil-height . ,pure-stencil-height)
(,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
(,ly:rest-collision::force-shift-callback-rest . ,pure-chain-offset-callback)
(,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
(,ly:slur::height . ,ly:slur::pure-height)
(,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
+ (,ly:stem::calc-stem-begin-position . ,ly:stem::pure-calc-stem-begin-position)
+ (,ly:stem::calc-stem-end-position . ,ly:stem::pure-calc-stem-end-position)
+ (,stem::length . ,stem::pure-length)
(,ly:stem::height . ,ly:stem::pure-height)
+ (,ly:stem-tremolo::calc-y-offset . ,ly:stem-tremolo::pure-calc-y-offset)
(,ly:system::height . ,ly:system::calc-pure-height)))
(define pure-functions
(list
parenthesize-elements
laissez-vibrer::print
+ ly:flag::calc-y-offset
ly:rest::y-offset-callback
ly:staff-symbol-referencer::callback
ly:staff-symbol::height))
(let ((extent-callback (ly:grob-property-data grob 'Y-extent)))
(not (eq? #f
(or
+ (ly:unpure-pure-container? extent-callback)
(pair? extent-callback)
(memq extent-callback pure-functions)
(and
(assq stencil pure-print-to-height-conversions)
(ly:stencil? stencil)))))))))
+;; hideous code dup below - to be cleaned up when call pure functino
+;; is eliminated and lilypond works entirely from unpure-pure-containers
+
(define-public (call-pure-function unpure args start end)
- (if (ly:simple-closure? unpure)
- (ly:eval-simple-closure (car args) unpure start end)
- (if (not (procedure? unpure))
- unpure
- (if (memq unpure pure-functions)
- (apply unpure args)
- (let ((pure (assq unpure pure-conversions-alist)))
- (if pure
- (apply (cdr pure)
- (append
- (list (car args) start end)
- (cdr args)))))))))
+ (if (ly:unpure-pure-container? unpure)
+ (let ((unpure (ly:unpure-pure-container-pure-part unpure)))
+ (if (ly:simple-closure? unpure)
+ (ly:eval-simple-closure (car args) unpure start end)
+ (if (not (procedure? unpure))
+ unpure
+ (apply (cdr pure)
+ (append
+ (list (car args) start end)
+ (cdr args))))))
+ (if (ly:simple-closure? unpure)
+ (ly:eval-simple-closure (car args) unpure start end)
+ (if (not (procedure? unpure))
+ unpure
+ (if (memq unpure pure-functions)
+ (apply unpure args)
+ (let ((pure (assq unpure pure-conversions-alist)))
+ (if pure
+ (apply (cdr pure)
+ (append
+ (list (car args) start end)
+ (cdr args))))))))))
;;; functions that take a markup as their last argument.
;;;
;;; args-signature
-;;; the arguments signature, i.e. a list of type predicates which
+;;; the arguments signature, i.e., a list of type predicates which
;;; are used to type check the arguments, and also to define the general
;;; argument types (markup, markup-list, scheme) that the command is
;;; expecting.
;;;
;;; category
;;; for documentation purpose, builtin markup commands are grouped by
-;;; category. This can be any symbol. When documentation is generated,
+;;; category. This can be any symbol. When documentation is generated,
;;; the symbol is converted to a capitalized string, where hyphens are
;;; replaced by spaces.
;;;
;;; property-bindings
;;; this is used both for documentation generation, and to ease
-;;; programming the command itself. It is list of
+;;; programming the command itself. It is list of
;;; (property-name default-value)
;;; or (property-name)
-;;; elements. Each property is looked-up in the `props' argument, and
+;;; elements. Each property is looked-up in the `props' argument, and
;;; the symbol naming the property is bound to its value.
;;; When the property is not found in `props', then the symbol is bound
-;;; to the given default value. When no default value is given, #f is
+;;; to the given default value. When no default value is given, #f is
;;; used instead.
;;; Thus, using the following property bindings:
;;; ((thickness 0.1)
;;; ..body..)
;;; When a command `B' internally calls an other command `A', it may
;;; desirable to see in `B' documentation all the properties and
-;;; default values used by `A'. In that case, add `A-markup' to the
-;;; property-bindings of B. (This is used when generating
+;;; default values used by `A'. In that case, add `A-markup' to the
+;;; property-bindings of B. (This is used when generating
;;; documentation, but won't create bindings.)
;;;
;;; documentation-string
;;; the command documentation string (used to generate manuals)
;;;
;;; body
-;;; the command body. The function is supposed to return a stencil.
+;;; the command body. The function is supposed to return a stencil.
;;;
;;; Each markup command definition shall have a documentation string
;;; with description, syntax and example.
"
@cindex referencing page numbers in text
-Add a link to the page @var{page-number} around @var{arg}. This only works in
-the PDF backend.
+Add a link to the page @var{page-number} around @var{arg}. This only works
+in the PDF backend.
@lilypond[verbatim,quote]
\\markup {
"
@cindex referencing page labels in text
-Add a link to the page holding label @var{label} around @var{arg}. This
+Add a link to the page holding label @var{label} around @var{arg}. This
only works in the PDF backend.
@lilypond[verbatim,quote]
\\markup {
- \\with-link #\"label\" { \\italic { This links to the page containing the label... } }
+ \\with-link #\"label\" {
+ \\italic { This links to the page containing the label... }
+ }
}
@end lilypond"
(let* ((arg-stencil (interpret-markup layout props arg))
indent = 0.0\\cm
\\context {
\\Score
- \\override RehearsalMark #'break-align-symbols =
- #'(time-signature key-signature)
- \\override RehearsalMark #'self-alignment-X = #LEFT
+ \\override RehearsalMark
+ #'break-align-symbols = #'(time-signature key-signature)
+ \\override RehearsalMark
+ #'self-alignment-X = #LEFT
}
\\context {
\\Staff
- \\override TimeSignature #'break-align-anchor-alignment = #LEFT
+ \\override TimeSignature
+ #'break-align-anchor-alignment = #LEFT
}
}
}
(define-markup-command (tied-lyric layout props str)
(string?)
#:category music
+ #:properties ((word-space))
"
@cindex simple text strings with tie characters
@end lilypond"
(if (string-contains str "~")
(let*
- ((parts (string-split str #\~))
- (tie-str (ly:wide-char->utf-8 #x203f))
+ ((half-space (/ word-space 2))
+ (parts (string-split str #\~))
+ (tie-str (markup #:hspace half-space
+ #:musicglyph "ties.lyric"
+ #:hspace half-space))
(joined (list-join parts tie-str))
(join-stencil (interpret-markup layout props tie-str))
)
(interpret-markup layout
- (prepend-alist-chain
- 'word-space
- (/ (interval-length (ly:stencil-extent join-stencil X)) -3.5)
- props)
- (make-line-markup joined)))
- ;(map (lambda (s) (interpret-markup layout props s)) parts))
+ props
+ (make-concat-markup joined)))
(interpret-markup layout props str)))
(define-public empty-markup
\\header {
title = \"My title\"
myText = \"Lorem ipsum dolor sit amet, consectetur adipisicing
- elit, sed do eiusmod tempor incididunt ut labore et dolore magna
- aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat.\"
+ elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat.\"
}
\\paper {
"
@cindex setting horizontal text alignment
-Set horizontal alignment. If @var{dir} is @code{-1}, then it is
+Set horizontal alignment. If @var{dir} is @w{@code{-1}}, then it is
left-aligned, while @code{+1} is right. Values in between interpolate
alignment accordingly.
(interpret-markup layout props (list anonymous-with-signature arg))))
(define-markup-command (footnote layout props mkup note)
+ (markup? markup?)
+ #:category other
+ "Have footnote @var{note} act as an annotation to the markup @var{mkup}.
+
+@lilypond[verbatim,quote]
+\\markup {
+ \\auto-footnote a b
+ \\override #'(padding . 0.2)
+ \\auto-footnote c d
+}
+@end lilypond
+The footnote will not be annotated automatically."
+ (ly:stencil-combine-at-edge
+ (interpret-markup layout props mkup)
+ X
+ RIGHT
+ (ly:make-stencil
+ `(footnote (gensym "footnote") #f ,(interpret-markup layout props note))
+ '(0 . 0)
+ '(0 . 0))
+ 0.0))
+
+(define-markup-command (auto-footnote layout props mkup note)
(markup? markup?)
#:category other
#:properties ((raise 0.5)
@lilypond[verbatim,quote]
\\markup {
- \\footnote a b
+ \\auto-footnote a b
\\override #'(padding . 0.2)
- \\footnote c d
+ \\auto-footnote c d
}
-@end lilypond"
+@end lilypond
+The footnote will be annotated automatically."
(let* ((markup-stencil (interpret-markup layout props mkup))
(auto-numbering (ly:output-def-lookup layout
'footnote-auto-numbering))
(ly:stencil-add
main-stencil
(ly:make-stencil
- `(footnote ,footnote-hash ,(interpret-markup layout props note))
+ `(footnote ,footnote-hash #t ,(interpret-markup layout props note))
'(0 . 0)
'(0 . 0)))))
@lilypond[verbatim,quote]
\\markup {
\\huge \\bold \\sans \\caps {
- Some text with font overrides
+ huge bold sans caps
\\hspace #2
\\normal-text {
- Default text, same font-size
+ huge normal
}
\\hspace #2
- More text as before
+ as before
}
}
@end lilypond"
"
@cindex referencing page numbers in text
-Reference to a page number. @var{label} is the label set on the referenced
+Reference to a page number. @var{label} is the label set on the referenced
page (using the @code{\\label} command), @var{gauge} a markup used to estimate
the maximum width of the page number, and @var{default} the value to display
when @var{label} is not found."
\\fill-with-pattern #1.5 #CENTER - left right
\\null
\"left-aligned :\"
- \\override #'(line-width . 50) \\fill-with-pattern #2 #LEFT : left first
- \\override #'(line-width . 50) \\fill-with-pattern #2 #LEFT : left second
+ \\override #'(line-width . 50)
+ \\fill-with-pattern #2 #LEFT : left first
+ \\override #'(line-width . 50)
+ \\fill-with-pattern #2 #LEFT : left second
}
@end lilypond"
(let* ((pattern-x-extent (ly:stencil-extent (interpret-markup layout props pattern) X))
(with @code{+} sign).")
(augmented-slash ,boolean? "This figure is for an augmented figured bass
(back-slashed number).")
+ (automatically-numbered ,boolean? "Should a footnote be automatically
+numbered?")
(autosplit-end ,boolean? "Duration of event was truncated by automatic
splitting in @code{Completion_heads_engraver}.")
(ArpeggioEvent
. ((description . "Make an arpeggio on this note.
-Syntax: @var{note}@code{-\\arpeggio}")
+Syntax: @w{@var{note}@code{-\\arpeggio}}")
(types . (general-music arpeggio-event event))
))
Syntax: @var{note}@code{x}@code{y}, where @code{x} is a direction
(@code{^} for up or @code{_} for down), or LilyPond's choice
(no direction specified), and where @code{y} is an articulation
-(such as @code{-.}, @code{->}, @code{\\tenuto}, @code{\\downbow}).
+(such as @w{@code{-.}}, @w{@code{->}}, @code{\\tenuto}, @code{\\downbow}).
See the Notation Reference for details.")
(types . (general-music event articulation-event script-event))
))
))
(BendAfterEvent
- . ((description . "A drop/fall/doit jazz articulation.")
+ . ((description . "A drop/@/fall/@/doit jazz articulation.")
(types . (general-music bend-after-event event))))
(BreathingEvent
(TieEvent
. ((description . "A tie.
-Syntax: @var{note}@code{-~}")
+Syntax: @w{@var{note}@code{-~}}")
(types . (general-music tie-event event))
))
'())))
(if (pair? alist)
(begin
- (if (ly:get-option 'verbose)
- (ly:message (_ "Using `~a' note names...") str))
+ (ly:debug (_ "Using `~a' note names...") str)
(set! pitchnames alist)
(ly:parser-set-note-names parser alist))
(ly:warning (_ "Could not find language `~a'. Ignoring.") str))))
(define-public (ly:all-output-backend-commands)
"Return the list of extra output backend commands that
-are used internally in @file{lily/stencil-interpret.cc}."
+are used internally in @file{lily/@/stencil-interpret.cc}."
'(color
combine-stencil
delay-stencil-evaluation
"Make a woodwind-instrument diagram. For example, say
@example
-\\markup \\woodwind-diagram #'oboe #'((lh . (d ees)) (cc . (five3qT1q)) (rh . (gis)))
+\\markup \\woodwind-diagram
+ #'oboe #'((lh . (d ees)) (cc . (five3qT1q)) (rh . (gis)))
@end example
@noindent
(node-children node)))
(define (processing name)
- (ly:message (_ "Processing ~S...") name))
+ (ly:basic-progress (_ "Processing ~S...") name))
(define (self-evaluating? x)
(or (number? x) (string? x) (procedure? x) (boolean? x)))
;;;; notably the old-straight-flag and the modern-straight-flag styles.
-(define-public (no-flag stem-grob)
+(define-public (no-flag grob)
"No flag: Simply return empty stencil."
empty-stencil)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(define-public (add-stroke-straight stencil stem-grob dir log stroke-style
+(define-public (add-stroke-straight stencil grob dir log stroke-style
offset length thickness stroke-thickness)
"Add the stroke for acciaccatura to the given flag stencil.
The stroke starts for up-flags at `upper-end-of-flag + (0,length/2)'
the angle! Other combinations don't look as good.
For down-stems the y-coordinates are simply mirrored."
- (let* ((start (offset-add offset (cons 0 (* (/ length 2) dir))))
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (start (offset-add offset (cons 0 (* (/ length 2) dir))))
(end (offset-add (cons 0 (cdr offset))
(cons (- (/ (car offset) 2)) (* (- (+ thickness (car offset))) dir))))
(stroke (make-line-stencil stroke-thickness (car start) (cdr start) (car end) (cdr end))))
All lengths are scaled according to the font size of the note."
- (lambda (stem-grob)
- (let* ((log (ly:grob-property stem-grob 'duration-log))
+ (lambda (grob)
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (log (ly:grob-property stem-grob 'duration-log))
(dir (ly:grob-property stem-grob 'direction))
(stem-up (eqv? dir UP))
- (layout (ly:grob-layout stem-grob))
+ (layout (ly:grob-layout grob))
; scale with the note size (e.g. for grace notes)
- (factor (magstep (ly:grob-property stem-grob 'font-size 0)))
+ (factor (magstep (ly:grob-property grob 'font-size 0)))
(grob-stem-thickness (ly:grob-property stem-grob 'thickness))
(line-thickness (ly:output-def-lookup layout 'line-thickness))
(half-stem-thickness (/ (* grob-stem-thickness line-thickness) 2))
(stencil (ly:round-filled-polygon points half-stem-thickness))
; Log for 1/8 is 3, so we need to subtract 3
(flag-stencil (buildflag stencil (- log 3) stencil spacing))
- (stroke-style (ly:grob-property stem-grob 'stroke-style)))
+ (stroke-style (ly:grob-property grob 'stroke-style)))
(if (equal? stroke-style "grace")
- (add-stroke-straight flag-stencil stem-grob
+ (add-stroke-straight flag-stencil grob
dir log
stroke-style
flag-end flag-length
(* half-stem-thickness 2))
flag-stencil))))
-(define-public (modern-straight-flag stem-grob)
+(define-public (modern-straight-flag grob)
"Modern straight flag style (for composers like Stockhausen, Boulez, etc.).
The angles are 18 and 22 degrees and thus smaller than for the ancient style
of Bach, etc."
- ((straight-flag 0.55 1 -18 1.1 22 1.2) stem-grob))
+ ((straight-flag 0.55 1 -18 1.1 22 1.2) grob))
-(define-public (old-straight-flag stem-grob)
+(define-public (old-straight-flag grob)
"Old straight flag style (for composers like Bach). The angles of the
flags are both 45 degrees."
- ((straight-flag 0.55 1 -45 1.2 45 1.4) stem-grob))
+ ((straight-flag 0.55 1 -45 1.2 45 1.4) grob))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; NOTE: By default, lilypond uses the C++ method Stem::calc-flag
-; (ly:stem::calc-flag is the corresponding Scheme interface) to generate the
+; NOTE: By default, lilypond uses the C++ method Flag::stencil
+; (ly:flag::stencil is the corresponding Scheme interface) to generate the
; flag stencil. The following functions are simply a reimplementation in
; Scheme, so that one has that functionality available in Scheme, if one
; wants to write a flag style, which modifies one of the standard flags
; by some stencil operations.
-(define-public (add-stroke-glyph stencil stem-grob dir stroke-style flag-style)
+(define-public (add-stroke-glyph stencil grob dir stroke-style flag-style)
"Load and add a stroke (represented by a glyph in the font) to the given
flag stencil."
(if (not (string? stroke-style))
stencil
; Otherwise: look up the stroke glyph and combine it with the flag
- (let* ((font-char (string-append "flags." flag-style dir stroke-style))
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (font-char (string-append "flags." flag-style dir stroke-style))
(alt-font-char (string-append "flags." dir stroke-style))
- (font (ly:grob-default-font stem-grob))
+ (font (ly:grob-default-font grob))
(tmpstencil (ly:font-get-glyph font font-char))
(stroke-stencil (if (ly:stencil-empty? tmpstencil)
(ly:font-get-glyph font alt-font-char)
(ly:stencil-add stencil stroke-stencil)))))
-(define-public (retrieve-glyph-flag flag-style dir dir-modifier stem-grob)
+(define-public (retrieve-glyph-flag flag-style dir dir-modifier grob)
"Load the correct flag glyph from the font."
- (let* ((log (ly:grob-property stem-grob 'duration-log))
- (font (ly:grob-default-font stem-grob))
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (log (ly:grob-property stem-grob 'duration-log))
+ (font (ly:grob-default-font grob))
(font-char (string-append "flags." flag-style dir dir-modifier (number->string log)))
(flag (ly:font-get-glyph font font-char)))
(if (ly:stencil-empty? flag)
flag))
-(define-public (create-glyph-flag flag-style dir-modifier stem-grob)
+(define-public (create-glyph-flag flag-style dir-modifier grob)
"Create a flag stencil by looking up the glyph from the font."
- (let* ((dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "u" "d"))
- (flag (retrieve-glyph-flag flag-style dir dir-modifier stem-grob))
- (stroke-style (ly:grob-property stem-grob 'stroke-style)))
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "u" "d"))
+ (flag (retrieve-glyph-flag flag-style dir dir-modifier grob))
+ (stroke-style (ly:grob-property grob 'stroke-style)))
(if (null? stroke-style)
flag
- (add-stroke-glyph flag stem-grob dir stroke-style flag-style))))
+ (add-stroke-glyph flag grob dir stroke-style flag-style))))
-(define-public (mensural-flag stem-grob)
+(define-public (mensural-flag grob)
"Mensural flags: Create the flag stencil by loading the glyph from the font.
Flags are always aligned with staff lines, so we need to check the end point
of the stem: For stems ending on staff lines, use different flags than for
staff line or between two staff lines. In other words, the inner end of
a flag always touches a staff line."
- (let* ((adjust #t)
- (stem-end (inexact->exact (round (ly:grob-property stem-grob 'stem-end-position))))
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (adjust #t)
+ (d (ly:grob-property stem-grob 'direction))
+ (ss (ly:staff-symbol-staff-space stem-grob))
+ (stem-end (inexact->exact (round (* (index-cell
+ (ly:grob-extent stem-grob
+ stem-grob
+ Y)
+ d)
+ (/ 2 ss)))))
; For some reason the stem-end is a real instead of an integer...
(dir-modifier (if (ly:position-on-line? stem-grob stem-end) "1" "0"))
(modifier (if adjust dir-modifier "2")))
- (create-glyph-flag "mensural" modifier stem-grob)))
+ (create-glyph-flag "mensural" modifier grob)))
-(define-public ((glyph-flag flag-style) stem-grob)
+(define-public ((glyph-flag flag-style) grob)
"Simulatesthe default way of generating flags: Look up glyphs
@code{flags.style[ud][1234]} from the feta font and use it for the flag
stencil."
- (create-glyph-flag flag-style "" stem-grob))
+ (create-glyph-flag flag-style "" grob))
-(define-public (normal-flag stem-grob)
+(define-public (normal-flag grob)
"Create a default flag."
- (create-glyph-flag "" "" stem-grob))
+ (create-glyph-flag "" "" grob))
-(define-public (default-flag stem-grob)
+(define-public (default-flag grob)
"Create a flag stencil for the stem. Its style will be derived from the
-@code{'flag-style} Stem property. By default, @code{lilypond} uses a
+@code{'style} Flag property. By default, @code{lilypond} uses a
C++ Function (which is slightly faster) to do exactly the same as this
function. However, if one wants to modify the default flags, this function
can be used to obtain the default flag stencil, which can then be modified
at will. The correct way to do this is:
@example
-\\override Stem #'flag = #default-flag
-\\override Stem #'flag-style = #'mensural
+\\override Flag #'stencil = #default-flag
+\\override Flag #'style = #'mensural
@end example
"
- (let* ((flag-style-symbol (ly:grob-property stem-grob 'flag-style))
+ (let* ((stem-grob (ly:grob-parent grob X))
+ (flag-style-symbol (ly:grob-property grob 'style))
(flag-style (if (symbol? flag-style-symbol)
(symbol->string flag-style-symbol)
"")))
(cond
- ((equal? flag-style "") (normal-flag stem-grob))
- ((equal? flag-style "mensural") (mensural-flag stem-grob))
- ((equal? flag-style "no-flag") (no-flag stem-grob))
- (else ((glyph-flag flag-style) stem-grob)))))
+ ((equal? flag-style "") (normal-flag grob))
+ ((equal? flag-style "mensural") (mensural-flag grob))
+ ((equal? flag-style "no-flag") (no-flag grob))
+ (else ((glyph-flag flag-style) grob)))))
@var{design-size-alist} is a list of @code{(rounded . designsize)}.
@code{rounded} is a suffix for font filenames, while @code{designsize}
should be the actual design size. The latter is used for text fonts
-loaded through pango/fontconfig.
+loaded through pango/@/fontconfig.
@item
@var{factor} is a size factor relative to the default size that is being
should be separated by spaces.
@item
-Fingerings are given by following the fret number with a @code{-},
+Fingerings are given by following the fret number with a @w{@code{-},}
followed by the finger indicator, e.g. @samp{3-2} for playing the third
fret with the second finger.
@item
Where a barre indicator is desired, follow the fret (or fingering) symbol
-with @code{-(} to start a barre and @code{-)} to end the barre.
+with @w{@code{-(}} to start a barre and @w{@code{-)}} to end the barre.
@end itemize"
;; TODO -- change syntax to fret\string-finger
scaling))
(define-public (version-not-seen-message input-file-name)
- (ly:message
- "~a:0: ~a ~a"
- input-file-name
- (_ "warning:")
- (format #f
- (_ "no \\version statement found, please add~afor future compatibility")
- (format #f "\n\n\\version ~s\n\n" (lilypond-version)))))
+ (ly:warning-located
+ (ly:format "~a:0" input-file-name)
+ (_ "no \\version statement found, please add~afor future compatibility")
+ (format #f "\n\n\\version ~s\n\n" (lilypond-version))))
(define-public (old-relative-not-used-message input-file-name)
- (ly:message
- "~a:0: ~a ~a"
- input-file-name
- (_ "warning:")
+ (ly:warning-located
+ (ly:format "~a:0" input-file-name)
(_ "old relative compatibility not used")))
(debug-enable 'debug)
(begin
(debug-enable 'backtrace)
- (debug-enable 'show-file-name)))
+ (debug-set! show-file-name #t)))
(define-public PLATFORM
(string->symbol
"If string FOO is given as argument, redirect
output to log file `FOO.log'.")
(midi-extension ,(if (eq? PLATFORM 'windows)
- "mid"
- "midi")
+ "mid"
+ "midi")
"Set the default file extension for MIDI output
file to given string.")
(music-strings-to-paths #f
`FILE.graph'.")
(trace-scheme-coverage #f
"Record coverage of Scheme files in `FILE.cov'.")
- (verbose ,(ly:command-line-verbose?)
-"Value of the --verbose flag (read-only).")
+ (verbose ,(ly:verbose-output?)
+"Verbose output, i.e. loglevel at least DEBUG (read-only).")
(warning-as-error #f
"Change all warning and programming_error
messages into errors.")
;; initialization depend on these options.
(for-each (lambda (x)
- (ly:add-option (car x) (cadr x) (caddr x)))
- scheme-options-definitions)
+ (ly:add-option (car x) (cadr x) (caddr x)))
+ scheme-options-definitions)
(for-each (lambda (x)
- (ly:set-option (car x) (cdr x)))
- (eval-string (ly:command-line-options)))
+ (ly:set-option (car x) (cdr x)))
+ (eval-string (ly:command-line-options)))
(debug-set! stack 0)
;;(set-debug-cell-accesses! 1000)
(use-modules (ice-9 regex)
- (ice-9 safe)
- (ice-9 format)
- (ice-9 rdelim)
- (ice-9 optargs)
- (oop goops)
- (srfi srfi-1)
- (srfi srfi-13)
- (srfi srfi-14)
- (scm clip-region)
- (scm memory-trace)
- (scm coverage))
+ (ice-9 safe)
+ (ice-9 format)
+ (ice-9 rdelim)
+ (ice-9 optargs)
+ (oop goops)
+ (srfi srfi-1)
+ (srfi srfi-13)
+ (srfi srfi-14)
+ (scm clip-region)
+ (scm memory-trace)
+ (scm coverage))
(define-public _ gettext)
;;; There are new modules defined in Guile V2.0 which we need to use.
(cond
((guile-v2)
- (if (ly:get-option 'verbose)
- (ly:message (_ "Using (ice-9 curried-definitions) module\n")))
+ (ly:debug (_ "Using (ice-9 curried-definitions) module\n"))
(use-modules (ice-9 curried-definitions)))
(else
- (if (ly:get-option 'verbose)
- (ly:message (_ "Guile 1.8\n")))))
+ (ly:debug (_ "Guile 1.8\n"))))
;; TODO add in modules for V1.8.7 deprecated in V2.0 and integrated
;; into Guile base code, like (ice-9 syncase).
;;; Debugging evaluator is slower. This should have a more sensible
;;; default.
+
(if (or (ly:get-option 'verbose)
- (ly:get-option 'trace-memory-frequency)
- (ly:get-option 'trace-scheme-coverage))
+ (ly:get-option 'trace-memory-frequency)
+ (ly:get-option 'trace-scheme-coverage))
(begin
(ly:set-option 'protected-scheme-parsing #f)
(debug-enable 'backtrace)
(define-public (ly:load x)
(let* ((file-name (%search-load-path x)))
- (if (ly:get-option 'verbose)
- (ly:progress "[~A" file-name))
+ (ly:debug "[~A" file-name)
(if (not file-name)
- (ly:error (_ "cannot find: ~A") x))
+ (ly:error (_ "cannot find: ~A") x))
(primitive-load-path file-name) ;; to support Guile V2 autocompile
+ ;; TODO: Any chance to use ly:debug here? Need to extend it to prevent
+ ;; a newline in this case
(if (ly:get-option 'verbose)
- (ly:progress "]\n"))))
+ (ly:progress "]\n"))))
(define-public DOS
(let ((platform (string-tokenize
- (vector-ref (uname) 0) char-set:letter+digit)))
+ (vector-ref (uname) 0) char-set:letter+digit)))
(if (null? (cdr platform)) #f
- (member (string-downcase (cadr platform)) '("95" "98" "me")))))
+ (member (string-downcase (cadr platform)) '("95" "98" "me")))))
(define (slashify x)
(if (string-index x #\\)
x
(string-regexp-substitute
- "//*" "/"
- (string-regexp-substitute "\\\\" "/" x))))
+ "//*" "/"
+ (string-regexp-substitute "\\\\" "/" x))))
(define-public (ly-getcwd)
(if (eq? PLATFORM 'windows)
(define-public (is-absolute? file-name)
(let ((file-name-length (string-length file-name)))
(if (= file-name-length 0)
- #f
- (or (eq? (string-ref file-name 0) #\/)
- (and (eq? PLATFORM 'windows)
- (> file-name-length 2)
- (eq? (string-ref file-name 1) #\:)
- (eq? (string-ref file-name 2) #\/))))))
+ #f
+ (or (eq? (string-ref file-name 0) #\/)
+ (and (eq? PLATFORM 'windows)
+ (> file-name-length 2)
+ (eq? (string-ref file-name 1) #\:)
+ (eq? (string-ref file-name 2) #\/))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; If necessary, emulate Guile V2 module_export_all! for Guile V1.8.n
(define (module-export-all! mod)
(define (fresh-interface!)
(let ((iface (make-module)))
- (set-module-name! iface (module-name mod))
- ;; for guile 2: (set-module-version! iface (module-version mod))
- (set-module-kind! iface 'interface)
- (set-module-public-interface! mod iface)
- iface))
+ (set-module-name! iface (module-name mod))
+ ;; for guile 2: (set-module-version! iface (module-version mod))
+ (set-module-kind! iface 'interface)
+ (set-module-public-interface! mod iface)
+ iface))
(let ((iface (or (module-public-interface mod)
- (fresh-interface!))))
+ (fresh-interface!))))
(set-module-obarray! iface (module-obarray mod))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (recursion-helper signature arguments count)
(define (helper pred? arg count)
(if (not (pred? arg))
- (begin
- (ly:input-message
- location
- (format
- #f (_ "wrong type for argument ~a. Expecting ~a, found ~s")
- count (type-name pred?) arg))
- #f)
- #t))
+ (begin
+ (ly:input-message
+ location
+ (format
+ #f (_ "wrong type for argument ~a. Expecting ~a, found ~s")
+ count (type-name pred?) arg))
+ #f)
+ #t))
(if (null? signature)
- #t
- (and (helper (car signature) (car arguments) count)
- (recursion-helper (cdr signature) (cdr arguments) (1+ count)))))
+ #t
+ (and (helper (car signature) (car arguments) count)
+ (recursion-helper (cdr signature) (cdr arguments) (1+ count)))))
(recursion-helper signature arguments 1))
(define-safe-public (lilypond-version)
(string-join
(map (lambda (x) (if (symbol? x)
- (symbol->string x)
- (number->string x)))
- (ly:version))
+ (symbol->string x)
+ (number->string x)))
+ (ly:version))
"."))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; other files.
-(define init-scheme-files
+;;
+;; List of Scheme files to be loaded into the (lily) module.
+;;
+;; - Library definitions, need to be at the head of the list
+(define init-scheme-files-lib
'("lily-library.scm"
- "file-cache.scm"
+ "output-lib.scm"))
+;; - Files containing definitions used later by other files later in load
+(define init-scheme-files-used
+ '("markup-macros.scm"))
+;; - Main body of files to be loaded
+(define init-scheme-files-body
+ '("file-cache.scm"
"define-event-classes.scm"
"define-music-callbacks.scm"
"define-music-types.scm"
"define-note-names.scm"
- "output-lib.scm"
"c++.scm"
- "chord-ignatzek-names.scm"
"chord-entry.scm"
- "chord-generic-names.scm"
"stencil.scm"
+ "define-markup-commands.scm"
"markup.scm"
"modal-transforms.scm"
+ "chord-generic-names.scm"
+ "chord-ignatzek-names.scm"
"music-functions.scm"
"part-combiner.scm"
"autochange.scm"
"define-music-properties.scm"
"time-signature-settings.scm"
"auto-beam.scm"
+ "chord-name.scm"
"bezier-tools.scm"
"parser-ly-from-scheme.scm"
"ly-syntax-constructors.scm"
"define-context-properties.scm"
- ;; guile 1.9 wants markups defined before referenced
- "define-markup-commands.scm"
-
- "chord-name.scm"
"translation-functions.scm"
"script.scm"
"midi.scm"
"paper.scm"
"backend-library.scm"
- "x11-color.scm"
-
- ;; must be after everything has been defined
- "safe-lily.scm"))
+ "x11-color.scm"))
+;; - Files to be loaded last
+(define init-scheme-files-tail
+;; - must be after everything has been defined
+ '("safe-lily.scm"))
+;;
+;; Now construct the load list
+;;
+(define init-scheme-files
+ (append init-scheme-files-lib
+ init-scheme-files-used
+ init-scheme-files-body
+ init-scheme-files-tail))
(for-each ly:load init-scheme-files)
(define (profile-measurements)
(let* ((t (times))
- (stats (gc-stats)))
+ (stats (gc-stats)))
(list (- (+ (tms:cutime t)
- (tms:utime t))
- (assoc-get 'gc-time-taken stats))
- (assoc-get 'total-cells-allocated stats 0))))
+ (tms:utime t))
+ (assoc-get 'gc-time-taken stats))
+ (assoc-get 'total-cells-allocated stats 0))))
(define (dump-profile base last this)
(let* ((outname (format #f "~a.profile" (dir-basename base ".ly")))
- (diff (map (lambda (y) (apply - y)) (zip this last))))
+ (diff (map (lambda (y) (apply - y)) (zip this last))))
(ly:progress "\nWriting timing to ~a..." outname)
(format (open-file outname "w")
- "time: ~a\ncells: ~a\n"
- (if (ly:get-option 'dump-cpu-profile)
- (car diff)
- 0)
- (cadr diff))))
+ "time: ~a\ncells: ~a\n"
+ (if (ly:get-option 'dump-cpu-profile)
+ (car diff)
+ 0)
+ (cadr diff))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; debug memory leaks
(define-public (dump-live-object-stats outfile)
(for-each (lambda (x)
- (format outfile "~a: ~a\n" (car x) (cdr x)))
- (sort (gc-live-object-stats)
- (lambda (x y)
- (string<? (car x) (car y))))))
+ (format outfile "~a: ~a\n" (car x) (cdr x)))
+ (sort (gc-live-object-stats)
+ (lambda (x y)
+ (string<? (car x) (car y))))))
(define-public (dump-gc-protects)
(set! gc-protect-stat-count (1+ gc-protect-stat-count))
(let* ((protects (sort (hash-table->alist (ly:protects))
- (lambda (a b)
- (< (object-address (car a))
- (object-address (car b))))))
- (out-file-name (string-append
- "gcstat-" (number->string gc-protect-stat-count)
- ".scm"))
- (outfile (open-file out-file-name "w")))
+ (lambda (a b)
+ (< (object-address (car a))
+ (object-address (car b))))))
+ (out-file-name (string-append
+ "gcstat-" (number->string gc-protect-stat-count)
+ ".scm"))
+ (outfile (open-file out-file-name "w")))
(set! gc-dumping #t)
- (format #t "Dumping GC statistics ~a...\n" out-file-name)
+ (ly:progress "Dumping GC statistics ~a...\n" out-file-name)
(for-each (lambda (y)
- (let ((x (car y))
- (c (cdr y)))
- (format outfile "~a (~a) = ~a\n" (object-address x) c x)))
- (filter
- (lambda (x)
- (not (symbol? (car x))))
- protects))
+ (let ((x (car y))
+ (c (cdr y)))
+ (format outfile "~a (~a) = ~a\n" (object-address x) c x)))
+ (filter
+ (lambda (x)
+ (not (symbol? (car x))))
+ protects))
(format outfile "\nprotected symbols: ~a\n"
- (apply + (map (lambda (obj-count)
- (if (symbol? (car obj-count))
- (cdr obj-count)
- 0))
- protects)))
+ (apply + (map (lambda (obj-count)
+ (if (symbol? (car obj-count))
+ (cdr obj-count)
+ 0))
+ protects)))
;; (display (ly:smob-protects))
(newline outfile)
(if (defined? 'gc-live-object-stats)
- (let* ((stats #f))
- (display "Live object statistics: GC'ing\n")
- (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)
- (set! stats (gc-live-object-stats))
- (display "Dumping live object statistics.\n")
- (dump-live-object-stats outfile)))
+ (let* ((stats #f))
+ (ly:progress "Live object statistics: GC'ing\n")
+ (ly:reset-all-fonts)
+ (gc)
+ (gc)
+ (ly:progress "Asserting dead objects\n")
+ (ly:set-option 'debug-gc-assert-parsed-dead #t)
+ (gc)
+ (ly:set-option 'debug-gc-assert-parsed-dead #f)
+ (set! stats (gc-live-object-stats))
+ (ly:progress "Dumping live object statistics.\n")
+ (dump-live-object-stats outfile)))
(newline outfile)
(let* ((stats (gc-stats)))
(for-each (lambda (sym)
- (format outfile "~a ~a ~a\n"
- gc-protect-stat-count
- sym
- (assoc-get sym stats "?")))
- '(protected-objects bytes-malloced cell-heap-size)))
+ (format outfile "~a ~a ~a\n"
+ gc-protect-stat-count
+ sym
+ (assoc-get sym stats "?")))
+ '(protected-objects bytes-malloced cell-heap-size)))
(set! gc-dumping #f)
(close-port outfile)))
"Read `/proc/self' to check up on memory use."
(define (gulp-file name)
(let* ((file (open-input-file name))
- (text (read-delimited "" file)))
+ (text (read-delimited "" file)))
(close file)
text))
(let* ((stat (gulp-file "/proc/self/status"))
- (lines (string-split stat #\newline))
- (interesting (filter identity
- (map
- (lambda (l)
- (string-match "^VmData:[ \t]*([0-9]*) kB" l))
- lines)))
- (mem (string->number (match:substring (car interesting) 1))))
+ (lines (string-split stat #\newline))
+ (interesting (filter identity
+ (map
+ (lambda (l)
+ (string-match "^VmData:[ \t]*([0-9]*) kB" l))
+ lines)))
+ (mem (string->number (match:substring (car interesting) 1))))
(format #t "VMDATA: ~a\n" mem)
(display (gc-stats))
- (if (> mem 100000)
- (begin (dump-gc-protects)
- (raise 1)))))
+ (newline)
+ (if (> mem 500000)
+ (begin (dump-gc-protects)
+ (raise 1)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PIDs or the number of the process."
(define (helper count acc)
(if (> count 0)
- (let* ((pid (primitive-fork)))
- (if (= pid 0)
- (1- count)
- (helper (1- count) (cons pid acc))))
- acc))
+ (let* ((pid (primitive-fork)))
+ (if (= pid 0)
+ (1- count)
+ (helper (1- count) (cons pid acc))))
+ acc))
(helper count '()))
"Exit function for lilypond"
(if (not silently)
(case status
- ((0) (ly:success (_ "Compilation successfully completed")))
- ((1) (ly:warning (_ "Compilation completed with warnings or errors")))
- (else (ly:message ""))))
+ ((0) (ly:basic-progress (_ "Success: compilation successfully completed")))
+ ((1) (ly:warning (_ "Compilation completed with warnings or errors")))
+ (else (ly:message ""))))
(exit status))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(eval-string (ly:command-line-code))
(if (ly:get-option 'help)
(begin (ly:option-usage)
- (ly:exit 0 #t)))
+ (ly:exit 0 #t)))
(if (ly:get-option 'show-available-fonts)
(begin (ly:font-config-display-fonts)
- (ly:exit 0 #t)))
+ (ly:exit 0 #t)))
(if (ly:get-option 'gui)
(gui-main files))
(if (null? files)
(begin (ly:usage)
- (ly:exit 2 #t)))
+ (ly:exit 2 #t)))
(if (ly:get-option 'read-file-list)
(set! files
- (filter (lambda (s)
- (> (string-length s) 0))
- (apply append
- (map (lambda (f)
- (string-split (ly:gulp-file f) #\nl))
- files)))))
+ (filter (lambda (s)
+ (> (string-length s) 0))
+ (apply append
+ (map (lambda (f)
+ (string-split (ly:gulp-file f) #\nl))
+ files)))))
(if (and (number? (ly:get-option 'job-count))
- (>= (length files) (ly:get-option 'job-count)))
+ (>= (length files) (ly:get-option 'job-count)))
(let* ((count (ly:get-option 'job-count))
- (split-todo (split-list files count))
- (joblist (multi-fork count))
- (errors '()))
- (if (not (string-or-symbol? (ly:get-option 'log-file)))
- (ly:set-option 'log-file "lilypond-multi-run"))
- (if (number? joblist)
- (begin (ly:set-option
- 'log-file (format #f "~a-~a"
- (ly:get-option 'log-file) joblist))
- (set! files (vector-ref split-todo joblist)))
- (begin (ly:progress "\nForking into jobs: ~a\n" joblist)
- (for-each
- (lambda (pid)
- (let* ((stat (cdr (waitpid pid))))
- (if (not (= stat 0))
- (set! errors
- (acons (list-element-index joblist pid)
- stat errors)))))
- joblist)
- (for-each
- (lambda (x)
- (let* ((job (car x))
- (state (cdr x))
- (logfile (format #f "~a-~a.log"
- (ly:get-option 'log-file) job))
- (log (ly:gulp-file logfile))
- (len (string-length log))
- (tail (substring log (max 0 (- len 1024)))))
- (if (status:term-sig state)
- (ly:message
- "\n\n~a\n"
- (format #f (_ "job ~a terminated with signal: ~a")
- job (status:term-sig state)))
- (ly:message
- (_ "logfile ~a (exit ~a):\n~a")
- logfile (status:exit-val state) tail))))
- errors)
- (if (pair? errors)
- (ly:error "Children ~a exited with errors."
- (map car errors)))
- ;; must overwrite individual entries
- (if (ly:get-option 'dump-profile)
- (dump-profile "lily-run-total"
- '(0 0) (profile-measurements)))
- (if (null? errors)
- (ly:exit 0 #f)
- (ly:exit 1 #f))))))
+ (split-todo (split-list files count))
+ (joblist (multi-fork count))
+ (errors '()))
+ (if (not (string-or-symbol? (ly:get-option 'log-file)))
+ (ly:set-option 'log-file "lilypond-multi-run"))
+ (if (number? joblist)
+ (begin (ly:set-option
+ 'log-file (format #f "~a-~a"
+ (ly:get-option 'log-file) joblist))
+ (set! files (vector-ref split-todo joblist)))
+ (begin (ly:progress "\nForking into jobs: ~a\n" joblist)
+ (for-each
+ (lambda (pid)
+ (let* ((stat (cdr (waitpid pid))))
+ (if (not (= stat 0))
+ (set! errors
+ (acons (list-element-index joblist pid)
+ stat errors)))))
+ joblist)
+ (for-each
+ (lambda (x)
+ (let* ((job (car x))
+ (state (cdr x))
+ (logfile (format #f "~a-~a.log"
+ (ly:get-option 'log-file) job))
+ (log (ly:gulp-file logfile))
+ (len (string-length log))
+ (tail (substring log (max 0 (- len 1024)))))
+ (if (status:term-sig state)
+ (ly:message
+ "\n\n~a\n"
+ (format #f (_ "job ~a terminated with signal: ~a")
+ job (status:term-sig state)))
+ (ly:message
+ (_ "logfile ~a (exit ~a):\n~a")
+ logfile (status:exit-val state) tail))))
+ errors)
+ (if (pair? errors)
+ (ly:error "Children ~a exited with errors."
+ (map car errors)))
+ ;; must overwrite individual entries
+ (if (ly:get-option 'dump-profile)
+ (dump-profile "lily-run-total"
+ '(0 0) (profile-measurements)))
+ (if (null? errors)
+ (ly:exit 0 #f)
+ (ly:exit 1 #f))))))
(if (string-or-symbol? (ly:get-option 'log-file))
(ly:stderr-redirect (format #f "~a.log" (ly:get-option 'log-file)) "w"))
(let ((failed (lilypond-all files)))
(if (ly:get-option 'trace-scheme-coverage)
- (begin
- (coverage:show-all (lambda (f)
- (string-contains f "lilypond")))))
+ (begin
+ (coverage:show-all (lambda (f)
+ (string-contains f "lilypond")))))
(if (pair? failed)
- (begin (ly:error (_ "failed files: ~S") (string-join failed))
- (ly:exit 1 #f))
- (begin
- (ly:exit 0 #f)))))
+ (begin (ly:error (_ "failed files: ~S") (string-join failed))
+ (ly:exit 1 #f))
+ (begin
+ (ly:exit 0 #f)))))
(define-public (lilypond-all files)
(let* ((failed '())
- (separate-logs (ly:get-option 'separate-log-files))
- (ping-log
- (if separate-logs
- (open-file (if (string-or-symbol? (ly:get-option 'log-file))
- (format #f "~a.log" (ly:get-option 'log-file))
- "/dev/stderr") "a") #f))
- (do-measurements (ly:get-option 'dump-profile))
- (handler (lambda (key failed-file)
- (set! failed (append (list failed-file) failed)))))
+ (separate-logs (ly:get-option 'separate-log-files))
+ (ping-log
+ (if separate-logs
+ (open-file (if (string-or-symbol? (ly:get-option 'log-file))
+ (format #f "~a.log" (ly:get-option 'log-file))
+ "/dev/stderr") "a") #f))
+ (do-measurements (ly:get-option 'dump-profile))
+ (handler (lambda (key failed-file)
+ (set! failed (append (list failed-file) failed)))))
(gc)
(for-each
(lambda (x)
(let* ((start-measurements (if do-measurements
- (profile-measurements)
- #f))
- (base (dir-basename x ".ly"))
- (all-settings (ly:all-options)))
- (if separate-logs
- (ly:stderr-redirect (format #f "~a.log" base) "w"))
- (if ping-log
- (format ping-log "Processing ~a\n" base))
- (if (ly:get-option 'trace-memory-frequency)
- (mtrace:start-trace (ly:get-option 'trace-memory-frequency)))
- (lilypond-file handler x)
- (if start-measurements
- (dump-profile x start-measurements (profile-measurements)))
- (if (ly:get-option 'trace-memory-frequency)
- (begin (mtrace:stop-trace)
- (mtrace:dump-results base)))
- (for-each (lambda (s)
- (ly:set-option (car s) (cdr s)))
- all-settings)
- (ly:set-option 'debug-gc-assert-parsed-dead #t)
- (gc)
- (ly:set-option 'debug-gc-assert-parsed-dead #f)
- (if (ly:get-option 'debug-gc)
- (dump-gc-protects)
+ (profile-measurements)
+ #f))
+ (base (dir-basename x ".ly"))
+ (all-settings (ly:all-options)))
+ (if separate-logs
+ (ly:stderr-redirect (format #f "~a.log" base) "w"))
+ (if ping-log
+ (format ping-log "Processing ~a\n" base))
+ (if (ly:get-option 'trace-memory-frequency)
+ (mtrace:start-trace (ly:get-option 'trace-memory-frequency)))
+ (lilypond-file handler x)
+ (if start-measurements
+ (dump-profile x start-measurements (profile-measurements)))
+ (if (ly:get-option 'trace-memory-frequency)
+ (begin (mtrace:stop-trace)
+ (mtrace:dump-results base)))
+ (for-each (lambda (s)
+ (ly:set-option (car s) (cdr s)))
+ all-settings)
+ (ly:set-option 'debug-gc-assert-parsed-dead #t)
+ (gc)
+ (ly:set-option 'debug-gc-assert-parsed-dead #f)
+ (if (ly:get-option 'debug-gc)
+ (dump-gc-protects)
(ly:reset-all-fonts))))
files)
;; Ensure a notice re failed files is written to aggregate logfile.
(if ping-log
- (format ping-log "Failed files: ~a\n" failed))
+ (format ping-log "Failed files: ~a\n" failed))
(if (ly:get-option 'dump-profile)
- (dump-profile "lily-run-total" '(0 0) (profile-measurements)))
+ (dump-profile "lily-run-total" '(0 0) (profile-measurements)))
failed))
(define (lilypond-file handler file-name)
(catch 'ly-file-failed
- (lambda () (ly:parse-file file-name))
- (lambda (x . args) (handler x file-name))))
+ (lambda () (ly:parse-file file-name))
+ (lambda (x . args) (handler x file-name))))
(use-modules (scm editor))
(gui-no-files-handler))
(if (not (string? (ly:get-option 'log-file)))
(let* ((base (dir-basename (car files) ".ly"))
- (log-name (string-append base ".log")))
- (if (not (ly:get-option 'gui))
- (ly:message (_ "Redirecting output to ~a...") log-name))
- (ly:stderr-redirect log-name "w")
- (ly:message "# -*-compilation-*-"))
+ (log-name (string-append base ".log")))
+ (if (not (ly:get-option 'gui))
+ (ly:message (_ "Redirecting output to ~a...") log-name))
+ (ly:stderr-redirect log-name "w")
+ (ly:message "# -*-compilation-*-"))
(let ((failed (lilypond-all files)))
- (if (pair? failed)
- (begin
- ;; ugh
- (ly:stderr-redirect "foo" "r")
- (system (get-editor-command log-name 0 0 0))
- (ly:error (_ "failed files: ~S") (string-join failed))
- ;; not reached?
- (exit 1))
- (ly:exit 0 #f)))))
+ (if (pair? failed)
+ (begin
+ ;; ugh
+ (ly:stderr-redirect "foo" "r")
+ (system (get-editor-command log-name 0 0 0))
+ (ly:error (_ "failed files: ~S") (string-join failed))
+ ;; not reached?
+ (exit 1))
+ (ly:exit 0 #f)))))
(define (gui-no-files-handler)
(let* ((ly (string-append (ly:effective-prefix) "/ly/"))
- ;; FIXME: soft-code, localize
- (welcome-ly (string-append ly "Welcome_to_LilyPond.ly"))
- (cmd (get-editor-command welcome-ly 0 0 0)))
+ ;; FIXME: soft-code, localize
+ (welcome-ly (string-append ly "Welcome_to_LilyPond.ly"))
+ (cmd (get-editor-command welcome-ly 0 0 0)))
(ly:message (_ "Invoking `~a'...\n") cmd)
(system cmd)
(ly:exit 1 #f)))
--- /dev/null
+;;;; This file is part of LilyPond, the GNU music typesetter.
+;;;;
+;;;; Copyright (C) 2003--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;;
+;;;; LilyPond is free software: you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation, either version 3 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; LilyPond is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+
+"
+Internally markup is stored as lists, whose head is a function.
+
+ (FUNCTION ARG1 ARG2 ... )
+
+When the markup is formatted, then FUNCTION is called as follows
+
+ (FUNCTION GROB PROPS ARG1 ARG2 ... )
+
+GROB is the current grob, PROPS is a list of alists, and ARG1.. are
+the rest of the arguments.
+
+The function should return a stencil (i.e. a formatted, ready to
+print object).
+
+
+To add a markup command, use the define-markup-command utility.
+
+ (define-markup-command (mycommand layout prop arg1 ...) (arg1-type? ...)
+ \"my command usage and description\"
+ ...function body...)
+
+The command is now available in markup mode, e.g.
+
+ \\markup { .... \\MYCOMMAND #1 argument ... }
+
+" ; "
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; markup definer utilities
+
+;; For documentation purposes
+;; category -> markup functions
+(define-public markup-functions-by-category (make-hash-table 150))
+;; markup function -> used properties
+(define-public markup-functions-properties (make-weak-key-hash-table 151))
+;; List of markup list functions
+(define-public markup-list-functions (make-weak-key-hash-table 151))
+
+(use-modules (ice-9 optargs))
+
+(defmacro*-public define-markup-command
+ (command-and-args signature
+ #:key (category '()) (properties '())
+ #:rest body)
+ "
+* Define a COMMAND-markup function after command-and-args and body,
+register COMMAND-markup and its signature,
+
+* add COMMAND-markup to markup-functions-by-category,
+
+* sets COMMAND-markup markup-signature object property,
+
+* define a make-COMMAND-markup function.
+
+Syntax:
+ (define-markup-command (COMMAND layout props . arguments)
+ argument-types
+ [ #:properties properties ]
+ \"documentation string\"
+ ...command body...)
+
+where:
+ `argument-types' is a list of type predicates for arguments
+ `properties' a list of (property default-value) lists
+
+The specified properties are available as let-bound variables in the
+command body, using the respective `default-value' as fallback in case
+`property' is not found in `props'. `props' itself is left unchanged:
+if you want defaults specified in that manner passed down into other
+markup functions, you need to adjust `props' yourself.
+
+The autogenerated documentation makes use of some optional
+specifications that are otherwise ignored:
+
+After `argument-types', you may also specify
+ [ #:category category ]
+where:
+ `category' is either a symbol or a symbol list specifying the
+ category for this markup command in the docs.
+
+As an element of the `properties' list, you may directly use a
+COMMANDx-markup symbol instead of a `(prop value)' list to indicate
+that this markup command is called by the newly defined command,
+adding its properties to the documented properties of the new
+command. There is no protection against circular definitions.
+"
+ (let* ((command (car command-and-args))
+ (args (cdr command-and-args))
+ (command-name (string->symbol (format #f "~a-markup" command)))
+ (make-markup-name (string->symbol (format #f "make-~a-markup" command))))
+ (while (and (pair? body) (keyword? (car body)))
+ (set! body (cddr body)))
+ `(begin
+ ;; define the COMMAND-markup function
+ ,(let* ((documentation (if (string? (car body))
+ (list (car body))
+ '()))
+ (real-body (if (or (null? documentation)
+ (null? (cdr body)))
+ body (cdr body))))
+ `(define-public (,command-name ,@args)
+ ,@documentation
+ (let ,(map (lambda (prop-spec)
+ (let ((prop (car prop-spec))
+ (default-value (if (null? (cdr prop-spec))
+ #f
+ (cadr prop-spec)))
+ (props (cadr args)))
+ `(,prop (chain-assoc-get ',prop ,props ,default-value))))
+ (filter pair? properties))
+ ,@real-body)))
+ (set! (markup-command-signature ,command-name) (list ,@signature))
+ ;; Register the new function, for markup documentation
+ ,@(map (lambda (category)
+ `(hashq-set!
+ (or (hashq-ref markup-functions-by-category ',category)
+ (let ((hash (make-weak-key-hash-table 151)))
+ (hashq-set! markup-functions-by-category ',category
+ hash)
+ hash))
+ ,command-name #t))
+ (if (list? category) category (list category)))
+ ;; Used properties, for markup documentation
+ (hashq-set! markup-functions-properties
+ ,command-name
+ (list ,@(map (lambda (prop-spec)
+ (cond ((symbol? prop-spec)
+ prop-spec)
+ ((not (null? (cdr prop-spec)))
+ `(list ',(car prop-spec) ,(cadr prop-spec)))
+ (else
+ `(list ',(car prop-spec)))))
+ (if (pair? args)
+ properties
+ (list)))))
+ ;; define the make-COMMAND-markup function
+ (define-public (,make-markup-name . args)
+ (let ((sig (list ,@signature)))
+ (make-markup ,command-name ,(symbol->string make-markup-name) sig args))))))
+
+(defmacro*-public define-markup-list-command
+ (command-and-args signature #:key (properties '()) #:rest body)
+ "Same as `define-markup-command', but defines a command that, when
+interpreted, returns a list of stencils instead of a single one"
+ (let* ((command (car command-and-args))
+ (args (cdr command-and-args))
+ (command-name (string->symbol (format #f "~a-markup-list" command)))
+ (make-markup-name (string->symbol (format #f "make-~a-markup-list" command))))
+ (while (and (pair? body) (keyword? (car body)))
+ (set! body (cddr body)))
+ `(begin
+ ;; define the COMMAND-markup-list function
+ ,(let* ((documentation (if (string? (car body))
+ (list (car body))
+ '()))
+ (real-body (if (or (null? documentation)
+ (null? (cdr body)))
+ body (cdr body))))
+ `(define-public (,command-name ,@args)
+ ,@documentation
+ (let ,(map (lambda (prop-spec)
+ (let ((prop (car prop-spec))
+ (default-value (if (null? (cdr prop-spec))
+ #f
+ (cadr prop-spec)))
+ (props (cadr args)))
+ `(,prop (chain-assoc-get ',prop ,props ,default-value))))
+ (filter pair? properties))
+ ,@real-body)))
+ (set! (markup-command-signature ,command-name) (list ,@signature))
+ ;; add the command to markup-list-function-list, for markup documentation
+ (hashq-set! markup-list-functions ,command-name #t)
+ ;; Used properties, for markup documentation
+ (hashq-set! markup-functions-properties
+ ,command-name
+ (list ,@(map (lambda (prop-spec)
+ (cond ((symbol? prop-spec)
+ prop-spec)
+ ((not (null? (cdr prop-spec)))
+ `(list ',(car prop-spec) ,(cadr prop-spec)))
+ (else
+ `(list ',(car prop-spec)))))
+ (if (pair? args)
+ properties
+ (list)))))
+ ;; it's a markup-list command:
+ (set-object-property! ,command-name 'markup-list-command #t)
+ ;; define the make-COMMAND-markup-list function
+ (define-public (,make-markup-name . args)
+ (let ((sig (list ,@signature)))
+ (list (make-markup ,command-name
+ ,(symbol->string make-markup-name) sig args)))))))
+
+;;;;;;;;;;;;;;;
+;;; Utilities for storing and accessing markup commands signature
+;;; Examples:
+;;;
+;;; (set! (markup-command-signature raise-markup) (list number? markup?))
+;;; ==> (#<primitive-procedure number?> #<procedure markup? (obj)>)
+;;;
+;;; (markup-command-signature raise-markup)
+;;; ==> (#<primitive-procedure number?> #<procedure markup? (obj)>)
+;;;
+
+(define-public (markup-command-signature-ref markup-command)
+ "Return markup-command's signature (the 'markup-signature object property)"
+ (object-property markup-command 'markup-signature))
+
+(define-public (markup-command-signature-set! markup-command signature)
+ "Set markup-command's signature (as object property)"
+ (set-object-property! markup-command 'markup-signature signature)
+ signature)
+
+(define-public markup-command-signature
+ (make-procedure-with-setter markup-command-signature-ref
+ markup-command-signature-set!))
+
+;;;;;;;;;;;;;;;;;;;;;;
+;;; markup type predicates
+
+(define (markup-function? x)
+ (and (markup-command-signature x)
+ (not (object-property x 'markup-list-command))))
+
+(define (markup-list-function? x)
+ (and (markup-command-signature x)
+ (object-property x 'markup-list-command)))
+
+(define-public (markup-command-list? x)
+ "Determine if `x' is a markup command list, ie. a list composed of
+a markup list function and its arguments."
+ (and (pair? x) (markup-list-function? (car x))))
+
+(define-public (markup-list? arg)
+ "Return a true value if `x' is a list of markups or markup command lists."
+ (define (markup-list-inner? lst)
+ (or (null? lst)
+ (and (or (markup? (car lst)) (markup-command-list? (car lst)))
+ (markup-list-inner? (cdr lst)))))
+ (not (not (and (list? arg) (markup-list-inner? arg)))))
+
+(define (markup-argument-list? signature arguments)
+ "Typecheck argument list."
+ (if (and (pair? signature) (pair? arguments))
+ (and ((car signature) (car arguments))
+ (markup-argument-list? (cdr signature) (cdr arguments)))
+ (and (null? signature) (null? arguments))))
+
+
+(define (markup-argument-list-error signature arguments number)
+ "return (ARG-NR TYPE-EXPECTED ARG-FOUND) if an error is detected, or
+#f is no error found.
+"
+ (if (and (pair? signature) (pair? arguments))
+ (if (not ((car signature) (car arguments)))
+ (list number (type-name (car signature)) (car arguments))
+ (markup-argument-list-error (cdr signature) (cdr arguments) (+ 1 number)))
+ #f))
+
+;;
+;; full recursive typecheck.
+;;
+(define (markup-typecheck? arg)
+ (or (string? arg)
+ (and (pair? arg)
+ (markup-function? (car arg))
+ (markup-argument-list? (markup-command-signature (car arg))
+ (cdr arg)))))
+
+;;
+;;
+;;
+;;
+(define (markup-thrower-typecheck arg)
+ "typecheck, and throw an error when something amiss.
+
+Uncovered - cheap-markup? is used."
+
+ (cond ((string? arg) #t)
+ ((not (pair? arg))
+ (throw 'markup-format "Not a pair" arg))
+ ((not (markup-function? (car arg)))
+ (throw 'markup-format "Not a markup function " (car arg)))
+ ((not (markup-argument-list? (markup-command-signature (car arg))
+ (cdr arg)))
+ (throw 'markup-format "Arguments failed typecheck for " arg)))
+ #t)
+
+;;
+;; good enough if you only use make-XXX-markup functions.
+;;
+(define (cheap-markup? x)
+ (or (string? x)
+ (and (pair? x)
+ (markup-function? (car x)))))
+
+;;
+;; replace by markup-thrower-typecheck for more detailed diagnostics.
+;;
+(define-public markup? cheap-markup?)
+
+(define-public (make-markup markup-function make-name signature args)
+ " Construct a markup object from MARKUP-FUNCTION and ARGS. Typecheck
+against SIGNATURE, reporting MAKE-NAME as the user-invoked function.
+"
+ (let* ((arglen (length args))
+ (siglen (length signature))
+ (error-msg (if (and (> siglen 0) (> arglen 0))
+ (markup-argument-list-error signature args 1)
+ #f)))
+ (if (or (not (= arglen siglen)) (< siglen 0) (< arglen 0))
+ (ly:error (string-append make-name ": "
+ (_ "Wrong number of arguments. Expect: ~A, found ~A: ~S"))
+ siglen arglen args))
+ (if error-msg
+ (ly:error
+ (string-append
+ make-name ": "
+ (_ "Invalid argument in position ~A. Expect: ~A, found: ~S."))
+ (car error-msg) (cadr error-msg)(caddr error-msg))
+ (cons markup-function args))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; markup constructors
+;;; lilypond-like syntax for markup construction in scheme.
+
+(use-modules (ice-9 receive))
+
+(defmacro*-public markup* (#:rest body)
+ "Same as `markup', for use in a \\notes block."
+ `(ly:export (markup ,@body)))
+
+
+(define (compile-all-markup-expressions expr)
+ "Return a list of canonical markups expressions, e.g.:
+ (#:COMMAND1 arg11 arg12 #:COMMAND2 arg21 arg22 arg23)
+ ===>
+ ((make-COMMAND1-markup arg11 arg12)
+ (make-COMMAND2-markup arg21 arg22 arg23) ...)"
+ (do ((rest expr rest)
+ (markps '() markps))
+ ((null? rest) (reverse markps))
+ (receive (m r) (compile-markup-expression rest)
+ (set! markps (cons m markps))
+ (set! rest r))))
+
+(define (keyword->make-markup key)
+ "Transform a keyword, e.g. #:COMMAND, in a make-COMMAND-markup symbol."
+ (string->symbol (string-append "make-" (symbol->string (keyword->symbol key)) "-markup")))
+
+(define (compile-markup-expression expr)
+ "Return two values: the first complete canonical markup expression
+ found in `expr', e.g. (make-COMMAND-markup arg1 arg2 ...),
+ and the rest expression."
+ (cond ((and (pair? expr)
+ (keyword? (car expr)))
+ ;; expr === (#:COMMAND arg1 ...)
+ (let ((command (symbol->string (keyword->symbol (car expr)))))
+ (if (not (pair? (lookup-markup-command command)))
+ (ly:error (_ "Not a markup command: ~A") command))
+ (let* ((sig (markup-command-signature
+ (car (lookup-markup-command command))))
+ (sig-len (length sig)))
+ (do ((i 0 (1+ i))
+ (args '() args)
+ (rest (cdr expr) rest))
+ ((>= i sig-len)
+ (values (cons (keyword->make-markup (car expr)) (reverse args)) rest))
+ (cond ((eqv? (list-ref sig i) markup-list?)
+ ;; (car rest) is a markup list
+ (set! args (cons `(list ,@(compile-all-markup-expressions (car rest))) args))
+ (set! rest (cdr rest)))
+ (else
+ ;; pick up one arg in `rest'
+ (receive (a r) (compile-markup-arg rest)
+ (set! args (cons a args))
+ (set! rest r))))))))
+ ((and (pair? expr)
+ (pair? (car expr))
+ (keyword? (caar expr)))
+ ;; expr === ((#:COMMAND arg1 ...) ...)
+ (receive (m r) (compile-markup-expression (car expr))
+ (values m (cdr expr))))
+ ((and (pair? expr)
+ (string? (car expr))) ;; expr === ("string" ...)
+ (values `(make-simple-markup ,(car expr)) (cdr expr)))
+ (else
+ ;; expr === (symbol ...) or ((funcall ...) ...)
+ (values (car expr)
+ (cdr expr)))))
+
+(define (compile-all-markup-args expr)
+ "Transform `expr' into markup arguments"
+ (do ((rest expr rest)
+ (args '() args))
+ ((null? rest) (reverse args))
+ (receive (a r) (compile-markup-arg rest)
+ (set! args (cons a args))
+ (set! rest r))))
+
+(define (compile-markup-arg expr)
+ "Return two values: the desired markup argument, and the rest arguments"
+ (cond ((null? expr)
+ ;; no more args
+ (values '() '()))
+ ((keyword? (car expr))
+ ;; expr === (#:COMMAND ...)
+ ;; ==> build and return the whole markup expression
+ (compile-markup-expression expr))
+ ((and (pair? (car expr))
+ (keyword? (caar expr)))
+ ;; expr === ((#:COMMAND ...) ...)
+ ;; ==> build and return the whole markup expression(s)
+ ;; found in (car expr)
+ (receive (markup-expr rest-expr) (compile-markup-expression (car expr))
+ (if (null? rest-expr)
+ (values markup-expr (cdr expr))
+ (values `(list ,markup-expr ,@(compile-all-markup-args rest-expr))
+ (cdr expr)))))
+ ((and (pair? (car expr))
+ (pair? (caar expr)))
+ ;; expr === (((foo ...) ...) ...)
+ (values (cons 'list (compile-all-markup-args (car expr))) (cdr expr)))
+ (else (values (car expr) (cdr expr)))))
+
+(define (lookup-markup-command-aux symbol)
+ (let ((proc (catch 'misc-error
+ (lambda ()
+ (module-ref (current-module) symbol))
+ (lambda (key . args) #f))))
+ (and (procedure? proc) proc)))
+
+(define-public (lookup-markup-command code)
+ (let ((proc (lookup-markup-command-aux
+ (string->symbol (format #f "~a-markup" code)))))
+ (and proc (markup-function? proc)
+ (cons proc (markup-command-signature proc)))))
+
+(define-public (lookup-markup-list-command code)
+ (let ((proc (lookup-markup-command-aux
+ (string->symbol (format #f "~a-markup-list" code)))))
+ (and proc (markup-list-function? proc)
+ (cons proc (markup-command-signature proc)))))
+
+;;;;;;;;;;;;;;;;;;;;;;
+;;; used in parser.yy to map a list of markup commands on markup arguments
+(define-public (map-markup-command-list commands markups)
+ "`markups' being a list of markups, eg (markup1 markup2 markup3),
+and `commands' a list of commands with their scheme arguments, in reverse order,
+eg: ((italic) (raise 4) (bold)), maps the commands on each markup argument, eg:
+ ((bold (raise 4 (italic markup1)))
+ (bold (raise 4 (italic markup2)))
+ (bold (raise 4 (italic markup3))))
+"
+ (map-in-order (lambda (arg)
+ (let ((result arg))
+ (for-each (lambda (cmd)
+ (set! result (append cmd (list result))))
+ commands)
+ result))
+ markups))
;;;; You should have received a copy of the GNU General Public License
;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
-"
-Internally markup is stored as lists, whose head is a function.
-
- (FUNCTION ARG1 ARG2 ... )
-
-When the markup is formatted, then FUNCTION is called as follows
-
- (FUNCTION GROB PROPS ARG1 ARG2 ... )
-
-GROB is the current grob, PROPS is a list of alists, and ARG1.. are
-the rest of the arguments.
-
-The function should return a stencil (i.e. a formatted, ready to
-print object).
-
-
-To add a markup command, use the define-markup-command utility.
-
- (define-markup-command (mycommand layout prop arg1 ...) (arg1-type? ...)
- \"my command usage and description\"
- ...function body...)
-
-The command is now available in markup mode, e.g.
-
- \\markup { .... \\MYCOMMAND #1 argument ... }
-
-" ; "
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; markup definer utilities
-
-;; For documentation purposes
-;; category -> markup functions
-(define-public markup-functions-by-category (make-hash-table 150))
-;; markup function -> used properties
-(define-public markup-functions-properties (make-weak-key-hash-table 151))
-;; List of markup list functions
-(define-public markup-list-functions (make-weak-key-hash-table 151))
-
-(use-modules (ice-9 optargs))
-
-(defmacro*-public define-markup-command
- (command-and-args signature
- #:key (category '()) (properties '())
- #:rest body)
- "
-* Define a COMMAND-markup function after command-and-args and body,
-register COMMAND-markup and its signature,
-
-* add COMMAND-markup to markup-functions-by-category,
-
-* sets COMMAND-markup markup-signature object property,
-
-* define a make-COMMAND-markup function.
-
-Syntax:
- (define-markup-command (COMMAND layout props . arguments)
- argument-types
- [ #:properties properties ]
- \"documentation string\"
- ...command body...)
-
-where:
- `argument-types' is a list of type predicates for arguments
- `properties' a list of (property default-value) lists
-
-The specified properties are available as let-bound variables in the
-command body, using the respective `default-value' as fallback in case
-`property' is not found in `props'. `props' itself is left unchanged:
-if you want defaults specified in that manner passed down into other
-markup functions, you need to adjust `props' yourself.
-
-The autogenerated documentation makes use of some optional
-specifications that are otherwise ignored:
-
-After `argument-types', you may also specify
- [ #:category category ]
-where:
- `category' is either a symbol or a symbol list specifying the
- category for this markup command in the docs.
-
-As an element of the `properties' list, you may directly use a
-COMMANDx-markup symbol instead of a `(prop value)' list to indicate
-that this markup command is called by the newly defined command,
-adding its properties to the documented properties of the new
-command. There is no protection against circular definitions.
-"
- (let* ((command (car command-and-args))
- (args (cdr command-and-args))
- (command-name (string->symbol (format #f "~a-markup" command)))
- (make-markup-name (string->symbol (format #f "make-~a-markup" command))))
- (while (and (pair? body) (keyword? (car body)))
- (set! body (cddr body)))
- `(begin
- ;; define the COMMAND-markup function
- ,(let* ((documentation (if (string? (car body))
- (list (car body))
- '()))
- (real-body (if (or (null? documentation)
- (null? (cdr body)))
- body (cdr body))))
- `(define-public (,command-name ,@args)
- ,@documentation
- (let ,(map (lambda (prop-spec)
- (let ((prop (car prop-spec))
- (default-value (if (null? (cdr prop-spec))
- #f
- (cadr prop-spec)))
- (props (cadr args)))
- `(,prop (chain-assoc-get ',prop ,props ,default-value))))
- (filter pair? properties))
- ,@real-body)))
- (set! (markup-command-signature ,command-name) (list ,@signature))
- ;; Register the new function, for markup documentation
- ,@(map (lambda (category)
- `(hashq-set!
- (or (hashq-ref markup-functions-by-category ',category)
- (let ((hash (make-weak-key-hash-table 151)))
- (hashq-set! markup-functions-by-category ',category
- hash)
- hash))
- ,command-name #t))
- (if (list? category) category (list category)))
- ;; Used properties, for markup documentation
- (hashq-set! markup-functions-properties
- ,command-name
- (list ,@(map (lambda (prop-spec)
- (cond ((symbol? prop-spec)
- prop-spec)
- ((not (null? (cdr prop-spec)))
- `(list ',(car prop-spec) ,(cadr prop-spec)))
- (else
- `(list ',(car prop-spec)))))
- (if (pair? args)
- properties
- (list)))))
- ;; define the make-COMMAND-markup function
- (define-public (,make-markup-name . args)
- (let ((sig (list ,@signature)))
- (make-markup ,command-name ,(symbol->string make-markup-name) sig args))))))
-
-(defmacro*-public define-markup-list-command
- (command-and-args signature #:key (properties '()) #:rest body)
- "Same as `define-markup-command', but defines a command that, when
-interpreted, returns a list of stencils instead of a single one"
- (let* ((command (car command-and-args))
- (args (cdr command-and-args))
- (command-name (string->symbol (format #f "~a-markup-list" command)))
- (make-markup-name (string->symbol (format #f "make-~a-markup-list" command))))
- (while (and (pair? body) (keyword? (car body)))
- (set! body (cddr body)))
- `(begin
- ;; define the COMMAND-markup-list function
- ,(let* ((documentation (if (string? (car body))
- (list (car body))
- '()))
- (real-body (if (or (null? documentation)
- (null? (cdr body)))
- body (cdr body))))
- `(define-public (,command-name ,@args)
- ,@documentation
- (let ,(map (lambda (prop-spec)
- (let ((prop (car prop-spec))
- (default-value (if (null? (cdr prop-spec))
- #f
- (cadr prop-spec)))
- (props (cadr args)))
- `(,prop (chain-assoc-get ',prop ,props ,default-value))))
- (filter pair? properties))
- ,@real-body)))
- (set! (markup-command-signature ,command-name) (list ,@signature))
- ;; add the command to markup-list-function-list, for markup documentation
- (hashq-set! markup-list-functions ,command-name #t)
- ;; Used properties, for markup documentation
- (hashq-set! markup-functions-properties
- ,command-name
- (list ,@(map (lambda (prop-spec)
- (cond ((symbol? prop-spec)
- prop-spec)
- ((not (null? (cdr prop-spec)))
- `(list ',(car prop-spec) ,(cadr prop-spec)))
- (else
- `(list ',(car prop-spec)))))
- (if (pair? args)
- properties
- (list)))))
- ;; it's a markup-list command:
- (set-object-property! ,command-name 'markup-list-command #t)
- ;; define the make-COMMAND-markup-list function
- (define-public (,make-markup-name . args)
- (let ((sig (list ,@signature)))
- (list (make-markup ,command-name
- ,(symbol->string make-markup-name) sig args)))))))
-
-(define-public (make-markup markup-function make-name signature args)
- "Construct a markup object from @var{markup-function} and @var{args}.
-Typecheck against @var{signature}, reporting @var{make-name} as the
-user-invoked function."
- (let* ((arglen (length args))
- (siglen (length signature))
- (error-msg (if (and (> siglen 0) (> arglen 0))
- (markup-argument-list-error signature args 1)
- #f)))
- (if (or (not (= arglen siglen)) (< siglen 0) (< arglen 0))
- (ly:error (string-append make-name ": "
- (_ "Wrong number of arguments. Expect: ~A, found ~A: ~S"))
- siglen arglen args))
- (if error-msg
- (ly:error
- (string-append
- make-name ": "
- (_ "Invalid argument in position ~A. Expect: ~A, found: ~S."))
- (car error-msg) (cadr error-msg)(caddr error-msg))
- (cons markup-function args))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; markup constructors
-;;; lilypond-like syntax for markup construction in scheme.
-
-(use-modules (ice-9 receive))
-
(defmacro*-public markup (#:rest body)
"The `markup' macro provides a lilypond-like syntax for building markups.
(car (compile-all-markup-expressions `(#:line ,body))))
-(defmacro*-public markup* (#:rest body)
- "Same as `markup', for use in a \\notes block."
- `(ly:export (markup ,@body)))
-
-
-(define (compile-all-markup-expressions expr)
- "Return a list of canonical markups expressions, e.g.:
- (#:COMMAND1 arg11 arg12 #:COMMAND2 arg21 arg22 arg23)
- ===>
- ((make-COMMAND1-markup arg11 arg12)
- (make-COMMAND2-markup arg21 arg22 arg23) ...)"
- (do ((rest expr rest)
- (markps '() markps))
- ((null? rest) (reverse markps))
- (receive (m r) (compile-markup-expression rest)
- (set! markps (cons m markps))
- (set! rest r))))
-
-(define (keyword->make-markup key)
- "Transform a keyword, e.g. #:COMMAND, in a make-COMMAND-markup symbol."
- (string->symbol (string-append "make-" (symbol->string (keyword->symbol key)) "-markup")))
-
-(define (compile-markup-expression expr)
- "Return two values: the first complete canonical markup expression
- found in `expr', e.g. (make-COMMAND-markup arg1 arg2 ...),
- and the rest expression."
- (cond ((and (pair? expr)
- (keyword? (car expr)))
- ;; expr === (#:COMMAND arg1 ...)
- (let ((command (symbol->string (keyword->symbol (car expr)))))
- (if (not (pair? (lookup-markup-command command)))
- (ly:error (_ "Not a markup command: ~A") command))
- (let* ((sig (markup-command-signature
- (car (lookup-markup-command command))))
- (sig-len (length sig)))
- (do ((i 0 (1+ i))
- (args '() args)
- (rest (cdr expr) rest))
- ((>= i sig-len)
- (values (cons (keyword->make-markup (car expr)) (reverse args)) rest))
- (cond ((eqv? (list-ref sig i) markup-list?)
- ;; (car rest) is a markup list
- (set! args (cons `(list ,@(compile-all-markup-expressions (car rest))) args))
- (set! rest (cdr rest)))
- (else
- ;; pick up one arg in `rest'
- (receive (a r) (compile-markup-arg rest)
- (set! args (cons a args))
- (set! rest r))))))))
- ((and (pair? expr)
- (pair? (car expr))
- (keyword? (caar expr)))
- ;; expr === ((#:COMMAND arg1 ...) ...)
- (receive (m r) (compile-markup-expression (car expr))
- (values m (cdr expr))))
- ((and (pair? expr)
- (string? (car expr))) ;; expr === ("string" ...)
- (values `(make-simple-markup ,(car expr)) (cdr expr)))
- (else
- ;; expr === (symbol ...) or ((funcall ...) ...)
- (values (car expr)
- (cdr expr)))))
-
-(define (compile-all-markup-args expr)
- "Transform `expr' into markup arguments"
- (do ((rest expr rest)
- (args '() args))
- ((null? rest) (reverse args))
- (receive (a r) (compile-markup-arg rest)
- (set! args (cons a args))
- (set! rest r))))
-
-(define (compile-markup-arg expr)
- "Return two values: the desired markup argument, and the rest arguments"
- (cond ((null? expr)
- ;; no more args
- (values '() '()))
- ((keyword? (car expr))
- ;; expr === (#:COMMAND ...)
- ;; ==> build and return the whole markup expression
- (compile-markup-expression expr))
- ((and (pair? (car expr))
- (keyword? (caar expr)))
- ;; expr === ((#:COMMAND ...) ...)
- ;; ==> build and return the whole markup expression(s)
- ;; found in (car expr)
- (receive (markup-expr rest-expr) (compile-markup-expression (car expr))
- (if (null? rest-expr)
- (values markup-expr (cdr expr))
- (values `(list ,markup-expr ,@(compile-all-markup-args rest-expr))
- (cdr expr)))))
- ((and (pair? (car expr))
- (pair? (caar expr)))
- ;; expr === (((foo ...) ...) ...)
- (values (cons 'list (compile-all-markup-args (car expr))) (cdr expr)))
- (else (values (car expr) (cdr expr)))))
-
-;;;;;;;;;;;;;;;
-;;; Utilities for storing and accessing markup commands signature
-;;; Examples:
-;;;
-;;; (set! (markup-command-signature raise-markup) (list number? markup?))
-;;; ==> (#<primitive-procedure number?> #<procedure markup? (obj)>)
-;;;
-;;; (markup-command-signature raise-markup)
-;;; ==> (#<primitive-procedure number?> #<procedure markup? (obj)>)
-;;;
-
-(define-public (markup-command-signature-ref markup-command)
- "Return @var{markup-command}'s signature (the @code{'markup-signature}
-object property)."
- (object-property markup-command 'markup-signature))
-
-(define-public (markup-command-signature-set! markup-command signature)
- "Set @var{markup-command}'s signature (as object property)."
- (set-object-property! markup-command 'markup-signature signature)
- signature)
-
-(define-public markup-command-signature
- (make-procedure-with-setter markup-command-signature-ref
- markup-command-signature-set!))
-
-(define (lookup-markup-command-aux symbol)
- (let ((proc (catch 'misc-error
- (lambda ()
- (module-ref (current-module) symbol))
- (lambda (key . args) #f))))
- (and (procedure? proc) proc)))
-
-(define-public (lookup-markup-command code)
- (let ((proc (lookup-markup-command-aux
- (string->symbol (format #f "~a-markup" code)))))
- (and proc (markup-function? proc)
- (cons proc (markup-command-signature proc)))))
-
-(define-public (lookup-markup-list-command code)
- (let ((proc (lookup-markup-command-aux
- (string->symbol (format #f "~a-markup-list" code)))))
- (and proc (markup-list-function? proc)
- (cons proc (markup-command-signature proc)))))
-
-;;;;;;;;;;;;;;;;;;;;;;
-;;; used in parser.yy to map a list of markup commands on markup arguments
-(define-public (map-markup-command-list commands markups)
- "@var{markups} being a list of markups, for example
-@code{(markup1 markup2 markup3)}, and @var{commands} a list of commands with
-their scheme arguments, in reverse order, for example
-@code{((italic) (raise 4) (bold))}, map the commands on each markup argument,
-for example
-@example
-((bold (raise 4 (italic markup1)))
- (bold (raise 4 (italic markup2)))
- (bold (raise 4 (italic markup3))))
-@end example"
- (map-in-order (lambda (arg)
- (let ((result arg))
- (for-each (lambda (cmd)
- (set! result (append cmd (list result))))
- commands)
- result))
- markups))
-
-;;;;;;;;;;;;;;;;;;;;;;
-;;; markup type predicates
-
-(define (markup-function? x)
- (and (markup-command-signature x)
- (not (object-property x 'markup-list-command))))
-
-(define (markup-list-function? x)
- (and (markup-command-signature x)
- (object-property x 'markup-list-command)))
-
-(define-public (markup-command-list? x)
- "Determine whether @var{x} is a markup command list, i.e. a list
-composed of a markup list function and its arguments."
- (and (pair? x) (markup-list-function? (car x))))
-
-(define-public (markup-list? arg)
- "Return @code{#t} if @var{x} is a list of markups or markup command lists."
- (define (markup-list-inner? lst)
- (or (null? lst)
- (and (or (markup? (car lst)) (markup-command-list? (car lst)))
- (markup-list-inner? (cdr lst)))))
- (not (not (and (list? arg) (markup-list-inner? arg)))))
-
-(define (markup-argument-list? signature arguments)
- "Typecheck argument list."
- (if (and (pair? signature) (pair? arguments))
- (and ((car signature) (car arguments))
- (markup-argument-list? (cdr signature) (cdr arguments)))
- (and (null? signature) (null? arguments))))
-
-
-(define (markup-argument-list-error signature arguments number)
- "return (ARG-NR TYPE-EXPECTED ARG-FOUND) if an error is detected, or
-#f is no error found.
-"
- (if (and (pair? signature) (pair? arguments))
- (if (not ((car signature) (car arguments)))
- (list number (type-name (car signature)) (car arguments))
- (markup-argument-list-error (cdr signature) (cdr arguments) (+ 1 number)))
- #f))
-
-;;
-;; full recursive typecheck.
-;;
-(define (markup-typecheck? arg)
- (or (string? arg)
- (and (pair? arg)
- (markup-function? (car arg))
- (markup-argument-list? (markup-command-signature (car arg))
- (cdr arg)))))
-
-;;
-;;
-;;
-;;
-(define (markup-thrower-typecheck arg)
- "typecheck, and throw an error when something amiss.
-
-Uncovered - cheap-markup? is used."
-
- (cond ((string? arg) #t)
- ((not (pair? arg))
- (throw 'markup-format "Not a pair" arg))
- ((not (markup-function? (car arg)))
- (throw 'markup-format "Not a markup function " (car arg)))
- ((not (markup-argument-list? (markup-command-signature (car arg))
- (cdr arg)))
- (throw 'markup-format "Arguments failed typecheck for " arg)))
- #t)
-
-;;
-;; good enough if you only use make-XXX-markup functions.
-;;
-(define (cheap-markup? x)
- (or (string? x)
- (and (pair? x)
- (markup-function? (car x)))))
-
-;;
-;; replace by markup-thrower-typecheck for more detailed diagnostics.
-;;
-(define-public markup? cheap-markup?)
-
;; utility
(define (markup-join markups sep)
(define-public (interpret-markup-list layout props markup-list)
(let ((stencils (list)))
(for-each (lambda (m)
- (set! stencils
- (if (markup-command-list? m)
- (append! (reverse! (apply (car m) layout props (cdr m)))
- stencils)
- (cons (interpret-markup layout props m) stencils))))
- markup-list)
+ (set! stencils
+ (if (markup-command-list? m)
+ (append! (reverse! (apply (car m) layout props (cdr m)))
+ stencils)
+ (cons (interpret-markup layout props m) stencils))))
+ markup-list)
(reverse! stencils)))
(define-public (prepend-alist-chain key val chain)
(define-public (stack-stencil-line space stencils)
"DOCME"
(if (and (pair? stencils)
- (ly:stencil? (car stencils)))
+ (ly:stencil? (car stencils)))
(if (and (pair? (cdr stencils))
- (ly:stencil? (cadr stencils)))
+ (ly:stencil? (cadr stencils)))
(let* ((tail (stack-stencil-line space (cdr stencils)))
(head (car stencils))
(xoff (+ space (interval-length (ly:stencil-extent head X)))))
(ly:stencil-add head
- (ly:stencil-translate-axis tail xoff X)))
+ (ly:stencil-translate-axis tail xoff X)))
(car stencils))
(ly:make-stencil '() '(0 . 0) '(0 . 0))))
(define-public (markup->string m)
;; markup commands with one markup argument, formatting ignored
(define markups-first-argument '(list
- bold-markup box-markup caps-markup dynamic-markup finger-markup
- fontCaps-markup huge-markup italic-markup large-markup larger-markup
- medium-markup normal-size-sub-markup normal-size-super-markup
- normal-text-markup normalsize-markup number-markup roman-markup
- sans-markup simple-markup small-markup smallCaps-markup smaller-markup
- sub-markup super-markup teeny-markup text-markup tiny-markup
- typewriter-markup underline-markup upright-markup bracket-markup
- circle-markup hbracket-markup parenthesize-markup rounded-box-markup
-
- center-align-markup center-column-markup column-markup dir-column-markup
- fill-line-markup justify-markup justify-string-markup left-align-markup
- left-column-markup line-markup right-align-markup right-column-markup
- vcenter-markup wordwrap-markup wordwrap-string-markup ))
+ bold-markup box-markup caps-markup dynamic-markup finger-markup
+ fontCaps-markup huge-markup italic-markup large-markup larger-markup
+ medium-markup normal-size-sub-markup normal-size-super-markup
+ normal-text-markup normalsize-markup number-markup roman-markup
+ sans-markup simple-markup small-markup smallCaps-markup smaller-markup
+ sub-markup super-markup teeny-markup text-markup tiny-markup
+ typewriter-markup underline-markup upright-markup bracket-markup
+ circle-markup hbracket-markup parenthesize-markup rounded-box-markup
+
+ center-align-markup center-column-markup column-markup dir-column-markup
+ fill-line-markup justify-markup justify-string-markup left-align-markup
+ left-column-markup line-markup right-align-markup right-column-markup
+ vcenter-markup wordwrap-markup wordwrap-string-markup ))
;; markup commands with markup as second argument, first argument
;; specifies some formatting and is ignored
(define markups-second-argument '(list
- abs-fontsize-markup fontsize-markup magnify-markup lower-markup
- pad-around-markup pad-markup-markup pad-x-markup raise-markup
- halign-markup hcenter-in-markup rotate-markup translate-markup
- translate-scaled-markup with-url-markup scale-markup ))
+ abs-fontsize-markup fontsize-markup magnify-markup lower-markup
+ pad-around-markup pad-markup-markup pad-x-markup raise-markup
+ halign-markup hcenter-in-markup rotate-markup translate-markup
+ translate-scaled-markup with-url-markup scale-markup ))
;; helper functions to handle string cons like string lists
(define (markup-cons->string-cons c)
(if (not (pair? c)) (markup->string c)
- (cons (markup->string (car c)) (markup-cons->string-cons (cdr c)))))
+ (cons (markup->string (car c)) (markup-cons->string-cons (cdr c)))))
(define (string-cons-join c)
(if (not (pair? c)) c
(string-join (list (car c) (string-cons-join (cdr c))) "")))
(cond
- ((string? m) m)
- ((null? m) "")
+ ((string? m) m)
+ ((null? m) "")
- ;; handle \concat (string-join without spaces)
- ((and (pair? m) (equal? (car m) concat-markup))
- (string-cons-join (markup-cons->string-cons (cadr m))) )
+ ;; handle \concat (string-join without spaces)
+ ((and (pair? m) (equal? (car m) concat-markup))
+ (string-cons-join (markup-cons->string-cons (cadr m))) )
- ;; markup functions with the markup as first arg
- ((member (car m) (primitive-eval markups-first-argument))
- (markup->string (cadr m)))
+ ;; markup functions with the markup as first arg
+ ((member (car m) (primitive-eval markups-first-argument))
+ (markup->string (cadr m)))
- ;; markup functions with markup as second arg
- ((member (car m) (primitive-eval markups-second-argument))
- (markup->string (cddr m)))
+ ;; markup functions with markup as second arg
+ ((member (car m) (primitive-eval markups-second-argument))
+ (markup->string (cddr m)))
- ;; ignore all other markup functions
- ((markup-function? (car m)) "")
+ ;; ignore all other markup functions
+ ((markup-function? (car m)) "")
- ;; handle markup lists
- ((list? m)
- (string-join (map markup->string m) " "))
+ ;; handle markup lists
+ ((list? m)
+ (string-join (map markup->string m) " "))
- (else "ERROR, unable to extract string from markup")))
+ (else "ERROR, unable to extract string from markup")))
(make-property-set 'graceSettings
;; TODO: take this from voicedGraceSettings or similar.
'((Voice Stem font-size -3)
+ (Voice Flag font-size -3)
(Voice NoteHead font-size -3)
(Voice TabNoteHead font-size -4)
(Voice Dots font-size -3)
(set! (ly:grob-property grob symbol) val))))
-;;
-(define-public (smart-bar-check n)
- "Make a bar check that checks for a specific bar number."
- (let ((m (make-music 'ApplyContext)))
- (define (checker tr)
- (let* ((bn (ly:context-property tr 'currentBarNumber)))
- (or (= bn n)
- (ly:error
- ;; FIXME: uncomprehensable message
- (_ "Bar check failed. Expect to be at ~a, instead at ~a")
- n bn))))
- (set! (ly:music-property m 'procedure) checker)
- m))
-
-
(define-public (skip->rest mus)
"Replace @var{mus} by @code{RestEvent} of the same duration if it is a
@code{SkipEvent}. Useful for extracting parts from crowded scores."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; warn for bare chords at start.
-
(define-public (ly:music-message music msg)
(let ((ip (ly:music-property music 'origin)))
(if (ly:input-location? ip)
- (ly:input-message ip msg)
- (ly:warning msg))))
+ (ly:input-message ip msg)
+ (ly:message msg))))
+
+(define-public (ly:music-warning music msg)
+ (let ((ip (ly:music-property music 'origin)))
+ (if (ly:input-location? ip)
+ (ly:input-warning ip msg)
+ (ly:warning msg))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
(set! (ly:music-property music 'quoted-events) quoted-vector)
(set! (ly:music-property music 'iterator-ctor)
ly:quote-iterator::constructor))
- (ly:music-message music (ly:format (_ "cannot find quoted music: `~S'") quoted-name))))
+ (ly:music-warning music (ly:format (_ "cannot find quoted music: `~S'") quoted-name))))
music))
@var{laziness} states over how many bars an accidental should be remembered.
@code{0}@tie{}is the default -- accidental lasts over 0@tie{}bar lines, that
is, to the end of current measure. A positive integer means that the
-accidental lasts over that many bar lines. @code{-1} is `forget
+accidental lasts over that many bar lines. @w{@code{-1}} is `forget
immediately', that is, only look at key signature. @code{#t} is `forever'."
(check-pitch-against-signature context pitch barnum laziness octaveness))
(ly:text-interface::interpret-markup layout props text)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; cross-staff stuff
+
+(define-public (script-or-side-position-cross-staff g)
+ (or
+ (ly:script-interface::calc-cross-staff g)
+ (ly:side-position-interface::calc-cross-staff g)))
+
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; note heads
(ly:duration-log
(ly:event-property (event-cause grob) 'duration)))
+(define-public (stem::length grob)
+ (let* ((d (ly:grob-property grob 'direction))
+ (ss (ly:staff-symbol-staff-space grob))
+ (beg (ly:grob-property grob 'stem-begin-position))
+ (beam (ly:grob-object grob 'beam)))
+ (if (null? beam)
+ (abs (- (ly:stem::calc-stem-end-position grob) beg))
+ (ly:grob-property grob 'length))))
+
+(define-public (stem::pure-length grob beg end)
+ (let* ((d (ly:grob-property grob 'direction))
+ (ss (ly:staff-symbol-staff-space grob))
+ (beg (ly:grob-pure-property grob 'stem-begin-position 0 1000)))
+ (abs (- (ly:stem::pure-calc-stem-end-position grob 0 2147483646) beg))))
+
(define-public (note-head::calc-duration-log grob)
(min 2
(ly:duration-log
(char->integer #\0)))))
(string->list (number->string var-idx)))))))))
-(define-public (parse-string-result str parser)
- "Parse @var{str}, which is supposed to contain a music expression."
-
- (ly:parser-parse-string
- parser
- (format #f "parseStringResult = \\notemode { ~a }" str))
- (ly:parser-lookup parser 'parseStringResult))
-
(define-public (read-lily-expression chr port)
"Read a lilypond music expression enclosed within @code{#@}} and @code{#@}}
from @var{port} and return the corresponding Scheme music expression.
,@(map (lambda (binding)
`(ly:parser-define! parser-clone ',(car binding) ,(cdr binding)))
(reverse bindings))
- (parse-string-result ,lily-string parser-clone)))))
+ (ly:parse-string-expression parser-clone ,lily-string)))))
(read-hash-extend #\{ read-lily-expression)
(if (not (null? quote-contents))
(hash-set! tab name (list->vector (reverse! quote-contents '())))
- (ly:music-message mus (ly:format (_ "quoted music `~a' is empty") name)))))
+ (ly:music-warning mus (ly:format (_ "quoted music `~a' is empty") name)))))
(my-system
be-verbose #t
(format #f
- "pngtopnm ~a | pnmscale -reduce ~a 2>/dev/null | pnmtopng -compression 9 2>/dev/null > ~a"
+ "pngtopnm \"~a\" | pnmscale -reduce ~a 2>/dev/null | pnmtopng -compression 9 2>/dev/null > \"~a\""
old factor file))
(delete-file old)))
. (
(script-stencil . (feta . ("uportato" . "dportato")))
(avoid-slur . around)
- (slur-padding . 0.3)
(padding . 0.45)
(side-relative-direction . ,DOWN)))
("prall"
(avoid-slur . around)
(padding . 0.50)
(direction . ,UP)
- (slur-padding . 0.2)
(staff-padding . 0.5)))
("trill"
. (
orig_ln = ln
+ ln = junk_space (ln, state)
ln = try_parse_header_line (ln, state)
# Try nibbling characters off until the line doesn't change.
return extract_sections (filepath)[1]
if not (include_name in known_missing_files):
# Not found
- print 'No such file: ' + include_name
- print 'Search path: ' + ':'.join (include_path)
+ print 'Warning: No such file: ' + include_name + \
+ ' (search path: ' + ':'.join (include_path)+')'
return ''
lang_re = re.compile (r'^@documentlanguage (.+)', re.M)
* Add @nodes, split at sections?
+ * -o --output listed in help is not implemented?!
'''
import os
import getopt
import re
+import glob
program_name = 'lys-to-tely'
-f, --fragment-options=OPTIONS use OPTIONS as lilypond-book fragment
options
-o, --output=NAME write tely doc to NAME
+ -i, --input-filenames=NAME read list of files from a file instead of stdin
+ -g, --glob-input=GLOB a string which will be passed to glob.glob(GLOB)
-t, --title=TITLE set tely doc title TITLE
-a, --author=AUTHOR set tely author AUTHOR
--template=TEMPLATE use TEMPLATE as Texinfo template file,
sys.exit (0)
(options, files) = getopt.getopt (sys.argv[1:], 'f:hn:t:',
- ['fragment-options=', 'help', 'name=', 'title=', 'author=', 'template='])
+ ['fragment-options=', 'help', 'name=',
+ 'title=', 'author=', 'template=',
+ 'input-filenames=', 'glob-input='])
name = "ly-doc"
title = "Ly Doc"
author = "Han-Wen Nienhuys and Jan Nieuwenhuizen"
+input_filename = ""
+glob_input = ""
template = '''\input texinfo
@setfilename %%(name)s.info
@settitle %%(title)s
title = a
elif o == '-a' or o == '--author':
author = a
+ elif o == '-i' or o == '--input-filenames':
+ input_filename = a
+ elif o == '-p' or o == '--glob-input':
+ glob_input = a
elif o == '-f' or o == '--fragment-options':
fragment_options = a
elif o == '--template':
texi_file_re = re.compile ('.*\.i?te(ly|xi)$')
html_file_re = re.compile ('.*\.i?htm(l)?$')
-xml_file_re = re.compile ('.*\.i?xml$')
+xml_file_re = re.compile ('.*\.i?(xm|mx)l$')
tex_file_re = re.compile ('.*\.i?(la)?tex$')
pdf_file_re = re.compile ('.*\.i?pdf$')
# We have a texi include file, simply include it:
s = r"@include %s" % os.path.basename (n)
elif (html_file_re.match (n) or pdf_file_re.match (n) or
- xml_file_re.match (n) or tex_file_re.match (n)):
+ tex_file_re.match (n)):
s = r"""
@ifhtml
@html
@end html
@end ifhtml
""" % (os.path.basename (n), os.path.basename (n))
- return s
+
+ elif (xml_file_re.match (n)):
+ # Assume it's a MusicXML file -> convert, create image etc.
+ s = r"""
+@ifhtml
+@html
+<a name="%s"></a>
+@end html
+@end ifhtml
+
+@musicxmlfile[%s]{%s}
+""" % (os.path.basename (n), fragment_options, n)
+
else:
# Assume it's a lilypond file -> create image etc.
s = r"""
""" % (os.path.basename (n), fragment_options, n)
return s
+if glob_input:
+ files = glob.glob(glob_input)
+elif input_filename:
+ files = open(input_filename).read().split()
+
if files:
dir = os.path.dirname (name) or "."
# don't strip .tely extension, Documentation/snippets uses .itely
import optparse
import os
import math
+import re
## so we can call directly as scripts/build/output-distance.py
me_path = os.path.abspath (os.path.split (sys.argv[0])[0])
self.geometric_distance ())
def scheme_float (s) :
- return float(s) if 'nan' not in s else float(s.split('.')[0])
+ if 'nan' not in s :
+ return float(s)
+ return float(s.split('.')[0])
def read_signature_file (name):
print 'reading', name
return d
+snippet_fn_re = re.compile (r"`\./([0-9a-f]{2}/lily-[0-9a-f]{8}).eps'");
class TextFileCompareLink (FileCompareLink):
def calc_distance (self):
import difflib
- diff = difflib.unified_diff (self.contents[0].strip().split ('\n'),
- self.contents[1].strip().split ('\n'),
+ # Extract the old and the new hashed snippet names from the log file
+ # and replace the old by the new, so file name changes don't show
+ # up as log differences...
+ cont0 = self.contents[0].strip();
+ cont1 = self.contents[1].strip();
+ m0 = re.search (snippet_fn_re, cont0);
+ m1 = re.search (snippet_fn_re, cont1);
+ if (m0 and m1 and (m0.group(1) != m1.group(1))):
+ cont0 = cont0.replace (m0.group(1), m1.group(1));
+
+ diff = difflib.unified_diff (cont0.split ('\n'),
+ cont1.split ('\n'),
fromfiledate = self.file_names[0],
tofiledate = self.file_names[1]
)
# Files/directories
import glob
-import re
def compare_signature_files (f1, f2):
s1 = read_signature_file (f1)
conv_list = get_conversions (from_version, to_version)
error_file_write (_ ("Applying conversion: "))
-
+
last_conversion = ()
try:
+ if not conv_list:
+ last_conversion = to_version
for x in conv_list:
error_file_write (tup_to_str (x[0]))
if x != conv_list[-1]:
elif not global_options.skip_version_add:
result = newversion + '\n' + result
- error_file_write ('\n')
+ error_file_write ('\n')
if global_options.edit:
try:
metavar=_ ("PROG"),
action='store', dest='latex_program',
default='latex')
+ group.add_option ('--texinfo-program',
+ help=_ ("run executable PROG instead of texi2pdf"),
+ metavar=_ ("PROG"),
+ action='store', dest='texinfo_program',
+ default='texi2pdf')
group.add_option ('--pdf',
action="store_true",
dest="create_pdf",
s = tag
s += r'''
-\version "2.13.53"
+\version "2.14.0"
'''
s += r'''
\normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
% Flag to tell @lisp, etc., not to narrow margin.
\let\nonarrowing = t%
+ %
+ % If this cartouche directly follows a sectioning command, we need the
+ % \parskip glue (backspaced over by default) or the cartouche can
+ % collide with the section heading.
+ \ifnum\lastpenalty>10000 \vskip\parskip \fi
+ %
\vbox\bgroup
\baselineskip=0pt\parskip=0pt\lineskip=0pt
\carttop