]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/new-markup.scm
* scm/chord-name.scm: complete new markup usage
[lilypond.git] / scm / new-markup.scm
index 78cbb7779a8f4744455b31ad02eaab106e50e8b8..8dde61d95d6d3a27acdd2cb55ad9c77e8a14555f 100644 (file)
@@ -1,14 +1,28 @@
-
-
-
 (define-public (simple-markup grob props . rest)
   (Text_item::text_to_molecule grob props (car rest))
   )
 
+(define-public (stack-molecule-line space molecules)
+  (if (pair? molecules)
+      (if (pair? (cdr molecules))
+         (let* (
+                (tail (stack-molecule-line  space (cdr molecules)))
+                (head (car molecules))
+                (xoff (+ space (cdr (ly:get-molecule-extent head X))))
+                )
+           
+           (ly:add-molecule
+            head
+            (ly:molecule-translate-axis tail xoff X))
+         )
+         (car molecules))
+      '())
+  )
+
 (define-public (line-markup grob props . rest)
-  (stack-molecules
-   X 1 1.0 
-   (map (lambda (x) (interpret_markup grob props x)) (car rest)))
+  (stack-molecule-line
+   (cdr (chain-assoc 'word-space props))
+   (map (lambda (x) (interpret-markup grob props x)) (car rest)))
   )
 
 (define (combine-molecule-list lst)
       ))
 
 (define-public (combine-markup grob props . rest)
-   (combine-molecule-list (map (lambda (x) (interpret_markup grob props x)) (car rest))))
+  (ly:add-molecule
+   (interpret-markup grob props (car rest))
+   (interpret-markup grob props (cadr rest))))
+  
+;   (combine-molecule-list (map (lambda (x) (interpret-markup grob props x)) (car rest))))
 
