]> git.donarmstrong.com Git - lilypond.git/blob - scm/bass-figure.scm
e65b116e49b446486b6c836b2ffa565664cc22c3
[lilypond.git] / scm / bass-figure.scm
1 ;;;; figured bass support ...
2
3 (ly:add-interface
4 'bass-figure-interface
5  "A bass figure, including bracket"
6  '())
7
8 (define  (recursive-split-at pred? l)
9   (if (null? l)
10       '()
11       (let*
12           ((x (split-at-predicate pred? l)))
13         (set-cdr! x (recursive-split-at pred? (cdr x)))
14         x
15         )))
16
17 (define-public (make-bass-figure-markup figures context)
18   (define (no-end-bracket? f1 f2)
19     (eq? (ly:get-mus-property f1 'bracket-stop) '())
20     )
21   (define (no-start-bracket? f1 f2)
22     (eq? (ly:get-mus-property f2 'bracket-start) '())
23     )
24
25   ;; TODO: support slashed numerals here.
26   (define (fig-to-markup fig-music)
27     (let*
28         (
29          (fig  (ly:get-mus-property fig-music 'figure))
30          (acc  (ly:get-mus-property fig-music 'alteration))
31          (acc-markup #f)
32          (fig-markup
33           (if (number? fig)
34               (make-number-markup (number->string fig))
35               (make-simple-markup " ")
36               ))
37          )
38
39     (if (number? acc)
40         (make-line-markup (list fig-markup
41                                 (alteration->text-accidental-markup acc)))
42         fig-markup)
43     ))
44   
45   (define (fig-seq-to-markup figs)
46     (let*
47         (
48          (c (make-dir-column-markup (map fig-to-markup figs)))
49          )
50       (if (eq? (ly:get-mus-property (car figs) 'bracket-start) #t)
51           (make-bracket-markup c)
52           c
53           )))
54   
55   (let*
56       (
57        (ends (recursive-split-at no-end-bracket? (reverse figures)))
58        (starts (map (lambda (x) (recursive-split-at no-start-bracket? x)) ends))
59        )
60     (make-dir-column-markup (map fig-seq-to-markup (apply append starts)))
61     ))
62