Hello all,
As per earlier discussion on the -user list:
http://www.mail-archive.com/[email protected]/msg51183.html
... I finally managed to put some time and mental energy towards
chromatic transposition, in particular, the naturalizeMusic function
from the LSR.
I've attached a draft version that makes two changes to the original:
(1) it takes out the original's focus on quarter-tones as the
units of alteration, and changes the conditions for rewriting
so that it will let pass any alteration less than a whole tone
(so e.g. 3/4-flats and sharps will not be rewritten; but see
below for caveat ...)
(2) it introduces a (do ...) loop to make sure that the process of
naturalization converges. This way you don't get accidental
(pun intended:-) double-flats hanging around due to weird
transpositions.
(Example: take the music of bb. 9-10 in the sample music, and
put it through the _original_ naturalizeMusic function. You get
left with a g-double-flat instead of an f-natural.)
What I still would like to do is make optional the question of the
largest alteration permitted. See lines 15--17 of the code:
(cond
((>= a 1) (set! a (- a 1)) (set! n (+ n 1)))
((<= a -1) (set! a (+ a 1)) (set! n (- n 1))))
In the original naturalizeMusic function, these conditional statements
were the equivalent of (> a (/ 1 2)) and (< a (/ -1 2)), which rewrote
any alteration larger than a semitone.
As Hans Aberg pointed out, this can be important for e.g. harp music
where there is a strict limit of +/- 1/2-tone on note alterations.
The best way to achieve this seems to be to make those conditions
variables in the function definition, something like,
(define (naturalize-pitch p toohigh toolow)
...
(cond
((toohigh a) (set! a (- a 1)) (set! n (+ n 1)))
((toolow a) (set! a (+ a 1)) (set! n (- n 1))))
... with toohigh or toolow being defined to give both a predicate (>,
>=, <, <=) and a value (1, -1, (/ 1 2), (/ -1 2) ...)
I'm shaky on how to define toohigh or twolow, though (not so much a
schemer as a meddler): can someone advise?
Thanks & best wishes,
-- Joe
#(define (naturalize-pitch p)
(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
((>= a 1) (set! a (- a 1)) (set! n (+ n 1)))
((<= a -1) (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)
(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)) es)))
(if (ly:music? e)
(ly:music-set-property!
music 'element
(naturalize e)))
(if (ly:pitch? p)
(begin
(set! p (naturalize-pitch p))
(ly:music-set-property! music 'pitch p)))
music))
naturalizeMusic =
#(define-music-function (parser location m)
(ly:music?)
(naturalize m))
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 "||"
\break
\time 9/4
\microphrase
\bar ":"
\naturalizeMusic { \microphrase }
\break
\transpose c ais { \microphrase }
\bar ":"
\naturalizeMusic \transpose c ais { \microphrase }
\break
\transpose c deses { \microphrase }
\bar ":"
\naturalizeMusic \transpose c deses { \microphrase }
\break
\transpose c cih { \microphrase }
\bar ":"
\naturalizeMusic \transpose c cih { \microphrase }
}
\layout { }
}
_______________________________________________
lilypond-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-devel