]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/define-markup-commands.scm
*** empty log message ***
[lilypond.git] / scm / define-markup-commands.scm
index c8e05e405eafed4213c79ef65fb35d9c96446cc1..8d4fc21eca762e32a5b8cb26356423be23fadf98 100644 (file)
@@ -2,11 +2,10 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c)  2000--2004  Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;; (c) 2000--2005  Han-Wen Nienhuys <hanwen@cs.uu.nl>
 ;;;;                  Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;;; markup commands
-;;; TODO:
 ;;;  * each markup function should have a doc string with
 ;;     syntax, description and example. 
 
@@ -26,7 +25,7 @@
          (ly:warn "No systems found in \\score markup. Did you forget \\layout?")
          empty-markup)
        (begin
-         (let* ((stencil (ly:paper-system-stencil  (vector-ref systems 0)))) 
+         (let* ((stencil (ly:paper-system-stencil (vector-ref systems 0)))) 
 
            (ly:stencil-align-to! stencil Y CENTER)
            stencil)))))
@@ -52,7 +51,6 @@
 
 
 (def-markup-command (postscript layout props str) (string?)
-
   "This inserts @var{str} directly into the output as a PostScript
 command string.  Due to technicalities of the output backends,
 different scales should be used for the @TeX{} and PostScript backend,
@@ -77,14 +75,13 @@ For the postscript backend, use the following
 @verbatim
 gsave /ecrm10 findfont 
  10.0 output-scale div 
- scalefont setfont  90 rotate (hello) show grestore 
+ scalefont setfont 90 rotate (hello) show grestore 
 @end verbatim
 "
   ;; FIXME
-  
   (ly:make-stencil
    (list 'embedded-ps str)
-   '(0 . 0) '(0 . 0)  ))
+   '(0 . 0) '(0 . 0)))
 
 ;;(def-markup-command (fill-line layout props line-width markups)
 ;;  (number? markup-list?)
@@ -95,7 +92,6 @@ gsave /ecrm10 findfont
    The markups are spaced/flushed to fill the entire line.
    If there are no arguments, return an empty stencil.
 "
-
   (let* ((orig-stencils
          (map (lambda (x) (interpret-markup layout props x))
               markups))
@@ -103,7 +99,7 @@ gsave /ecrm10 findfont
          (map (lambda (stc)
                 (if (ly:stencil-empty? stc)
                     point-stencil
-                    stc))  orig-stencils))
+                    stc)) orig-stencils))
         (text-width (apply +
                            (map (lambda (stc)
                                   (if (ly:stencil-empty? stc)
@@ -140,26 +136,26 @@ gsave /ecrm10 findfont
 determines the space between each markup in @var{args}."
   (stack-stencil-line
    (chain-assoc-get 'word-space props)
-   (map (lambda (m) (interpret-markup layout props m)) args)))
+   (remove ly:stencil-empty?
+          (map (lambda (m) (interpret-markup layout props m)) args))))
 
 (def-markup-command (fromproperty layout props symbol) (symbol?)
-  "Read the @var{symbol} from property settings, and produce a stencil from the markup contained within. If @var{symbol} is not defined, it returns an empty markup"
+  "Read the @var{symbol} from property settings, and produce a stencil
+  from the markup contained within. If @var{symbol} is not defined, it
+  returns an empty markup"
   (let* ((m (chain-assoc-get symbol props)))
-
     (if (markup? m)
        (interpret-markup layout props m)
-       (ly:make-stencil '()  '(1 . -1) '(1 . -1) ))))
+       (ly:make-stencil '()  '(1 . -1) '(1 . -1)))))
 
 
 (def-markup-command (on-the-fly layout props procedure arg) (symbol? markup?)
   "Apply the @var{procedure} markup command to
 @var{arg}. @var{procedure} should take a single argument."
   (let* ((anonymous-with-signature (lambda (layout props arg) (procedure layout props arg))))
-
     (set-object-property! anonymous-with-signature
                          'markup-signature
                          (list markup?))
-    
     (interpret-markup layout props (list anonymous-with-signature arg))))
 
 
@@ -167,7 +163,6 @@ determines the space between each markup in @var{args}."
   "Print two markups on top of each other."
   (let* ((s1 (interpret-markup layout props m1))
         (s2 (interpret-markup layout props m2)))
-    
     (ly:stencil-add s1 s2)))
 
 (def-markup-command (finger layout props arg) (markup?)
@@ -199,7 +194,6 @@ A \\magnify #1.1 @{ A @} A
 
 Note: magnification only works if a font-name is explicitly selected.
 Use @code{\\fontsize} otherwise."
-
   (interpret-markup
    layout 
    (prepend-alist-chain 'font-magnification sz props)
@@ -251,9 +245,9 @@ some punctuation. It doesn't have any letters.  "
   "Set @code{font-shape} to @code{caps}."
   (interpret-markup layout (prepend-alist-chain 'font-shape 'caps props) arg))
 
-                                       ;(def-markup-command (latin-i layout props arg) (markup?)
-                                       ;  "TEST latin1 encoding."
-                                       ;  (interpret-markup layout (prepend-alist-chain 'font-shape 'latin1 props) arg))
+;(def-markup-command (latin-i layout props arg) (markup?)
+;  "TEST latin1 encoding."
+;  (interpret-markup layout (prepend-alist-chain 'font-shape 'latin1 props) arg))
 
 (def-markup-command (dynamic layout props arg) (markup?)
   "Use the dynamic font.  This font only contains @b{s}, @b{f}, @b{m},
@@ -280,37 +274,38 @@ recommend font for this is bold and italic"
 (def-markup-command (doublesharp layout props) ()
   "Draw a double sharp symbol."
 
-  (interpret-markup layout props (markup #:musicglyph "accidentals-4")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.4")))
 (def-markup-command (sesquisharp layout props) ()
   "Draw a 3/2 sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph "accidentals-3")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.3")))
 
 (def-markup-command (sharp layout props) ()
   "Draw a sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph "accidentals-2")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.2")))
+
 (def-markup-command (semisharp layout props) ()
   "Draw a semi sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph "accidentals-1")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.1")))
+
 (def-markup-command (natural layout props) ()
   "Draw a natural symbol."
+  (interpret-markup layout props (markup #:musicglyph "accidentals.0")))
 
-  (interpret-markup layout props (markup #:musicglyph "accidentals-0")))
 (def-markup-command (semiflat layout props) ()
   "Draw a semiflat."
-  (interpret-markup layout props (markup #:musicglyph "accidentals--1")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M1")))
+
 (def-markup-command (flat layout props) ()
   "Draw a flat symbol."
-  
-  (interpret-markup layout props (markup #:musicglyph "accidentals--2")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M2")))
+
 (def-markup-command (sesquiflat layout props) ()
   "Draw a 3/2 flat symbol."
-  
-  (interpret-markup layout props (markup #:musicglyph "accidentals--3")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M3")))
+
 (def-markup-command (doubleflat layout props) ()
   "Draw a double flat symbol."
-
-  (interpret-markup layout props (markup #:musicglyph "accidentals--4")))
-
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M4")))
 
 (def-markup-command (column layout props args) (markup-list?)
   "Stack the markups in @var{args} vertically.  The property
@@ -337,19 +332,25 @@ of the @code{#'direction} layout property."
     (stack-lines -1 0.0 (chain-assoc-get 'baseline-skip props) cmols)))
 
 (def-markup-command (vcenter layout props arg) (markup?)
-  "Align @code{arg} to its center. "
+  "Align @code{arg} to its center. "
   (let* ((mol (interpret-markup layout props arg)))
     (ly:stencil-align-to! mol Y CENTER)
     mol))
 
+(def-markup-command (hcenter layout props arg) (markup?)
+  "Align @code{arg} to its X center. "
+  (let* ((mol (interpret-markup layout props arg)))
+    (ly:stencil-align-to! mol X CENTER)
+    mol))
+
 (def-markup-command (right-align layout props arg) (markup?)
+  "Align @var{arg} on its right edge. "
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-align-to! m X RIGHT)
     m))
 
 (def-markup-command (left-align layout props arg) (markup?)
   "Align @var{arg} on its left edge. "
-  
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-align-to! m X LEFT)
     m))
@@ -357,7 +358,6 @@ of the @code{#'direction} layout property."
 (def-markup-command (general-align layout props axis dir arg)  (integer? number? markup?)
   "Align @var{arg} in @var{axis} direction to the @var{dir} side."
   (let* ((m (interpret-markup layout props arg)))
-
     (ly:stencil-align-to! m axis dir)
     m))
 
@@ -365,23 +365,19 @@ of the @code{#'direction} layout property."
   "Set horizontal alignment. If @var{dir} is @code{-1}, then it is
 left-aligned, while @code{+1} is right. Values in between interpolate
 alignment accordingly."
-
-  
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-align-to! m X dir)
     m))
 
 (def-markup-command (musicglyph layout props glyph-name) (string?)
   "This is converted to a musical symbol, e.g. @code{\\musicglyph
-#\"accidentals-0\"} will select the natural sign from the music font.
-See @usermanref{The Feta font} for  a complete listing of the possible glyphs.
-"
+#\"accidentals.0\"} will select the natural sign from the music font.
+See @usermanref{The Feta font} for  a complete listing of the possible glyphs."
   (ly:font-get-glyph
    (ly:paper-get-font layout (cons '((font-encoding . fetaMusic))
                                   props))
    glyph-name))
 
-
 (def-markup-command (lookup layout props glyph-name) (string?)
   "Lookup a glyph by name."
   (ly:font-get-glyph (ly:paper-get-font layout props)
@@ -409,14 +405,11 @@ If the text object itself is positioned above or below the staff, then
 positions it next to the staff cancels any shift made with
 @code{\\raise}. For vertical positioning, use the @code{padding}
 and/or @code{extra-offset} properties. "
-
-  
   (ly:stencil-translate-axis (interpret-markup layout props arg)
                             amount Y))
 
 (def-markup-command (fraction layout props arg1 arg2) (markup? markup?)
   "Make a fraction of two markups."
-  
   (let* ((m1 (interpret-markup layout props arg1))
          (m2 (interpret-markup layout props arg2)))
     (ly:stencil-align-to! m1 X CENTER)
@@ -438,13 +431,12 @@ and/or @code{extra-offset} properties. "
 (def-markup-command (note-by-number layout props log dot-count dir) (number? number? number?)
   "Construct a note symbol, with stem.  By using fractional values for
 @var{dir}, you can obtain longer or shorter stems."
-  
   (let* ((font (ly:paper-get-font layout (cons '((font-encoding . fetaMusic)) props)))
         (size (chain-assoc-get 'font-size props 0))
          (stem-length (* (magstep size) (max 3 (- log 1))))
          (head-glyph (ly:font-get-glyph
                      font
-                     (string-append "noteheads-s" (number->string (min log 2)))))
+                     (string-append "noteheads.s" (number->string (min log 2)))))
          (stem-thickness 0.13)
          (stemy (* dir stem-length))
          (attachx (if (> dir 0)
@@ -463,12 +455,12 @@ and/or @code{extra-offset} properties. "
                     (apply ly:stencil-add
                            (map (lambda (x)
                                   (ly:stencil-translate-axis
-                                   dot  (* (+ 1 (* 2 x)) dotwid) X) )
+                                   dot  (* (+ 1 (* 2 x)) dotwid) X))
                                 (iota dot-count 1)))))
          (flaggl (and (> log 2)
                       (ly:stencil-translate
                        (ly:font-get-glyph font
-                                         (string-append "flags-"
+                                         (string-append "flags."
                                                         (if (> dir 0) "u" "d")
                                                         (number->string log)))
                        (cons (+ attachx (/ stem-thickness 2)) stemy)))))
@@ -515,13 +507,11 @@ and/or @code{extra-offset} properties. "
 the @var{duration} for the note head type and augmentation dots. For
 example, @code{\\note #\"4.\" #-0.75} creates a dotted quarter note, with
 a shortened down stem."
-  
   (let ((parsed (parse-simple-duration duration)))
     (note-by-number-markup layout props (car parsed) (cadr parsed) dir)))
 
 (def-markup-command (normal-size-super layout props arg) (markup?)
   "Set @var{arg} in superscript with a normal font size."
-  
   (ly:stencil-translate-axis (interpret-markup
                              layout
                              props arg)
@@ -546,7 +536,6 @@ Raising and lowering texts can be done with @code{\\super} and
 @end lilypond
 
 "
-  
   (ly:stencil-translate-axis
    (interpret-markup
     layout
@@ -566,13 +555,11 @@ vertically, for the same reason that @code{\\raise} cannot be used for
 that.
 
 "
-  
   (ly:stencil-translate (interpret-markup  layout props arg)
                        offset))
 
 (def-markup-command (sub layout props arg) (markup?)
   "Set @var{arg} in subscript."
-  
   (ly:stencil-translate-axis
    (interpret-markup
     layout
@@ -581,9 +568,28 @@ that.
    (* -0.5 (chain-assoc-get 'baseline-skip props))
    Y))
 
+(def-markup-command (beam layout props width slope thickness) (number? number? number?)
+  "Create a beam with the specified parameters."
+
+  (let*
+      ((y (* slope width))
+       (yext (cons (min 0 y) (max 0 y)))
+       (half (/ thickness 2)))
+       
+    (ly:make-stencil
+     (list 'beam width
+          slope
+          thickness
+          (ly:output-def-lookup layout 'blotdiameter))
+     (cons 0 width)
+     (cons (+ (- half) (car yext))
+          (+ half (cdr yext))))
+
+    ))
+
+
 (def-markup-command (normal-size-sub layout props arg) (markup?)
   "Set @var{arg} in subscript, in a normal font size."
-
   (ly:stencil-translate-axis
    (interpret-markup layout props arg)
    (* -0.5 (chain-assoc-get 'baseline-skip props))
@@ -611,7 +617,7 @@ will put extra space between A and B, on top of the space that is
 normally inserted before elements on a line.
 "
   (if (> amount 0)
-      (ly:make-stencil "" (cons 0 amount) '(-1 . 1) )
+      (ly:make-stencil "" (cons 0 amount) '(-1 . 1))
       (ly:make-stencil "" (cons amount amount) '(-1 . 1))))
 
 (def-markup-command (override layout props new-prop arg) (pair? markup?)
@@ -632,30 +638,29 @@ any sort of property supported by @internalsref{font-interface} and
         (entry (cons 'font-size (- fs 1))))
     (interpret-markup layout (cons (list entry) props) arg)))
 
-
 (def-markup-command (bigger layout props arg) (markup?)
   "Increase the font size relative to current setting"
   (let* ((fs (chain-assoc-get 'font-size props 0))
          (entry (cons 'font-size (+ fs 1))))
     (interpret-markup layout (cons (list entry) props) arg)))
 
-(def-markup-command larger (markup?)
-  bigger-markup)
+(def-markup-command larger (markup?) bigger-markup)
 
 (def-markup-command (box layout props arg) (markup?)
-  "Draw a box round @var{arg}.  Looks at @code{thickness} and
-@code{box-padding} properties to determine line thickness and padding
-around the markup."
-  (let ((th (chain-assoc-get 'thickness props  0.1))
-        (pad (chain-assoc-get 'box-padding props 0.2))
-        (m (interpret-markup layout props arg)))
+  "Draw a box round @var{arg}.  Looks at @code{thickness},
+@code{box-padding} and @code{font-size} properties to determine line
+thickness and padding around the markup."
+  (let* ((th (chain-assoc-get 'thickness props  0.1))
+        (size (chain-assoc-get 'font-size props 0))
+        (pad
+         (* (magstep size)
+            (chain-assoc-get 'box-padding props 0.2)))
+        (m (interpret-markup layout props arg)))
     (box-stencil m th pad)))
 
 ;;FIXME: is this working? 
 (def-markup-command (strut layout props) ()
-  
   "Create a box of the same height as the space in the current font."
-  
   (let ((m (Text_interface::interpret_markup layout props " ")))
     (ly:stencil-set-extent! m X '(1000 . -1000))
     m))
@@ -670,30 +675,36 @@ around the markup."
   (vector-set! number->mark-letter-vector j
                (integer->char (+ i (char->integer #\A)))))
 
-(define (number->markletter-string n)
+(define number->mark-alphabet-vector (list->vector
+  (map (lambda (i) (integer->char (+ i (char->integer #\A)))) (iota 26))))
+
+(define (number->markletter-string vec n)
   "Double letters for big marks."
-  (let* ((lst (vector-length number->mark-letter-vector)))
+  (let* ((lst (vector-length vec)))
     
     (if (>= n lst)
-       (string-append (number->markletter-string (1- (quotient n lst)))
-                      (number->markletter-string (remainder n lst)))
-       (make-string 1 (vector-ref number->mark-letter-vector n)))))
-
+       (string-append (number->markletter-string vec (1- (quotient n lst)))
+                      (number->markletter-string vec (remainder n lst)))
+       (make-string 1 (vector-ref vec n)))))
 
 (def-markup-command (markletter layout props num) (integer?)
   "Make a markup letter for @var{num}.  The letters start with A to Z
  (skipping I), and continues with double letters."
-  
-  (Text_interface::interpret_markup layout props (number->markletter-string num)))
+  (Text_interface::interpret_markup layout props
+    (number->markletter-string number->mark-letter-vector num)))
 
+(def-markup-command (markalphabet layout props num) (integer?)
+   "Make a markup letter for @var{num}.  The letters start with A to Z
+ and continues with double letters."
+   (Text_interface::interpret_markup layout props
+     (number->markletter-string number->mark-alphabet-vector num)))
 
 (def-markup-command (bracketed-y-column layout props indices args)
   (list? markup-list?)
   "Make a column of the markups in @var{args}, putting brackets around
 the elements marked in @var{indices}, which is a list of numbers."
-
   (define (sublist lst start stop)
-    (take (drop lst start) (- (1+ stop) start)) )
+    (take (drop lst start) (- (1+ stop) start)))
 
   (define (stencil-list-extent ss axis)
     (cons
@@ -703,7 +714,7 @@ the elements marked in @var{indices}, which is a list of numbers."
   (define (stack-stencils stencils bskip last-stencil)
     (cond
      ((null? stencils) '())
-     ((not last-stencil)
+     ((not (ly:stencil? last-stencil))
       (cons (car stencils)
            (stack-stencils (cdr stencils) bskip (car stencils))))
      (else
@@ -748,7 +759,8 @@ the elements marked in @var{indices}, which is a list of numbers."
                  x)) args))
         (leading
          (chain-assoc-get 'baseline-skip props))
-        (stacked (stack-stencils stencils 1.25 #f))
+        (stacked (stack-stencils
+                  (remove ly:stencil-empty? stencils) 1.25 #f))
         (brackets (make-brackets stacked indices '())))
 
     (apply ly:stencil-add