I have suceeded in producing a desired result although I don't think it is of general use. The code could be more elegant but it works.
\version "2.18.2" % OS Vista and Frescobaldi #(define s 0) #(define (naturalize-pitch p tonic) (define sharp-list '((0 . 0) (1 . 0) (2 . 1) (3 . 0) (4 . 0) (5 . 0) (6 . 1))) (define flat-list '((0 . 1) (1 . 0) (2 . 0) (3 . 1) (4 . 0) (5 . 0) (6 . 0))) (let ((o (ly:pitch-octave p)) (a (* 4 (ly:pitch-alteration p))) ;; alteration, a, in quarter tone steps, ;; for historical reasons ;; get currrent pitch (n (ly:pitch-notename p))) (cond ;; B# to C and E# toF ((and (> a 1) (or (eq? n 6) (eq? n 2))) (set! a (- a 2)) (set! n (+ n 1))) ;; Cb to B and Fb to E ((and (< a -1) (or (eq? n 0) (eq? n 3))) (set! a (+ a 2)) (set! n (- n 1)))) (cond ;; if a > 2 then set a=a-4 n=n+1 ((> a 2) (set! a (- a 4)) (set! n (+ n 1))) ;; if a < -2 then set a=a+4 n=n-1 ((< a -2) (set! a (+ a 4)) (set! n (- n 1)))) (if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7)))) ;; if n > 6 then set o=o+1 n=n-7 (if (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7)))) (cond ((eq? tonic 1 ) ; determine key contains flats s=1, naturals s=0 , or sharps s=3 ") (if (and (eq? n 0) (eq? a 2) ) (set! s 3)) (if (and (eq? n 1) (eq? a 0) ) (set! s 3)) (if (and (eq? n 2) (eq? a 0) ) (set! s 3)) (if (and (eq? n 3) (eq? a 2) ) (set! s 3)) (if (and (eq? n 4) (eq? a 0) ) (set! s 3)) (if (and (eq? n 5) (eq? a 0) ) (set! s 3)) (if (and (eq? n 6) (eq? a 0) ) (set! s 3)) (if (and (eq? n 0) (eq? a 0) ) (set! s 2)) (if (and (eq? n 0) (eq? a -2) ) (set! s 1)) (if (and (eq? n 1) (eq? a -2) ) (set! s 1)) (if (and (eq? n 2) (eq? a -2) ) (set! s 1)) (if (and (eq? n 3) (eq? a 0) ) (set! s 1)) (if (and (eq? n 4) (eq? a -2) ) (set! s 1)) (if (and (eq? n 5) (eq? a -2) ) (set! s 1)) (if (and (eq? n 6) (eq? a -2) ) (set! s 1)) (set! tonic 0))) (cond ((eq? tonic 0 ) ; ntonic not detected skip to naturalize the pitch (cond ( (eq? s 3) ; key contains sharps use list of flat modifiers (if (and (eq? (cdr (assoc n flat-list)) 1) (< a 0) ) (set! a (* a -1) )) (if (and (eq? (cdr (assoc n flat-list)) 0) (< a 0) ) (begin (set! n (- n 1)) (set! a (* a -1) ))) )) (cond ((eq? s 1) ; key contains flats use list of sharp modifiers (if (and (eq? (cdr(assoc n sharp-list)) 1) (> a 0) ) (set! a (* a -1) )) (if (and (eq? (cdr(assoc n sharp-list)) 0) (> a 0) ) (begin (set! n (+ n 1)) (set! a (* a -1) ))) )) )) (ly:make-pitch o n (/ a 4))) ) #(define (naturalize music) (let ((es (ly:music-property music 'elements)) (e (ly:music-property music 'element)) (p (ly:music-property music 'pitch)) (t (ly:music-property music 'tonic))) (if (pair? es) (ly:music-set-property! music 'elements (map (lambda (x) (naturalize x)) es))) (if (ly:music? e) (ly:music-set-property! music 'element (naturalize e))) (if (ly:pitch? p) (begin (set! p (naturalize-pitch p 0)) (ly:music-set-property! music 'pitch p))) (if (ly:pitch? t) (begin (set! t (naturalize-pitch t 1)) (ly:music-set-property! music 'tonic t))) music) ) naturalizeMusic = #(define-music-function (parser location m) (ly:music?) (naturalize m)) \version "2.18.2" % Bach Minuet from Partita No1 #(set-global-staff-size 23) \header { title = "Minuet from Partita No 1" composer = "J S Bach" } \include "./ranges/enharmonic.ly" \score { \include "Bach Part Notes Test.ly"} {\naturalizeMusic \include "Bach Part Notes Test.ly" } regards Peter Gentry
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user