On 07/09/2010 10:34 PM, Neil Puttock wrote: > Sounds good to me. So, here we go ... (faster to achieve than I expected, thanks to a conversation with a friend who is Scheme-experienced).
I've defined a Scheme function "naturalize-limit" which can be used to define limits for different cases, and given two examples -- one where the maximum alteration must be less than a whole tone, and one where the maximum alteration must be less than or equal to 1/2-tone (the old naturalizeMusic). In principle I can also use these to define custom cases for the notes c, e, f, b as well; not sure if I should, since the whole point of the naturalizeMusic function is to kill things like c-flats and e-sharps, and tonal transposition is already taken care of by Lilypond's default options. (Other possible improvements -- getting rid of the (set! ...) functions? My Schemer friend laughed at these...:-) Next step, hooking this into the transpose_mutable() function... :-)
#(define (naturalize-limit lim val) (define (limit a) (lim a val)) limit) #(define (naturalize-pitch p high low) (let ((o (ly:pitch-octave p)) (n (ly:pitch-notename p)) (a (ly:pitch-alteration p))) (do ((aa 0)) ((= aa a) (ly:make-pitch o n a)) (set! aa a) (cond ((and (>= a (/ 1 2)) (or (eq? n 2) (eq? n 6))) (set! a (- a (/ 1 2))) (set! n (+ n 1))) ((and (<= a (/ -1 2)) (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 (naturalize music high low) (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 high low)) es))) (if (ly:music? e) (ly:music-set-property! music 'element (naturalize e high low))) (if (ly:pitch? p) (begin (set! p (naturalize-pitch p high low)) (ly:music-set-property! music 'pitch p))) music)) naturalizeMusic = #(define-music-function (parser location m) (ly:music?) (naturalize m (naturalize-limit >= 1) (naturalize-limit <= -1))) naturalizeMusicHarp = #(define-music-function (parser location m) (ly:music?) (naturalize m (naturalize-limit > (/ 1 2)) (naturalize-limit < (/ -1 2)))) music = \relative c' { c4 d e g } microphrase = \relative c'' { geses4 geseh ges geh g gih gis gisih gisis } \score { \new Staff { \set Staff.extraNatural = ##f \transpose c ais { \music } \naturalizeMusic \transpose c ais { \music } \transpose c deses { \music } \naturalizeMusic \transpose c deses { \music } \bar "||" \naturalizeMusicHarp \transpose c ais { \music } \naturalizeMusicHarp \transpose c deses { \music } \bar "||" \break \time 9/4 \microphrase \bar ":" \naturalizeMusic { \microphrase } \bar ":" \naturalizeMusicHarp { \microphrase } \break \transpose c ais { \microphrase } \bar ":" \naturalizeMusic \transpose c ais { \microphrase } \bar ":" \naturalizeMusicHarp \transpose c ais { \microphrase } \break \transpose c deses { \microphrase } \bar ":" \naturalizeMusic \transpose c deses { \microphrase } \bar ":" \naturalizeMusicHarp \transpose c deses { \microphrase } \break \transpose c cih { \microphrase } \bar ":" \naturalizeMusic \transpose c cih { \microphrase } \bar ":" \naturalizeMusicHarp \transpose c cih { \microphrase } } \layout { } }
_______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-devel