]> git.donarmstrong.com Git - lilypond.git/blobdiff - Documentation/user/features.tely
patch::: 1.3.121.jcn1
[lilypond.git] / Documentation / user / features.tely
index dbb876e0215fa8c7f4f8bcc034ade06157c93871..118ed956a253477e828368d6be14001879df7cd0 100644 (file)
@@ -7,8 +7,22 @@ TODO
   * add more un/badly documented features
   * write some text
   * add to/merge with refman
+
+
+  
+  there's a very simple, very general noXXX mechanism; try
+
+noop   \property Staff.VoltaBrace = #'()
+yes: \property Staff.VoltaBracket = #'((meta .  ((interfaces . ()))))
+
+
+  visibility?
+  brew_molecule?
 @end ignore
 
+
+
+
 @node Top
 @chapter Features
 
@@ -21,15 +35,18 @@ TODO
 * Engraver hacking::               Engraver hacking
 * Part combiner::                  Part combiner
 * Markup text::                    Markup text
+* Apply hacking::                  Apply hacking
 * Output property::                Output property
 * Embedded TeX::                   Embedded TeX
 * Embedded PostScript::            Embedded PostScript
 @end menu
 
+@ignore
 Testin'' a b c...
 @lilypond[fragment,relative,verbatim,center]
   a'' b c
 @end lilypond
+@end ignore
 
 @node Arpeggio
 @section Arpeggio
@@ -91,24 +108,24 @@ Control number of beams...
 @end lilypond
 
 @lilypond[fragment,relative,verbatim,center]
-    f'32 g a b b a g f
-    
-    \property Voice.autoBeamSettings
-      \set #'(end * * * *) = #(make-moment 1 4)
-    f32 g a b b a g f
-    
-    f32 g a
-    \property Voice.stemRightBeamCount = #1 b
-    \property Voice.stemLeftBeamCount = #1 b
-    a g f
+  f'32 g a b b a g f
+
+  \property Voice.autoBeamSettings
+    \set #'(end * * * *) = #(make-moment 1 4)
+  f32 g a b b a g f
+
+  f32 g a
+  \property Voice.stemRightBeamCount = #1 b
+  \property Voice.stemLeftBeamCount = #1 b
+  a g f
 @end lilypond
 
 Don't extend to middle line esp. for grace
 
 @lilypond[fragment,relative,verbatim,center]
-    \grace a'8 a4
-    \property Voice.Stem \set #'no-stem-extend = ##t
-    \grace g8 g4
+  \grace a'8 a4
+  \property Voice.Stem \set #'no-stem-extend = ##t
+  \grace g8 g4
 @end lilypond
   
 Beam slope (height)
@@ -183,13 +200,13 @@ You can spot the difference of these settings quite easily from these simple exa
 
 Override attachments...
 @lilypond[fragment,relative,verbatim,center]
-    \property Voice.Slur \set #'direction = #1
-    \property Voice.Stem \set #'length = #5.5
-    g''8(g)g4
-    g4(g8)g
-    \property Voice.Slur \set #'attachment = #'(stem . stem)
-    g8(g)g4
-    g4(g8)g
+  \property Voice.Slur \set #'direction = #1
+  \property Voice.Stem \set #'length = #5.5
+  g''8(g)g4
+  g4(g8)g
+  \property Voice.Slur \set #'attachment = #'(stem . stem)
+  g8(g)g4
+  g4(g8)g
 @end lilypond
 
 
@@ -200,7 +217,7 @@ Test Before, after
 @c We'll have to postpone this before/after representation until
 @c jcn3 is rolled into texinfo...
 
-@multitable @columnfractions .50 .50
+@multitable @columnfractions .40 .40
 @item
 @noindent
 @lilypond[fragment,relative,verbatim,center]
@@ -225,9 +242,9 @@ g4(g8)g
         
 Ophee slurs...
 @lilypond[fragment,relative,verbatim,center]
-    \property Voice.Slur \set #'direction = #1
-    \property Voice.Slur \set #'attachment = #'(head . head)
-    g''16()g()g()g()d'()d()d()d
+  \property Voice.Slur \set #'direction = #1
+  \property Voice.Slur \set #'attachment = #'(head . head)
+  g''16()g()g()g()d'()d()d()d
 @end lilypond
 
 
