Thank you Peter.
Cheers,
Pierre

2014-12-15 21:27 GMT+01:00 Peter Gentry <peter.gen...@sunscales.co.uk>:
>
> Find below is the corrected version of the modified snippet.
>
> \version "2.18.2"
> %{ P Gentry 15 December 2014 08:23
> ;; Modified version of the LilyPond snippet enharmonic.ly (probably
> better as enharmonic.ily)
> ;; This script will enharmonically spell a music object
> ;; Semi-tone intervals are dealt in accordance with the Key signature
> ;; If the Key is C Major the first accidental encountered is chosen as the
> preferred accidental
> ;; For other keys the preferred accidental is taken from the key signature
> ;; It may not be elegant but it seems to work
> %}
>
> #(define s 0)
> #(define k 0)
> #(define nbuf 0)
> #(define abuf 0)
> #(define keysig 0)
>
>  #(define (naturalize-pitch p tonic)
>  (define sharpkey-list '((0 . 0) (1 . 1) (2 . 1) (3 . 0) (4 . 1) (5 . 1)
> (6 . 1)))  ;key signatures  D, E, G, A, B contain sharps
>  (define flatkey-list  '((0 . 0) (1 . 0) (2 . 0) (3 . 1) (4 . 0) (5 . 0)
> (6 . 0)))  ;key signature F contains a  flat
>  (define sharp-list    '((0 . 0) (1 . 0) (2 . 1) (3 . 0) (4 . 0) (5 . 0)
> (6 . 1)))  ; notes E# and B# may be changed to F and C
> dependant on key
>  (define flat-list     '((0 . 1) (1 . 0) (2 . 0) (3 . 1) (4 . 0) (5 . 0)
> (6 . 0)))  ; notes Cb and Fb may be changed to B and E
> dependant on key
>
>  (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)))
>
> ;if keychange event  determine if key contains flats s=1, naturals s=2 ,
> or sharps s=3 ")
> (cond ((eq? tonic  1 )
>   (begin
>    (set! keysig 0) ;C natural key contains no accidentals
>    (set! k 0)
>   (if (or (and (eq? a 0) (eq? (cdr(assoc n sharpkey-list)) 1))  (> a 0))
> (set! keysig 3)) ; key contains sharps
>   (if (or (and (eq? a 0) (eq? (cdr(assoc n flatkey-list)) 1)) (< a 0))
>  (set! keysig 6))  ;key contains flats
>   (if (and (eq? n 0) (eq? a 2) )  (set! keysig 1))  ;key C#
>   (if (and (eq? n 3) (eq? a 2) )  (set! keysig 2))  ;key F#
>   (if (and (eq? n 0) (eq? a -2) )  (set! keysig 4)) ;key Cb
>   (if (and (eq? n 4) (eq? a -2) )  (set! keysig 5)) ;key Gb
>
> ;; if not C major set preferred accidental
>   (if  (and (< keysig 4)  (> keysig 0)  (eq? k 0))  (set! k  2) )    ;;
> sharp key
>   (if  (and (> keysig 3)   (eq? k 0))   (set! k -2) )                ;;
> flat key
>   (set! tonic 0)   ))
> )
>
> (set! nbuf n)
> (set! abuf a)
>
> ; if no keychange event  naturalize the pitch
>
> ; first remove double accidentals
>
> ;deal with double sharps
> (cond ((and (eq? tonic 0) (> a 2)) (begin  (set! n (+ n 1))  (set! a (- a
> 4)) )))
> (cond ((> n 6)  (begin  (set! n (- n 7))  (set! o(+ o 1))  )) )
> (cond ((and (eq? (cdr(assoc nbuf sharp-list )) 1) (eq? abuf 4))  (begin
> (set! a (+ a 2)) )))
>
> ;deal with double flats
> (cond ((and (eq? tonic 0) (< a -2))
>       (begin (set! n (- n 1)) (set! a(+ a 4)) )))
> (cond ((< n 0)
>       (begin (set! n(+ n 7)) (set! o(- o 1)) )))
> (cond ((and (eq? (cdr(assoc nbuf flat-list )) 1) (eq? abuf -4))
>       (begin (set! a (- a 2)) )))
>
> ;; if key C Major save first accidental as preferred
> (if  (and (eq? tonic 0) (eq? keysig 0) (eq? k 0) (not (eq? a 0)))   (set!
> k a) )
>
> ;; enharmonic spell accidentals
> ;  (if (and (eq? tonic 0) (or ( eq? keysig 5) (eq? keysig 0)) (eq? n 3)
> (eq? a -2))
> ;      (begin (set! a 0) (set! n (- n 1))))
> ; (if (and (eq? tonic 0) (or (eq? keysig 6)   (eq? keysig 0)) (or (eq? n
> 0) (eq? n 3)) (eq? a -2))
> ;      (begin (set! a 0) (set! n (- n 1))))
>
> ;;deal with semi-tones Cb to B and Fb to E
>  (if (and (eq? tonic 0)  (or (eq? keysig 6 ) (eq? keysig 0)) (< a -1)
>  (eq? (cdr(assoc n flat-list)) 1) )
>      (begin (set! a  0)  (set! n (- n 1))))
> ; if keysig 4  and  note is  B or E make note flat
>  (if (and  (eq? tonic 0) (eq? keysig 4)   (or (eq? n 2) (eq? n 6)) (eq? a
> 0))
>       (begin (set! a -2) (set! n (+ n 1))))
> ; if keysig 5 and  note is   F  make note flat
>  (if (and (eq? tonic 0) (eq? keysig 5) (eq? n 3) (eq? a 0))
>      (begin (set! a  -2)  (set! n (+ n 1))))
>
> ;;deal with semi-tones B# to C and E# toF
> ; if keysig 3 or 0  and note is E# or B# make note natural
> (if (and (eq? tonic 0) (or (eq? keysig 3 ) (eq? keysig 0) ) (> a 1) (eq?
> (cdr(assoc n sharp-list)) 1) )
>      (begin (set! a  0)  (set! n (+ n 1))))
> ; if keysig 1  and  note is  C or F make note #
>  (if (and  (eq? tonic 0) (eq? keysig 1)  (or (eq? n 0) (eq? n 3)) (eq? a
> 0))
>       (begin (set! a 2) (set! n (- n 1))))
> ; if keysig 2 and  note is   F  make note #
>  (if (and (eq? tonic 0) (eq? keysig 2) (eq? n 3) (eq? a 0))
>      (begin (set! a  2)  (set! n (- n 1))))
>
> ;; modify the octave if necessary
> (if ( < n 0) (begin (set! o (- o 1)) (set! n (+ n 7))))
> (if  (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7))))
>
> ;take account of preferred flats
> (cond  ( (and  (eq? tonic 0) ( < k 0 )  ( > a  0) (eq? (cdr(assoc n
> sharp-list )) 0 )) (begin  (set! a (* a -1)) (set! n (+ n 1)))))
> (cond  ( (and  (eq? tonic 0) ( < k 0 )  ( > a  0) (eq? (cdr(assoc n
> sharp-list )) 1 )) (begin  (set! a 0)        (set! n (+ n 1)))))
>
> ;take account of preferred sharps
> (cond  ((and  (eq? tonic 0) ( > k 0 )  ( < a  0)  (eq? (cdr(assoc n
> flat-list )) 0 ))  (begin  (set! a (* a -1)) (set! n (-  n
> 1)))))
> (cond  ((and  (eq? tonic 0) ( > k 0 )  ( < a  0)  (eq? (cdr(assoc n
> flat-list )) 1 ))  (begin  (set! a 0)        (set! n (-  n
> 1)))))
>
> ;; modify the octave if necessary
> (if ( < n 0) (begin (set! o (- o 1)) (set! n (+ n 7))))
> (if  (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7))))
> (ly:make-pitch o n (/ a 4))
>
> ;; end scope of let
>  )
> ;; end scope of naturalize-pitch
>  )
>
>
> #(define (naturalize music)
> ; get music data from the music file
> (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)))
> ;write back to Lilypond
> (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 lilypond pitch then naturalize before write back
> (if (ly:pitch? p)
> (begin
> (set! p (naturalize-pitch p 0))
> (ly:music-set-property! music 'pitch p)))
>
> (
>   ; if lilypond tonic then call naturalize but don't modify the pitch
> before write back
> 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))
>
>
> regards
> Peter Gentry
>
>
>
> _______________________________________________
> lilypond-user mailing list
> lilypond-user@gnu.org
> https://lists.gnu.org/mailman/listinfo/lilypond-user
>
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to