@node Using a Virtual Machine to Compile LilyPond
@section Using a Virtual Machine to Compile LilyPond
+TODO: rewrite for lily-git.tcl !!! do before GOP! -gp
+
Since it is not possible to compile Lilypond on Windows, some
developers may find it useful to install a GNU/Linux virtual
machine. A disk image with a special remix of @strong{Ubuntu}
@item Open a @strong{terminal} session.
(@code{Applications > Accessories > Terminal})
-@c FIXME: make sure the url link below doesn't get broken -vv
-
@item Open @strong{Firefox} (there's an icon for it on the
panel at the top of the screen) and go to the online Lilypond
@uref{http://lilypond.org/doc/latest/Documentation/contributor/,
manual.
@item
-@@predefined ... @@endpredefined is for commands in ly/*-init.ly
-FIXME?
+@@predefined ... @@endpredefined is for commands in
+@file{ly/*-init.ly}
@item
Do not include any real info in second-level sections (ie 1.1
@include contributor/doc-translation-list.itexi
+In addition, not listed above, Snippets' titles and descriptions
+should be translated; they are a part of the Notation Reference and
+therefore their priority is 5.
+
@node Translating the Web site and other Texinfo documentation
@unnumberedsubsubsec Translating the Web site and other Texinfo documentation
@file{Documentation/snippets}, see @q{General guidelines} in @ref{Adding
and editing snippets}.
-@code{@@example} blocs need not be verbatim copies, e.g. variable
+@code{@@example} blocks need not be verbatim copies, e.g. variable
names, file names and comments should be translated.
Finally, please carefully apply every rule exposed in @ref{Texinfo
git rev-list HEAD |head -1
@end example
+A special case is updating Snippet documentation strings in
+@file{Documentation/@var{MY-LANGUAGE}/texidocs}. For these to be
+correctly marked as up-to-date, first run @code{makelsr.py} as
+explained in @ref{Adding and editing snippets}, and commit the
+resulting compiled snippets left in @file{Documentation/snippets/}.
+Say the SHA1 ID code of this commit is <C>. Now edit again your
+translated files in @file{Documentation/@var{MY-LANGUAGE}/texidocs}
+adjusting the 40-digit committish that appears in the text to be <C>;
+finally, commit these updated files. Not doing so would result in
+changes made both to your updates and original snippets to
+persistently appear in the check-translation output as if they were
+out of sync.
+
+This two-phase mechanism avoids the (practically) unsolvable problem
+of guessing what committish will have our update, and pretending to
+put this very committish on the files in the same commit.
+
+@c http://lists.gnu.org/archive/html/lilypond-devel/2009-01/msg00245.html
+@c contains a helper script which could be used to perform massive
+@c committish updates.
+
+
+@seealso
+@ref{LSR work}.
+
@node Translations management policies
@subsection Translations management policies
@node Introduction to contributing
@chapter Introduction to contributing
-FIXME add fluff
+This chapter presents a quick overview of ways that people can
+help LilyPond.
@menu
* Help us::
Second, the classification of what counts as a bug vs. feature
request, and the priorities assigned to bugs, are a matter of
-concern @strong{for developers only}. If you are curious about
-the classification, read on, but don't complain that your
-particular issue is higher priority or counts as a bug rather than
-a feature request.
+concern @strong{for developers only}. The Bug Squad will classify
+issues according to the guidelines given by developers.
+
+If you are curious about the classification, read on, but please
+don't complain that your particular issue should have higher
+priority or counts as a bug rather than a feature request.
@node Issue classification
@item
New: the item was added by a non-member, despite numerous warnings
-not to do this. Should be reviewed by the Bug Meister.
+not to do this. Should be reviewed by a member of the Bug Squad.
@item
-Accepted: the Bug Meister added it, or reviewed the item.
+Accepted: the Bug Squad added it, or reviewed the item.
@item
Started: a contributor is working on a fix. Owner should change
@item
Fixed: a contributor claims to have fixed the bug. The Bug
-Meister should check the fix with the next official binary release
+Squad should check the fix with the next official binary release
(not by compiling the source from git). Owner should be set to
that contributor.
@item
-Verified: Bug Meister has confirmed that the issue is closed.
+Verified: Bug Squad has confirmed that the issue is closed.
@end itemize
@item
Priority-High: highly embarrassing items, and any regression
-against a version earlier than two stable versions. (i.e. when
-developing 2.13, any regression against 2.8 or earlier)
+against a version earlier than two stable versions (i.e. when
+developing 2.13, any regression against 2.8 or earlier). This
+level is also used for issues which produce no output and fail to
+give the user a clue about what's wrong.
@item
Priority-Medium: normal priority.
@end itemize
+The difference between Priority-Medium and Priority-Low is not
+well-defined, both in this policy and in practice. The only
+answer we can give at the moment is @qq{look at existing items in
+of the same type, and try to guess whether the priority is closer
+to the Medium items or Low items}. We're aware of the ambiguity,
+and won't complain if somebody picks a @q{wrong} value for
+Medium/Low.
+
@subheading Opsys
@node Adding issues to the tracker
@section Adding issues to the tracker
-This should only be done by the Bug Meister(s), or experienced
+This should only be done by the Bug Squad or experienced
developers. Normal users should not do this; instead, they should
follow the guidelines for @rweb{Bug reports}.
Git has special functionality to help tracking down the exact
commit which causes a problem. See the git manual page for
-@code{git bisect}.
-
-This is a job that non-programmers can do; once a problematic
-commit is identified, the programmers' job is much easier. In
-fact, for most regression bugs, the majority of the time is spent
-simply finding the problematic commit.
-
+@code{git bisect}. This is a job that non-programmers can do,
+although it requires familiarity with git, ability to compile
+LilyPond, and generally a fair amount of technical knowledge.
+
+Even if you are not familiar with git or are not able to compile
+LilyPond you can still help to narrow down the cause of a regression
+simply by downloading the binary releases of different LilyPond
+versions and testing them for the regression. Knowing which version
+of LilyPond first exhibited the regression is helpful to a developer
+as it shortens the @code{git bisect} procedure described above.
+
+Once a problematic commit is identified, the programmers' job is
+much easier. In fact, for most regression bugs, the majority of
+the time is spent simply finding the problematic commit.
@noindent
This also copies translated texidoc fields and snippet titles into
-snippets in @file{Documentation/snippets}.
+snippets in @file{Documentation/snippets}. Note: this, in turn, could
+make the translated texidoc fields to appear as out of sync when you
+run @code{make check-translation}, if the originals changed from the
+last translation update, even if the translations are also updated;
+see @ref{Documentation translation maintenance} for details about
+updating the docs; in particular, see @ref{Updating translation
+committishes} to learn how to mark these translated fields as fully
+updated.
Be sure that @command{make doc} runs successfully before submitting a
patch, to prevent breaking compilation.
@node Iterator tutorial
@section Iterator tutorial
-FIXME -- this is a placeholder for a tutorial on iterators
+TODO -- this is a placeholder for a tutorial on iterators
Iterators are routines written in C++ that process music expressions
and sent the music events to the appropriate engravers and/or
@node Engraver tutorial
@section Engraver tutorial
-FIXME -- This is a placeholder for a tutorial on how engravers work.
+TODO -- This is a placeholder for a tutorial on how engravers work.
Engravers are C++ classes that catch music events and
create the appropriate grobs for display on the page. Though the
In certain cases, an engraver might need to ensure private Scheme variables
(with type SCM) do not get swept away by Guile's garbage collector: for example,
-a cache of the previous key signature which must persist persist between timesteps.
-The method @code{virtual derived_mark () const} can be used in such cases to mark
+a cache of the previous key signature which must persist between timesteps. The
+method @code{virtual derived_mark () const} can be used in such cases to mark
such objects as follows:
@example
@subsection Listening to music events
-External interfaces to to the engraver are implemented by protected
+External interfaces to the engraver are implemented by protected
macros including one or more of the following:
@itemize
@node Callback tutorial
@section Callback tutorial
-FIXME -- This is a placeholder for a tutorial on callback functions.
+TODO -- This is a placeholder for a tutorial on callback functions.
@node LilyPond scoping
@section LilyPond scoping
@item @strong{Release prep phase}:
-FIXME: I don't like that name.
+TODO: I don't like that name.
A new git branch @code{stable/2.x} is created, and a major release
is made in two weeks.
vi Documentation/web/news-front.itexi Documentation/web/news.itexi
@end example
-@item (optional) Check that lilypond builds from scratch in an
-out-of-tree build.
-
-@item Upload release branch.
+@item
+Commit, push, switch back to master:
@example
+git commit -m "Release: update news." Documentation/web/
git push origin
+git checkout master
+git merge release/unstable
@end example
+@item (optional) Check that lilypond builds from scratch in an
+out-of-tree build.
+
@item
If you do not have the previous release test-output tarball, download
it and put it in @code{regtests/}
@section Using lily-git
-FIXME: Add instructions for using @command{lily-git} here.
+If you haven't already, download and install Git. Go to
+@uref{http://git-scm.com/download}, and in the @qq{Binaries}
+section, select the appropriate package for your operating system.
+Windows users should visit
+@uref{http://code.google.com/p/msysgit/downloads/list} and
+download the @file{.exe} file labeled @qq{Full installer for
+official Git}.
+
+Download the lily-git script from:
+
+@c don't change the cgit link below to gitweb; gitweb uses
+@c long filenames like "scripts_auxiliar_lily-git.tcl"
+
+@example
+@uref{http://git.sv.gnu.org/cgit/lilypond.git/plain/scripts/auxiliar/lily-git.tcl}.
+@end example
+
+To run the program from the command line, navigate to the
+directory containing @file{lily-git.tcl} and enter:
+
+@example
+wish lily-git.tcl
+@end example
+
+
+@subsubheading Get source / Update source
+
+When you click the @qq{Get source} button, @command{lily-git} will
+create a directory called @file{lilypond-git/} within your home
+directory, and will download the complete source code into that
+directory (around 55Mb). When the process is finished, the
+@qq{Command output} window will display @qq{Done}, and the button
+label will change to say @qq{Update source}.
+
+Navigate to the @file{lilypond-git/} directory to view the source
+files. You should now be able to modify the source files using
+your normal text editor.
+
+
+@subsubheading New local commit
+
+A single commit typically represents one logical set of related
+changes (such as a bug-fix), and may incorporate changes to
+multiple files at the same time.
+
+When you're finished making the changes for your first commit,
+click the @qq{New local commit} button. This will open the
+@qq{Git Commit Message} window. The message header is required,
+and the message body is optional. See @ref{Commits and patches}
+for more information regarding commits and commit messages.
+
+After entering a commit message, click @qq{OK} to finalize the
+commit.
+
+
+@subsubheading Amend previous commit
+
+You can go back and make changes to the most recent commit with
+the @qq{Amend previous commit} button. This is useful if a
+mistake is found after you've clicked the @qq{New local commit}
+button. To amend the most recent commit, edit the source files as
+needed and click the button. The earlier version of the commit is
+not saved, but is replaced by the new one.
+
+Note that this does not update patch files; if you have a patch
+file from an earlier version of the commit, you will need to make
+another patch set when using this feature. The old patch file is
+not saved, but is replaced by the new one.
+
+
+@subsubheading Make patch set
+
+Before making a patch set from any commits, you should click the
+@qq{Update source} button to make sure the commits are based on
+the most recent remote snapshot.
+
+When you click the @qq{Make patch set} button, @command{lily-git}
+will produce patch files for any new commits, saving them to the
+current directory. The command output will display the name of
+the new patch files near the end of the output:
+
+@example
+0001-CG-add-lily-git-instructions.patch
+Done.
+@end example
+
+Send patch files to your mentor if you have one. Otherwise, write
+an email (must be less than 64 KB) to
+@email{lilypond-devel@@gnu.org} briefly explaining your work, with
+the patch files attached. Translators should send patches to
+@email{translations@@lilynet.net}.
+
+
+@subsubheading The @qq{Abort changes -- Reset to origin} button
+
+@warning{Only use this if your local commit history gets
+hopelessly confused!}
+
+The button labeled @qq{Abort changes -- Reset to origin} will copy
+all changed files to a subdirectory of @file{lilypond-git/} named
+@file{aborted_edits/}, and will reset the repository to the
+current state of the remote repository (at @code{git.sv.gnu.org}).
@node Starting with Git
⋮
@end example
-Send an email to @email{lilypond-devel@@gnu.org} briefly
-explaining your work, with the patch files attached. Translators
-should send patches to @email{translations@@lilynet.net}. After
-your patches are reviewed, the developers may push one or more of
-them to the main repository or discuss them with you.
+Send an email (must be less than 64 KB) to
+@email{lilypond-devel@@gnu.org} briefly explaining your work, with
+the patch files attached. Translators should send patches to
+@email{translations@@lilynet.net}. After your patches are
+reviewed, the developers may push one or more of them to the main
+repository or discuss them with you.
@seealso
@node Music engraving
@chapter Music engraving
-This section covers the overall goals and architecture of
-LilyPond.
+This essay describes why LilyPond was created and how it can produce
+such beautiful sheet music.
@c TODO:
@c remove 3mm eps bounding box left padding for Sarabande (This will
@c require adding a new snippet option to lilypond-book.py
@c check formatting of HTML output
-@c
@c Notes:
@c Incorrect beaming in the Sarabande is a known bug.
@node The LilyPond story
@unnumberedsec The LilyPond story
-Before LilyPond had a community of users around the world, before it had
-been used to produce university course notes or world-premier opera
-performance scores, before there was an essay on music engraving or any
-computer code or even an organized team of developers, LilyPond began
-with a question:
+Long before LilyPond had been used to engrave beautiful performance
+scores, before it could create university course notes or even simple
+melodies, before there was a community of users around the world or even
+an essay on music engraving, LilyPond began with a question:
@quotation
Why does most computer output fail to achieve the beauty and balance of
second is a modern, computer-engraved edition.
@ifnottex
+@quotation
@noindent
Bärenreiter BA 320, @copyright{}1950:
@sourceimage{baer-suite1-fullpage,,,png}
+@end quotation
+@quotation
@noindent
Henle no. 666, @copyright{}2000:
@sourceimage{henle-suite1-fullpage,,,png}
+@end quotation
@end ifnottex
The notes here are identical, taken from Bach's first Suite for solo
@noindent
Bärenreiter BA 320, @copyright{}1950:
-@sourceimage{baer-suite1-fullpage,16cm,,}
+@sourceimage{baer-suite1-fullpage-hires,16cm,,}
@page
@noindent
Henle no. 666, @copyright{}2000:
@sp 3
-@sourceimage{henle-suite1-fullpage,16cm,,}
+@sourceimage{henle-suite1-fullpage-hires,16cm,,}
@page
@end iftex
notes. A master engraver would adjust the spacing as needed to please
the eye.
-Another example of optical spacing is the visual interplay between the
-stems and the bar lines. When an up-stem precedes the bar line, a little
-more space is needed to keep it from feeling crowded:
-
-@lilypond
-\paper {
- ragged-right = ##t
-}
-
-\score {
- {
- c''8 c'' c'' c'' c'' c'' c'' c'' \break
- a' a' a' a' a' a' a' a'
- }
- \layout {
- \context {
- \Staff
- \remove "Time_signature_engraver"
- \override NoteSpacing #'stem-spacing-correction = #0.7
- }
- \context {
- \Score
- \remove "Bar_number_engraver"
- }
- }
-}
-@end lilypond
+The spacing algorthims in LilyPond even take the barlines into account,
+which is why the final up-stem in the properly spaced example has been
+given a little more space before the barline to keep it from looking
+crowded. A down-stem would not need this adjustment.
@node Ledger lines
@unnumberedsubsec Ledger lines
@cindex engraving, automated
@cindex automated engraving
-This section describes what is required to create software that can
+Here we describe what is required to create software that can
mimic the layout of engraved scores: a method of explaining good
layouts to the computer, detailed comparisons with real engravings,
and enough flexibility to deal with the wide range of challenges
@end lilypond
There are a few books on the art of music engraving
-available. Unfortunately, they contain rules of simple thumbs and some
+available. Unfortunately, they contain simple rules of thumb and some
examples. Such rules can be instructive, but they are a far cry from
an algorithm that we could readily implement in a computer. Following
the instructions from literature leads to algorithms with lots of
-hand coded exceptions. Doing all this case analysis is a lot of work,
+hand-coded exceptions. Doing all this case analysis is a lot of work,
and often not all cases are covered completely:
@quotation
in North America. Sibelius is their major rival and they appear to be
especially strong in the European market.
-For our comparison we chose Bach's Fugue in G minor from the
+For our comparison we selected Bach's Fugue in G minor from the
Well-Tempered Clavier, Book I, BWV 861, whose opening subject is
@lilypond
the subject returns in a three-part stretto and leads into the closing
section. In the Finale version, we have resisted the temptation to make
any adjustments to the default output because we are trying to show the
-things that each software package gets right without assistance.
+things that each software package gets right without assistance. The
+only major edits that we made were adjusting the page size to match this
+essay and forcing the music onto two systems to make the comparison
+easier. By default Finale would have engraved two systems of three
+measures each and a final, full-width system containing a single
+measure.
Many of the differences between the two engravings are visible in
measures 28--29, as shown here with Finale first and LilyPond second:
@end itemize
This example is not intended to suggest that Finale cannot be used to
-produce beautiful output. On the contrary, in the hands of a skilled
-user it can and does, but it requires skill and time. One of the
-fundamental differences between LilyPond and commercial score writers is
+produce publication-quality output. On the contrary, in the hands of a
+skilled user it can and does, but it requires skill and time. One of the
+fundamental differences between LilyPond and commercial scorewriters is
that LilyPond hopes to reduce the amount of human intervention to an
absolute minimum, while other packages try to provide an attractive
interface in which to make these types of edits.
-One particularly glaring omission we found in the Finale sample is a
-missing flat in measure 33:
+One particularly glaring omission we found from Finale is a missing flat
+in measure 33:
@quotation
@iftex
@noindent
The flat symbol is required to cancel out the natural in the same
measure, but Finale misses it because it occurred in a different voice.
-The user must not only remember to run a beaming plug-in and respace the
-note heads and rests, she must also check each measure for cross-voice
-accidentals if she is to avoid interrupting a rehearsal for an engraving
-error.
+So in addition to running a beaming plug-in and checking the spacing on
+the noteheads and rests, the user must also check each measure for
+cross-voice accidentals to avoid interrupting a rehearsal over an
+engraving error.
If you are interested in examining these examples in more detail, the
-full seven-measure excerpt can be found at the end of this essay in
-engravings by Finale and LilyPond along with four different published
-engravings. Close examination reveals that there is some acceptable
-variation among the hand-engravings, but that LilyPond compares
-reasonably well to that acceptable range. There are still some
-shortcomings in the LilyPond output, for example, it appears a bit too
-aggressive in shortening some of the stems, so there is room for further
-development and fine-tuning.
+full seven-measure excerpt can be found at the end of this essay along
+with four different published engravings. Close examination reveals that
+there is some acceptible variation among the hand-engravings, but that
+LilyPond compares reasonably well to that acceptible range. There are
+still some shortcomings in the LilyPond output, for example, it appears
+a bit too agressive in shortening some of the stems, so there is room
+for further development and fine-tuning.
Of course, typography relies on human judgment of appearance, so people
cannot be replaced completely. However, much of the dull work can be
@node Literature list
@chapter Literature list
-FIXME: blah
+Here are lists of references used in LilyPond.
@menu
* Short literature list::
@code{box-padding} will be used for the inner padding. The new code is
now as follows:
-@lisp
+@lisp
#(define-markup-command (double-box layout props text) (markup?)
#:properties ((inter-box-padding 0.4)
(box-padding 0.6))
@lisp
(define-markup-command (draw-double-line layout props dest)
(number-pair?)
- #:properties ((thickness 1)
+ #:properties ((thickness 1)
(line-gap 0.6))
"..documentation.."
...
@lilypond[quote,verbatim,ragged-right]
#(define-markup-command (my-draw-line layout props dest)
- (number-pair?)
- #:properties ((thickness 1)
+ (number-pair?)
+ #:properties ((thickness 1)
(line-gap 0.6))
"..documentation.."
(let* ((th (* (ly:output-def-lookup layout 'line-thickness)
to @var{proc}, the outer ensures that result of the function is
returned, rather than the @code{simple-closure} object.
+From within a callback, the easiest method for evaluating a markup is
+to use gro-interpret-markup. For example:
+
+@example
+my-callback = #(lambda (grob)
+ (grob-interpret-markup grob (markup "foo")))
+@end example
@node Inline Scheme code
@section Inline Scheme code
Translations
@item Valentin Villenave:
-LSR editor and Bug meister
+LSR editor and Bug squad member
@end itemize
@end macro
texidoc = " Chord names are generated from a list pitches. The
functions which construct these names can be customised. Here are shown
-Jazz chords, following Ignatzek (pp. 17-18, 1995) and
+Jazz chords, following Ignatzek (pp. 17-18, 1995) and
an alternative Jazz chord notation.
Chords following Banter (1987) can also be printed from this file, but
}
-chs = \transpose c' c'
+chs = \transpose c' c'
{
<c e g>1
<c es g>% m = minor triad
<c e g bes>
<c es g bes>
<c e g b> % triangle = maj
- <c es ges beses>
+ <c es ges beses>
<c es ges b> \break
<c e gis bes>
<c es g b>
- <c e gis b>
+ <c e gis b>
<c es ges bes>\break
<c e g a> % 6 = major triad with added sixth
<c es g a> % m6 = minor triad with added sixth
- <c e g bes d'>
+ <c e g bes d'>
<c es g bes d'> \break
<c es g bes d' f' a' >
<c es g bes d' f' >
- <c es ges bes d' >
+ <c es ges bes d' >
<c e g bes des' > \break
<c e g bes dis'>
<c e g bes d' f'>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% alternate Jazz notation
-efullmusicJazzAlt =
+efullmusicJazzAlt =
{
<c e gis>1-\markup { "+" }
<c e g b>-\markup { \normal-size-super
<c es>-\markup { "m" }
<c f>-\markup { \normal-size-super "sus4" }
<c g>-\markup { \normal-size-super "5" }
-
+
%% TODO, partial exceptions
<c es f>-\markup { "m" }-\markup { \normal-size-super "sus4" }
<c d es>-\markup { "m" }-\markup { \normal-size-super "sus2" }
epartialJazzAlt = #(sequential-music-to-chord-exceptions epartialmusicJazzAlt #f)
-jazzAltProperties = \sequential {
+jazzAltProperties = \sequential {
\set majorSevenSymbol = #whiteTriangleMarkup
\set chordNameSeparator = #(make-simple-markup "/")
\set chordNameExceptionsFull = #efullJazzAlt
\set chordNameFunction = #jazz-chord-names
}
-banterProperties = \sequential {
+banterProperties = \sequential {
\set chordNameFunction = #banter-chord-names
}
\set shortInstrumentName = #"Def"
\chs
}
-
+
\new ChordNames {
\jazzAltProperties
\set instrumentName = #"Alternative"
%% This is the Banter (1987) style. It gives exceedingly
%% verbose (wide) names, making the output file take up to 4 pages.
- %% (FIXME: how big is is now?)
+ %% (TODO: how big is is now?)
%% Turned off by default.
- %% FIXME: use smaller font for Banter (or remove some esoteric
+ %% TODO: use smaller font for Banter (or remove some esoteric
%% chords).
-
+
\new ChordNames {
\banterProperties
\set instrumentName = #"Banter"
\chs
}
%}
-
+
\new Staff \transpose c c' { \chs }
>>
\layout {
indent = 3.\cm
- \context {
+ \context {
\ChordNames
\consists Instrument_name_engraver
}
}
}
-
+
@noindent
from every directory in the build tree. Most targets for
-documentation maintenance are available from @file{Documentation/};
-@c FIXME: xref to CG
-for more information, see the Contributor's Guide, section
-@emph{Documentation work}.
+documentation maintenance are available from
+@file{Documentation/}. For more information, see
+@rcontrib{Documentation work}.
The makefile variable @code{QUIET_BUILD} may be set to @code{1} for a
less verbose build output, just like for building the programs.
@c -*- coding: utf-8; mode: texinfo; -*-
-@c This file is part of FIXME
+@c This file is part of web/download.itexi and
+@c learning/tutorial.itely
@c This is about "compiling" a lilypond file
@c (Learning 1 Tutorial), **not** compiling the
@c -*- coding: utf-8; mode: texinfo; -*-
-@c This file is part of FIXME
+@c This file is part of web/community.itexi and
+@c contributor/introduction.itely
@macro helpusNeed
@subheading We need you!
@cindex variables
-Another great shorthand is the ability to define variables (see
-@ref{Organizing pieces with variables}). All the templates use this
+Another great shorthand is the ability to define variables, as
+shown in @ref{Organizing pieces with variables}. All the
+templates use this:
@example
melody = \relative c' @{
@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
\key g \major
% Voice "1" Voice "2"
-<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> |
+<< { g4 fis8( g) a4 g } \\ { d4 d d d } >>
@end lilypond
Notice how the stems of the second voice now point down.
@lilypond[quote,verbatim,fragment,ragged-right,relative=2]
\key d \minor
% Voice "1" Voice "2"
-<< { r4 g g4. a8 } \\ { d,2 d4 g } >> |
-<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> |
-<< { a2. r4 } \\ { fis2. s4 } >> |
+<< { r4 g g4. a8 } \\ { d,2 d4 g } >>
+<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >>
+<< { a2. r4 } \\ { fis2. s4 } >>
@end lilypond
It is not necessary to use a separate @code{<< \\ >>} construct
% Main voice
c16 d e f
% Voice "1" Voice "2" Voice "3"
- << { g4 f e } \\ { r8 e4 d c8 ~ } >> |
- << { d2 e2 } \\ { c8 b16 a b8 g ~ g2 } \\ { s4 b4 c2 } >> |
+ << { g4 f e } \\ { r8 e4 d c8~ } >>
+ << { d2 e2 } \\ { c8 b16 a b8 g~ g2 } \\ { s4 b4 c2 } >>
}
@end lilypond
\new Staff \relative c' {
% Main voice
c16 d e f
- << % Bar 1
+ << % Bar 1
{
\voiceOneStyle
g4 f e
\\
{
\voiceTwoStyle
- r8 e4 d c8 ~
+ r8 e4 d c8~
}
>>
- << % Bar 2
+ << % Bar 2
% Voice 1 continues
{ d2 e2 }
\\
@lilypond[quote,ragged-right]
\new Staff \relative c'' {
\key aes \major
- << % Voice one
+ << % Voice one
{ c2 aes4. bes8 }
- \\ % Voice two
+ \\ % Voice two
{ aes2 f4 fes }
- \\ % No voice three
- \\ % Voice four
+ \\ % No voice three
+ \\ % Voice four
{
% Ignore these for now - they are explained in Ch 4
\once \override NoteColumn #'force-hshift = #0
\new Staff \relative c'' {
\key aes \major
<<
- { % Voice one
+ { % Voice one
\voiceOneStyle
c2 aes4. bes8
}
\once \override NoteColumn #'force-hshift = #0.5
des2
}
- >> |
- <c ees aes c>1 |
+ >>
+ <c ees aes c>1
}
@end lilypond
@lilypond[quote,verbatim,fragment,ragged-right]
\new Staff \relative c'' {
\key aes \major
- << % Voice one
+ << % Voice one
{ c2 aes4. bes8 }
- \\ % Voice two
- { aes2 f4 fes }
- \\ % Omit Voice three
- \\ % Voice four
+ \\ % Voice two
+ { aes2 f4 fes }
+ \\ % Omit Voice three
+ \\ % Voice four
{ <ees c>2 des2 }
- >> |
- <c ees aes c>1 |
+ >>
+ <c ees aes c>1
}
@end lilypond
@lilypond[quote,ragged-right,verbatim]
\relative c'{
% Default behavior or behavior after \oneVoice
- c d8 ~ d e4 ( f g a ) b-> c
+ c d8~ d e4( f g a) b-> c
}
@end lilypond
@lilypond[quote,ragged-right,verbatim]
\relative c'{
\voiceOne
- c d8 ~ d e4 ( f g a ) b-> c
+ c d8~ d e4( f g a) b-> c
\oneVoice
- c, d8 ~ d e4 ( f g a ) b-> c
+ c, d8~ d e4( f g a) b-> c
}
@end lilypond
@lilypond[quote,ragged-right,verbatim]
\relative c'{
\voiceTwo
- c d8 ~ d e4 ( f g a ) b-> c
+ c d8~ d e4( f g a) b-> c
\oneVoice
- c, d8 ~ d e4 ( f g a ) b-> c
+ c, d8~ d e4( f g a) b-> c
}
@end lilypond
% Start simultaneous section of three voices
<<
% Continue the main voice in parallel
- { g4 f e | d2 e2) }
+ { g4 f e | d2 e2) | }
% Initiate second voice
\new Voice {
- % Set stems, etc, down
+ % Set stems, etc., down
\voiceTwo
- r8 e4 d c8 ~ | c8 b16 a b8 g ~ g2
+ r8 e4 d c8~ | c8 b16 a b8 g~ g2 |
}
% Initiate third voice
\new Voice {
% Set stems, etc, up
\voiceThree
- s2. | s4 b4 c2
+ s2. | s4 b4 c2 |
}
>>
}
\new Staff \relative c' {
c16^( d e f
<<
- { g4 f e | d2 e2) }
+ { g4 f e | d2 e2) | }
\new Voice {
\voiceTwo
- r8 e4 d c8 ~ |
+ r8 e4 d c8~
<<
- {c8 b16 a b8 g ~ g2}
+ { c8 b16 a b8 g~ g2 }
\new Voice {
\voiceThree
s4 b4 c2
\new Voice {
% Set stems, etc, down
\voiceTwo
- s4 r8 e4 d c8 ~ | c8 b16 a b8 g ~ g2 |
+ s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 |
}
% Initiate third voice
\new Voice {
@lilypond[quote,verbatim]
global = { \time 6/8 \partial 8 \key f \major}
SopOneMusic = \relative c'' {
- c8 | c([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 }
+ c8 | c([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 | }
SopTwoMusic = \relative c' {
- r8 | r4. r4 c8 | a'([ g)] f f([ e)] d | e([ d)] c bes' }
+ r8 | r4. r4 c8 | a'([ g)] f f([ e)] d | e([ d)] c bes' | }
SopOneLyrics = \lyricmode {
- Let | flee -- cy flocks the | hills a -- dorn, __ }
+ Let | flee -- cy flocks the | hills a -- dorn, __ | }
SopTwoLyrics = \lyricmode {
- Let | flee -- cy flocks the | hills a -- dorn, }
+ Let | flee -- cy flocks the | hills a -- dorn, | }
\score {
\new ChoirStaff <<
@lilypond[quote,verbatim]
TimeKey = { \time 4/4 \partial 4 \key c \major}
-SopMusic = \relative c' { c4 | e4. e8 g4 g | a a g }
-AltoMusic = \relative c' { c4 | c4. c8 e4 e | f f e }
-TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 }
-BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 }
+SopMusic = \relative c' { c4 | e4. e8 g4 g | a a g | }
+AltoMusic = \relative c' { c4 | c4. c8 e4 e | f f e | }
+TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 | }
+BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 | }
VerseOne = \lyricmode {
- E -- | ter -- nal fa -- ther, | strong to save, }
+ E -- | ter -- nal fa -- ther, | strong to save, | }
VerseTwo = \lyricmode {
- O | Christ, whose voice the | wa -- ters heard, }
+ O | Christ, whose voice the | wa -- ters heard, | }
VerseThree = \lyricmode {
- O | Ho -- ly Spi -- rit, | who didst brood }
+ O | Ho -- ly Spi -- rit, | who didst brood | }
VerseFour = \lyricmode {
- O | Tri -- ni -- ty of | love and pow'r }
+ O | Tri -- ni -- ty of | love and pow'r | }
\score {
\new ChoirStaff <<
\new Staff <<
\clef "bass"
\new Voice = "Tenor" { \voiceOne \TimeKey \TenorMusic }
- \new Voice = "Bass" { \voiceTwo \BassMusic }
+ \new Voice = "Bass" { \voiceTwo \BassMusic }
>>
>>
}
@cindex verse and refrain
We end with an example to show how we might code a solo verse which
-continues into a two-part refrain in two staves. The
-positioning of the sequential and simultaneous sections to achieve
-this within a single score is quite tricky, so follow the
-explanation carefully!
+continues into a two-part refrain in two staves. The positioning
+of the sequential and simultaneous sections to achieve this within
+a single score is quite tricky, so follow the explanation carefully!
Let's start with a score block containing a @code{ChoirStaff}, as
we would like the brace to appear at the start of the chorus.
versenotes = \relative c'' {
\clef "treble"
\key g \major
- \time 3/4 g g g b b b
+ \time 3/4
+ g g g | b b b |
}
versewords = \lyricmode {
One two three four five six
versenotes = \relative c'' {
\clef "treble"
\key g \major
- \time 3/4 g g g b b b
+ \time 3/4
+ g g g | b b b |
}
refrainnotesA = \relative c'' {
\time 2/4
- c c g g \bar "|."
+ c c | g g \bar "|."
}
refrainnotesB = \relative c {
\clef "bass"
\key g \major
- c e d d
+ c e | d d |
}
versewords = \lyricmode {
One two three four five six
versenotes = \relative c'' {
\clef "treble"
\key g \major
- \time 3/4 g g g b b b
+ \time 3/4
+ g g g | b b b |
}
refrainnotesA = \relative c'' {
\time 2/4
- c c g g \bar "|."
+ c c | g g \bar "|."
}
refrainnotesB = \relative c {
\clef "bass"
\key g \major
- c e d d
+ c e | d d |
}
versewords = \lyricmode {
One two three four five six
\clef "treble"
\new Voice { % create voice for RH notes
\relative c'' { % start of RH notes
- d4 ees16 c8. |
- d4 ees16 c8. |
+ d4 ees16 c8.
+ d4 ees16 c8.
} % end of RH notes
} % end of RH voice
} % end of RH staff
\new Voice { % create LH voice one
\voiceOne
\relative g { % start of LH voice one notes
- g8 <bes d> ees, <g c> |
- g8 <bes d> ees, <g c> |
+ g8 <bes d> ees, <g c>
+ g8 <bes d> ees, <g c>
} % end of LH voice one notes
} % end of LH voice one
\new Voice { % create LH voice two
\voiceTwo
\relative g { % start of LH voice two notes
- g4 ees |
- g4 ees |
+ g4 ees
+ g4 ees
} % end of LH voice two notes
} % end of LH voice two
>> % end of LH staff
<<
\new Staff \relative c'' {
ais4 aes
- }
+ }
\new Staff \relative c'' {
\set Staff.extraNatural = ##f
ais4 aes
- }
+ }
>>
@end lilypond
<<
\new Staff \relative c'' {
ais4 aes
- }
+ }
\new Staff \relative c'' {
\set Score.extraNatural = ##f
ais4 aes
- }
+ }
>>
@end lilypond
}
}
\layout {
- \context { \Staff
+ \context {
+ \Staff
extraNatural = ##t
}
}
@seealso
Notation Reference:
@ruser{Changing context default settings}.
-@c FIXME
-@c uncomment when backslash-node-name issue is resolved -pm
-@c @ruser{The set command}.
+@ruser{The set command}.
Internals Reference:
@rinternals{Contexts},
\score {
<<
\new Staff <<
- \relative c'' { c a b g }
+ \relative c'' {
+ c a b g
+ }
>>
\new Staff <<
- \relative c' { c a b g }
+ \relative c' {
+ c a b g
+ }
>>
\new Staff <<
\clef "G_8"
- \relative c' { c a b g }
+ \relative c' {
+ c a b g
+ }
>>
\new Staff <<
\clef "bass"
- \relative c { c a b g }
+ \relative c {
+ c a b g
+ }
>>
>>
\layout {
- \context { \Staff
+ \context {
+ \Staff
\consists Ambitus_engraver
}
}
@cindex template, modifying
@cindex modifying templates
-Start off with the template that seems closest to what you want to end
-up with. Let's say that you want to write something for soprano and
-cello. In this case, we would start with the @q{Notes and lyrics} template (for the
-soprano part).
+Start off with the template that seems closest to what you want to
+end up with. Let's say that you want to write something for
+soprano and cello. In this case, we would start with the
+@q{Notes and lyrics} template (for the soprano part).
@example
\version @w{"@version{}"}
@example
\score @{
<<
- <<
- \new Voice = "one" @{
- \autoBeamOff
- \sopranoMusic
- @}
- \new Lyrics \lyricsto "one" \sopranoLyrics
- >>
- \new Staff \celloMusic
+ <<
+ \new Voice = "one" @{
+ \autoBeamOff
+ \sopranoMusic
+ @}
+ \new Lyrics \lyricsto "one" \sopranoLyrics
+ >>
+ \new Staff \celloMusic
>>
\layout @{ @}
\midi @{ @}
upper = \relative a' {
\clef "treble"
\global
- r4 <a d fis>2 <a e' a>4 |
- <d fis d'>4. <d fis d'>8 <a d a'>2 |
- <g cis g'>4 <a d fis> <a cis e>2 |
+ r4 <a d fis>2 <a e' a>4
+ <d fis d'>4. <d fis d'>8 <a d a'>2
+ <g cis g'>4 <a d fis> <a cis e>2
}
lower = \relative c, {
\clef "bass"
\global
- <d d'>4 <d d'>2 <cis cis'>4 |
- <b b'>4. <b' b'>8 <fis fis'>2 |
- <e e'>4 <d d'> <a' a'>2 |
+ <d d'>4 <d d'>2 <cis cis'>4
+ <b b'>4. <b' b'>8 <fis fis'>2
+ <e e'>4 <d d'> <a' a'>2
}
\score {
\new ChoirStaff <<
\new Staff = "sopranos" <<
\set Staff.instrumentName = #"Soprano"
- \new Voice = "sopranos" { \global \sopranoMusic }
+ \new Voice = "sopranos" {
+ \global
+ \sopranoMusic
+ }
>>
- \new Lyrics \lyricsto "sopranos" { \sopranoWords }
+ \new Lyrics \lyricsto "sopranos" {
+ \sopranoWords
+ }
\new Staff = "altos" <<
\set Staff.instrumentName = #"Alto"
- \new Voice = "altos" { \global \altoMusic }
+ \new Voice = "altos" {
+ \global
+ \altoMusic
+ }
>>
\new Lyrics \lyricsto "altos" { \altoWords }
\new Staff = "tenors" <<
\set Staff.instrumentName = #"Tenor"
- \new Voice = "tenors" { \global \tenorMusic }
+ \new Voice = "tenors" {
+ \global
+ \tenorMusic
+ }
>>
\new Lyrics \lyricsto "tenors" { \tenorWords }
\new Staff = "basses" <<
\set Staff.instrumentName = #"Bass"
- \new Voice = "basses" { \global \bassMusic }
+ \new Voice = "basses" {
+ \global
+ \bassMusic
+ }
>>
- \new Lyrics \lyricsto "basses" { \bassWords }
+ \new Lyrics \lyricsto "basses" {
+ \bassWords
+ }
>> % end ChoirStaff
-
\new PianoStaff <<
\set PianoStaff.instrumentName = #"Piano"
\new Staff = "upper" \upper
\new ChoirStaff <<
\new Staff = "sopranos" <<
\set Staff.instrumentName = #"Soprano"
- \new Voice = "sopranos" @{ \global \sopranoMusic @}
+ \new Voice = "sopranos" @{
+ \global
+ \sopranoMusic
+ @}
>>
- \new Lyrics \lyricsto "sopranos" @{ \sopranoWords @}
+ \new Lyrics \lyricsto "sopranos" @{
+ \sopranoWords
+ @}
\new Staff = "altos" <<
\set Staff.instrumentName = #"Alto"
- \new Voice = "altos" @{ \global \altoMusic @}
+ \new Voice = "altos" @{
+ \global
+ \altoMusic
+ @}
>>
- \new Lyrics \lyricsto "altos" @{ \altoWords @}
+ \new Lyrics \lyricsto "altos" @{
+ \altoWords
+ @}
\new Staff = "tenors" <<
\set Staff.instrumentName = #"Tenor"
- \new Voice = "tenors" @{ \global \tenorMusic @}
+ \new Voice = "tenors" @{
+ \global
+ \tenorMusic
+ @}
>>
- \new Lyrics \lyricsto "tenors" @{ \tenorWords @}
+ \new Lyrics \lyricsto "tenors" @{
+ \tenorWords
+ @}
\new Staff = "basses" <<
\set Staff.instrumentName = #"Bass"
- \new Voice = "basses" @{ \global \bassMusic @}
+ \new Voice = "basses" @{
+ \global
+ \bassMusic
+ @}
>>
- \new Lyrics \lyricsto "basses" @{ \bassWords @}
+ \new Lyrics \lyricsto "basses" @{
+ \bassWords
+ @}
>> % end ChoirStaff
@end example
<< % combine ChoirStaff and PianoStaff one above the other
\new ChoirStaff <<
\new Staff = "sopranos" <<
- \new Voice = "sopranos" @{ \global \sopranoMusic @}
+ \new Voice = "sopranos" @{
+ \global
+ \sopranoMusic
+ @}
>>
- \new Lyrics \lyricsto "sopranos" @{ \sopranoWords @}
+ \new Lyrics \lyricsto "sopranos" @{
+ \sopranoWords
+ @}
\new Staff = "altos" <<
- \new Voice = "altos" @{ \global \altoMusic @}
+ \new Voice = "altos" @{
+ \global
+ \altoMusic
+ @}
>>
- \new Lyrics \lyricsto "altos" @{ \altoWords @}
+ \new Lyrics \lyricsto "altos" @{
+ \altoWords
+ @}
\new Staff = "tenors" <<
\clef "G_8" % tenor clef
- \new Voice = "tenors" @{ \global \tenorMusic @}
+ \new Voice = "tenors" @{
+ \global
+ \tenorMusic
+ @}
>>
- \new Lyrics \lyricsto "tenors" @{ \tenorWords @}
+ \new Lyrics \lyricsto "tenors" @{
+ \tenorWords
+ @}
\new Staff = "basses" <<
\clef "bass"
- \new Voice = "basses" @{ \global \bassMusic @}
+ \new Voice = "basses" @{
+ \global
+ \bassMusic
+ @}
>>
- \new Lyrics \lyricsto "basses" @{ \bassWords @}
+ \new Lyrics \lyricsto "basses" @{
+ \bassWords
+ @}
>> % end ChoirStaff
\new PianoStaff <<
for the three bars of the example above gives:
@lilypond[quote,verbatim,ragged-right,addversion]
-global = { \key d \major \time 4/4 }
+global = {
+ \key d \major
+ \time 4/4
+}
sopranoMusic = \relative c'' {
\clef "treble"
r4 d2 a4 | d4. d8 a2 | cis4 d cis2 |
upper = \relative a' {
\clef "treble"
\global
- r4 <a d fis>2 <a e' a>4 |
- <d fis d'>4. <d fis d'>8 <a d a'>2 |
- <g cis g'>4 <a d fis> <a cis e>2 |
+ r4 <a d fis>2 <a e' a>4
+ <d fis d'>4. <d fis d'>8 <a d a'>2
+ <g cis g'>4 <a d fis> <a cis e>2
}
lower = \relative c, {
\clef "bass"
\global
- <d d'>4 <d d'>2 <cis cis'>4 |
- <b b'>4. <b' b'>8 <fis fis'>2 |
- <e e'>4 <d d'> <a' a'>2 |
+ <d d'>4 <d d'>2 <cis cis'>4
+ <b b'>4. <b' b'>8 <fis fis'>2
+ <e e'>4 <d d'> <a' a'>2
}
\score {
\new ChoirStaff <<
\new Staff = "sopranos" <<
\set Staff.instrumentName = #"Soprano"
- \new Voice = "sopranos" { \global \sopranoMusic }
+ \new Voice = "sopranos" {
+ \global
+ \sopranoMusic
+ }
>>
- \new Lyrics \lyricsto "sopranos" { \sopranoWords }
+ \new Lyrics \lyricsto "sopranos" {
+ \sopranoWords
+ }
\new Staff = "altos" <<
\set Staff.instrumentName = #"Alto"
- \new Voice = "altos" { \global \altoMusic }
+ \new Voice = "altos" {
+ \global
+ \altoMusic
+ }
>>
- \new Lyrics \lyricsto "altos" { \altoWords }
+ \new Lyrics \lyricsto "altos" {
+ \altoWords
+ }
\new Staff = "tenors" <<
\set Staff.instrumentName = #"Tenor"
- \new Voice = "tenors" { \global \tenorMusic }
+ \new Voice = "tenors" {
+ \global
+ \tenorMusic
+ }
>>
- \new Lyrics \lyricsto "tenors" { \tenorWords }
+ \new Lyrics \lyricsto "tenors" {
+ \tenorWords
+ }
\new Staff = "basses" <<
\set Staff.instrumentName = #"Bass"
- \new Voice = "basses" { \global \bassMusic }
+ \new Voice = "basses" {
+ \global
+ \bassMusic
+ }
>>
- \new Lyrics \lyricsto "basses" { \bassWords }
+ \new Lyrics \lyricsto "basses" {
+ \bassWords
+ }
>> % end ChoirStaff
\new PianoStaff <<
title = "Jesu, meine Freude"
composer = "J S Bach"
@}
-TimeKey = @{ \time 4/4 \key c \minor @}
-ManualOneVoiceOneMusic = @{s1@}
-ManualOneVoiceTwoMusic = @{s1@}
-ManualTwoMusic = @{s1@}
-PedalOrganMusic = @{s1@}
+TimeKey = @{
+ \time 4/4
+ \key c \minor
+@}
+ManualOneVoiceOneMusic = @{ s1 @}
+ManualOneVoiceTwoMusic = @{ s1 @}
+ManualTwoMusic = @{ s1 @}
+PedalOrganMusic = @{ s1 @}
\score @{
@}
@example
\new PianoStaff <<
\new Staff = "ManualOne" <<
- \new Voice @{ \ManualOneVoiceOneMusic @}
- \new Voice @{ \ManualOneVoiceTwoMusic @}
+ \new Voice @{
+ \ManualOneVoiceOneMusic
+ @}
+ \new Voice @{
+ \ManualOneVoiceTwoMusic
+ @}
>> % end ManualOne Staff context
\new Staff = "ManualTwo" <<
- \new Voice @{ \ManualTwoMusic @}
+ \new Voice @{
+ \ManualTwoMusic
+ @}
>> % end ManualTwo Staff context
>> % end PianoStaff context
@end example
<< % PianoStaff and Pedal Staff must be simultaneous
\new PianoStaff <<
\new Staff = "ManualOne" <<
- \new Voice @{ \ManualOneVoiceOneMusic @}
- \new Voice @{ \ManualOneVoiceTwoMusic @}
+ \new Voice @{
+ \ManualOneVoiceOneMusic
+ @}
+ \new Voice @{
+ \ManualOneVoiceTwoMusic
+ @}
>> % end ManualOne Staff context
\new Staff = "ManualTwo" <<
- \new Voice @{ \ManualTwoMusic @}
+ \new Voice @{
+ \ManualTwoMusic
+ @}
>> % end ManualTwo Staff context
>> % end PianoStaff context
\new Staff = "PedalOrgan" <<
- \new Voice @{ \PedalOrganMusic @}
+ \new Voice @{
+ \PedalOrganMusic
+ @}
>>
>>
@end example
\new Staff = "ManualOne" <<
\TimeKey % set time signature and key
\clef "treble"
- \new Voice @{ \voiceOne \ManualOneVoiceOneMusic @}
- \new Voice @{ \voiceTwo \ManualOneVoiceTwoMusic @}
+ \new Voice @{
+ \voiceOne
+ \ManualOneVoiceOneMusic
+ @}
+ \new Voice @{
+ \voiceTwo
+ \ManualOneVoiceTwoMusic
+ @}
>> % end ManualOne Staff context
\new Staff = "ManualTwo" <<
\TimeKey
\clef "bass"
- \new Voice @{ \ManualTwoMusic @}
+ \new Voice @{
+ \ManualTwoMusic
+ @}
>> % end ManualTwo Staff context
>> % end PianoStaff context
\new Staff = "PedalOrgan" <<
\TimeKey
\clef "bass"
- \new Voice @{ \PedalOrganMusic @}
+ \new Voice @{
+ \PedalOrganMusic
+ @}
>> % end PedalOrgan Staff
>>
@} % end Score context
title = "Jesu, meine Freude"
composer = "J S Bach"
}
-TimeKey = { \time 4/4 \key c \minor }
+TimeKey = {
+ \time 4/4
+ \key c \minor
+}
ManualOneVoiceOneMusic = \relative g' {
- g4 g f ees | d2 c2 |
+ g4 g f ees
+ d2 c2
}
ManualOneVoiceTwoMusic = \relative c' {
- ees16 d ees8~ ees16 f ees d c8 d~ d c~ |
- c c4 b8 c8. g16 c b c d |
+ ees16 d ees8~ ees16 f ees d c8 d~ d c~
+ c c4 b8 c8. g16 c b c d
}
ManualTwoMusic = \relative c' {
- c16 b c8~ c16 b c g a8 g~ g16 g aes ees |
- f ees f d g aes g f ees d e8~ ees16 f ees d |
+ c16 b c8~ c16 b c g a8 g~ g16 g aes ees
+ f ees f d g aes g f ees d e8~ ees16 f ees d
}
PedalOrganMusic = \relative c {
- r8 c16 d ees d ees8~ ees16 a, b g c b c8 |
- r16 g ees f g f g8 c,2 |
- }
+ r8 c16 d ees d ees8~ ees16 a, b g c b c8
+ r16 g ees f g f g8 c,2
+}
\score {
<< % PianoStaff and Pedal Staff must be simultaneous
\new Staff = "ManualOne" <<
\TimeKey % set time signature and key
\clef "treble"
- \new Voice { \voiceOne \ManualOneVoiceOneMusic }
- \new Voice { \voiceTwo \ManualOneVoiceTwoMusic }
+ \new Voice {
+ \voiceOne
+ \ManualOneVoiceOneMusic
+ }
+ \new Voice {
+ \voiceTwo
+ \ManualOneVoiceTwoMusic
+ }
>> % end ManualOne Staff context
\new Staff = "ManualTwo" <<
\TimeKey
\clef "bass"
- \new Voice { \ManualTwoMusic }
+ \new Voice {
+ \ManualTwoMusic
+ }
>> % end ManualTwo Staff context
>> % end PianoStaff context
\new Staff = "PedalOrgan" <<
\TimeKey
\clef "bass"
- \new Voice { \PedalOrganMusic }
+ \new Voice {
+ \PedalOrganMusic
+ }
>> % end PedalOrgan Staff context
>>
} % end Score context
@lilypond[quote,verbatim,ragged-right]
fragmentA = \relative c'' { a4 a8. b16 }
fragmentB = \relative c'' { a8. gis16 ees4 }
-violin = \new Staff { \fragmentA \fragmentA \fragmentB \fragmentA }
+violin = \new Staff {
+ \fragmentA
+ \fragmentA
+ \fragmentB
+ \fragmentA
+}
\score {
{
\violin
@c TODO Avoid padtext - not needed with skylining
@lilypond[quote,verbatim,ragged-right]
-dolce = \markup{ \italic \bold dolce }
+dolce = \markup { \italic \bold dolce }
padText = { \once \override TextScript #'padding = #5.0 }
-fthenp=_\markup{ \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p }
+fthenp=_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p }
violin = \relative c'' {
\repeat volta 2 {
- c4._\dolce b8 a8 g a b |
+ c4._\dolce b8 a8 g a b
\padText
- c4.^"hi there!" d8 e' f g d |
- c,4.\fthenp b8 c4 c-. |
+ c4.^"hi there!" d8 e' f g d
+ c,4.\fthenp b8 c4 c-.
}
}
\score {
{
\violin
}
-\layout{ragged-right=##t}
+\layout { ragged-right=##t }
}
@end lilypond
@example
violin = \relative c'' @{
\repeat volta 2 @{
- c4._\markup@{ \italic \bold dolce @} b8 a8 g a b |
+ c4._\markup @{ \italic \bold dolce @} b8 a8 g a b
\once \override TextScript #'padding = #5.0
- c4.^"hi there!" d8 e' f g d |
- c,4.\markup@{ \dynamic f \italic \small @{ 2nd @}
- \hspace #0.1 \dynamic p @} b8 c4 c-. |
+ c4.^"hi there!" d8 e' f g d
+ c,4.\markup @{ \dynamic f \italic \small @{ 2nd @}
+ \hspace #0.1 \dynamic p @}
+ b8 c4 c-.
@}
@}
@end example
@lilypond[quote,ragged-right]
\relative c <<
\new Staff {
- \time 2/4 R2*3
+ \time 2/4
+ R2*3
r4 f8 a cis4 f e d
}
\new Staff {
\clef bass
r4 d,8 f | gis4 c | b bes |
- a8 e f4 | g d | gis f
+ a8 e f4 | g d | gis f |
}
>>
@end lilypond
@subheading force-hshift property
-@c FIXME: formatting stuff (ie not important right now IMO)
-@c @a nchor Chopin finally corrected TODOgp
-
We can now see how to apply the final corrections to the Chopin
example introduced at the end of @ref{I'm hearing Voices}, which
was left looking like this:
my $href = shift;
my @hrefsplit = split('/', $href);
# change the last portion (the filename), if it exists
- if ($#array > 0) {
- @hrefsplit[$#array] = lc( @hrefsplit[$#array] );
+ if ($#hrefsplit > 0) {
+ @hrefsplit[$#hrefsplit] = lc( @hrefsplit[$#hrefsplit] );
$href = join("/", @hrefsplit);
}
return $href;
@node The set command
-@subsection The @code{\set} command
+@subsection The @code{@bs{}set} command
@cindex properties
@funindex \set
on-the-fly for every graphic object, but it is possible to
override these:
-@c FIXME Complete
+@c TODO Complete
@lilypond[relative=2,ragged-right,verbatim,fragment]
e2 \glissando f
\once \override Glissando #'(bound-details right Y) = #-2
@node Vertical grouping of grobs
@subsection Vertical grouping of grobs
-@c FIXME Expand this section
+@c TODO Expand this section
The VerticalAlignment and VerticalAxisGroup grobs work together.
VerticalAxisGroup groups together different grobs like Staff, Lyrics,
}
@end lilypond
-Vertical spaces and brackets can be be included in figures:
+Vertical spaces and brackets can be included in figures:
@lilypond[verbatim,quote,ragged-right,fragment]
\figures {
\clef bass
% stems may overlap the other staff
\override Stem #'cross-staff = ##t
- % extend the stems to reach other other staff
+ % extend the stems to reach the other staff
\override Stem #'length = #12
% do not print extra flags
\override Stem #'flag-style = #'no-flag
property @code{drumStyleTable} in context @code{DrumVoice}. The
following variables have been predefined:
-@c FIXME: decide what to do about this table. (ie verbatim or not)
+@c TODO: decide what to do about this table. (ie verbatim or not)
@table @code
@item drums-style
@snippets
-FIXME: MOVE ALL THESE TO LSR! -gp
+@c TODO: MOVE ALL THESE TO LSR! -gp
Here are some examples:
c2 c
\clef baritone
c2 c
+
+\break
+
\clef varbaritone
c2 c
\clef subbass
c2 c
+\clef percussion
+c2 c
\break
@end lilypond
Some special purpose clefs are described in @ref{Mensural clefs},
-@ref{Gregorian clefs}, @ref{Default tablatures}, @ref{Custom
-tablatures}, and @ref{Basic percussion notation}.
+@ref{Gregorian clefs}, @ref{Default tablatures}, and @ref{Custom
+tablatures}.
@snippets
@ref{Mensural clefs},
@ref{Gregorian clefs},
@ref{Default tablatures},
-@ref{Custom tablatures},
-@ref{Basic percussion notation}.
+@ref{Custom tablatures}.
Snippets:
@rlsr{Pitches}.
@end example
@noindent
-is ambiguous, since it is is not clear to which @code{\repeat} the
+is ambiguous, since it is not clear to which @code{\repeat} the
@code{\alternative} belongs. This ambiguity is resolved by always
having the @code{\alternative} belong to the inner @code{\repeat}.
For clarity, it is advisable to use braces in such situations.
@knownissues
When using different time signatures in parallel, notes
-at the same moment will be be placed at the same horizontal
+at the same moment will be placed at the same horizontal
location. However, the bar lines in the different staves
will cause the note spacing to be less regular in each of the
individual staves than would be normal without the different
@ignore
-FIXME: this variable is used, but I don't know what it does. -pm
+TODO: this variable is used, but I don't know what it does. -pm
@item blank-after-score-page-force
@funindex blank-after-score-page-force
@funindex markup
A @code{\markup} block can exist by itself, outside of any
-any @code{\score} block, as a @qq{top-level
-expression}. This syntax is described in @ref{File structure}.
+@code{\score} block, as a @qq{top-level expression}. This syntax
+is described in @ref{File structure}.
@lilypond[verbatim,quote]
\markup {
@cindex spaces, in lyrics
@cindex quotes, in lyrics
-@c FIXME: this section is to be rewritten.
+@c TODO: this section is to be rewritten.
Since LilyPond input files are text, there is at least one
issue to consider when working with vocal music:
song texts must be interpreted as text, not notes. For example, the
@rinternals{LyricSpace}.
-@c FIXME: this title has to be changed (possible confusion with LM) -vv
+@c TODO: this title has to be changed (possible confusion with LM) -vv
@node Setting simple songs
@unnumberedsubsubsec Setting simple songs
@end example
@ignore
-@c FIXME
+@c TODO
http://code.google.com/p/lilypond/issues/detail?id=329
The problem cannot be reproduced.
The following has no sense, because the issue seems to be fixed.
@funindex \addlyrics
@funindex \lyricsto
-@c FIXME: this stuff is to be rewritten. -vv
+@c TODO: this stuff is to be rewritten. -vv
Aligning of text with melodies can be made automatically, but if you
specify the durations of the syllables it can also be made manually.
You can define melismata entirely in the lyrics, by entering @code{_}
for every extra note that has to be added to the melisma.
-@c FIXME: clarify: __ is used to crate a lyric extender,
+@c TODO: clarify: __ is used to crate a lyric extender,
@c _ is used to add a note to a melisma, so both __ and _ are needed.
@c verbose! --FV
>>
@end lilypond
-@c FIXME: this now links to LM -vv
+@c TODO: this now links to LM -vv
+@c umm, yeah... so what? -gp
@cindex SATB
@cindex choral score
@node Specific uses of lyrics
@subsection Specific uses of lyrics
-@c FIXME This whole section is to be reorganized. -vv
+@c TODO This whole section is to be reorganized. -vv
Often, different stanzas of one song are put to one melody in slightly
differing ways. Such variations can still be captured with
Here, @code{alternative} is the name of the @code{Voice} context
containing the triplet.
-@c FIXME: make this easier to understand -vv
+@c TODO: make this easier to understand -vv
This command must be one syllable too early, before @q{Ty} in this
case. In other words, changing the associatedVoice happens one step
later than expected. This is for technical reasons, and it is not a
\input texinfo @c -*- coding: utf-8; mode: texinfo; -*-
-@c FIXME: dump "public domain" notice in this manual, and fix
-@c the generic doc page title macro to not automatically put
-@c FDL on stuff. Or maybe make a separate macro.
-
@setfilename lilypond-snippets.info
@settitle LilyPond snippets
@documentencoding UTF-8
\header {
lsrtags = "keyboards"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los símbolos específicos de acordeón discanto se escriben mediante
@code{\\markup}. Se puede trucar la colocación vertical de los
\header {
lsrtags = "chords, ancient-notation, contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al escribir un bajo cifrado, existe una forma de especificar si
queremos que las cifras se sitúen encima o debajo de las notas del
\header {
lsrtags = "pitches, staff-notation, vocal-music"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Añadir un ámbito por voz"
texidoces = "
Se puede añadir un ámbito por cada voz. En este caso, el ámbito se
\header {
lsrtags = "staff-notation, contexts-and-engravers, breaks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al añadir un pentagrama nuevo en un salto de línea, por desgracia
se añade un espacio adicional al final de la línea antes del salto
\header {
lsrtags = "staff-notation, contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede añadir (posiblemente de forma temporal) un pentagrama
nuevo una vez que la pieza ha comenzado.
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para añadir indicaciones de línea divisoria dentro del contexto de
los nombres de acorde @code{ChordNames}, incluya el grabador
\header {
lsrtags = "rhythms, expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La sintaxis de LilyPond puede implicar muchas colocaciones poco
comunes para los paréntesis, corchetes, etc, que a veces se tienen
\header {
lsrtags = "rhythms, percussion"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Mediante la utilización de las potentes herramientas preconfiguradas
como la función @code{\\drummode} y el contexto @code{DrumStaff}, la
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La función @code{\\parenthesize} es un truco especial que encierra
objetos entre paréntesis. El grob asociado es @code{ParenthesesItem}.
\header {
lsrtags = "text, titles"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Con algo de código de Scheme, se puede añadir fácilmente la fecha
actual a una partitura.
\header {
lsrtags = "repeats"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
El grabador @code{Volta_engraver} reside de forma predeterminada
dentro del contexto de @code{Score}, y los corchetes de la repetición
\header {
lsrtags = "simultaneous-notes"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Voces adicionales para evitar colisiones"
texidoces = "
En ciertos casos de polifonía compleja, se necesitan voces adicionales
\header {
lsrtags = "text, vocal-music, spacing"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este fragmento de código muestra cómo situar la línea de base de la
letra más cerca del pentagrama.
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Puede ser necesario trucar la propiedad
@code{shortest-duration-space} para poder ajustar el tamaño de las
\header {
lsrtags = "text, paper-and-layout, titles"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La alineación horizontal de los nombres de instrumento se puede
trucar modificando la propiedad @code{Staff.InstrumentName
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los números de compás se alinean de forma predeterminada por la
\header {
lsrtags = "text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Si están especificadas, las marcas de texto se pueden alinear con
objetos de notación distintos a las líneas divisorias. Entre estos
\header {
lsrtags = "editorial-annotations, fretted-strings, spacing"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las cifras de digitación orientadas verticalmente se colocan de forma
\header {
lsrtags = "pitches, vocal-music"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Ámbitos con varias voces"
texidoces = "
La adición del grabador @code{Ambitus_engraver} al contexto de
\header {
lsrtags = "editorial-annotations, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
De forma predeterminada se añaden corchetes de análisis sencillos
debajo del pentagrama. El ejemplo siguiente muestra una manera de
\header {
lsrtags = "ancient-notation"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Aquí se muestran muchos de (¿o quizá todos?) los símbolos que
están contemplados por la capacidad de LilyPond para la música
\header {
lsrtags = "ancient-notation, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este ejemplo muestra cómo hacer una transcripción moderna de canto
gregoriano. El canto gregoriano no tiene compás ni plicas; utiliza
\header {
lsrtags = "ancient-notation, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al transcribir música mensural, es útil un «incipit» al compienzo
de la pieza para indicar la tonalidad y el tempo
\header {
lsrtags = "ancient-notation"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las indicaciones de compás también se pueden grabar en estilo antiguo.
\header {
lsrtags = "pitches, editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Aplicar estilos de cabeza según la nota de la escala"
texidoces = "
La propiedad @code{shapeNoteStyles} se puede usar para definir varios
\header {
lsrtags = "world-music"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para las improvisaciones o @emph{taqasim} que son libres durante unos
momentos, se puede omitir la indicación de compás y se puede usar
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden subdividir las barras automáticamente. Estableciendo la
propiedad @code{subdivideBeams}, las barras se subdividen en
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las reglas de final de barra especificadas en el contexto
@code{Score} se aplican a todos los pentagramas, pero se pueden
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
No está especificada ninguna agrupación predeterminada automática
de las barras para el compás de 7/8, de forma que si se requieren
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Normalmente están prohibidos los saltos de línea si las barras
atraviesan las líneas divisorias. Se puede cambiar este
\header {
lsrtags = "editorial-annotations, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La instrucción @code{\\whiteout} intercala un rectángulo blanco
debajo de un elemento de marcado. Este rectángulo blanco no tapa
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para hacer invisibles partes de un regulador de crescendo, se usa
el método de dibujar un rectángulo blanco encima de la parte
\header {
lsrtags = "expressive-marks, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
A veces se denota una «cesura» mediante una doble marca de respiración
parecida a las vías del tren, con un calderón encima. Este fragmento
\header {
lsrtags = "expressive-marks, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este ejemplo proporciona una función para tipografiar un regulador con
texto por debajo, como @qq{molto} o @qq{poco}. El ejemplo ilustra
\header {
lsrtags = "expressive-marks, unfretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para hacer más pequeño el círculo de @code{\\flageolet} (armónico)
utilice la siguiente función de Scheme.
\header {
lsrtags = "simultaneous-notes, editorial-annotations, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden modificar notas individuales de un acorde con la instrucción
@code{\\tweak}, alterando la propiedad @code{font-size}.
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se insertan automáticamente barras en ángulo cuando se detecta un
intervalo muy grande entre las notas. Se puede hacer un ajuste
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede establecer el separador entre las distintas partes del
nombre de un acorde para que sea cualquier elemento de marcado.
\header {
lsrtags = "rhythms, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Cambiar la forma de los silencios multicompás"
texidoces = "
Si hay diez compases de silencio o menos, se imprime en el pentagrama
\header {
lsrtags = "contexts-and-engravers, midi"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al producir una salida MIDI, el comportamiento predeterminado es
que cada pentagrama representa un canal MIDI, con todas las voces
\header {
lsrtags = "simultaneous-notes"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al utilizar la posibilidad de combinación automática de partes, se
puede modificar el texto que se imprime para las secciones de solo
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede modificar el texto empleado para los crescendos y
decrescendos modificando las propiedades de contexto
\header {
lsrtags = "expressive-marks, editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede cambiar el aspecto de las ligaduras de expresión de
continuas a punteadas o intermitentes.
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
El glifo de la marca de respiración se puede ajustar
sobreescribiendo la propiedad de texto del objeto de presentación
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La nomenclatura inglesa (predeterminada) para los acordes del cifrado
americano se puede cambiar por la alemana (@code{\\germanChords}
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las alteraciones y los signos «más» pueden aparecer antes o
después de los números, según el valor de las propiedades
\header {
lsrtags = "staff-notation, midi"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para cambiar el tempo en la salida MIDI sin
imprimir nada, hacemos invisible la indicación metronómica:
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La instrucción @code{\\time} establece las propiedades
@code{timeSignatureFraction}, @code{beatLength}, @code{beatGrouping} y
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Cambiar el número del grupo especial"
texidoces = "
\header {
lsrtags = "rhythms, contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La propiedad @code{measureLength}, junto con
@code{measurePosition}, determina cuándo es necesario dibujar una
\header {
lsrtags = "rhythms, vocal-music, ancient-notation, contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este tipo de notación se utiliza para el canto de los Salmos, en
que las estrofas no siempre tienen la misma longitud.
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede usar la propiedad @code{chordNameExceptions} para
almacenar una lista de notaciones espaciales para acordes
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La presentación del acorde de séptima mayor se
puede ajustar mediante majorSevenSymbol.
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede hacer que los diagramas de posiciones se muestren sólo
cuando el acorde cambia o al comienzo de una nueva línea.
\header {
lsrtags = "simultaneous-notes, chords, keyboards"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los «clusters» o racimos son un mecanismo para indicar la
interpretación de un ámbito de notas al mismo tiempo.
\header {
lsrtags = "expressive-marks, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Ciertas indicaciones dinámicas pueden llevar textos (como @qq{più
forte} o @qq{piano subito}). Se pueden producir usando un bloque
\header {
lsrtags = "simultaneous-notes, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La herramienta de combinación de partes ( instrucción
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Indicaciones de compases compuestos"
texidoces = "
Las indicaciones de compás poco frecuentes como @qq{5/8} se pueden
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La agrupación de pulsos dentro de un compás está controlada por la
agrupación predeterminada que se establece en @code{beamSettings}.
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede tipografiar un gissando contemporáneo sin nota final
utilizando una nota oculta y temporalización de cadenza.
\header {
lsrtags = "editorial-annotations, chords, keyboards, fretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede controlar con precisión la colocación de los números de
digitación. Para que se tenga en cuenta la orientación de las
\header {
lsrtags = "expressive-marks, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
El orden vertical que ocupan las inscripciones gráficas está
controlado con la propiedad @code{'script-priority}. Cuanto más
\header {
lsrtags = "expressive-marks, editorial-annotations, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La creación de un grupeto circular de anticipación entre dos notas,
donde la nota inferior del grupeto utiliza una alteración, requiere
\header {
lsrtags = "pitches"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
En una música que tenga muchas apariciones de la
misma secuencia de notas a distintas alturas, podría ser de
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede trazar un símbolo de arpegio entre notas de distintas
voces que están sobre el mismo pentagrama si el grabador
\header {
lsrtags = "staff-notation, editorial-annotations, contexts-and-engravers, paper-and-layout"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para crear pentagramas en blanco, genere compases vacíos y después
elimine el grabador de números de compás @code{Bar_number_engraver}
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Dentro de un @code{PianoStaff}, es posible hacer que un arpegio
cruce entre los pentagramas ajustando la propiedad
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden crear arpegios que se cruzan entre pentagramas dentro de
contextos distintos a @code{GrandStaff}, @code{PianoStaff} y
\header {
lsrtags = "staff-notation"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden crear indicaciones metronómicas nuevas en modo de
marcado, pero no cambian el tempo en la salida MIDI.
\header {
lsrtags = "expressive-marks, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Aunque la manera más fácil de añadir paréntesis a una indicación
de dinámica es utilizar un bloque @code{\\markup}, este método
\header {
lsrtags = "expressive-marks, text, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
A diferencia de las inscripciones de texto, las lestras de ensayo
no se pueden apilar en un punto concreto de la partitura: sólo se
\header {
lsrtags = "expressive-marks, keyboards, unfretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
En determinadas situaciones es necesario crear ligaduras de
expresión entre notas que están en voces distintas.
\header {
lsrtags = "expressive-marks, text, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las instrucciones @code{\\startTextSpan} y @code{\\stopTextSpan}
permiten la creación de elementos de extensión textuales tan
\header {
lsrtags = "ancient-notation, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden tipografiar «custos» en diferentes estilos.
\header {
lsrtags = "fretted-strings, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden establecer las propiedades de los diagramas de
posiciones de acordes por medio de @code{'fret-diagram-details}.
\header {
lsrtags = "fretted-strings, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden establecer las propiedades de los diagramas de
posiciones a través de @code{'fret-diagram-details}. Para los
\header {
lsrtags = "editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La dirección predeterminada de las plicas sobre la tercera línea
del pentagrama está determinada por la propiedad
\header {
lsrtags = "fretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden añadir diagramas de posiciones predefinidas para
\header {
lsrtags = "staff-notation, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Si hay un solo pentagrama en un de los tipos de sistema
@code{ChoirStaff} o @code{StaffGroup}, el comportamiento
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Alteraciones de estilo dodecafónico para todas las notas incluidas las naturales"
texidoces = "
En las obras de principios del s.XX, empezando por Schoenberg, Berg y
\header {
lsrtags = "editorial-annotations, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede insertar códico PostScript directamente dentro de un
bloque @code{\\markup}.
\header {
lsrtags = "contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Del problema central de la notación, esto es, crear un determinado
símbolo, se encargan los «plugins» o complementos añadidos. Cada
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Grabado manual de las ligaduras"
texidoces = "
Se pueden grabar a mano las ligaduras modificando la propiedad
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Escribir varios grupos especiales usando una sola instrucción \\times"
texidoces = "
La propiedad @code{tupletSpannerDuration} establece cuánto debe durar
\header {
lsrtags = "fretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
En este ejemplo se combinan las digitaciones de la mano izquierda,
indicaciones del número de cuerda y digitaciones de la mano
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Son posibles tanto los corchetes rectos sobre notas sueltas como
extremos de barra sueltos en figuras unidas, con una combinación de
\header {
lsrtags = "simultaneous-notes, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Forzar el desplazamiento horizontal de las notas"
\header {
lsrtags = "pitches"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este fragmento de código basado en Scheme genera
24 notas aleatorias (o tantas como se necesiten), basándose en la
\header {
lsrtags = "editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede cambiar el aspecto de las líneas de rejilla
sobreescribiendo algunas de sus propiedades.
\header {
lsrtags = "editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden trazar líneas verticales normales entre pentagramas para
mostrar la relación entre notas; sin embargo, en caso de música
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los patrones de barrado se pueden alterar con la propiedad
@code{beatGrouping}:
\header {
lsrtags = "rhythms, fretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para la música de guitarra, es posible mostrar los ritmos de rasgueo,
además de las notas de la melodía, acordes y diagramas de posiciones.
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los cambios de dinámica con estilo de texto (como cresc. y dim.)
se imprimen con una línea intermitente que muestra su alcance.
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los «incipit» se pueden escribir utilizando el grob del nombre del
instruemento, pero manteniendo independientes las definiciones del
\header {
lsrtags = "keyboards"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Un corchete de arpegio puede indicar que se tienen que tocadr con la
misma mano notas que están en dos pentagramas distintos. Para hacerlo,
\header {
lsrtags = "expressive-marks, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las marcas de cesura se pueden crear sobreescribiendo la propiedad
@code{'text} del objeto @code{BreathingSign}. También está disponible
\header {
lsrtags = "repeats"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
También se pueden imprimir símbolos de porcentaje sueltos. Esto se
hace introduciendo un silencio multicompás con una función de
\header {
lsrtags = "keyboards, percussion, fretted-strings, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Ésta es una plantilla bastante avanzada, para un conjunto de
jazz. Observe que la notación de todos los instrumentos está en
\header {
lsrtags = "expressive-marks, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden aplicar puntas de flecha a los elementos de extensión de
texto y de línea (como el Glissando).
\header {
lsrtags = "text, vocal-music"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La alineación horizontal de la letra se puede ajustar sobreescribiendo
la propiedad @code{self-alignment-X} del objeto @code{LyricText}.
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
El «Makam» es un tipo de melodía de Turquía que
utiliza alteraciones microtonales de 1/9 de tono. Consulte el
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las ligaduras de expresión se pueden construir con patrones de
\header {
lsrtags = "staff-notation, editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede engrosar una línea del pentagrama con fines pedagógicos
(p.ej. la tercera línea o la de la clave de Sol). Esto se puede
\header {
lsrtags = "repeats, staff-notation, editorial-annotations"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este fragmento de código proporciona una solución alternativa a la
producción de contadores de compás utilizando repeticiones
\header {
lsrtags = "staff-notation, ancient-notation, contexts-and-engravers, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La disposición «mensurstriche» en que las líneas divisorias no
están dibujadas sobre los pentagramas, sino entre ellos, se puede
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las abreviaturas se encuentran definidas dentro del archivo
@code{ly/script-init.ly}, donde las variables @code{dashHat},
\header {
lsrtags = "rhythms, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los elementos de marcado aplicados a un silencio multicompás se
centran encima o debajo de éste. Los elementos de marcado extensos
\header {
lsrtags = "staff-notation, contexts-and-engravers, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede utilizar la propiedad
@code{systemStartDelimiterHierarchy} para crear grupos de
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
LilyPond también proporciona funciones de formato para imprimir
números de grupo especial diferentes a la propia fracción, así
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Armaduras de tonalidad no tradicionales"
texidoces = "
\header {
lsrtags = "template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta plantilla muestra el uso de contextos @code{StaffGroup} y
\header {
lsrtags = "pitches, text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Internamente, @code{\\ottava} establece las propiedades
\header {
lsrtags = "repeats, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden mostrar los contadores de las repeticiones del tipo
porcentaje a intervalos regulares mediante el establecimiento de
\header {
lsrtags = "repeats"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las repeticiones de compases completos mayores de dos repeticiones
pueden llevar un contador si se activa la propiedad adecuada, como se
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Permitir saltos de línea dentro de grupos especiales con barra"
texidoces = "
Este ejemplo artificial muestra cómo se pueden permitir tanto los
\header {
lsrtags = "keyboards, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Presentamos a continuación una plantilla de piano sencilla con algunas
notas.
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Muchas partituras de piano tienen las indicaciones dinámicas centradas
entre los dos pentagramas. El contexto @code{Dynamics}, si se sitúa
\header {
lsrtags = "text, keyboards, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
En lugar de tener un pentagrama dedicado a la melodía y la letra, ésta
se puede centrar entre los pentagramas de un sistema de piano.
\header {
lsrtags = "vocal-music, keyboards, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
He aquí el típico formato dde una canción: un pentagrama con la
melodía y la letra, y el acompañamiento de piano por debajo.
\header {
lsrtags = "fretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Es posible ejercer un mayor control sobre la colocación de las
digitaciones de la mano derecha estableciendo el valor de una
\header {
lsrtags = "fretted-strings"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La polifonía se crea de la misma forma en un @code{TabStaff} que
en una pauta normal.
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al establecer la propiedad @code{'strict-grace-spacing} hacemos que
\header {
lsrtags = "rhythms, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Posicionar los silencios multicompás"
texidoces = "
A diferencia de los silencios normales, no existe una instrucción
\header {
lsrtags = "expressive-marks, editorial-annotations, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los elementos de marcado de texto deben tener la propiedad
\header {
lsrtags = "pitches"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Evitar que se añadan becuadros adicionales automáticamente"
texidoces = "
\header {
lsrtags = "pitches"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Evitar que se impriman becuadros cuando cambia la armadura"
texidoces = "
\header {
lsrtags = "repeats, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede imprimir una línea divisoria de la forma @code{|:} al
principio de la pieza, sobreescribiendo la propiedad correspondiente:
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden imprimir los números de compás a intervalos regulares
\header {
lsrtags = "rhythms, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los números de compás también se pueden imprimir dentro de rectángulos o de circunferencias.
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden imprimir reguladores con un círculo en la punta (notación
«al niente») estableciendo la propiedad @code{circled-tip} del objeto
\header {
lsrtags = "text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Aunque normalmente las marcas de texto sólo se imprimen sobre el
pentagrama superior, también se pueden imprimir en otro pentagrama
\header {
lsrtags = "rhythms, expressive-marks, staff-notation, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
De forma predeterminada, las indicaciones metronómicas y las
letras de ensayo se imprimen encima del pentagrama. Para
\context {
\Score
\remove "Timing_translator"
- \remove "Time_signature_engraver"
\remove "Default_bar_line_engraver"
\remove "Bar_number_engraver"
\override SpacingSpanner #'uniform-stretching = ##t
\Staff
\consists "Timing_translator"
\consists "Default_bar_line_engraver"
- \consists "Time_signature_engraver"
}
\context {
\Voice
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
De forma predeterminada se suprime el número del primer compás de una
\header {
lsrtags = "pitches, staff-notation"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los pasajes citados tienen en cuenta la transposición de la fuente
tanto como la del destino. En este ejemplo, todos los
\header {
lsrtags = "staff-notation"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La propiedad @code{quotedEventTypes} determina los tipos de eventos
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los valores predeterminados para las notas de adorno están
\header {
lsrtags = "rhythms, contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden eliminar completamente los números de compás quitando el
\header {
lsrtags = "staff-notation, tweaks-and-overrides, breaks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
El primer pentagrama vacío también se puede suprimir de la
partitura estableciendo la propiedad @code{remove-first} de
\header {
lsrtags = "rhythms, ancient-notation, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Estilos de silencios"
texidoces = "
Los silencios se pueden imprimir en distintos estilos.
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Para tipografiar las barras agrupadas en la forma @code{3-4-3-2}
en 12/8, en primer lugar tenemos que sobreescribir los finales de
\header {
lsrtags = "expressive-marks, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Si la nota que da fin a un regulador cae sobre la primera parte de
un compás, el regulador se detiene en la línea divisoria
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Si los reguladores son demasiado cortos, se pueden alargar
modificando la propiedad @code{minimum-length} del objeto
\header {
lsrtags = "repeats"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
De forma predeterminada, los corchetes de primera y segunda vez se
trazan encima de los finales alternativos completos, pero es posible
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se pueden imprimir los acordes exclusivamente al comienzo de las
líneas y cuando cambia el acorde.
\header {
lsrtags = "chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Al juntar nombres de acorde en cifrado americano, melodía y letra,
obtenemos una hoja guía de acordes o «lead sheet»:
\header {
lsrtags = "vocal-music, chords, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta plantilla facilita la preparación de una canción con melodía,
letra y acordes.
\header {
lsrtags = "vocal-music, chords, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Presentamos a continuación un ejemplo de plantilla para una hoja
guía de acordes con melodía, letra, acordes y diagramas de
\header {
lsrtags = "chords, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
¿Quiere preparar una hoja guía de acordes (o «lead sheet») con
melodía y acordes? ¡No busque más!
\header {
lsrtags = "vocal-music, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta pequeña plantilla muestra una melodía sencilla con letra. Córtela
y péguela, escriba las notas y luego la letra. Este ejemplo desactiva
\header {
lsrtags = "template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta plantilla simple prepara un pentagrama con notas, adecuado para
un instrumento solista o un fragmento melódico. Córtelo y péguelo en
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Marca de pizzicato de chasquido (`pizzicato de Bartók')"
texidoces = "
El pizzicato de chasquido (también llamado @q{Pizzicato de Bartók}) es un
\header {
lsrtags = "text"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Los textos independientes se pueden disponer en varias columnas
utilizando instrucciones @code{\\markup}:
\version "2.13.10"
\header {
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La dirección de las plicas se contola de la misma forma en la
tablatura que en la notación tradicional. Las barras se pueden
\header {
lsrtags = "unfretted-strings, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta plantilla muestra un cuarteto de cuerda normal. También utiliza
una sección @code{\\global} para el compás y la armadura
\header {
lsrtags = "unfretted-strings, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
El fragmento de código @qq{Plantilla de cuarteto de cuerda} produce un
resultado satisfactorio para el cuarteto, pero ¿y si tenemos que
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las barras de semicorcheas (o notas más breves) seguidas no se
subdividen de forma predeterminada. Esto es: las tres (o más)
\header {
lsrtags = "ancient-notation, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
A modo de alternativa para obtener auténticos «incipit»
independientes de la partitura principal, se incluyen como
\header {
lsrtags = "pitches"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Transportar música con el menor número de alteraciones"
texidoces = "
Este ejemplo utiliza código de Scheme para forzar las
\header {
lsrtags = "pitches, staff-notation, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Trucaje de las propiedades de clave"
texidoces = "
La instrucción @code{\\clef \"treble_8\"} equivale a un ajuste de
\header {
lsrtags = "rhythms, tweaks-and-overrides"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
La disposición de las expresiones de adorno se puede cambiar a lo
\header {
lsrtags = "staff-notation, contexts-and-engravers"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Se puede usar el delimitador de comienzo de un sistema
@code{SystemStartSquare} estableciéndolo explícitamente dentro de
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Algunos compositores escriben dos ligaduras cuando quieren acordes
legato. Esto se puede conseguir estableciendo @code{doubleSlurs}.
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Es posible aplicar la barrita que cruza la barra de las
\header {
lsrtags = "rhythms"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
doctitlees = "Uso de ligaduras en los arpegios"
texidoces = "
En ocasiones se usan ligaduras de unión para escribir los arpegios.
\header {
lsrtags = "tweaks-and-overrides, spacing"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Mediante el establecimiento de la propiedad @code{'Y-extent} a un valor
adecuado, todos los objetos @code{DynamicLineSpanner} (reguladores e
\header {
lsrtags = "expressive-marks"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Las expresiones dinámicas que se comienzan, terminan o se producen
en la misma nota se alinean verticalmente. Para asegurar que las
\header {
lsrtags = "vocal-music, tweaks-and-overrides, spacing"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Este fragmento de código muestra el uso de las propiedades de
contexto @code{alignBelowContext} y @code{alignAboveContext} para
\header {
lsrtags = "vocal-music, keyboards, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta plantilla añade una reducción de piano automática a la partitura
\header {
lsrtags = "text, vocal-music, contexts-and-engravers, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Esta plantilla es, básicamente, la misma que la sencilla plantilla
@qq{Conjunto vocal}, excepto que aquí todas las líneas de letra se
\header {
lsrtags = "vocal-music, template"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
He aquí una partitura vocal estándar para cuatro voces SATB. Con
grupos mayores, suele ser útil incluir una sección que aparezca en
\header {
lsrtags = "repeats, staff-notation, chords"
-%% Translation of GIT committish: 4385ed4cc738e164a95798862580b4b86703356f
+%% Translation of GIT committish: 5cab62e8738ff02eead438042743116391f306f5
texidoces = "
Mediante la adición del grabador @code{Volta_engraver} al
pentagrama pertinente, se pueden poner los corchetes de primera y
@node External programs
@chapter External programs
-FIXME: blah blah
-
+LilyPond can interact with other programs in various ways.
@menu
* Point and click::
@node Independent includes
@section Independent @code{include}s
-FIXME: blah blah
+Some people have written large (and useful!) code that can be
+shared between projects. This code might eventually make its way
+into LilyPond itself, but until that happens, you must download
+and @code{\include} them manually.
+
@menu
* MIDI articulation::
@node MIDI articulation
@subsection MIDI articulation
-stub for info about Dr. Peter Chubb's @file{articulate.ly}
+LilyPond can be used to produce MIDI output, for
+@qq{proof-hearing} what has been written. However, only dynamics,
+explicit tempo markings, and the notes and durations themselves
+are produced in the output.
+
+The @emph{articulate} project is one attempt to get more of the
+information in the score into he MIDI. It works by shortening
+notes not under slurs, to @q{articulate} the notes. The amount of
+shortening depends on any articulation markings attached to a
+note: staccato halves the note value, tenuto gives a note its full
+duration, and so on. The script also realises trills and turns,
+and could be extended to expand other ornaments such as mordents.
+
+@example
+@uref{http://@/www@/.nicta@/.com@/.au/@/people/@/chubbp/@/articulate}
+@end example
+
+@knownissues
+
+Its main limitation is that it can only affect things it knows
+about: anything that is merely textual markup (instead of a note
+property) is still ignored.
@imageFloat{flat-design,png,right}
-The inspiration for LilyPond came when two musicians became
-annoyed with the bland and boring look of computer-printed
-sheet music. All musicians prefer reading beautiful music, so why
-couldn't programmers write software to produce better printed
-parts?
-
-This software just does that: it prints music in the best
-traditions of classical engraving with minimum fuss. Don't waste
-time on tuning spacing, moving around symbols, or shaping slurs.
-Impress friends and colleagues with sharp sheet music!
+LilyPond came about when two musicians wanted to go beyond the
+soulless look of computer-printed sheet music. Musicians prefer
+reading beautiful music, so why couldn't programmers write
+software to produce elegant printed parts?
+
+The result is a system which frees musicians from the details of
+layout, allowing them to focus on making music. LilyPond works
+with them to create publication-quality parts, crafted in the best
+traditions of classical music engraving.
+
@divEnd
@divClass{column-left-top}
* Productions:: Real-life use of LilyPond.
* Testimonials:: What do people say about it?
* Text input:: You write music as text?!
-* Easier editing:: Other ways of working with LilyPond.
+* Easier editing:: Other ways of working with LilyPond.
@end menu
@divEnd
@node Features
@unnumberedsec Features
-@help{hoping to delegate this. Desired: an enthusiastic
-attempt to sway people towards trying lilypond. The warnings
-about writing music as text come in Crash Course, not here.}
-
-Maybe draw inspiration from
-@uref{http://lilypond.org/web/about/features} and
-@uref{http://lilypond.org/web/switch/tour} and
-@uref{http://lilypond.org/web/switch/advantages}
-
-
@subheading Why switch to LilyPond?
@imageFloat{flat-design,png,right}
-The point of using LilyPond is to produce elegant sheet music that is
+LilyPond allows musicians to produce elegant sheet music that is
easy to read. Its developer community has spent thousands of hours
developing powerful music engraving software that results in beautifully
engraved music. All of LilyPond's style settings, font designs and
@subsubheading Text-based input
LilyPond takes ASCII input, which you can produce in your favorite
-text editor, quickly and comfortably. No more futzing with the
-mouse. The input contains all the information, so there is no
-need to remember complex command sequences. Simply save an input
-for later reference.
+text editor, quickly and comfortably. The input contains all the
+information, so there is no need to remember complex command sequences:
+simply save a file for later reference.
@subsubheading Accessibility
@divClass{column-center-bottom}
@subheading Where now?
-Still not convinced? Look at some neat @ref{Examples}. If you've
+Still not convinced? Look at some specific @ref{Examples}. If you've
already decided to try LilyPond, first read about our
@ref{Text input}.
@divEnd
We realize that many users find this way of entering music a bit
odd. For this reason, we have written extensive documentation to
-help new users, beginning with @ref{Learning}.
+help new users, beginning with @ref{Learning}. The Learning
+Manual is the best place to start, as many questions are answered
+before they come up!
Please read the Learning Manual before complaining about bugs!
New users occasionally believe that LilyPond is not working
correctly, when in fact it is working precisely as designed.
+More in-depth information is available in @ref{Manuals}.
+
@subsubheading Easier editing environments
@uref{http://denemo.org}
-Denemo is graphical editor which generates LilyPond source code
-and also allows audio playback. It is currently in development
-and generates code for older versions of LilyPond (V2.8.7). It
-allows users to view the LilyPond source code in parallel to the
-graphical view.
+Denemo is a graphical editor which generates LilyPond source code,
+at release 2.8.7, and also allows audio playback. It allows users
+to view the LilyPond source code in parallel to the graphical view.
+Extra LilyPond tweaks can be attached to notes, chords etc. and are
+stored with the Denemo file, so that users can continue to edit graphically.
-@ignore
-Import: LilyPond, MIDI
+Moving the cursor in the LilyPond text moves the cursor in the graphical
+view, and any syntax errors in your LilyPond tweaks are highlighted in
+the text view when printed from there.
-Export: Lilypond, MIDI, ABC, CSound Score File, PDF
-@end ignore
@divEnd
@sourceimage{logo-macosx,,,}
@sourceimage{logo-windows,,,}
-@uref{http://lilypondtool@/.organum@/.hu}
+@uref{http://lilypondtool.organum.hu}
Created as a plugin for the
-@uref{http://@/www@/.jedit@/.org@/,jEdit} text editor,
+@uref{http://www.jedit.org,jEdit} text editor,
LilyPondTool is one of the most feature-rich text-based tool for
editing LilyPond scores. Its features include a Document Wizard
with lyrics support to set up documents easier, and embedded PDF
@divClass{column-center-top}
@subheading Other
-@help insert text and a graphic(s)
@subsubheading Mixed environment: LilyKDE
@uref{http://lilykde.googlecode.com/}
+LilyKDE has been replaced by @uref{http://www.frescobaldi.org/,Frescobaldi},
+and exists as LilyKDE3 for KDE 3.5 and lilypond-KDE4 for KDE 4.1 only.
+
LilyKDE is a plugin for KDE's text editor
@uref{http://kate-editor.org/,Kate}. It has a powerful Score
Wizard to quickly setup a LilyPond document and an embedded
Other features are lyric hyphenation and running LilyPond on
multiple files at once from within the KDE file manager.
+
@subsubheading Text environment: TexShop
@sourceimage{logo-macosx,,,}
-@uref{http://@/www@/.uoregon@/.edu/~koch/texshop}
+@uref{http://www.uoregon.edu/~koch/texshop}
The TexShop editor for MacOS@tie{}X can be extended to run LilyPond,
@command{lilypond-book} and @command{convert-ly} from within the editor,
using the extensions available at
-@uref{http://@/www@/.dimi@/.uniud@/.it/vitacolo/freesoftware@/.html#desktoppub}.
+@uref{http://www.dimi.uniud.it/vitacolo/freesoftware.html#desktoppub}.
@ignore
TODO: ask somebody to sponsor/check these. -gp
@divClass{column-center-top}
@subheading Other programs can export LilyPond code
-@ignore
-TODO: change url back to full adress, to make it readable in printouts -ch
-@end ignore
-
-@help clean up this list, check links, etc.
@subsubheading Graphical environments:
@itemize
@item
-@uref{http://@/noteedit@/.berlios@/.de,NoteEdit}
-which imports @uref{http://@/www@/.musicxml@/.com/xml@/.html,MusicXML}
+@uref{http://noteedit.berlios.de,NoteEdit}
+which imports @uref{http://www.musicxml.com/xml.html,MusicXML}
@item
-@uref{http://@/www@/.rosegardenmusic@/.com,Rosegarden},
-which imports MIDI
+@uref{http://www.rosegardenmusic.com,Rosegarden},
+which imports MIDI.
@item
@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd},
has experimental export for LilyPond.
@item
@uref{http://canorus.org,Canorus} can also export to LilyPond, but is still
beta-software. Testers welcome though.
+@item
+@uref{http://lilycomp.sourceforge.net, LilyComp} is a graphical note entry
+program, acting much like a number-pad which produces lilypond notes.
@end itemize
@subsubheading Command Line Tools:
@itemize
@item
-@uref{http://www@/.volny@/.cz/smilauer/rumor/rumor@/.html,Rumor}, a realtime
+@uref{http://www.volny.cz/smilauer/rumor/rumor.html,Rumor}, a realtime
monophonic MIDI to LilyPond converter.
@item
-@uref{http://nicolas@/.sceaux@/.free@/.fr/lilypond/lyqi@/.html,lyqi}, an
+@uref{http://nicolas.sceaux.free.fr/lilypond/lyqi.html,lyqi}, an
Emacs major mode.
@item
-@uref{http://@/common-lisp@/.net/project/fomus/,FOMUS},
+@uref{http://common-lisp.net/project/fomus/,FOMUS},
a LISP library to generate music notation
@end itemize
@divEnd
@c DO NOT WRITE BETWEEN THESE LINES
@newsItem
-@subsubheading LilyPond 2.13.12 released! @emph{February 2, 2010}
+@subsubheading LilyPond 2.13.13 released! @emph{February 13, 2010}
-We are happy to announce the release of LilyPond 2.13.11. This
-release is intended for developers only, and brings more stability
-and fewer bugs to the build system and Contributor's Guide.
+We are happy to announce the release of LilyPond 2.13.13. This
+release is intended for developers only, and fixes various
+problems with documentation build system as well as adding an
+output-preview-framework for our SVG backend. In addition, the
+binaries are now approximately 6 megabytes smaller.
@newsEnd
@newsItem
-@subsubheading LilyPond 2.13.11 released! @emph{January 16, 2010}
+@subsubheading LilyPond 2.13.12 released! @emph{February 2, 2010}
-We are happy to announce the release of LilyPond 2.13.11. This
-release is intended for developers only, and brings a number of
-improvements to the build system, Contributor's Guide, and fixes 4
-critical regressions against earlier versions.
+We are happy to announce the release of LilyPond 2.13.12. This
+release is intended for developers only, and brings more stability
+and fewer bugs to the build system and Contributor's Guide.
@newsEnd
@end ignore
+
+@newsItem
+@subsubheading LilyPond 2.13.11 released! @emph{January 16, 2010}
+
+We are happy to announce the release of LilyPond 2.13.11. This
+release is intended for developers only, and brings a number of
+improvements to the build system, Contributor's Guide, and fixes 4
+critical regressions against earlier versions.
+@newsEnd
+
@newsItem
@subsubheading LilyPond 2.13.10 released! @emph{December 31, 2009}
* It does not apply to any manual which explicitly states
another license.
+
+ * It does not apply to the MusicXML unit test suite,
+ which is licensed under the MIT license.
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=13
-PATCH_LEVEL=13
+PATCH_LEVEL=14
MY_PATCH_LEVEL=
VERSION_STABLE=2.12.3
-VERSION_DEVEL=2.13.12
+VERSION_DEVEL=2.13.13
texidoc = "Identifiers following a chordmode section are not
interpreted as chordmode tokens. In the following snippet, the
-identifier `m' is not interpreted by the lexer as as a minor chord
+identifier `m' is not interpreted by the lexer as a minor chord
modifier."
}
"With @code{music-map}, you can apply functions operating on a
single piece of music to an entire music expression. In this example,
-the the function @code{notes-to-skip} changes a note to a skip. When
+the function @code{notes-to-skip} changes a note to a skip. When
applied to an entire music expression in the 1st measure, the scripts
and dynamics are left over. These are put onto the 2nd measure."
\layout { ragged-right= ##t }
-foobar = \transpose c c' { c4\>-^ c4-^ c4\!-^ c4-^ }
+foobar = \transpose c c' { c4\>-^ c4-^ c4\!-^ c4-^ }
\relative c'' \context Voice {
<< \applyMusic #(lambda (x) (music-map notes-to-skip x))
\foobar
- { d8 d d d d d d d } >>
+ { d8 d d d d d d d } >>
}
The complete set of MusicXML test files contained in this suite can be downloaded
@uref{MusicXML-TestSuite-0.1.zip,here} as a ZIP archive.
+@heading License of the test suite
+
+This collection of MusicXML test files is distributed under the
+@uref{http://www.opensource.org/licenses/mit-license.php,MIT license}, which
+means that you can use the files for any purpose, as long as you leave the
+copyright notice (or the LICENSE file) intact.
+
@heading Connection with @uref{http://www.lilypond.org/,LilyPond}
At the same time as providing a generic test suite for MusicXML document,
STEPMAKE_TEMPLATES=documentation texinfo tex
LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc musicxml
+EXTRA_DIST_FILES = LICENSE
+
TEXI2HTML_FLAGS += --nomenu
# Urgh, how can I do two replacements at once without messing up the order of the list?
zip: $(outdir)/MusicXML-TestSuite-$(TEST_SUITE_VERSION).zip
-$(outdir)/MusicXML-TestSuite-$(TEST_SUITE_VERSION).zip: $(MUSICXML_FILES) $(MUSICMXL_FILES)
- $(ZIP) -r $@ $(addprefix $(src-dir)/,$(MUSICXML_FILES)) $(addprefix $(src-dir)/,$(MUSICMXL_FILES))
+$(outdir)/MusicXML-TestSuite-$(TEST_SUITE_VERSION).zip: $(MUSICXML_FILES) $(MUSICMXL_FILES) LICENSE
+ $(ZIP) -r $@ $(addprefix $(src-dir)/,$(MUSICXML_FILES)) $(addprefix $(src-dir)/,$(MUSICMXL_FILES)) LICENSE
--- /dev/null
+An (unofficial) MusicXML Test Suite
+
+This test suite of MusicXML unit tests is licenced under the MIT license:
+
+Copyright (c) 2008-2010, Reinhold Kainhofer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+\version "2.13.13"
+
+\header{
+
+ texidoc="
+The parenthesize markup will place parentheses
+around any stencil.
+
+The angularity of the parentheses can be adjusted.
+"
+
+}
+
+\score {
+ c''^\markup {
+ \parenthesize {
+ \column { "A" "B" "C" }
+ }
+ }
+}
+
void stop_translation_timestep ();
void process_acknowledged ();
-
+
virtual void finalize ();
virtual void derived_mark () const;
bool cautionary = to_boolean (note->get_property ("cautionary"));
if (caut.score () > acc.score ())
{
- acc.need_acc |= caut.need_acc;
- acc.need_restore |= caut.need_restore;
+ acc.need_acc |= caut.need_acc;
+ acc.need_restore |= caut.need_restore;
cautionary = true;
}
*/
if (!note->in_event_class ("trill-span-event"))
{
- if (acc.need_acc)
+ if (acc.need_acc)
create_accidental (&accidentals_[i], acc.need_restore, cautionary);
if (forced || cautionary)
Accidental_placement::add_accidental (accidental_placement_, a);
note_head->set_object ("accidental-grob", a->self_scm ());
-
+
return a;
}
}
for (vsize i = accidentals_.size (); i--;)
- {
+ {
Stream_event *note = accidentals_[i].melodic_;
Context *origin = accidentals_[i].origin_;
else
{
/*
- not really really correct if there is more than one
+ not really correct if there is more than one
note head with the same notename.
*/
localsig = ly_assoc_prepend_x (localsig, key,
SCM s = me->get_property ("glyph-name");
SCM barsize = me->get_property ("bar-size");
-
+
if (scm_is_string (s) && scm_is_number (barsize))
{
string str = ly_scm2string (s);
if (fabs (line_thick + (count -1) * ss - h) < 0.1) // ugh.
{
- Real blot =
+ Real blot =
me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
Real half_space = ss/2;
Stencil bar;
-
+
for (int i = (count-1); i >= -(count-1); i -= 2)
{
Real top_y = min ((i + dash_size) * half_space,
int dashes = int (rint (h / ss));
Real total_dash_size = h / dashes;
Real factor = (dash_size - thick) / ss;
-
+
SCM at = scm_list_n (ly_symbol2scm ("dashed-line"),
scm_from_double (thick),
scm_from_double (factor * total_dash_size),
" a thick double repeat, a thin-thick-thin double repeat,"
" a thin-thick double repeat, a thick bar, a double bar, a start bar,"
" an end bar, a thick double bar, a thin-thick-thin bar,"
- " a dotted bar, a dashed bar and a tick as bar bar line."
+ " a dotted bar, a dashed bar, and a tick."
" In addition, there is an option"
" @code{||:} which is equivalent to @code{|:} except at line"
" breaks, where it produces a double bar (@code{||}) at the"
smobify_self ();
description_ = s.description_;
- input_location_ = make_input (*s.origin ());
+ input_location_ = make_input (*s.origin ());
default_child_ = s.default_child_;
accept_mods_ = s.accept_mods_;
property_ops_ = s.property_ops_;
Context_def::mark_smob (SCM smob)
{
ASSERT_LIVE_IS_ALLOWED ();
-
+
Context_def *me = (Context_def *) SCM_CELL_WORD_1 (smob);
scm_gc_mark (me->description_);
- the first element in the list defines a context that is a valid child of
the context defined by this Context_def
- each subsequent element in the list defines a context that is a valid child
- of the the context defined by the preceding element in the list
+ of the context defined by the preceding element in the list
- the last element in the list defines a context with the given name
The ADDITIONAL_ACCEPTS parameter is a list of additional contexts that this
alist defined in a parent context. BASED-ON should always be a tail
of ALIST.
- Push or pop (depending on value of VAL) a single entry entry from a
+ Push or pop (depending on value of VAL) a single entry from a
translator property list by name of PROP. GROB_PROPERTY_PATH
indicates nested alists, eg. '(beamed-stem-lengths details)
-
+
*/
void
execute_override_property (Context *context,
SCM new_value)
{
SCM current_context_val = SCM_EOL;
-
+
Context *where = context->where_defined (context_property,
¤t_context_val);
SCM symbol = scm_car (grob_property_path);
if (scm_is_pair (scm_cdr (grob_property_path)))
{
- new_value = nested_property_alist (ly_assoc_get (symbol, target_alist,
+ new_value = nested_property_alist (ly_assoc_get (symbol, target_alist,
SCM_EOL),
scm_cdr (grob_property_path),
new_value);
programming_error ("Grob property path should be list of symbols.");
return;
}
-
+
SCM symbol = scm_car (grob_property_path);
if (scm_is_pair (scm_cdr (grob_property_path)))
{
SCM new_val
= nested_property_revert_alist (current_sub_alist,
scm_cdr (grob_property_path));
-
+
if (scm_is_pair (current_alist)
&& scm_caar (current_alist) == symbol
&& current_alist != daddy)
else
{
SCM new_alist = evict_from_alist (symbol, current_alist, daddy);
-
+
if (new_alist == daddy)
context->unset_property (context_property);
else
scm_list_1 (grob_property),
new_value);
}
-
+
/*
PRE_INIT_OPS is in the order specified, and hence must be reversed.
*/
group_ = 0;
current_event_ = 0;
}
+ /* Mark the members of the struct as used for the GUILE Garbage Collection */
+ void gc_mark () const
+ {
+ scm_gc_mark (number_);
+ scm_gc_mark (alteration_);
+ scm_gc_mark (augmented_);
+ scm_gc_mark (diminished_);
+ scm_gc_mark (augmented_slash_);
+ scm_gc_mark (text_);
+ }
+ bool group_is_equal_to (Stream_event *evt) const
+ {
+ return
+ ly_is_equal (number_, evt->get_property ("figure"))
+ && ly_is_equal (alteration_, evt->get_property ("alteration"))
+ && ly_is_equal (augmented_, evt->get_property ("augmented"))
+ && ly_is_equal (diminished_, evt->get_property ("diminished"))
+ && ly_is_equal (augmented_slash_, evt->get_property ("augmented-slash"))
+ && ly_is_equal (text_, evt->get_property ("text"));
+ }
bool is_continuation () const
{
return
current_event_
&& !force_no_continuation_
- && ly_is_equal (number_,
- current_event_->get_property ("figure"))
- && ly_is_equal (alteration_,
- current_event_->get_property ("alteration"))
- && ly_is_equal (augmented_,
- current_event_->get_property ("augmented"))
- && ly_is_equal (diminished_,
- current_event_->get_property ("diminished"))
- && ly_is_equal (augmented_slash_,
- current_event_->get_property ("augmented-slash"))
- && ly_is_equal (text_,
- current_event_->get_property ("text"));
+ && group_is_equal_to (current_event_);
}
};
{
for (vsize i = 0; i < groups_.size (); i++)
{
- scm_gc_mark (groups_[i].number_);
- scm_gc_mark (groups_[i].alteration_);
- scm_gc_mark (groups_[i].augmented_);
- scm_gc_mark (groups_[i].diminished_);
- scm_gc_mark (groups_[i].augmented_slash_);
- scm_gc_mark (groups_[i].text_);
+ groups_[i].gc_mark ();
}
}
LY_DEFINE (ly_otf_glyph_count, "ly:otf-glyph-count", 1, 0, 0,
(SCM font),
- "Return the the number of glyphs in @var{font}.")
+ "Return the number of glyphs in @var{font}.")
{
Modified_font_metric *fm
= dynamic_cast<Modified_font_metric *> (unsmob_metrics (font));
along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "protected-scm.hh"
+#include "engraver.hh"
+#include "item.hh"
#include "note-column.hh"
+#include "protected-scm.hh"
#include "side-position-interface.hh"
-#include "engraver.hh"
#include "spanner.hh"
#include "text-interface.hh"
-#include "item.hh"
+
class Ottava_spanner_engraver : public Engraver
{
"OttavaBracket ",
/* read */
+ "middleCOffset "
"ottavation "
- "originalMiddleCPosition "
"currentMusicalColumn ",
/* write */
constructor preserve equality.
Perhaps it would be better to use a more strict definition of
- equality; e.g., that that two probs are equal iff they can be
+ equality; e.g., that two probs are equal iff they can be
distinguished by calls to ly:prob-property.
*/
Prob *probs[2] = {unsmob_prob (sa), unsmob_prob (sb)};
if (scm_caar (aprop) != scm_caar (bprop) ||
(
!(unsmob_input (aval) && unsmob_input (bval))
- &&
+ &&
!to_boolean (scm_equal_p (aval, bval))))
return SCM_BOOL_F;
}
Prob::mark_smob (SCM smob)
{
ASSERT_LIVE_IS_ALLOWED ();
-
+
Prob *system = (Prob *) SCM_CELL_WORD_1 (smob);
scm_gc_mark (system->mutable_property_alist_);
system->derived_mark ();
-
+
return system->immutable_property_alist_;
}
scm_puts (p->class_name (), port);
scm_display (p->mutable_property_alist_, port);
scm_display (p->immutable_property_alist_, port);
-
+
scm_puts (" >\n", port);
return 1;
}
}
void
-Prob::internal_set_property (SCM sym, SCM val)
+Prob::internal_set_property (SCM sym, SCM val)
{
if (do_internal_type_checking_global)
type_check_assignment (sym, val);
-
+
mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, sym, val);
}
LY_DEFINE (ly_position_on_line_p, "ly:position-on-line?",
2, 0, 0, (SCM sg, SCM spos),
"Return whether @var{spos} is on a line of the staff associated"
- " with the the grob @var{sg} (even on an extender line).")
+ " with the grob @var{sg} (even on an extender line).")
{
LY_ASSERT_SMOB (Grob, sg, 1);
LY_ASSERT_TYPE (scm_is_number, spos, 2);
+++ /dev/null
-/*
- This file is part of LilyPond, the GNU music typesetter.
-
- Copyright (C) 1998--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>,
- Erik Sandberg <mandolaerik@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/>.
-*/
-
-#include "context.hh"
-#include "input.hh"
-#include "international.hh"
-#include "music.hh"
-#include "music-wrapper-iterator.hh"
-#include "stream-event.hh"
-
-/*
- Iterates \times, by sending TupletSpanEvents at the start/end of each
- tuplet bracket. Extra stop/start events are sent at regular
- intervals if tupletSpannerDuration is set.
-*/
-class Time_scaled_music_iterator : public Music_wrapper_iterator
-{
-public:
- DECLARE_SCHEME_CALLBACK (constructor, ());
- /* construction */
- DECLARE_CLASSNAME (Time_scaled_music_iterator);
- Time_scaled_music_iterator ();
-protected:
- virtual void process (Moment m);
- virtual void construct_children ();
- virtual void derived_mark () const;
- virtual Moment pending_moment () const;
-
- Music *create_event (Direction d);
-
-private:
-
- /* tupletSpannerDuration */
- Moment spanner_duration_;
-
- /* next time to add a stop/start pair */
- Moment next_split_mom_;
-
- /* Recycle start/stop events if tupletSpannerDuration is set. */
- SCM synthesized_events_;
-
- Context_handle tuplet_handler_;
-};
-
-Music*
-Time_scaled_music_iterator::create_event (Direction d)
-{
- SCM ev_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"),
- ly_symbol2scm ("TupletSpanEvent"),
- scm_from_int (d));
-
- Music *mus = get_music ();
-
- Music *ev = unsmob_music (ev_scm);
- ev->set_spot (*mus->origin ());
- if (d == START)
- {
- ev->set_property ("numerator", mus->get_property ("numerator"));
- ev->set_property ("denominator", mus->get_property ("denominator"));
- ev->set_property ("tweaks", mus->get_property ("tweaks"));
- ev->set_property ("length", spanner_duration_.smobbed_copy ());
- }
-
- synthesized_events_ = scm_cons (ev_scm, synthesized_events_);
- return ev;
-}
-
-
-Time_scaled_music_iterator::Time_scaled_music_iterator ()
-{
- spanner_duration_ = next_split_mom_ = 0;
- synthesized_events_ = SCM_EOL;
-}
-
-
-Moment
-Time_scaled_music_iterator::pending_moment () const
-{
- Moment next_mom = Music_wrapper_iterator::pending_moment ();
- next_mom = min (next_mom, next_split_mom_);
-
- return next_mom;
-}
-
-
-void
-Time_scaled_music_iterator::process (Moment m)
-{
- if (spanner_duration_.to_bool () &&
- m.main_part_ == next_split_mom_)
- {
- descend_to_bottom_context ();
- if (tuplet_handler_.get_outlet ())
- create_event (STOP)->send_to_context (tuplet_handler_.get_outlet ());
-
- if (m.main_part_ < music_get_length ().main_part_)
- {
- tuplet_handler_.set_context (get_outlet ());
- report_event (create_event (START));
-
- next_split_mom_ += spanner_duration_;
- }
- else
- {
- tuplet_handler_.set_context (0);
- }
- }
- Music_wrapper_iterator::process (m);
- if (child_iter_ && child_iter_->ok ())
- descend_to_child (child_iter_->get_outlet ());
-
-}
-
-void
-Time_scaled_music_iterator::construct_children ()
-{
- spanner_duration_ = music_get_length ();
-
- Moment *mp = unsmob_moment (get_outlet ()->get_property ("tupletSpannerDuration"));
- if (mp)
- spanner_duration_ = min (mp->main_part_, spanner_duration_);
-
- Music_wrapper_iterator::construct_children ();
-
- if (child_iter_ && child_iter_->ok ())
- descend_to_child (child_iter_->get_outlet ());
-}
-
-void
-Time_scaled_music_iterator::derived_mark () const
-{
- scm_gc_mark (synthesized_events_);
- Music_wrapper_iterator::derived_mark ();
-}
-
-IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator);
= (TT_Header *)FT_Get_Sfnt_Table (face, ft_sfnt_head);
lily_cookie_fprintf (out, "/FontBBox [%lf %lf %lf %lf] def\n",
- float (ht->xMin) / ht->Units_Per_EM,
- float (ht->yMin) / ht->Units_Per_EM,
- float (ht->xMax) / ht->Units_Per_EM,
- float (ht->yMax) / ht->Units_Per_EM);
+ float (ht->xMin) / float (ht->Units_Per_EM),
+ float (ht->yMin) / float (ht->Units_Per_EM),
+ float (ht->xMax) / float (ht->Units_Per_EM),
+ float (ht->yMax) / float (ht->Units_Per_EM));
lily_cookie_fprintf (out, "/FontType 42 def\n");
lily_cookie_fprintf (out, "/FontInfo 8 dict dup begin\n");
lily_cookie_fprintf (out, "/isFixedPitch %s def\n",
pt->isFixedPitch ? "true" : "false");
lily_cookie_fprintf (out, "/UnderlinePosition %lf def\n",
- float (pt->underlinePosition) / ht->Units_Per_EM);
+ float (pt->underlinePosition)
+ / float (ht->Units_Per_EM));
lily_cookie_fprintf (out, "/UnderlineThickness %lf def\n",
- float (pt->underlineThickness) / ht->Units_Per_EM);
+ float (pt->underlineThickness)
+ / float (ht->Units_Per_EM));
lily_cookie_fprintf (out, "end readonly def\n");
}
if (offset > last_offset + CHUNKSIZE)
{
if (last_chunk != last_offset)
- chunks.push_back (last_offset - last_chunk);
+ chunks.push_back (FT_UShort (last_offset - last_chunk));
/*
a single glyph with more than 64k data
is a pathological case but...
chunks.push_back (CHUNKSIZE);
rest -= CHUNKSIZE;
}
- chunks.push_back (rest);
+ chunks.push_back (FT_UShort (rest));
last_chunk = offset;
}
else if (offset > last_chunk + CHUNKSIZE)
{
- chunks.push_back (last_offset - last_chunk);
+ chunks.push_back (FT_UShort (last_offset - last_chunk));
last_chunk = last_offset;
}
last_offset = offset;
}
- chunks.push_back (s - last_chunk);
+ chunks.push_back (FT_UShort (s - last_chunk));
delete[] loca_buf;
}
chunks.push_back (CHUNKSIZE);
rest -= CHUNKSIZE;
}
- chunks.push_back (rest);
+ chunks.push_back (FT_UShort (rest));
}
else
chunks.push_back (CHUNKSIZE);
unsigned char *hbuf = new unsigned char[hlength];
unsigned char *p;
- hbuf[0] = 0x00; /* version */
+ hbuf[0] = 0x00; /* version */
hbuf[1] = 0x01;
hbuf[2] = 0x00;
hbuf[3] = 0x00;
- hbuf[4] = (idx & 0xFF00) >> 8; /* numTables */
+ hbuf[4] = (unsigned char) ((idx & 0xFF00) >> 8); /* numTables */
hbuf[5] = idx & 0x00FF;
FT_UInt searchRange, entrySelector, rangeShift;
searchRange = 0x10 << entrySelector;
rangeShift = (idx << 4) - searchRange;
- hbuf[6] = (searchRange & 0xFF00) >> 8;
+ hbuf[6] = (unsigned char) ((searchRange & 0xFF00) >> 8);
hbuf[7] = searchRange & 0x00FF;
- hbuf[8] = (entrySelector & 0xFF00) >> 8;
+ hbuf[8] = (unsigned char) ((entrySelector & 0xFF00) >> 8);
hbuf[9] = entrySelector & 0x00FF;
- hbuf[10] = (rangeShift & 0xFF00) >> 8;
+ hbuf[10] = (unsigned char) ((rangeShift & 0xFF00) >> 8);
hbuf[11] = rangeShift & 0x00FF;
p = &hbuf[12];
delete[] buf;
- *(p++) = (tags[i] & 0xFF000000UL) >> 24;
- *(p++) = (tags[i] & 0x00FF0000UL) >> 16;
- *(p++) = (tags[i] & 0x0000FF00UL) >> 8;
+ *(p++) = (unsigned char) ((tags[i] & 0xFF000000UL) >> 24);
+ *(p++) = (unsigned char) ((tags[i] & 0x00FF0000UL) >> 16);
+ *(p++) = (unsigned char) ((tags[i] & 0x0000FF00UL) >> 8);
*(p++) = tags[i] & 0x000000FFUL;
- *(p++) = (checksum & 0xFF000000UL) >> 24;
- *(p++) = (checksum & 0x00FF0000UL) >> 16;
- *(p++) = (checksum & 0x0000FF00UL) >> 8;
+ *(p++) = (unsigned char) ((checksum & 0xFF000000UL) >> 24);
+ *(p++) = (unsigned char) ((checksum & 0x00FF0000UL) >> 16);
+ *(p++) = (unsigned char) ((checksum & 0x0000FF00UL) >> 8);
*(p++) = checksum & 0x000000FFUL;
- *(p++) = (offset & 0xFF000000UL) >> 24;
- *(p++) = (offset & 0x00FF0000UL) >> 16;
- *(p++) = (offset & 0x0000FF00UL) >> 8;
+ *(p++) = (unsigned char) ((offset & 0xFF000000UL) >> 24);
+ *(p++) = (unsigned char) ((offset & 0x00FF0000UL) >> 16);
+ *(p++) = (unsigned char) ((offset & 0x0000FF00UL) >> 8);
*(p++) = offset & 0x000000FFUL;
- *(p++) = (lengths[i] & 0xFF000000UL) >> 24;
- *(p++) = (lengths[i] & 0x00FF0000UL) >> 16;
- *(p++) = (lengths[i] & 0x0000FF00UL) >> 8;
+ *(p++) = (unsigned char) ((lengths[i] & 0xFF000000UL) >> 24);
+ *(p++) = (unsigned char) ((lengths[i] & 0x00FF0000UL) >> 16);
+ *(p++) = (unsigned char) ((lengths[i] & 0x0000FF00UL) >> 8);
*(p++) = lengths[i] & 0x000000FFUL;
/* offset must be a multiple of 4 */
if (tag == head_tag)
{
/* in the second pass simply store the computed font checksum */
- buf[8] = (font_checksum & 0xFF000000UL) >> 24;
- buf[9] = (font_checksum & 0x00FF0000UL) >> 16;
- buf[10] = (font_checksum & 0x0000FF00UL) >> 8;
+ buf[8] = (unsigned char) ((font_checksum & 0xFF000000UL) >> 24);
+ buf[9] = (unsigned char) ((font_checksum & 0x00FF0000UL) >> 16);
+ buf[10] = (unsigned char) ((font_checksum & 0x0000FF00UL) >> 8);
buf[11] = font_checksum & 0x000000FFUL;
}
--- /dev/null
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 1998--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+ Erik Sandberg <mandolaerik@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/>.
+*/
+
+#include "context.hh"
+#include "input.hh"
+#include "international.hh"
+#include "music.hh"
+#include "music-wrapper-iterator.hh"
+#include "stream-event.hh"
+
+/*
+ Iterates \times, by sending TupletSpanEvents at the start/end of each
+ tuplet bracket. Extra stop/start events are sent at regular
+ intervals if tupletSpannerDuration is set.
+*/
+class Tuplet_iterator : public Music_wrapper_iterator
+{
+public:
+ DECLARE_SCHEME_CALLBACK (constructor, ());
+ /* construction */
+ DECLARE_CLASSNAME (Tuplet_iterator);
+ Tuplet_iterator ();
+protected:
+ virtual void process (Moment m);
+ virtual void construct_children ();
+ virtual void derived_mark () const;
+ virtual Moment pending_moment () const;
+
+ Music *create_event (Direction d);
+
+private:
+
+ /* tupletSpannerDuration */
+ Moment spanner_duration_;
+
+ /* next time to add a stop/start pair */
+ Moment next_split_mom_;
+
+ /* Recycle start/stop events if tupletSpannerDuration is set. */
+ SCM synthesized_events_;
+
+ Context_handle tuplet_handler_;
+};
+
+Music *
+Tuplet_iterator::create_event (Direction d)
+{
+ SCM ev_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"),
+ ly_symbol2scm ("TupletSpanEvent"),
+ scm_from_int (d));
+
+ Music *mus = get_music ();
+
+ Music *ev = unsmob_music (ev_scm);
+ ev->set_spot (*mus->origin ());
+ if (d == START)
+ {
+ ev->set_property ("numerator", mus->get_property ("numerator"));
+ ev->set_property ("denominator", mus->get_property ("denominator"));
+ ev->set_property ("tweaks", mus->get_property ("tweaks"));
+ ev->set_property ("length", spanner_duration_.smobbed_copy ());
+ }
+
+ synthesized_events_ = scm_cons (ev_scm, synthesized_events_);
+ return ev;
+}
+
+Tuplet_iterator::Tuplet_iterator ()
+{
+ spanner_duration_ = next_split_mom_ = 0;
+ synthesized_events_ = SCM_EOL;
+}
+
+Moment
+Tuplet_iterator::pending_moment () const
+{
+ Moment next_mom = Music_wrapper_iterator::pending_moment ();
+ next_mom = min (next_mom, next_split_mom_);
+
+ return next_mom;
+}
+
+void
+Tuplet_iterator::process (Moment m)
+{
+ if (spanner_duration_.to_bool ()
+ && m.main_part_ == next_split_mom_)
+ {
+ descend_to_bottom_context ();
+ if (tuplet_handler_.get_outlet ())
+ create_event (STOP)->send_to_context (tuplet_handler_.get_outlet ());
+
+ if (m.main_part_ < music_get_length ().main_part_)
+ {
+ tuplet_handler_.set_context (get_outlet ());
+ report_event (create_event (START));
+
+ next_split_mom_ += spanner_duration_;
+ }
+ else
+ tuplet_handler_.set_context (0);
+ }
+ Music_wrapper_iterator::process (m);
+ if (child_iter_ && child_iter_->ok ())
+ descend_to_child (child_iter_->get_outlet ());
+
+}
+
+void
+Tuplet_iterator::construct_children ()
+{
+ spanner_duration_ = music_get_length ();
+
+ Moment *mp
+ = unsmob_moment (get_outlet ()->get_property ("tupletSpannerDuration"));
+ if (mp)
+ spanner_duration_ = min (mp->main_part_, spanner_duration_);
+
+ Music_wrapper_iterator::construct_children ();
+
+ if (child_iter_ && child_iter_->ok ())
+ descend_to_child (child_iter_->get_outlet ());
+}
+
+void
+Tuplet_iterator::derived_mark () const
+{
+ scm_gc_mark (synthesized_events_);
+ Music_wrapper_iterator::derived_mark ();
+}
+
+IMPLEMENT_CTOR_CALLBACK (Tuplet_iterator);
\version "2.12.0"
-% Add ninth chords to to predefined fret diagrams for standard guitar tunings
+% Add ninth chords to predefined fret diagrams for standard guitar tunings
\addChordShape #'c:9 #guitar-tuning #"x;3-2;2-1;3-3-(;3-3;3-3-);"
\addChordShape #'f:9 #guitar-tuning #"1-1-(;3-3;1-1;2-2;1-1-);3-4;"
%
-% These numbers were taken from a part that that the EJE violas played
+% These numbers were taken from a part that the EJE violas played in
% 1997 -- Probably Mendelssohn's ouverture `Heimkehr aus der Fremde'.
%
stafflines := 5;
%
-% The design size of a staff should really be the
+% The design size of a staff should really be the
% staff_space, but we use staffsize for historical reasons.
-%
+%
staff_space# := staffsize# / (stafflines - 1);
staff_space_rounded# := staff_space#;
fixed_line_thickness + variable_line_factor * 4.125 pt# = 0.47 pt#;
stafflinethickness# := fixed_line_thickness
- + variable_line_factor * staff_space#;
+ + variable_line_factor * staff_space#;
stafflinethickness_rounded# := stafflinethickness#;
%
-% The following tunes the general blackness of the glyphs.
+% The following tunes the general blackness of the glyphs.
%
linethickness# := stafflinethickness#; %% 0.5 pt#;
ledgerlinethickness_rounded := 2 stafflinethickness_rounded;
fi;
-%
+%
% Because of the engraving/stamping process, no traditional
% characters have sharp edges and corners.
% The following variable controls the amount of `roundness'.
% . Restore height and decrease `d' by 1.
%
% o The glyph is centered between two or four staff lines, and the origin is
-% the middle of the whitespace. Assuming that the the whitespace consists
-% of an odd number of pixels, we have this:
+% the middle of the whitespace. Assuming that the whitespace consists of
+% an odd number of pixels, we have this:
%
% -----------
% b
def print_before_note (self, printer):
if self.span_direction == -1:
printer.dump ('\[')
- # the the bracket after the last note
+ # the bracket after the last note
def print_after_note (self, printer):
if self.span_direction == 1:
printer.dump ('\]')
;; backend helpers.
(use-modules (scm ps-to-png)
+ (scm paper-system)
(ice-9 optargs))
(define-public (ly:system command . rest)
scope)))
(apply string-append (map output-scope scopes)))
+(define-public (relevant-book-systems book)
+ (let ((systems (ly:paper-book-systems book)))
+ ;; skip booktitles.
+ (if (and (not (ly:get-option 'include-book-title-preview))
+ (pair? systems)
+ (ly:prob-property (car systems) 'is-book-title #f))
+ (cdr systems)
+ systems)))
+
+(define-public (relevant-dump-systems systems)
+ (let ((to-dump-systems '()))
+ (for-each
+ (lambda (sys)
+ (if (or (paper-system-title? sys)
+ (not (pair? to-dump-systems))
+ (paper-system-title? (car to-dump-systems)))
+ (set! to-dump-systems (cons sys to-dump-systems))))
+ systems)
+ to-dump-systems))
+
(define missing-stencil-list '())
(define-public (backend-testing output-module)
detected.")
- (originalMiddleCPosition ,integer? "Used for temporary overriding
-middle@tie{}C in octavation brackets.")
-
-
(quotedCueEventTypes ,list? "A list of symbols, representing the
event types that should be duplicated for @code{\\cueDuring} commands.")
(quotedEventTypes ,list? "A list of symbols, representing the
(m (interpret-markup layout props arg)))
(bracketify-stencil m Y th (* 2.5 th) th)))
+(define-markup-command (parenthesize layout props arg)
+ (markup?)
+ #:category graphic
+ #:properties ((angularity 0)
+ (padding)
+ (size 1)
+ (thickness 1)
+ (width 0.25))
+ "
+@cindex placing parentheses around text
+
+Draw parentheses around @var{arg}. This is useful for parenthesizing
+a column containing several lines of text.
+
+@lilypond[verbatim,quote]
+\\markup {
+ \\parenthesize {
+ \\column {
+ foo
+ bar
+ }
+ }
+}
+@end lilypond"
+ (let* ((markup (interpret-markup layout props arg))
+ (scaled-width (* size width))
+ (scaled-thickness
+ (* (chain-assoc-get 'line-thickness props 0.1)
+ thickness))
+ (half-thickness
+ (min (* size 0.5 scaled-thickness)
+ (* (/ 4 3.0) scaled-width)))
+ (padding (chain-assoc-get 'padding props half-thickness)))
+ (parenthesize-stencil
+ markup half-thickness scaled-width angularity padding)))
+
+\f
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Delayed markup evaluation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@code{\\times 2/3 @{ @dots{} @}} for triplets.")
(length-callback . ,ly:music-wrapper::length-callback)
(start-callback . ,ly:music-wrapper::start-callback)
- (iterator-ctor . ,ly:time-scaled-music-iterator::constructor)
+ (iterator-ctor . ,ly:tuplet-iterator::constructor)
(types . (time-scaled-music music-wrapper-music general-music))
))
(define-public (output-preview-framework basename book scopes fields)
(let* ((paper (ly:paper-book-paper book))
- (systems (ly:paper-book-systems book))
- (scale (ly:output-def-lookup paper 'output-scale))
- (to-dump-systems '()))
- ;; skip booktitles.
- (if (and (not (ly:get-option 'include-book-title-preview))
- (pair? systems)
- (ly:prob-property (car systems) 'is-book-title #f))
- (set! systems (cdr systems)))
- (for-each
- (lambda (sys)
- (if (or (paper-system-title? sys)
- (not (pair? to-dump-systems))
- (paper-system-title? (car to-dump-systems)))
- (set! to-dump-systems (cons sys to-dump-systems))))
- systems)
+ (systems (relevant-book-systems book))
+ (to-dump-systems (relevant-dump-systems systems)))
(dump-stencil-as-EPS paper
(stack-stencils Y DOWN 0.0
(map paper-system-stencil
(format "~a.preview.eps" basename)
(cons "png" (ly:output-formats)))))
-(if #f
- (define-public (output-preview-framework basename book scopes fields)
- (let* ((paper (ly:paper-book-paper book))
- (systems (ly:paper-book-systems book))
- (scale (ly:output-def-lookup paper 'output-scale))
- (titles (take-while paper-system-title? systems))
- (non-title (find (lambda (x)
- (not (paper-system-title? x))) systems))
- (dump-me
- (stack-stencils Y DOWN 0.0
- (map paper-system-stencil
- (append titles (list non-title))))))
- (output-scopes scopes fields basename)
- (dump-stencil-as-EPS paper dump-me
- (format "~a.preview" basename)
- #t)
- (postprocess-output book framework-ps-module
- (format "~a.preview.eps" basename)
- (ly:output-formats)))))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-public (convert-to-pdf book name)
(guile)
(lily)
(scm page)
+ (scm paper-system)
(scm output-svg)
(srfi srfi-1)
(srfi srfi-2)
(define format ergonomic-simple-format)
-(define (svg-header paper unit-length)
- (let* ((lookup (lambda (x) (ly:output-def-lookup paper x)))
- (output-scale (* lily-unit->mm-factor unit-length))
- (paper-width (lookup 'paper-width))
- (paper-height (lookup 'paper-height))
- (page-width (* output-scale paper-width))
- (page-height (* output-scale paper-height)))
+(define (svg-begin . rest)
+ (eo 'svg
+ '(xmlns . "http://www.w3.org/2000/svg")
+ '(xmlns:xlink . "http://www.w3.org/1999/xlink")
+ '(version . "1.2")
+ `(width . ,(ly:format "~2fmm" (first rest)))
+ `(height . ,(ly:format "~2fmm" (second rest)))
+ `(viewBox . ,(ly:format "~4f ~4f ~4f ~4f"
+ (third rest) (fourth rest)
+ (fifth rest) (sixth rest)))))
- `((xmlns . "http://www.w3.org/2000/svg")
- (xmlns:xlink . "http://www.w3.org/1999/xlink")
- (version . "1.2")
- (width . ,(ly:format "~2fmm" page-width))
- (height . ,(ly:format "~2fmm" page-height))
- (viewBox . ,(ly:format "0 0 ~4f ~4f"
- paper-width paper-height)))))
+(define (svg-end)
+ (ec 'svg))
(define (dump-page paper filename page page-number page-count)
(let* ((outputter (ly:make-paper-outputter (open-file filename "wb") 'svg))
(dump (lambda (str) (display str (ly:outputter-port outputter))))
- (unit-length (ly:output-def-lookup paper 'output-scale)))
+ (lookup (lambda (x) (ly:output-def-lookup paper x)))
+ (unit-length (lookup 'output-scale))
+ (output-scale (* lily-unit->mm-factor unit-length))
+ (device-width (lookup 'paper-width))
+ (device-height (lookup 'paper-height))
+ (page-width (* output-scale device-width))
+ (page-height (* output-scale device-height)))
- (dump (apply eo 'svg (svg-header paper unit-length)))
+ (dump (svg-begin page-width page-height
+ 0 0 device-width device-height))
(dump (comment (format "Page: ~S/~S" page-number page-count)))
(ly:outputter-output-scheme outputter
`(begin (set! lily-unit-length ,unit-length)
""))
(ly:outputter-dump-stencil outputter page)
- (dump (ec 'svg))
+ (dump (svg-end))
(ly:outputter-close outputter)))
+(define (dump-preview paper stencil filename)
+ (let* ((outputter (ly:make-paper-outputter (open-file filename "wb") 'svg))
+ (dump (lambda (str) (display str (ly:outputter-port outputter))))
+ (lookup (lambda (x) (ly:output-def-lookup paper x)))
+ (unit-length (lookup 'output-scale))
+ (x-extent (ly:stencil-extent stencil X))
+ (y-extent (ly:stencil-extent stencil Y))
+ (left-x (car x-extent))
+ (top-y (cdr y-extent))
+ (device-width (interval-length x-extent))
+ (device-height (interval-length y-extent))
+ (output-scale (* lily-unit->mm-factor unit-length))
+ (svg-width (* output-scale device-width))
+ (svg-height (* output-scale device-height)))
+
+ (dump (svg-begin svg-width svg-height
+ left-x (- top-y) device-width device-height))
+ (ly:outputter-output-scheme outputter
+ `(begin (set! lily-unit-length ,unit-length)
+ ""))
+ (ly:outputter-dump-stencil outputter stencil)
+ (dump (svg-end))
+ (ly:outputter-close outputter)))
+
+
(define (output-framework basename book scopes fields)
(let* ((paper (ly:paper-book-paper book))
(page-stencils (map page-stencil (ly:paper-book-pages book)))
(filename "")
(file-suffix (lambda (num)
(if (= page-count 1) "" (format "-page-~a" num)))))
-
(for-each
(lambda (page)
(set! page-number (1+ page-number))
(file-suffix page-number)))
(dump-page paper filename page page-number page-count))
page-stencils)))
+
+(define (output-preview-framework basename book scopes fields)
+ (let* ((paper (ly:paper-book-paper book))
+ (systems (relevant-book-systems book))
+ (to-dump-systems (relevant-dump-systems systems)))
+ (dump-preview paper
+ (stack-stencils Y DOWN 0.0
+ (map paper-system-stencil
+ (reverse to-dump-systems)))
+ (format "~a.preview.svg" basename))))
(ly:stencil-combine-at-edge lb (other-axis axis) 1 stil padding))
stil))
+(define (make-parenthesis-stencil
+ y-extent half-thickness width angularity)
+ "Create a parenthesis stencil.
+@var{y-extent} is the Y extent of the markup inside the parenthesis.
+@var{half-thickness} is the half thickness of the parenthesis.
+@var{width} is the width of a parenthesis.
+The higher the value of number @var{angularity},
+the more angular the shape of the parenthesis."
+ (let* ((line-width 0.1)
+ ;; Horizontal position of baseline that end points run through.
+ (base-x
+ (if (< width 0)
+ (- width)
+ 0))
+ ;; Farthest X value (in relation to baseline)
+ ;; on the outside of the curve.
+ (outer-x (+ base-x width))
+ (x-extent (ordered-cons base-x outer-x))
+ (bottom-y (interval-start y-extent))
+ (top-y (interval-end y-extent))
+
+ (lower-end-point (cons base-x bottom-y))
+ (upper-end-point (cons base-x top-y))
+
+ (outer-control-x (+ base-x (* 4/3 width)))
+ (inner-control-x (+ outer-control-x
+ (if (< width 0)
+ half-thickness
+ (- half-thickness))))
+
+ ;; Vertical distance between a control point
+ ;; and the end point it connects to.
+ (offset-index (- (* 0.6 angularity) 0.8))
+ (lower-control-y (interval-index y-extent offset-index))
+ (upper-control-y (interval-index y-extent (- offset-index)))
+
+ (lower-outer-control-point
+ (cons outer-control-x lower-control-y))
+ (upper-outer-control-point
+ (cons outer-control-x upper-control-y))
+ (upper-inner-control-point
+ (cons inner-control-x upper-control-y))
+ (lower-inner-control-point
+ (cons inner-control-x lower-control-y)))
+
+ (ly:make-stencil
+ (list 'bezier-sandwich
+ `(quote ,(list
+ ;; Step 4: curve through inner control points
+ ;; to lower end point.
+ upper-inner-control-point
+ lower-inner-control-point
+ lower-end-point
+ ;; Step 3: move to upper end point.
+ upper-end-point
+ ;; Step 2: curve through outer control points
+ ;; to upper end point.
+ lower-outer-control-point
+ upper-outer-control-point
+ upper-end-point
+ ;; Step 1: move to lower end point.
+ lower-end-point))
+ line-width)
+ x-extent
+ y-extent)))
+
+(define-public (parenthesize-stencil
+ stencil half-thickness width angularity padding)
+ "Add parentheses around @var{stencil}, returning a new stencil."
+ (let* ((y-extent (ly:stencil-extent stencil Y))
+ (lp (make-parenthesis-stencil
+ y-extent half-thickness (- width) angularity))
+ (rp (make-parenthesis-stencil
+ y-extent half-thickness width angularity)))
+ (set! stencil (ly:stencil-combine-at-edge lp X RIGHT stencil padding))
+ (set! stencil (ly:stencil-combine-at-edge stencil X RIGHT rp padding))
+ stencil))
+
(define-public (make-line-stencil width startx starty endx endy)
"Make a line stencil of given linewidth and set its extents accordingly"
(let ((xext (cons (min startx endx) (max startx endx)))
(define-public guitar-drop-d-tuning '(4 -1 -5 -10 -15 -22))
(define-public guitar-open-g-tuning '(2 -1 -5 -10 -17 -22))
(define-public guitar-open-d-tuning '(2 -3 -6 -10 -15 -22))
-(define-public guitar-dadgad-tuning '(2 -3 -7 -10 -15 -22))
+(define-public guitar-dadgad-tuning '(2 -3 -5 -10 -15 -22))
(define-public guitar-lute-tuning '(4 -1 -6 -10 -15 -20))
(define-public guitar-asus4-tuning '(4 -3 -8 -10 -15 -20))
;; bass tunings
else:
return ''
-class FatalConversionError:
+class FatalConversionError (Exception):
pass
-class UnknownVersion:
+class UnknownVersion (Exception):
pass
+class InvalidVersion (Exception):
+ def __init__ (self, version):
+ self.version = version
+
def do_one_file (infile_name):
ly.stderr_write (_ ("Processing `%s\'... ") % infile_name)
sys.stderr.write ('\n')
else:
to_version = latest_version ()
+ if len (from_version) != 3:
+ raise InvalidVersion (".".join ([str(n) for n in from_version]))
+
(last, result) = do_conversion (input, from_version, to_version)
if f == '-':
f = ''
elif not os.path.isfile (f):
- error (_ ("cannot open file: `%s'") % f)
+ error (_ ("%s: Unable to open file") % f)
if len (files) == 1:
sys.exit (1)
continue
try:
do_one_file (f)
except UnknownVersion:
- error (_ ("cannot determine version for `%s'. Skipping") % f)
+ error (_ ("%s: Unable to determine version. Skipping") % f)
+ except InvalidVersion as ex:
+ error (_ ("%s: Invalid version string `%s' \n"
+ "Valid version strings consist of three numbers, "
+ "separated by dots, e.g. `2.8.12'") % (f, ex.version) )
sys.stderr.write ('\n')
r'''(?mx)
(?P<match>
<lilypond
- (\s*(?P<options>.*?)\s*:)?\s*
+ (\s+(?P<options>.*?))?\s*:\s*
(?P<code>.*?)
- />)''',
+ \s*/>)''',
'lilypond_block':
r'''(?msx)
\s*(?P<options>.*?)\s*
>
(?P<code>.*?)
- </lilypond>)''',
+ </lilypond\s*>)''',
'lilypond_file':
r'''(?mx)
\s*(?P<options>.*?)\s*
>
\s*(?P<filename>.*?)\s*
- </lilypondfile>)''',
+ </lilypondfile\s*>)''',
'multiline_comment':
r'''(?smx)
################################################################
OUT=out-website
+WEB_LANGS=es fr
+
TEXI2HTML=ONLY_WEB=1 TOP_SRC_DIR=$(top-src-dir) DEPTH=$(depth) PERL_UNICODE=SD $(TEXI2HTML_PROGRAM)
EXTRACT_TEXI_FILENAMES=python $(script-dir)/extract_texi_filenames.py
CREATE_VERSION=python $(script-dir)/create-version-itexi.py
CREATE_WEBLINKS=python $(script-dir)/create-weblinks-itexi.py
+MASS_LINK=python $(script-dir)/mass-link.py
SERVER_FILES=$(top-src-dir)/Documentation/web/server/
$(foreach manual, $(MANUALS), \
$(EXTRACT_TEXI_FILENAMES) -I $(top-src-dir)/Documentation/ \
-I $(OUT) -o $(OUT) $(manual) && ) :
+ # translations
+ for l in $(WEB_LANGS); do \
+ $(EXTRACT_TEXI_FILENAMES) \
+ -I $(top-src-dir)/Documentation/"$$l" \
+ -I $(OUT) -o $(OUT) --split=node \
+ $(top-src-dir)/Documentation/"$$l"/web.texi ;\
+ done;
+
website-texinfo: website-version website-xrefs
$(TEXI2HTML) --prefix=index \
-D web_version \
--output=$(OUT)/website/ \
$(top-src-dir)/Documentation/web.texi
+ # translations
+ for l in $(WEB_LANGS); do \
+ $(TEXI2HTML) --prefix=index \
+ --split=section \
+ --I=$(top-src-dir)/Documentation/"$$l" \
+ --I=$(top-src-dir)/Documentation/ \
+ --I=$(OUT) \
+ --lang="$$l" \
+ --init-file=$(texi2html-init-file) \
+ -D web_version \
+ --output=$(OUT)/"$$l" \
+ $(top-src-dir)/Documentation/"$$l"/web.texi ; \
+ find $(OUT)/$$l/ -name '*.html' | xargs grep -L 'UNTRANSLATED NODE: IGNORE ME' | sed 's!$(OUT)/'$$l'/!!g' | xargs $(MASS_LINK) --prepend-suffix .$$l hard $(OUT)/$$l/ $(OUT)/website/ ; \
+ done
+
website-css:
cp $(top-src-dir)/Documentation/css/*.css $(OUT)/website/