@@ -240,7 +257,37 @@ Steep slur correct...
   d,32( d'4 )d8..
 @end lilypond
 
-@c  high slurs, eg from gnossienes
+Ugly slurs...
+@lilypond[verbatim,center]
+\score {
+  \notes \context PianoStaff <
+    \time 6/4;
+    \context Staff=up { s1 * 6/4 }
+    \context Staff=down <
+      \clef bass;
+      \autochange Staff \context Voice
+        \notes \relative c {
+          d,8( a' d f a d f d a f d )a
+        }
+    >
+  >
+  \paper {
+    linewidth = -1.;
+    \translator {
+      \VoiceContext
+      Slur \override #'beautiful = #5.0
+      Slur \override #'direction = #1
+      Stem \override #'direction = #-1
+      autoBeamSettings \override #'(end * * * *)
+        = #(make-moment 1 2)
+    }
+    \translator {
+      \PianoStaffContext
+      VerticalAlignment \override #'threshold = #'(5 . 5)
+    }
+  }
+}
+@end lilypond
 
 
 @node Text spanner
@@ -258,12 +305,12 @@ Have crescendo set a text spanner iso hairpin
 @subsection Ottava
 
 @lilypond[fragment,relative,verbatim,center]
-    a'''' b c a
-    \property Voice.TextSpanner \set #'type = #'dotted-line
-    \property Voice.TextSpanner \set #'edge-height = #'(0 . 1.5)
-    \property Voice.TextSpanner \set #'edge-text = #'("8va " . "")
-    \property Staff.centralCPosition = #-13
-    a\spanrequest \start "text" b c a \spanrequest \stop "text"
+  a'''' b c a
+  \property Voice.TextSpanner \set #'type = #'dotted-line
+  \property Voice.TextSpanner \set #'edge-height = #'(0 . 1.5)
+  \property Voice.TextSpanner \set #'edge-text = #'("8va " . "")
+  \property Staff.centralCPosition = #-13
+  a\spanrequest \start "text" b c a \spanrequest \stop "text"
 @end lilypond
 
 
@@ -345,8 +392,6 @@ No staff, no clef, squash pitches
 @node Markup text
 @section Markup text
 
-@c markup text hacking
-
 Metrome hack...
 
 @lilypond[verbatim,center]
@@ -394,18 +439,136 @@ Don't move the finger 2, only text "m.d." ...
 }
 @end lilypond
 
-@c subsection no clefs
 
 @c  equalizer
 
 
-@c \apply hacking
-@c reverse
-@c smart transpose
+@node Apply hacking
+@section Apply hacking
+
+@lilypond[verbatim,center]
+music = \notes { c'4 d'4( e'4 f'4 }
+
+#(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))
+
+\score {
+  \context Voice {
+    \music
+    \apply #reverse-music \music
+  }
+  \paper { linewidth = -1.; }
+}
+@end lilypond
+
+
+LilyPond is more flexible than some users realise.  Han-Wen could be
+very rich.
+
+Just too funny not to include.
+
+@example
+@quotation
+    I've just entered a request on cosource.com :
+@quotation
+        http://www.cosource.com/cgi-bin/cos.pl/wish/info/387
+@end quotation
+    Here's a copy of my feature request :
+@quotation
+        Your task, if you accept it is to implement a \smarttranspose
+        command> that would translate such oddities into more natural
+        notations. Double accidentals should be removed, as well as #E
+        (-> F), bC (-> B), bF (-> E), #B (-> C).
+@end quotation
+@end quotation
+You mean like this. (Sorry 'bout the nuked indentation.)
+
+Add IMPLEMENT_TYPE_P(Music, "music?"); to music.cc, and presto, done.
+
+That's an easy $ 100; if I'd make $ 200/hour for every hour I worked
+on Lily, I'd be very rich :)
+@end example
+
+
+@lilypond[verbatim,center]
+#(define  (unhair-pitch p)
+  (let* ((o (pitch-octave p))
+         (a (pitch-alteration p))
+        (n (pitch-notename p)))
+
+    (cond
+     ((and (> a 0) (or (eq? n 6) (eq? n 2)))
+      (set! a (- a 1)) (set! n (+ n 1)))
+     ((and (< a 0) (or (eq? n 0) (eq? n 3)))
+      (set! a (+ a 1)) (set! n (- n 1))))
+    
+    (cond
+     ((eq? a 2)  (set! a 0) (set! n (+ n 1)))
+     ((eq? a -2) (set! a 0) (set! n (- n 1))))
+
+    (if (< n 0) (begin (set!  o (- o 1)) (set! n (+ n 7))))
+    (if (> n 7) (begin (set!  o (+ o 1)) (set! n (- n 7))))
+    
+    (make-pitch o n a)))
+
+#(define (smart-transpose music pitch)
+  (let* ((es (ly-get-mus-property music 'elements))
+        (e (ly-get-mus-property music 'element))
+        (p (ly-get-mus-property music 'pitch))
+        (body (ly-get-mus-property music 'body))
+        (alts (ly-get-mus-property music 'alternatives)))
+
+    (if (pair? es)
+       (ly-set-mus-property
+        music 'elements
+        (map (lambda (x) (smart-transpose x pitch)) es)))
+    
+    (if (music? alts)
+       (ly-set-mus-property
+        music 'alternatives
+        (smart-transpose alts pitch)))
+    
+    (if (music? body)
+       (ly-set-mus-property
+        music 'body
+        (smart-transpose body pitch)))
+
+    (if (music? e)
+       (ly-set-mus-property
+        music 'element
+        (smart-transpose e pitch)))
+    
+    (if (pitch? p)
+       (begin
+         (set! p (unhair-pitch (Pitch::transpose p pitch)))
+         (ly-set-mus-property music 'pitch p)))
+    
+    music))
+
+    
+music = \notes \relative c' { c4 d  e f g a b  c }
 
+\score {
+  \notes \context Staff {
+    \transpose ais' \music
+    \apply #(lambda (x) (smart-transpose x (make-pitch 0 5 1)))
+      \music
+  }
+  \paper { linewidth = -1.; }
+}
+@end lilypond
 
-@c Embedded TeX
 
 @node Embedded TeX
 @section Embedded TeX
@@ -417,6 +580,7 @@ Don't move the finger 2, only text "m.d." ...
 @section Embedded PostScript
 
 Arbitrary lines and curves not supported...
+
 [TODO:] Make a direct postscript command?
 
 @lilypond[verbatim,center]
@@ -428,9 +592,7 @@ Arbitrary lines and curves not supported...
     s2
     a'1
   }
-  \paper {
-    linewidth = 70.0*\staffspace;
-  }
+  \paper { linewidth = 70 * \staffspace; }
 }
 @end lilypond