X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily-library.scm;h=ecf5a4598fe6ee66c3347c9ba5613731989aaddb;hb=e7638b90e908840010125d0c150db8c18a5016c7;hp=da04e6c89662e769015a0f8e2b0b3491d3378de6;hpb=314587c0714437b058c04173d81ad79db7452e73;p=lilypond.git diff --git a/scm/lily-library.scm b/scm/lily-library.scm index da04e6c896..ecf5a4598f 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -78,6 +78,42 @@ (cons (ly:moment-main-numerator moment) (ly:moment-main-denominator moment))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; durations + +(define-public (duration-log-factor lognum) +"Given a logarithmic duration number, return the length of the duration, +as a number of whole notes." + (or (and (exact? lognum) (integer? lognum)) + (scm-error 'wrong-type-arg "duration-log-factor" "Not an integer: ~S" (list lognum) #f)) + (if (<= lognum 0) + (ash 1 (- lognum)) + (/ (ash 1 lognum)))) + +(define-public (duration-dot-factor dotcount) +"Given a count of the dots used to extend a musical duration, return +the numeric factor by which they increase the duration." + (or (and (exact? dotcount) (integer? dotcount) (>= dotcount 0)) + (scm-error 'wrong-type-arg "duration-dot-factor" "Not a count: ~S" (list dotcount) #f)) + (- 2 (/ (ash 1 dotcount)))) + +(define-public (duration-length dur) +"Return the overall length of a duration, as a number of whole notes. +(Not to be confused with ly:duration-length, which returns a less-useful +moment object.)" + (ly:moment-main (ly:duration-length dur))) + +(define-public (duration-visual dur) +"Given a duration object, return the visual part of the duration (base +note length and dot count), in the form of a duration object with +non-visual scale factor 1." + (ly:make-duration (ly:duration-log dur) (ly:duration-dot-count dur) 1)) + +(define-public (duration-visual-length dur) +"Given a duration object, return the length of the visual part of the +duration (base note length and dot count), as a number of whole notes." + (duration-length (duration-visual dur))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; arithmetic (define-public (average x . lst) @@ -411,17 +447,11 @@ bookoutput function" (define-public (first-member members lst) "Return first successful member (of member) from @var{members} in @var{lst}." - (if (null? members) - #f - (let ((m (member (car members) lst))) - (if m m (first-member (cdr members) lst))))) + (any (lambda (m) (member m lst)) members)) (define-public (first-assoc keys lst) "Return first successful assoc of key from @var{keys} in @var{lst}." - (if (null? keys) - #f - (let ((k (assoc (car keys) lst))) - (if k k (first-assoc (cdr keys) lst))))) + (any (lambda (k) (assoc k lst)) keys)) (define-public (flatten-alist alist) (if (null? alist) @@ -477,30 +507,23 @@ For example: ;; hash (define-public (hash-table->alist t) - (hash-fold (lambda (k v acc) (acons k v acc)) - '() t)) + (hash-fold acons '() t)) ;; todo: code dup with C++. (define-safe-public (alist->hash-table lst) "Convert alist to table" (let ((m (make-hash-table (length lst)))) - (map (lambda (k-v) (hashq-set! m (car k-v) (cdr k-v))) lst) + (for-each (lambda (k-v) (hashq-set! m (car k-v) (cdr k-v))) lst) m)) ;;;;;;;;;;;;;;;; ;; list (define (functional-or . rest) - (if (pair? rest) - (or (car rest) - (apply functional-or (cdr rest))) - #f)) + (any identity rest)) (define (functional-and . rest) - (if (pair? rest) - (and (car rest) - (apply functional-and (cdr rest))) - #t)) + (every identity rest)) (define (split-list lst n) "Split LST in N equal sized parts" @@ -518,14 +541,7 @@ For example: (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)) + (list-index (lambda (m) (equal? m x)))) (define-public (count-list lst) "Given @var{lst} as @code{(E1 E2 .. )}, return @@ -697,6 +713,15 @@ right (@var{dir}=+1)." (define-public (reverse-interval iv) (cons (cdr iv) (car iv))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; boolean + +(define (lily-and a b) + (and a b)) + +(define (lily-or a b) + (or a b)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; coordinates