lilypond-1.3.144
[lilypond.git] / Documentation / user / features.itely
blobcdff41fb771c73bf7acfb77a5fc43fe0ffbd13c2
1 @c -*-texinfo-*-
2 @ignore
4 TODO
5   * move some stuff to refman
6   * merge some stuff with refman entries
7   
8   * add @ref{}s to lilypond-internals:
9      @rgrob{Name} to grob
10      @reng{Name} to engraver
12   there's a very simple, very general noXXX mechanism; try
14 noop    \property Staff.VoltaBrace = #'()
15 yes: \property Staff.VoltaBracket = #'((meta .  ((interfaces . ()))))
18   visibility?
19   brew_molecule?
20 @end ignore
23 @node Features
24 @chapter Features
26 @menu
27 * Arpeggio::                       Arpeggio
28 * Glissando::                      Glissando
29 * Manual beam settings::           Manual beam settings
30 * Slur attachments::               Slur attachments
31 * Text spanner::                   Text spanner
32 * Engraver hacking::               Engraver hacking
33 * Part combiner::                  Part combiner
34 * Markup text::                    Markup text
35 * Apply hacking::                  Apply hacking
36 * Output property::                Output property
37 * Embedded TeX::                   Embedded TeX
38 * Embedded PostScript::            Embedded PostScript
39 @c * Index::                          Checking Feature index
40 @end menu
43 @node Arpeggio
44 @section Arpeggio
45 @cindex argepeggio
47 @cindex broken arpeggio
49 You can specify an @rgrob{Arpeggio} sign on a chord by issuing an
50 @c FIXME
51 @c @code{\arpeggio}@indexcode{\arpeggio} request:
52 @code{\arpeggio} request:
55 @quotation
56 @lilypond[fragment,relative,verbatim]
57   \context Voice <c'\arpeggio e g c>
58 @end lilypond
59 @end quotation
61 Typesetting of simultanious chords with arpeggios can be controlled with
62 the property @code{PianoStaff.connectArpeggios} @footnote{ FIXME:
63 connectArpeggios.  Can't find the English terms for two kinds of
64 arpeggio (Dutch: gebroken arpeggio vs doorlopend arpeggio).}  By
65 default, LilyPond prints broken arpeggios; when set to true, one
66 extended arpeggio sign is printed.
68 @quotation
69 @lilypond[fragment,relative,verbatim]
70   \context PianoStaff <
71     \property PianoStaff.connectArpeggios = ##t
72     \context Staff \context Voice <c''\arpeggio e g c>
73     \context Staff=other \context Voice <c,\arpeggio e g>
74   >  
75 @end lilypond
76 @end quotation
78 @node Glissando
79 @section Glissando
80 @cindex glissando
82 A @rgrob{Glissando} line can be requested by issuing a
83 @c FIXME
84 @c @code{\glissando}@indexcode{\glissando} request:
85 @code{\glissando} request:
88 @quotation
89 @lilypond[fragment,relative,verbatim]
90   c'' \glissando c'
91 @end lilypond
92 @end quotation
94 Printing of the additional text @samp{gliss.} is currently not
95 supported.
98 @subsection Follow Thread
99 @cindex follow thread
100 @cindex staff switching
101 @cindex cross staff
103 @c Documented here because it looks like a glissando...
104 A glissando-like line can be printed to connect notes whenever a thread
105 switches to another staff.  This is enabled if the property
106 @code{PianoStaff.followThread}@indexcode{followThread} is set to true:
108 @quotation
109 @lilypond[fragment,relative,verbatim]
110   \context PianoStaff <
111     \property PianoStaff.followThread = ##t
112     \context Staff \context Voice {
113       c'1
114       \translator Staff=two
115       b2 a
116     }
117     \context Staff=two {\clef bass; \skip 1*2;}
118   >  
119 @end lilypond
120 @end quotation
122 @node Manual beam settings
123 @section Manual beam settings
124 @cindex beams
125 @cindex beam settings
126 @cindex manual beams
129 @c auto knees
131 In some cases it may be necessary to override LilyPond's automatic
132 beaming algorithm.  For example, the auto beamer will not beam over
133 rests, so if you want that, specify the begin and end point manually
134 using @code{[}@indexcode{[} and @code{]}@indexcode{]}:
136 @quotation
137 @lilypond[fragment,relative,verbatim]
138   \context Staff {
139     r4 [r8 g'' a]
140   }
141 @end lilypond
142 @end quotation
144 Similarly, for beams over bar lines:
146 @quotation
147 @lilypond[fragment,relative,verbatim]
148   \context Staff {
149     a''8 r a2 r8 [a a]
150   }
151 @end lilypond
152 @end quotation
154 If you have specific wishes for the number of beams, you can fully
155 control the number of beams through the properties
156 @code{Voice.stemLeftBeamCount}@indexcode{stemLeftBeamCount};
158 @quotation
159 @lilypond[fragment,relative,verbatim]
160   \context Staff {
161     [f'8 r16 f g a]
162     [f8 r16 \property Voice.stemLeftBeamCount = #1 f g a]
163   }
164 @end lilypond
165 @end quotation
167 and @code{Voice.stemRightBeamCount}@indexcode{stemRightBeamCount}:
169 @quotation
170 @lilypond[fragment,relative,verbatim]
171   f'32 g a b b a g f
173   \property Voice.autoBeamSettings
174     \set #'(end * * * *) = #(make-moment 1 4)
175   f32 g a b b a g f
177   f32 g a
178   \property Voice.stemRightBeamCount = #1 b
179   \property Voice.stemLeftBeamCount = #1 b
180   a g f
181 @end lilypond
182 @end quotation
184 Conventionally, stems extend to the middle staff line, and thus so do
185 beams.  The extending of the stems can be controlled through 
186 @code{Voice.Stem}'s grob-property
187 @code{no-stem-extend}@indexcode{no-stem-extend}:
189 @quotation
190 @lilypond[fragment,relative,verbatim]
191   \grace a'8 a4
192   \property Voice.Stem \set #'no-stem-extend = ##t
193   \grace g8 g4 [g8 g]
194 @end lilypond
195 @end quotation
197 The beam symbol can be tweaked through @code{Voice.Beam}'s
198 grob-properties @code{height-hs} and @code{y-position-hs}.
200 Set @code{height-hs} to zero, to get horizontal beams:
202 @quotation
203 @lilypond[fragment,relative,verbatim]
204   \property Voice.Beam \set #'direction = #1
205   \property Voice.Beam \set #'height-hs = #0
206   [a''8 e' d c]
207 @end lilypond
208 @end quotation
210 Both are in half spaces.  Here's how you'd specify a weird looking beam
211 that instead of beaing horizontal, falls two staff spaces (ie, four half
212 spaces):
214 @quotation
215 @lilypond[fragment,relative,verbatim]
216   \property Voice.Beam \set #'y-position-hs = #4
217   \property Voice.Beam \set #'height-hs = #-4
218   [c'8 c] 
219 @end lilypond
220 @end quotation
222 The direction of a perfectly centred beams can be
223 controlled through @code{Voice.Beam}'s grob-property
224 @code{default-neutral-direction}@indexcode{default-neutral-direction}
226 @quotation
227 @lilypond[fragment,relative,verbatim]
228   [b''8 b]
229   \property Voice.Beam \set #'default-neutral-direction = #-1
230   [b b]
231 @end lilypond
232 @end quotation
234 There are several ways to calculate the direction of a beam.
236 [Ross] states that the majority of the notes dictates the
237 direction (and not the mean of "center distance")
239 But is that because it really looks better, or because he wants
240 to provide some real simple hands-on rules?
241      
242 We have our doubts, so we simply provide all sensible alternatives:
244 @table @samp
245 @item majority
246 number count of up or down notes
247 @item mean
248 mean centre distance of all notes
249 @item median
250 mean centre distance weighted per note
251 @end table
253 You can spot the differences of these settings from these simple
254 examples:
256 @quotation
257 @lilypond[fragment,relative,verbatim]
258   [d''8 a]
259   \property Voice.Beam \set #'dir-function = #beam-dir-mean
260   [d a] 
261   \property Voice.Beam \set #'dir-function = #beam-dir-median
262   [d a]
263 @end lilypond
264 @end quotation
266 @quotation    
267 @lilypond[fragment,relative,verbatim]
268   \time 3/8;
269   [d''8 a a]
270   \property Voice.Beam \set #'dir-function = #beam-dir-mean
271   [d a a] 
272   \property Voice.Beam \set #'dir-function = #beam-dir-median
273   [d a a] 
274 @end lilypond
275 @end quotation
277 These beam direction functions are defined in @file{scm/beam.scm}.  If
278 your favourite algorithm isn't one of these, you can hook up your own.
282 @node Slur attachments
283 @section Slur attachments
285 The ending of a slur should whenever possible be attached to a note
286 head.  Only in some instances where beams are involved, LilyPond may
287 attach a slur to a stem end.  In some cases, you may want to override
288 LilyPond's decision, eg to attach the slur to the stem end.  This can be
289 done through @code{Voice.Slur}'s grob-property @code{attachment}:
290 @c FIXME: make @ref{} to backend doco
292 @quotation
293 @lilypond[fragment,relative,verbatim]
294   \property Voice.Slur \set #'direction = #1
295   \property Voice.Stem \set #'length = #5.5
296   g''8(g)g4
297   g4(g8)g
298   \property Voice.Slur \set #'attachment = #'(stem . stem)
299   g8(g)g4
300   g4(g8)g
301 @end lilypond
302 @end quotation
304 Trying Before | After example...
305 @c Fix rolled into 4.0a prerelease
306 @c is this nice?
308 @multitable @columnfractions .40 .40
309 @item
310 @noindent
311 @lilypond[fragment,relative,verbatim]
312 \property Voice.Slur
313   \set #'direction = #1
314 g''8(g)g4
315 g4(g8)g
316 @end lilypond
317 @tab
318 @lilypond[fragment,relative,verbatim]
319 \property Voice.Slur
320   \set #'direction = #1
321 \property Voice.Stem
322   \set #'length = #5.5
323 \property Voice.Slur
324   \set #'attachment = #'(stem . stem)
325 g''8(g)g4
326 g4(g8)g
327 @end lilypond
328 @end multitable
331 Similarly, slurs can be attached to note heads even when beams are
332 involved (aka Ophee slurs):
334 @quotation
335 @lilypond[fragment,relative,verbatim]
336   \property Voice.Slur \set #'direction = #1
337   \property Voice.Slur \set #'attachment = #'(head . head)
338   g''16()g()g()g()d'()d()d()d
339 @end lilypond
340 @end quotation
342 If a slur would strike through a stem or beam, LilyPond will move the
343 slur away vertically (upward or downward).  In some cases, this may
344 cause ugly slurs that you may want to correct:
346 @quotation
347 @lilypond[fragment,relative,verbatim]
348   \property Voice.Stem \set #'direction = #1
349   \property Voice.Slur \set #'direction = #1
350   d'32( d'4 )d8..
351   \property Voice.Slur \set #'attachment = #'(stem . stem)
352   d,32( d'4 )d8..
353 @end lilypond
354 @end quotation
356 LilyPond will increase the curvature of a slur trying to stay free of
357 note heads and stems.  However, if the curvature would increase too much,
358 the slur will be reverted to its default shape.  This decision is based
359 on @code{Voice.Slur}'s grob-property @code{beautiful} value.  In some
360 cases, you may find ugly slurs beautiful, and tell LilyPond so by
361 increasing the @code{beautiful} value:
363 @quotation
364 @lilypond[verbatim]
365 \score {
366   \notes \context PianoStaff <
367     \time 6/4;
368     \context Staff=up { s1 * 6/4 }
369     \context Staff=down <
370       \clef bass;
371       \autochange Staff \context Voice
372         \notes \relative c {
373           d,8( a' d f a d f d a f d )a
374         }
375     >
376   >
377   \paper {
378     linewidth = -1.;
379     \translator {
380       \VoiceContext
381       Slur \override #'beautiful = #5.0
382       Slur \override #'direction = #1
383       Stem \override #'direction = #-1
384       autoBeamSettings \override #'(end * * * *)
385         = #(make-moment 1 2)
386     }
387     \translator {
388       \PianoStaffContext
389       VerticalAlignment \override #'threshold = #'(5 . 5)
390     }
391   }
393 @end lilypond
394 @end quotation
397 @node Text spanner
398 @section Text spanner
402 Have crescendo set a text spanner iso hairpin
405 @lilypond[fragment,relative,verbatim]
406   \context Voice {
407     \property Voice.crescendoText = "cresc."
408     \property Voice.crescendoSpanner = #'dashed-line
409     a''2\mf\< a a \!a 
410   }
411 @end lilypond
413 @subsection Ottava
415 @lilypond[fragment,relative,verbatim]
416   a'''' b c a
417   \property Voice.TextSpanner \set #'type = #'dotted-line
418   \property Voice.TextSpanner \set #'edge-height = #'(0 . 1.5)
419   \property Voice.TextSpanner \set #'edge-text = #'("8va " . "")
420   \property Staff.centralCPosition = #-13
421   a\spanrequest \start "text" b c a \spanrequest \stop "text"
422 @end lilypond
426 @node Engraver hacking
427 @section Engraver hacking
429 No time signature, no barlines... 
430 @lilypond[verbatim]
431 \score {
432   \notes \relative c'' {
433     a b c d
434     d c b a
435   }
436   \paper {
437     linewidth = -1.;
438     \translator {
439       \StaffContext
440       whichBar = #""
441       \remove "Time_signature_engraver";
442     }
443   }
445 @end lilypond
447 No staff, no clef, squash pitches
448 @lilypond[verbatim]
449 \score {
450   \notes { c4 c4 c8 c8 }
451   \paper {
452     linewidth = -1.;
453     \translator {
454       \StaffContext
455       \remove Staff_symbol_engraver;
456       \consists Pitch_squash_engraver;
457       \remove Clef_engraver;
458     }
459   }
461 @end lilypond
464 @node Part combiner
465 @section Part combiner
467 @lilypond[verbatim]
468 \score{
469   \context Staff = flauti <
470     \time 4/4;
471     \context Voice=one \partcombine Voice
472     \context Thread=one \notes\relative c'' {
473       c4 d e f | b,4 d c d | r2 e4 f | c4 d e f |
474       c4 r e f | c4 r e f | c4 r a r | a a r a |
475       a2 \property Voice.soloADue = ##f a |
476     }
477     \context Thread=two \notes\relative c'' {
478       g4 b d f | r2 c4 d | a c c d | a4. b8 c4 d
479       c r e r | r2 s2 | a,4 r a r | a r r a |
480       a2 \property Voice.soloADue = ##f a |
481     }
482   >
483   \paper{
484     linewidth = 80 * \staffspace;
485     \translator{
486       \ThreadContext
487       \consists Rest_engraver;
488     }
489     \translator{
490       \VoiceContext
491       \remove Rest_engraver;
492     }
493   }
495 @end lilypond
500 @node Markup text
501 @section Markup text
503 Metrome hack...
507 @lilypond[verbatim]
508 #(define note '(rows (music "noteheads-2" ((kern . -0.1) "flags-stem"))))
509 #(define eight-note `(rows ,note ((kern . -0.1) (music ((raise . 3.5) "flags-u3")))))
510 #(define dotted-eight-note `(rows ,eight-note (music "dots-dot")))
512 \score {
513   \notes\relative c'' {
514     a1^#`(rows ,dotted-eight-note " = 64")
515   }
516   \paper {
517     linewidth = -1.;
518     \translator{
519       \ScoreContext
520       TextScript \override #'font-shape = #'upright
521     }
522   }
524 @end lilypond
527 @node Output property
528 @section Output property
530 @lilypond[fragment,relative,verbatim]
531     \outputproperty #(make-type-checker 'note-head-interface) 
532       #'extra-offset = #'(2 . 3)
533     c''2 c
534 @end lilypond
536 Don't move the finger 2, only text "m.d." ...
537 @lilypond[verbatim]
538 #(define (make-text-checker text)
539    (lambda (grob) (equal? text (ly-get-elt-property grob 'text))))
541 \score {    
542   \notes\relative c''' {
543     \property Voice.Stem \set #'direction = #1
544     \outputproperty #(make-text-checker "m.d.")
545       #'extra-offset = #'(-3.5 . -4.5)
546     a^2^"m.d."    
547   }
548   \paper { linewidth = -1.; }
550 @end lilypond
553 @c  equalizer
556 @node Apply hacking
557 @section Apply hacking
559 @lilypond[verbatim]
560 music = \notes { c'4 d'4( e'4 f'4 }
562 #(define (reverse-music music)
563   (let* ((elements (ly-get-mus-property music 'elements))
564          (reversed (reverse elements))
565          (span-dir (ly-get-mus-property music 'span-direction)))
566     
567     (ly-set-mus-property music 'elements reversed)
568     
569     (if (dir? span-dir)
570         (ly-set-mus-property music 'span-direction (- span-dir)))
571     
572     (map reverse-music reversed)
573     
574     music))
576 \score {
577   \context Voice {
578     \music
579     \apply #reverse-music \music
580   }
581   \paper { linewidth = -1.; }
583 @end lilypond
585 @example
586     Here's a copy of my feature request :
587 @quotation
588         Your task, if you accept it is to implement a \smarttranspose
589         command> that would translate such oddities into more natural
590         notations. Double accidentals should be removed, as well as #E
591         (-> F), bC (-> B), bF (-> E), #B (-> C).
592 @end quotation
594 You mean like this. (Sorry 'bout the nuked indentation.)
595 @end example
598 @lilypond[verbatim]
599 #(define  (unhair-pitch p)
600   (let* ((o (pitch-octave p))
601          (a (pitch-alteration p))
602          (n (pitch-notename p)))
604     (cond
605      ((and (> a 0) (or (eq? n 6) (eq? n 2)))
606       (set! a (- a 1)) (set! n (+ n 1)))
607      ((and (< a 0) (or (eq? n 0) (eq? n 3)))
608       (set! a (+ a 1)) (set! n (- n 1))))
609     
610     (cond
611      ((eq? a 2)  (set! a 0) (set! n (+ n 1)))
612      ((eq? a -2) (set! a 0) (set! n (- n 1))))
614     (if (< n 0) (begin (set!  o (- o 1)) (set! n (+ n 7))))
615     (if (> n 7) (begin (set!  o (+ o 1)) (set! n (- n 7))))
616     
617     (make-pitch o n a)))
619 #(define (smart-transpose music pitch)
620   (let* ((es (ly-get-mus-property music 'elements))
621          (e (ly-get-mus-property music 'element))
622          (p (ly-get-mus-property music 'pitch))
623          (body (ly-get-mus-property music 'body))
624          (alts (ly-get-mus-property music 'alternatives)))
626     (if (pair? es)
627         (ly-set-mus-property
628          music 'elements
629          (map (lambda (x) (smart-transpose x pitch)) es)))
630     
631     (if (music? alts)
632         (ly-set-mus-property
633          music 'alternatives
634          (smart-transpose alts pitch)))
635     
636     (if (music? body)
637         (ly-set-mus-property
638          music 'body
639          (smart-transpose body pitch)))
641     (if (music? e)
642         (ly-set-mus-property
643          music 'element
644          (smart-transpose e pitch)))
645     
646     (if (pitch? p)
647         (begin
648           (set! p (unhair-pitch (Pitch::transpose p pitch)))
649           (ly-set-mus-property music 'pitch p)))
650     
651     music))
653     
654 music = \notes \relative c' { c4 d  e f g a b  c }
656 \score {
657   \notes \context Staff {
658     \transpose ais' \music
659     \apply #(lambda (x) (smart-transpose x (make-pitch 0 5 1)))
660       \music
661   }
662   \paper { linewidth = -1.; }
664 @end lilypond
667 @node Embedded TeX
668 @section Embedded TeX
669 @lilypond[fragment,relative,verbatim]
670   a''^"3 $\\times$ \\`a deux"
671 @end lilypond
673 @node Embedded PostScript
674 @section Embedded PostScript
676 Arbitrary lines and curves not supported...
678 [TODO:] Make a direct postscript command?
680 @lilypond[verbatim]
681 \score {
682   \notes \relative c'' {
683     a-#"\\embeddedps{3 4 moveto 5 3 rlineto stroke}"
684     -#"\\embeddedps{ [ 0 1 ] 0 setdash 3 5 moveto 5 -3 rlineto stroke}"
685     b-#"\\embeddedps{3 4 moveto 0 0 1 2 8 4 20 3.5 rcurveto stroke}"
686     s2
687     a'1
688   }
689   \paper { linewidth = 70 * \staffspace; }
691 @end lilypond
693 @ignore 
694 @node Index
695 @section Checking Feature index
697 @printindex cp
700 @bye
701 @end ignore