(define (naturalize-limit lim) (define (limit a) ((car lim) a (cdr lim))) limit) (define-public (naturalize-pitch p pitch-limits) (let ((o (ly:pitch-octave p)) (n (ly:pitch-notename p)) (a (ly:pitch-alteration p)) (high (naturalize-limit (list-ref pitch-limits 0))) (low (naturalize-limit (list-ref pitch-limits 1))) (higheb (naturalize-limit (list-ref pitch-limits 2))) (lowcf (naturalize-limit (list-ref pitch-limits 3)))) (do ((aa 0)) ((= aa a) (ly:make-pitch o n a)) (set! aa a) (cond ((and (higheb a) (or (eq? n 2) (eq? n 6))) (set! a (- a (/ 1 2))) (set! n (+ n 1))) ((and (lowcf a) (or (eq? n 0) (eq? n 3))) (set! a (+ a (/ 1 2))) (set! n (- n 1)))) (cond ((high a) (set! a (- a 1)) (set! n (+ n 1))) ((low a) (set! a (+ a 1)) (set! n (- n 1)))) (if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7)))) (if (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7))))))) (define-public (naturalize music pitch-limits) (let ((es (ly:music-property music 'elements)) (e (ly:music-property music 'element)) (p (ly:music-property music 'pitch))) (if (pair? es) (ly:music-set-property! music 'elements (map (lambda (x) (naturalize x pitch-limits)) es))) (if (ly:music? e) (ly:music-set-property! music 'element (naturalize e pitch-limits))) (if (ly:pitch? p) (begin (set! p (naturalize-pitch p pitch-limits)) (ly:music-set-property! music 'pitch p))) music))