FWIW

I have attached a slightly simplified and better version of instrument_ranges.ly

regards
Peter Gentry 

\version "2.19.15"
% -------------------------------------------------------------------------------------------------
% include function file instrument_ranges.ly
% usuage include --> \include "./ranges/instrument_ranges.ly"
% usuage call -->       \naturalizeInstrumentRange "instrument" music
% this function will confine all pitches to the individual instruments range
% Note the ranges refer to music transposed for each instrument not the true pitches.
% use % for comment outside scheme function -  use ; inside scheme functions
% -------------------------------------------------------------------------------------------------

#(define (naturalize-instrument-range p instrument ) 
  (let ((o (ly:pitch-octave p))
  (a (* 4 (ly:pitch-alteration p)))
;; alteration, a, in quarter tone steps, for historical reasons
  (n (ly:pitch-notename p)))

(define op (+ (+ (+ (* 14 o) ) (* n 2) ) (/ a 2)))

(cond
 ;; clarinet range e to f'  -1 2 0  to 1 3 0  (-10 to 34)

((equal? instrument "clarinet" )
    (if (or ( > op 34) (< op -10) ) (begin (set! o (+ o 1))) ))

; bass clarinet range eb to f'  -1 1 2  (-1 2 -2)  to 1 3 0 (-11 to34)

   ((equal? instrument "bass clarinet eb" )
    (if (or ( > op 34) (< op -11) ) (begin (set! o (+ o 1))) ))
 
; bass clarinet range c to f'  -1 1 2  (-1 2 -2)  to 1 3 0 (-11 to34)

((equal? instrument "bass clarinet c" )
    (if (or ( > op 34) (< op -14) ) (begin (set! o (+ o 1))) ))
 
;; flute range c to f'  0 0 0   to 1 3 0  (0 to 34)

((equal? instrument "flute")
     (if (or ( > op 34) (< op 0) ) (begin (set! o (+ o 1))) ))
 
;; alto range c to f'  1 0 0   to 1 3 0

 ((equal? instrument "alto")
     (if (or ( > op 34) (< op 0) ) (begin (set! o (+ o 1))) ))
)

(ly:make-pitch o n (/ a 4)) 

))
 
% -------------------------------------------------------------------------------------------------
% a variable for the notehaed color on pitch change
% -------------------------------------------------------------------------------------------------

my-color = #(x11-color 'red)
 
% -------------------------------------------------------------------------------------------------
% this function rebuilds the music object optionally changing pitch and notehead color
% -------------------------------------------------------------------------------------------------
#(define (instrumentrange music instrument ) 
   (  ly:music? string? ) 
; extract the various portions of the music object
(let ((es (ly:music-property music 'elements))      
           (e   (ly:music-property music 'element)) 
           (p   (ly:music-property music 'pitch)))
 
; rebuild any 'elements unchanged
(if (pair? es)
   (ly:music-set-property! music 'elements
   (map (lambda (x) (instrumentrange x instrument)) es)))  

; rebuild any 'element unchanged
 (if (ly:music? e) (ly:music-set-property! music 'element
                            (instrumentrange e instrument )))

;rebuild the pitch and if a changed pitch add the color tweak
(if (ly:pitch? p)
          (let ((new-pitch (naturalize-instrument-range p instrument)))
          (ly:music-set-property! music 'pitch new-pitch)
          (if (and (not (equal? p new-pitch)) (color? my-color))
              (ly:music-set-property! music 'tweaks
              (acons
                'color my-color
               (ly:music-property music 'tweaks))))))

     music))
 
% -------------------------------------------------------------------------------------------------
% the Lily file calling function \naturalizeInstrumentRange  "clarinet"  followed by sequential music
% -------------------------------------------------------------------------------------------------
naturalizeInstrumentRange =
#(define-music-function (parser location  instrument m ) 
  ( string? ly:music? )  
  (instrumentrange m instrument ))
 
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to