4 texidoc
= "This example uses some Scheme code to enforce enharmonic
5 modifications for notes in order to have the minimum number of
6 accidentals. In this case, the following rules apply:
10 Double accidentals should be removed
26 In this manner, the most natural enharmonic notes are chosen.
28 doctitle
= "Transposing music with minimum accidentals"
31 #(define
(naturalize-pitch p
)
32 (let
* ((o
(ly
:pitch-octave p
))
33 (a (* 4 (ly
:pitch-alteration p
)))
34 ; alteration
, a, in quarter tone steps
, for historical reasons
35 (n
(ly
:pitch-notename p
)))
37 ((and
(> a 1) (or
(eq? n
6) (eq? n
2)))
40 ((and
(< a -
1) (or
(eq? n
0) (eq? n
3)))
44 ((> a 2) (set
! a (-
a 4)) (set
! n
(+ n
1)))
45 ((< a -
2) (set
! a (+
a 4)) (set
! n
(- n
1))))
46 (if
(< n
0) (begin
(set
! o
(- o
1)) (set
! n
(+ n
7))))
47 (if
(> n
6) (begin
(set
! o
(+ o
1)) (set
! n
(- n
7))))
48 (ly
:make-pitch o n
(/ a 4))))
50 #(define
(naturalize music
)
51 (let
* ((es (ly
:music-property music
'elements
))
52 (e (ly
:music-property music
'element
))
53 (p
(ly
:music-property music
'pitch
)))
55 (ly
:music-set-property
!
57 (map
(lambda
(x
) (naturalize x
)) es)))
59 (ly
:music-set-property
!
64 (set
! p
(naturalize-pitch p
))
65 (ly
:music-set-property
! music
'pitch p
)))
69 #(define-music-function
(parser location m
)
73 music
= \relative c' { c4 d e g }
77 \transpose c ais { \music }
78 \naturalizeMusic \transpose c ais { \music }
79 \transpose c deses
{ \music }
80 \naturalizeMusic \transpose c deses
{ \music }