X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily-library.scm;h=1e8fe97e477809c669338cb9072e8594a31adb16;hb=c2ccda3e91d408453744bd03882c6b0584a9561a;hp=492e38d5ecfc0cf99e56897f95965aca95e6c4f4;hpb=d84c7587117731add28b3b3591e9ef3d92fa827c;p=lilypond.git diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 492e38d5ec..1e8fe97e47 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -6,6 +6,8 @@ ;;;; (c) 1998--2006 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; constants. (define-public X 0) (define-public Y 1) @@ -17,22 +19,39 @@ (define-public DOWN -1) (define-public CENTER 0) -(define-safe-public DOUBLE-FLAT -4) -(define-safe-public THREE-Q-FLAT -3) -(define-safe-public FLAT -2) -(define-safe-public SEMI-FLAT -1) +(define-safe-public DOUBLE-FLAT-QTS -4) +(define-safe-public THREE-Q-FLAT-QTS -3) +(define-safe-public FLAT-QTS -2) +(define-safe-public SEMI-FLAT-QTS -1) +(define-safe-public NATURAL-QTS 0) +(define-safe-public SEMI-SHARP-QTS 1) +(define-safe-public SHARP-QTS 2) +(define-safe-public THREE-Q-SHARP-QTS 3) +(define-safe-public DOUBLE-SHARP-QTS 4) +(define-safe-public SEMI-TONE-QTS 2) + +(define-safe-public DOUBLE-FLAT -1) +(define-safe-public THREE-Q-FLAT -3/4) +(define-safe-public FLAT -1/2) +(define-safe-public SEMI-FLAT -1/4) (define-safe-public NATURAL 0) -(define-safe-public SEMI-SHARP 1) -(define-safe-public SHARP 2) -(define-safe-public THREE-Q-SHARP 3) -(define-safe-public DOUBLE-SHARP 4) -(define-safe-public SEMI-TONE 2) +(define-safe-public SEMI-SHARP 1/4) +(define-safe-public SHARP 1/2) +(define-safe-public THREE-Q-SHARP 3/4) +(define-safe-public DOUBLE-SHARP 1) +(define-safe-public SEMI-TONE 1/2) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; moments (define-public ZERO-MOMENT (ly:make-moment 0 1)) (define-public (moment-min a b) (if (ly:moment output hooks. + ;; parser stuff. (define-public (print-music-as-book parser music) (let* ((head (ly:parser-lookup parser '$defaultheader)) @@ -66,7 +88,6 @@ parser 'toplevel-scores (cons score (ly:parser-lookup parser 'toplevel-scores)))) - (define-public (scorify-music music parser) (for-each (lambda (func) @@ -102,8 +123,6 @@ (define-public (print-score-with-defaults parser score) (let* ((paper (ly:parser-lookup parser '$defaultpaper)) - (layout (ly:parser-lookup parser '$defaultlayout)) - (header (ly:parser-lookup parser '$defaultheader)) (count (ly:parser-lookup parser 'output-count)) (base (ly:parser-output-name parser))) @@ -114,12 +133,40 @@ (set! base (format #f "~a-~a" base count))) (ly:parser-define! parser 'output-count (1+ count)) - (ly:score-process score header paper layout base) - )) + + (if (not (ly:score-error? score)) + (let* + ((header (ly:score-header score)) + (output-defs (ly:score-output-defs score)) + (layout-defs (filter (lambda (d) (eq? #t (ly:output-def-lookup d 'is-layout))) + output-defs)) + (midi-defs (filter (lambda (d) (eq? #t (ly:output-def-lookup d 'is-midi))) + output-defs)) + (music (ly:score-music score)) + (layout-def (if (null? layout-defs) + (ly:parser-lookup parser '$defaultlayout) + (car layout-defs)))) + + (if (not (module? header)) + (set! header (ly:parser-lookup parser '$defaultheader))) + + (ly:render-music-as-systems + music layout-def paper header base) + + (if (pair? midi-defs) + (ly:performance-write (ly:format-output (ly:run-translator music (car midi-defs))) + (format #f "~a.midi" base) + )) + + )))) + + + ;;;;;;;;;;;;;;;; ;; alist + (define-public assoc-get ly:assoc-get) (define-public (uniqued-alist alist acc) @@ -192,6 +239,7 @@ found." ;;;;;;;;;;;;;;;; ;; vector + (define-public (vector-for-each proc vec) (do ((i 0 (1+ i))) @@ -228,7 +276,71 @@ found." m)) ;;;;;;;;;;;;;;;; -; list +;; list + +(define (functional-or . rest) + (if (pair? rest) + (or (car rest) + (apply functional-and (cdr rest))) + #f)) + +(define (functional-and . rest) + (if (pair? rest) + (and (car rest) + (apply functional-and (cdr rest))) + #t)) + +(define (split-list lst n) + "Split LST in N equal sized parts" + + (define (helper todo acc-vector k) + (if (null? todo) + acc-vector + (begin + (if (< k 0) + (set! k (+ n k))) + + (vector-set! acc-vector k (cons (car todo) (vector-ref acc-vector k))) + (helper (cdr todo) acc-vector (1- k))))) + + (helper lst (make-vector n '()) (1- n))) + +(define (list-element-index lst x) + (define (helper todo k) + (cond + ((null? todo) #f) + ((equal? (car todo) x) k) + (else + (helper (cdr todo) (1+ k))))) + + (helper lst 0)) + +(define-public (count-list lst) + "Given lst (E1 E2 .. ) return ((E1 . 1) (E2 . 2) ... ) " + + (define (helper l acc count) + (if (pair? l) + (helper (cdr l) (cons (cons (car l) count) acc) (1+ count)) + acc)) + + + (reverse (helper lst '() 1))) + +(define-public (list-join lst intermediate) + "put INTERMEDIATE between all elts of LST." + + (fold-right + (lambda (elem prev) + (if (pair? prev) + (cons elem (cons intermediate prev)) + (list elem))) + '() lst)) + +(define-public (filtered-map proc lst) + (filter + (lambda (x) x) + (map proc lst))) + (define (flatten-list lst) "Unnest LST" @@ -242,19 +354,17 @@ found." "Return list of elements in A that are not in B." (lset-difference eq? a b)) -;; TODO: use the srfi-1 partition function. (define-public (uniq-list lst) - "Uniq LST, assuming that it is sorted" - (define (helper acc lst) - (if (null? lst) - acc - (if (null? (cdr lst)) - (cons (car lst) acc) - (if (equal? (car lst) (cadr lst)) - (helper acc (cdr lst)) - (helper (cons (car lst) acc) (cdr lst)))))) - (reverse! (helper '() lst) '())) + + (reverse! + (fold (lambda (x acc) + (if (null? acc) + (list x) + (if (eq? x (car acc)) + acc + (cons x acc)))) + '() lst) '())) (define (split-at-predicate predicate lst) "Split LST = (a_1 a_2 ... a_k b_1 ... b_k) @@ -263,6 +373,7 @@ found." L1 is copied, L2 not. (split-at-predicate (lambda (x y) (= (- y x) 2)) '(1 3 5 9 11) (cons '() '()))" + ;; " Emacs is broken (define (inner-split predicate lst acc) @@ -284,8 +395,8 @@ found." (set-car! c (reverse! (car c))) c)) -(define-public (split-list lst sep?) - "(display (split-list '(a b c / d e f / g) (lambda (x) (equal? x '/)))) +(define-public (split-list-by-separator lst sep?) + "(display (split-list-by-separator '(a b c / d e f / g) (lambda (x) (equal? x '/)))) => ((a b c) (d e f) (g)) " @@ -301,7 +412,7 @@ found." (if (null? lst) '() (let* ((c (split-one sep? lst '()))) - (cons (reverse! (car c) '()) (split-list (cdr c) sep?))))) + (cons (reverse! (car c) '()) (split-list-by-separator (cdr c) sep?))))) (define-public (offset-add a b) (cons (+ (car a) (car b)) @@ -483,7 +594,6 @@ possibly turned off." (define-public (car< a b) (< (car a) (car b))) - (define-public (symbolstring lst) (symbol->string r)))