Transposing pitches with minimum accidentals (“smart” transpose): Difference between revisions
mNo edit summary |
mNo edit summary |
||
| Line 12: | Line 12: | ||
#(define (naturalize-pitch p) | #(define (naturalize-pitch p) | ||
(let ((o (ly:pitch-octave p)) | (let ((o (ly:pitch-octave p)) | ||
;; `ly:pitch-alteration` returns quarter tone steps. | |||
(a (* 4 (ly:pitch-alteration p))) | (a (* 4 (ly:pitch-alteration p))) | ||
(n (ly:pitch-notename p))) | (n (ly:pitch-notename p))) | ||
(cond | (cond | ||
((and (> a 1) (or (eqv? n 6) (eqv? n 2))) | ((and (> a 1) | ||
(or (eqv? n 6) (eqv? n 2))) | |||
(set! a (- a 2)) | (set! a (- a 2)) | ||
(set! n (+ n 1))) | (set! n (+ n 1))) | ||
((and (< a -1) (or (eqv? n 0) (eqv? n 3))) | ((and (< a -1) | ||
(or (eqv? n 0) (eqv? n 3))) | |||
(set! a (+ a 2)) | (set! a (+ a 2)) | ||
(set! n (- n 1)))) | (set! n (- n 1)))) | ||
(cond | (cond | ||
((> a 2) (set! a (- a 4)) (set! n (+ n 1))) | ((> a 2) | ||
((< a -2) (set! a (+ a 4)) (set! n (- n 1)))) | (set! a (- a 4)) | ||
( | (set! n (+ n 1))) | ||
( | ((< a -2) | ||
(set! a (+ a 4)) | |||
(set! n (- n 1)))) | |||
(when (< n 0) | |||
(set! o (- o 1)) | |||
(set! n (+ n 7))) | |||
(when (> n 6) | |||
(set! o (+ o 1)) | |||
(set! n (- n 7))) | |||
(ly:make-pitch o n (/ a 4)))) | (ly:make-pitch o n (/ a 4)))) | ||
| Line 34: | Line 43: | ||
(e (ly:music-property music 'element)) | (e (ly:music-property music 'element)) | ||
(p (ly:music-property music 'pitch))) | (p (ly:music-property music 'pitch))) | ||
( | (when (pair? es) | ||
(ly:music-set-property! music 'elements | |||
(map naturalize es))) | |||
(when (ly:music? e) | |||
( | (ly:music-set-property! music 'element | ||
(naturalize e))) | |||
(when (ly:pitch? p) | |||
(set! p (naturalize-pitch p)) | |||
( | (ly:music-set-property! music 'pitch p)) | ||
music)) | music)) | ||
naturalizeMusic = | naturalizeMusic = | ||
#(define-music-function (m) | #(define-music-function (m) (ly:music?) | ||
(naturalize m)) | (naturalize m)) | ||
music = \relative c' { c4 d e g } | music = \relative c' { c4 d e g } | ||
\new Staff { | |||
\transpose c ais { \music } | |||
\naturalizeMusic \transpose c ais { \music } | |||
\transpose c deses { \music } | |||
\naturalizeMusic \transpose c deses { \music } | |||
} | } | ||
</lilypond> | </lilypond> | ||