* Page layout::
* Sound::
* Music entry::
+* Skipping corrected music::
* Interpretation context::
* Syntactic details::
* Lexical details::
@c . {Polyphony}
@node Polyphony
@section Polyphony
-@cindex Polyphony
+@cindex polyphony
-[TODO: collisions, rest-collisinos, voiceX identifiers, how to
-which contexts to instantiate. some small examples? ]
+Polyphonic parts, i.e. parts with more than one voice on a staff can be
+typeset with LilyPond. To use this, instantiate a separate Voice
+context for each part, and assign a stem direction to each part.
+@lilypond[fragment,verbatim]
+\context Staff
+< \context Voice = VA { \stemUp b'4 a' g' f' e' }
+ \context Voice = VB { \stemDown g'4 g' g' g' g' } >
+@end lilypond
+When there are more than two voices on a staff, you must also indicate
+which voice should moved horizontally in case of a collision. This can
+be done with the identifiers @code{\shiftOff}, @code{\shiftOn},
+@code{\shiftOnn}, etc. (which sets grob property @code{horizontal-shift}
+in @code{NoteColumn}).
+
+@lilypond[fragment, verbatim]
+ \context Staff \notes\relative c''<
+ \context Voice=one {
+ \shiftOff \stemUp e4
+ }
+ \context Voice=two {
+ \shiftOn \stemUp cis
+ }
+ \context Voice=three {
+ \shiftOnn \stemUp ais
+ }
+ \context Voice=four {
+ \shiftOnnn \stemUp fis-2
+ }
+ >
+@end lilypond
-@table @code
-@cindex @code{\shiftOff}
- @item @code{\shiftOff}
- Disable horizontal shifting of note heads that collide.
-
-@cindex @code{\shiftOn}
- @item @code{\shiftOn}
- Enable note heads that collide with other note heads to be
- shifted horiztonally. Also @code{\shiftOnn} and @code{\shiftOnnn}
-set different shift values.
-
-@cindex @code{\stemBoth}
- @item @code{\stemBoth}
- Allow stems and beams to point either upwards or
- downwards, decided automatically by LilyPond.
-
-@cindex @code{\stemDown}
- @item @code{\stemDown}
- Force stems and beams to point down.
-
-@cindex @code{\stemUp}
- @item @code{\stemUp}
- Force stems and beams to point up.
-@end table
+The most convenient way is to use the identifiers @code{\voiceOne}
+through @code{\voiceFour}, which also set slur and tie directions in the
+correct manner.
+
+@lilypond[singleline, verbatim]
+\relative c''
+\context Staff < \context Voice = VA { \voiceOne cis2 b }
+ \context Voice = VB { \voiceThree b4 ais ~ ais4 gis4 }
+ \context Voice = VC { \voiceTwo fis4~ fis4 f ~ f } >
+@end lilypond
+
+
+LilyPond also vertically shifts rests that are opposite of a stem.
+
+@lilypond[singleline,verbatim]
+\context Staff <
+\context Voice { \stemUp c''4 }
+\context Voice =VB { r4 }
+>
+@end lilypond
-@cindex @code{\slurBoth}
-@cindex @code{\slurDown}
-@cindex @code{\slurUp}
-Similarly, for slurs use
-@code{\slurBoth},
-@code{\slurDown},
-@code{\slurUp}.
-
-@cindex @code{\tieBoth}
-@cindex @code{\tieDown}
-@cindex @code{\tieUp}
-For ties use
-@code{\tieBoth},
-@code{\tieDown},
-@code{\tieUp}.
-
-@cindex @code{\dynacmicBoth}
-@cindex @code{\dynamicDown}
-@cindex @code{\dynamicUp}
-For dynamics use
-@code{\dynamicBoth},
-@code{\dynamicDown},
-@code{\dynamicUp}.
-
-@c text scripts? articulation scripts? fingering?
-
-@cindex @code{\voiceOne}
-@cindex @code{\voiceTwo}
-@cindex @code{\voiceThree}
-@cindex @code{\voiceFour}
-@cindex @code{\oneVoice}
-@cindex @code{\shiftOn}
-@cindex @code{\shiftOff}
-
-If two voices sharing one staff have the same stem directions, their
-note heads may collide. You can shift the note heads of one voice by
-setting @code{\shiftOn}. This can be undone by setting
-@code{\shiftOff}.
-
-For simple polyphonic music, shorthands are available that combine
-directions and shift settings: @code{\voiceOne}, @code{\voiceTwo},
-@code{\voiceThree}, @code{\voiceFour} and @code{\oneVoice}.
+Note head collisions (horizontal shifting of note heads) are handled by
+the @code{NoteCollision} grob. @code{RestCollision} handles vertical
+shifting of rests.
+@cindex @code{NoteCollision}
+@cindex @code{RestCollision}
+
+
+@refbugs
+
+Resolving collisions is a very intricate subject, and LilyPond only
+handles a few situations. When it can not cope, you are advised to use
+@code{force-hshift} of the NoteColumn grob and @code{staff-position} of
+the Rest grob to override typesetting decisions.
+
+[TODO: doc merge-differently-dotted]
@node Beaming
@section Beaming
with 32nd notes (and no shorter notes), you would use @code{(end * * 1
32)}.
-[say something about irregular meters. eg 5/8 = 2+3/8, 3+2/8]
+@c not true
+@c Automatic beams can not be put on the last note in a score.
-Automatic beams can not be put on the last note in a score.
+If a score ends while an automatic beam has not been ended and is still
+accepting notes, this last beam will not be typeset at all.
@cindex automatic beam generation
@cindex autobeam
@refbugs
-It is not possible to specify beaming for beams with mixed durations,
-that differs from the beaming of all separate durations, ie, you'll
-have to specify manual beams to get:
+It is not possible to specify beaming parameters for beams with mixed
+durations, that differ from the beaming parameters of all separate
+durations, ie, you'll have to specify manual beams to get:
@lilypond[fragment,singleline,relative]
\property Voice.autoBeamSettings
- \override #'(end * * * *) = #(make-moment 3 8)
- \time 12/8; c'8 c c c16 c c c c c [c c c c] c8 c c4
+ \override #'(end * * * *) = #(make-moment 3 8)
+ \time 12/8; c'8 c c c16 c c c c c [c c c c] c8 c c4
@end lilypond
+It is not possible to specify beaming parameters that act differently in
+different parts of a measure, eg, in irregular meters such as @code{5/8}
+that breaks down to @code{2/8 +3/8} or @code{3/8 + 2/8}, automatic beams
+won't act according to the broken down parts @code{2/8} and @code{3/8}.
@c . {Manual beams}
@cindex Automatic beams
@end lilypond
-@refbugs
-
-When using spacer notes to subdivide note dynamics and @code{linewidth =
--1}, starting a hairpin on the first spacer note (the one coinciding
-with the real note) exposes an embarassing bug.
-
-
@c . {Repeats}
@node Repeats
@cindex Pedals
Piano pedal instruction can be expressed using
-@code{\sustainDown}, @code{\sustainUp}, @code{\unaChorda},
-@code{\treChorde}, @code{\sostenutoDown} and @code{\sostenutoUp}.
+@code{\sustainDown}, @code{\sustainUp}, @code{\unaCorda},
+@code{\treCorde}, @code{\sostenutoDown} and @code{\sostenutoUp}.
These identifiers are shorthands for spanner commands of the types
-@code{Sustain}, @code{UnaChorda} and @code{Sostenuto}:
+@code{Sustain}, @code{UnaCorda} and @code{Sostenuto}:
@lilypond[fragment,verbatim]
c''4 \spanrequest \start "Sustain" c''4 c''4 \spanrequest \stop "Sustain"
LilyPond examines chords specified as lists of notes to determine a name
to give the chord. LilyPond will not try to identify chord inversions or
-added base, which may result in strange chord names when chords are
-entered as a list of pitches:
-
-[base vs. bass ?]
+an added bass note, which may result in strange chord names when chords
+are entered as a list of pitches:
@lilypond[verbatim,center,singleline]
scheme = \notes {
Routines that determine the names to be printed are written in Scheme,
and may be customized by the user. The code can be found in
-@file{scm/chord-name.scm}.
+@file{scm/chord-name.scm}. Here's an example showing the differences in
+chord name styles:
+
+@c too long?
+@c maybe just junk verbatim option?
+@lilypond[verbatim,singleline]
+scheme = \chords {
+ c1 c:5^3 c:4^3 c:5+
+ c:m7+ c:m5-.7
+ c:5-.7 c:5+.7
+ c:9^7
+}
+
+\score {
+ \notes <
+ \context ChordNames = banter \scheme
+ \context ChordNames = american {
+ \property ChordNames.ChordName \override
+ #'style = #'american \scheme }
+ \context ChordNames = jazz {
+ \property ChordNames.ChordName \override
+ #'style = #'jazz \scheme }
+ \context Staff \transpose c'' \scheme
+ >
+}
+@end lilypond
-[3 short examples showing differences between american, banter and jazz]
@node Writing parts
@section Writing parts
@end lilypond
This requires that you add the @code{Instrument_name_engraver} to the
-staff context.
+staff context. You can also use markup texts to construct more
+complicated instrument names:
+
+@lilypond[verbatim,singleline]
+#(define text-flat
+ '((font-relative-size . -2 ) (music "accidentals--1")))
+
+\score { \notes {
+ \property Staff.instrument = #`((kern . 0.5) (lines
+ "2 Clarinetti" (rows " (B" ,text-flat ")")))
+ c'' 4 }
+ \paper {
+ \translator { \StaffContext
+ \consists "Instrument_name_engraver"; } } }
+@end lilypond
+
+
+@refbugs
+
+When you put a name on a grand staff or piano staff (By adding an
+@code{Instrument_name_engraver} to that context and setting
+e.g. @code{\property GrandStaff.instrument}), the width of the brace is
+not taken into account. You must add extra spaces to the end of the name
+to avoid a collision.
@node Transpose
@subsection Transpose
@end example
where the pieces of music @var{musicexpr1} and @var{musicexpr2} will be
-combined into one context @var{context}. The names of the music
+combined into one context @var{context}. The context names of the music
expressions must start with the prefixes @code{one} and @code{two}.
-[Name of music expressions? is that context name? ]
-
The most useful function of the part combiner to combining threads into
one voice, as common for wind parts in orchestral scores:
* What to tune?::
* Font selection::
* Text markup::
+* Embedded @TeX{}::
@end menu
@node Tuning groups of grobs
you can change the resulting grobs.
@lilypond[verbatim, fragment]
-c'4 \property Voice.Stem \override #'meta = #'((interfaces . ())) c'4
+c'4 \property Voice.Stem = #'((meta . ((interfaces . ())))) c'4
@end lilypond
-The @code{\property} statement effectively empties the definition of the
-Stem object. One of the effects is that property specifying how it
+The @code{\property} assignment effectively empties the definition of
+the Stem object. One of the effects is that property specifying how it
should be printed is erased, with the effect of rendering it invisible.
+The above assignment is available as a standard identifier, lest you
+find this useful:
+@example
+ \property Voice.Stem = \turnOff
+@end example
@cindex \override
@cindex \revert
exact length of the string, which may lead to collisions. Also, @TeX{}
commands won't work with direct postscript output.
+@cindex metronome mark
+
+One practical application of complicated markup is to fake a metronome
+marking:
+
+@lilypond[verbatim]
+#(define note '(rows
+ (music "noteheads-2" ((kern . -0.1) "flags-stem"))))
+#(define eight-note `(rows ,note ((kern . -0.1)
+ (music ((raise . 3.5) "flags-u3")))))
+#(define dotted-eight-note
+ `(rows ,eight-note (music "dots-dot")))
+
+\score {
+ \notes\relative c'' {
+ a1^#`((rows (font-relative-size . -1)) ,dotted-eight-note " = 64")
+ }
+ \paper {
+ linewidth = -1.;
+ \translator{
+ \ScoreContext
+ TextScript \override #'font-shape = #'upright
+ }
+ }
+}
+@end lilypond
+
+@node Embedded @TeX{}
+@subsection Embeded @TeX{}
+@cindex embedded tex
+@cindex embedded tex
+
+You can use @TeX{} commands in text scripts, but this should be avoided
+because this makes it impossible for LilyPond to compute the exact
+length of the string, which may lead to collisions. Also, @TeX{}
+commands won't work with direct PostScript output.
+
+@lilypond[fragment,relative,verbatim]
+ a''^"3 $\\times$ \\`a deux"
+@end lilypond
+
+@subsection Embedded PostScript
+@cindex embedded postscript
+@cindex embedded postscript
+
+You can also use raw PostScript commands embedded in text scripts. This
+offers ultimate flexibitily, but you'll have to learn the arcane
+PostScript language. Currently, embedded PostScript will @strong{not}
+work with direct PostScript output. Note that all dimensions that you
+use are in @code{staff-space}s.
+
+@lilypond[verbatim]
+\score {
+ \notes \relative c'' {
+ a-#"\\embeddedps{3 4 moveto 5 3 rlineto stroke}"
+ -#"\\embeddedps{ [ 0 1 ] 0 setdash 3 5 moveto 5 -3 rlineto stroke}"
+ b-#"\\embeddedps{3 4 moveto 0 0 1 2 8 4 20 3.5 rcurveto stroke}"
+ s2
+ a'1
+ }
+ \paper { linewidth = 70 * \staffspace; }
+}
+@end lilypond
+
+
@c . {Page layout}
@node Page layout
@section Page layout
@cindex Sound
LilyPond can produce MIDI output. The performance lacks lots of
-interesting effects, such as swing, articulation, slurring, tieing,
-etc., but it is good enough for proof-hearing the music you enter.
-
-Dynamics and tempo changes are interpreted.
-
-[TODO: mention volume control/Instrument Equaliser]
-
+interesting effects, such as swing, articulation, slurring, etc., but it
+is good enough for proof-hearing the music you have entered. Ties,
+dynamics and tempo changes are interpreted.
+
+The MIDI volume is composed of two elements: the current dynamics of the
+voice and the type of musical instrument.
+
+Dynamic marks, crescendi and decrescendi translate into MIDI volume
+levels. Dynamic marks translate to a fixed fraction of the available
+MIDI volume range, crescendi and decrescendi make the the volume vary
+linearly between their two extremities. The fractions be adjusted by
+overriding the @code{absolute-volume-alist} defined in
+@file{scm/midi.scm}.
+
+For each type of musical instrument (that MIDI supports), a volume range
+can be defined. This gives you basic equaliser control, which can
+enhance the quality of the MIDI output remarkably. You can add
+instruments and ranges or change the default settings by overriding
+the @code{instrument-equaliser-alist} defined in @file{scm/midi.scm}.
@refbugs
A bar check is entered using the bar symbol, @code{|}
-
-
@c . {Point and click}
@node Point and click
@subsection Point and click
@item emacs
@end itemize
-
Add one these lines to the top of your .ly file. The first one is for
line location only. The second one is more convenient, but requires
patching @code{emacsclient}.
harmless, and can be ignored.
+@node Skipping corrected music
+@section Skipping corrected music
+
+The property @code{Score.skipTypesetting} can be used to switch on and
+off typesetting completely during the interpretation phase. When
+typesetting is switched off, the music is processed much more quickly.
+You can use this to skip over the parts of a score that you have already
+checked for errors.
+
+@lilypond[fragment,singleline,verbatim]
+\relative c'' { c8 d
+\property Score.skipTypesetting = ##t
+ e f g a g c, f e d
+\property Score.skipTypesetting = ##f
+c d b bes a g c2 }
+@end lilypond
+
+
@node Interpretation context
@section Interpretation context
This example replaces the text string of a script. It also shows a dump
of the music it processes, which is useful if you want to know more
about how music is stored.
-@lilypond[verbatim]
+
+@lilypond[verbatim,singleline]
#(define (testfunc x)
(if (equal? (ly-get-mus-property x 'text) "foo")
(ly-set-mus-property x 'text "bar"))
}
@end lilypond
-For more information on what is possible, see the @ref{Tricks} and the
-automatically generated documentation.
+For more information on what is possible, see the automatically
+generated documentation.
Directly accessing internal representations is dangerous: the
implementation is subject to changes, so you should avoid this feature
if possible.
-
-
+
+A final example is a function that reverses a piece of music in time:
+
+@lilypond[verbatim,singleline]
+#(define (reverse-music music)
+ (let* ((elements (ly-get-mus-property music 'elements))
+ (reversed (reverse elements))
+ (span-dir (ly-get-mus-property music 'span-direction)))
+ (ly-set-mus-property music 'elements reversed)
+ (if (dir? span-dir)
+ (ly-set-mus-property music 'span-direction (- span-dir)))
+ (map reverse-music reversed)
+ music))
+
+music = \notes { c'4 d'4( e'4 f'4 }
+
+\score { \context Voice {
+ \music
+ \apply #reverse-music \music
+ }
+}
+@end lilypond
+
@c . {Span requests}
@menu