-(define-public (bold-markup grob props . rest)
-   (interpret_markup grob (cons '((font-series .  bold)) props) (car rest))
-  )
+(define (font-markup qualifier value)
+  (lambda (grob props . rest)
+    (interpret-markup grob (cons (cons `(,qualifier . ,value) (car props)) (cdr props)) (car rest))
+  
+  ))
+
+
+(define-public (set-property-markup qualifier)
+  (lambda (grob props . rest  )
+    (interpret-markup grob
+                     (cons (cons `(,qualifier . ,(car rest))
+                                 (car props)) (cdr props))
+                     (cadr rest))
+    ))
+
+
+(define-public fontsize-markup (set-property-markup 'font-relative-size))
+(define-public magnify-markup (set-property-markup 'font-magnification))
+
+(define-public bold-markup
+  (font-markup 'font-series 'bold))
+(define-public number-markup
+  (font-markup 'font-family 'number))
+
+
+(define-public huge-markup
+  (font-markup 'font-relative-size 2))
+(define-public large-markup
+  (font-markup 'font-relative-size 1))
+(define-public small-markup
+  (font-markup 'font-relative-size -1))
+(define-public tiny-markup
+  (font-markup 'font-relative-size -2))
+(define-public teeny-markup
+  (font-markup 'font-relative-size -3))
+(define-public dynamic-markup
+  (font-markup 'font-family 'dynamic))
+(define-public italic-markup
+  (font-markup 'font-shape 'italic))
 
+
+;; TODO: baseline-skip should come from the font.
 (define-public (column-markup grob props . rest)
-  (stack-molecules
-   Y -1 0.0 
-   (map (lambda (x) (interpret_markup grob props x)) (car rest)))
+  (stack-lines
+   -1 0.0 (cdr (chain-assoc 'baseline-skip props))
+   (map (lambda (x) (interpret-markup grob props x)) (car rest)))
+  )
+
+(define-public (musicglyph-markup grob props . rest)
+  (ly:find-glyph-by-name
+   (ly:get-font grob (cons '((font-family . music)) props))
+   (car rest))
+  )
+
+(define-public (lookup-markup grob props . rest)
+  "Lookup a glyph by name."
+  (ly:find-glyph-by-name
+   (ly:get-font grob props)
+   (car rest))
+  )
+
+(define-public (char-markup grob props . rest)
+  "Syntax: \\char NUMBER. "
+  (ly:get-glyph  (ly:get-font grob props) (car rest))
+  )
+
+(define-public (raise-markup grob props  . rest)
+  "Syntax: \\raise AMOUNT MARKUP. "
+  (ly:molecule-translate-axis (interpret-markup
+                              grob
+                              props
+                              (cadr rest))
+                             (car rest) Y)
+  )
+
+(define-public (normal-size-superscript-markup grob props . rest)
+  (ly:molecule-translate-axis (interpret-markup
+                              grob
+                              props (car rest))
+                             (* 0.5 (cdr (chain-assoc 'baseline-skip props)))
+                             Y)
+  )
+
+(define-public (super-markup grob props  . rest)
+  "Syntax: \\super MARKUP. "
+  (ly:molecule-translate-axis (interpret-markup
+                              grob
+                              (cons '((font-relative-size . -2)) props) (car rest))
+                             (* 0.5 (cdr (chain-assoc 'baseline-skip props)))
+                             Y)
   )
 
-;; todo. Use macro?  
-(map
- (lambda (x)
+(define-public (translate-markup grob props . rest)
+  "Syntax: \\translate OFFSET MARKUP. "
+  (ly:molecule-translate (interpret-markup  grob props (cadr rest))
+                        (car rest))
 
-   (set-object-property!
-    (eval (string->symbol (string-append (symbol->string x) "-markup")) (current-module))
-    'markup-function? #t))
+  )
+
+(define-public (sub-markup grob props  . rest)
+  "Syntax: \\sub MARKUP."
+  (ly:molecule-translate-axis (interpret-markup
+                              grob
+                              (cons '((font-relative-size . -2)) props)
+                              (car rest))
+                             (* -0.5 (cdr (chain-assoc 'baseline-skip props)))
+                             Y)
+  )
+
+;; todo: fix negative space
+(define (hspace-markup grob props . rest)
+  "Syntax: \\hspace NUMBER."
+  (let*
+      ((amount (car rest)))
+    (if (> amount 0)
+       (ly:make-molecule "" (cons 0 amount) '(-1 . 1) )
+       (ly:make-molecule "" (cons amount amount) '(-1 . 1)))
+  ))
+
+(define-public (override-markup grob props . rest)
+  "Tack the 1st arg in REST onto PROPS, e.g.
+
+\override #'(font-family . married) \"bla\"
+
+"
+  
+  (interpret-markup grob (cons (list (car rest)) props)
+                   (cadr rest)))
+
+(define-public (smaller-markup  grob props . rest)
+  "Syntax: \\smaller MARKUP"
+  (let*
+      (
+       (fs (cdr (chain-assoc 'font-relative-size props)))
+       (entry (cons 'font-relative-size (- fs 1)))
+       )
+  (interpret-markup
+   grob (cons (list entry) props)
+   (car rest))
+
+  ))
+
+(define-public (bigger-markup  grob props . rest)
+  "Syntax: \\bigger MARKUP"
+  (let*
+      (
+       (fs (cdr (chain-assoc 'font-relative-size props)))
+       (entry (cons 'font-relative-size (+ fs 1)))
+       )
+  (interpret-markup
+   grob (cons (list entry) props)
+   (car rest))
+  ))
+
+(map (lambda (x)
+       (set-object-property! (car x) 'markup-signature (cdr x))
+       )
+     (list
+      (cons bold-markup 'markup0)
+      (cons teeny-markup 'markup0)
+      (cons tiny-markup 'markup0)
+      (cons small-markup 'markup0)
+      (cons smaller-markup 'markup0)
+      (cons bigger-markup 'markup0)
+      (cons italic-markup 'markup0)
+      (cons dynamic-markup 'markup0)
+      (cons large-markup 'markup0) 
+      (cons huge-markup 'markup0) 
+      (cons sub-markup 'markup0)
+      (cons super-markup 'markup0)
+      (cons number-markup 'markup0)
+      (cons column-markup 'markup-list0)
+      (cons line-markup  'markup-list0)
+      (cons combine-markup 'markup0-markup1)
+      (cons simple-markup 'markup0)
+      (cons musicglyph-markup 'scm0)
+      (cons translate-markup 'scm0-markup1)
+      (cons override-markup 'scm0-markup1)
+      (cons lookup-markup 'scm0)
+      (cons raise-markup 'scm0-markup1)
+      (cons char-markup 'scm0)
+      (cons hspace-markup 'scm0)
+      (cons magnify-markup 'scm0-markup1)
+      (cons fontsize-markup 'scm0-markup1)
+      (cons translate-markup 'scm0-markup1)
+      ))
+
+(define markup-module (current-module))
+
+(define-public (lookup-markup-command code)
+  (let*
+      ( (sym (string->symbol (string-append code "-markup")))
+       (var (module-local-variable markup-module sym))
+       )
+    (if (eq? var #f)
+       #f   
+       (cons (variable-ref var) (object-property  (variable-ref var) 'markup-signature))
+    )
+  ))
 
- '(simple column bold combine line )
- )
 
 (define-public (brew-new-markup-molecule grob)
-  (interpret_markup grob
+  (interpret-markup grob
                    (Font_interface::get_property_alist_chain grob)
                    (ly:get-grob-property grob 'text)
                    )
   )
 
-(define (interpret_markup  grob props markup)
+(define-public empty-markup `(,simple-markup ""))
+
+(define (interpret-markup  grob props markup)
   (let*
       (
        (func (car markup))
     (apply func (cons grob (cons props args)) )
     ))
 
+
 (define (new-markup? x)
        (markup-function? (car x))
 )
 
 (define (markup-function? x)
-       (object-property 'markup-function? x))
+       (object-property 'markup-signature? x))
+
+