]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/bass-figure.scm
* tex/GNUmakefile ($(outdir)/latin1.enc): Replace `/minus' with
[lilypond.git] / scm / bass-figure.scm
index 4f26ba953d05756e3298df405484586d3972e07d..104793b86ffe57ea54dd63060cd4de6f161d15f0 100644 (file)
@@ -1,91 +1,53 @@
 ;;;; figured bass support ...
 
-;;;; todo: make interfaces as 1st level objects in LilyPond.
+(ly:add-interface
+'bass-figure-interface
+ "A bass figure, including bracket"
+ '())
 
-(define (brew-one-figure grob fig-music)
-  "Brew a single column for a music figure"
-  (let* (
-        (mf (ly:get-font grob (cons  '((font-family . music))
-                                     Font_interface::get_property_alist_chain
-                                     )))
-        (nf (ly:get-font grob
-                         (cons  '((font-family . number))
-                                Font_interface::get_property_alist_chain)))
-        (mol (ly:make-molecule  '() '(0 . 0) '(0 . 1.0)))
-        (fig  (ly:get-mus-property fig-music 'figure))
-        (acc  (ly:get-mus-property fig-music 'alteration))
-        )
-    
-    (if (number? fig)
-       (begin
-         (set! mol   (fontify-text nf (number->string fig)))
-         (ly:align-to! mol Y CENTER)
-       ))
-    
-    (if (number? acc)
-       (set! mol
-             (ly:combine-molecule-at-edge
-              mol X RIGHT (ly:find-glyph-by-name mf (string-append "accidentals-" (number->string acc)))
-              0.2))
-       )
-    (if (ly:molecule? mol)
-       (ly:align-to! mol X CENTER)
-       )
-    mol))
 
-(define (brew-bass-figure grob)
-  "Make a molecule for a Figured Bass grob"
-  (let* (
-        (figs (ly:get-grob-property grob 'causes ))
-        (mol (ly:make-molecule '() '(0 . 0) '(0 . 0)))
-        (padding (ly:get-grob-property grob 'padding))
-        (kerning (ly:get-grob-property grob 'kern))
-        (thickness (*
-                    (ly:get-paper-variable grob 'linethickness)
-                    (ly:get-grob-property grob 'thickness))
-                   )
-        (dir (ly:get-grob-property grob 'direction))
-        )
 
-    (define (brew-complete-figure grob figs mol)
-      "recursive function: take some stuff from FIGS, and add it to MOL." 
-      (define (end-bracket? fig)
-       (eq? (ly:get-mus-property fig 'bracket-stop) #t)
-       )
-      
-      (if (null? figs)
-         mol
-         (if (eq? (ly:get-mus-property (car figs) 'bracket-start) #t)
-             (let* (
-                    (gather-todo (take-from-list-until figs '() end-bracket?))
-                    (unbr-mols
-                     (map
-                      (lambda (x) (brew-one-figure grob x))
-                      (reverse! (car gather-todo) '())))
-                    (br-mol (bracketify-molecule
-                             (stack-molecules Y dir kerning unbr-mols)
-                             Y thickness (* 2 padding) padding))
-                    )
-               (brew-complete-figure
-                grob (cdr gather-todo)
-                (ly:combine-molecule-at-edge mol Y dir br-mol kerning)
-                )
-               )
-             (brew-complete-figure
-              grob (cdr figs)
-              (ly:combine-molecule-at-edge mol Y dir (brew-one-figure grob (car figs))
-                                           kerning))
-             )
-         ))
+(define-public (format-bass-figure figures context grob)
+  ;; TODO: support slashed numerals here.
+  (define (fig-to-markup fig-music)
+    (let*
+       ((align-accs (eq? #t (ly:context-property context 'alignBassFigureAccidentals)))
+        (fig  (ly:music-property fig-music 'figure))
+        (acc  (ly:music-property fig-music 'alteration))
+        (acc-markup #f)
+        (fig-markup
+         (if (markup? fig)
+             fig
+             (if align-accs (make-simple-markup " ")
+                 (if (not (eq? acc '()))
+                     (make-simple-markup "")
+                     (make-strut-markup)))
+             )))
 
-    
-    (set! mol (brew-complete-figure grob (reverse figs) mol))
-    (ly:align-to! mol Y (- dir))
-    mol
-    ))
+      (if (number? acc)
+         (make-line-markup (list fig-markup
+                                 (alteration->text-accidental-markup acc)))
+         fig-markup)
+      ))
 
+  (define (filter-brackets i figs acc)
+    (cond
+     ((null? figs) acc)
+     (else
+      (filter-brackets (1+ i) (cdr figs)
 
-(ly:add-interface
-'bass-figure-interface
- "A bass figure, including bracket"
- '(padding thickness direction))
+                      (append
+                       (if  (eq? (ly:music-property (car figs) 'bracket-start) #t)
+                            (list i)
+                            '())
+                       (if  (eq? (ly:music-property (car figs) 'bracket-stop) #t)
+                            (list i)
+                            '())
+                       
+                       acc)))))
+
+  (set! (ly:grob-property grob 'text)
+       (make-bracketed-y-column-markup
+        (sort (filter-brackets 0 figures '()) <)
+        (map fig-to-markup figures)
+        )))