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
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user