X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fbass-figure.scm;h=104793b86ffe57ea54dd63060cd4de6f161d15f0;hb=5398c1592834132478e75ec17c2806e36b7a98fb;hp=dee09c7391c41a178ab67c718a2530adce82693a;hpb=899a5926b98860f3d5db399616d9211927fbfa3c;p=lilypond.git diff --git a/scm/bass-figure.scm b/scm/bass-figure.scm index dee09c7391..104793b86f 100644 --- a/scm/bass-figure.scm +++ b/scm/bass-figure.scm @@ -1,86 +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 '( (font-family . music) ))) - (nf (ly:get-font grob '( (font-family . number) ))) - (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 0 1 (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)) - ) - ) - (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 UP kerning unbr-mols) - Y thickness (* 2 padding) padding)) - ) - (brew-complete-figure - grob (cdr gather-todo) - (ly:combine-molecule-at-edge mol Y UP br-mol kerning) - ) - ) - (brew-complete-figure - grob (cdr figs) - (ly:combine-molecule-at-edge mol Y UP (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 DOWN) - 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 )) + (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) + )))