Gianmaria 

 

I have modified the procedure to use pitch-tones to define the instrument 
range.  It makes little difference to the result.

 

I haven’t looked at the possibility of rebuilding the pitch just using 
pitch-tones (yet)

 

Have you had any luck yet?

 

\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))
  (pt (ly:pitch-tones p)))
(define np 0)
(define op (+ (* 14 o) (* n 2) (/ a 2)))


(cond

;; clarinet range e to f#'   (-4 to 29/2)

((equal? instrument "clarinet" )
   (if  (< pt -16)    (begin (set! o (+ o 1))) )
   (if  (< pt -10)    (begin (set! o (+ o 1))) )
   (if  (< pt -4)     (begin (set! o (+ o 1))) )

   (if  ( > pt 52/2)  (begin (set! o (- o 1))) )
   (if  ( > pt 41/2)  (begin (set! o (- o 1))) )
   (if  ( > pt 29/2)  (begin (set! o (- o 1))) )
)
; bass clarinet range eb to f'  (-9/2 to 29/2)

   ((equal? instrument "bass clarinet eb" )
   (if  (< pt -33/2)  (begin (set! o (+ o 1))) )
   (if  (< pt -21/2)  (begin (set! o (+ o 1))) )
   (if  (< pt -9/2)  (begin (set! o (+ o 1))) )

   (if  ( > pt 52/2)  (begin (set! o (- o 1))) )
   (if  ( > pt 41/2)  (begin (set! o (- o 1))) )
   (if  ( > pt 29/2)  (begin (set! o (- o 1))) )
 )
; bass clarinet range c to f'   (-6 to 29/2)

((equal? instrument "bass clarinet c" )
    (if  (< pt -18)  (begin (set! o (+ o 1))) )
    (if  (< pt -12)  (begin (set! o (+ o 1))) )
    (if  (< pt -6)  (begin (set! o (+ o 1))) )

    (if  ( > pt 52/2)  (begin (set! o (- o 1))) )
    (if  ( > pt 41/2)  (begin (set! o (- o 1))) )
    (if  ( > pt 29/2)  (begin (set! o (- o 1))) )
)
;; flute range c to c''  (0 to 18)

((equal? instrument "flute")
    (if   (< pt -12)  (begin (set! o (+ o 1))) )
    (if   (< pt -6)   (begin (set! o (+ o 1))) )
    (if   (< pt 0)    (begin (set! o (+ o 1))) )

    (if  ( > pt 30)   (begin (set! o (- o 1))) )
    (if  ( > pt 24)   (begin (set! o (- o 1))) )
    (if  ( > pt 18)   (begin (set! o (- o 1))) )
)
;; alto range d to c''  (1 to 31/2)

 ((equal? instrument "alto")
    (if  (< pt -11) (begin (set! o (+ o 1))) )
    (if  (< pt -5)  (begin  (set! o (+ o 1))) )
    (if  (< pt  1)  (begin  (set! o (+ o 1))) )

    (if  ( > pt 55/2)  (begin (set! o (- o 1))) )
    (if  ( > pt 43/2)  (begin (set! o (- o 1))) )
    (if  ( > pt 31/2)  (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 )

; 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
               (acons 'style 'harmonic-mixed
                 (ly:music-property music 'tweaks)))))))

     music))

naturalizeInstrumentRange =
#(define-music-function (parser location  instrument m )
  ( string? ly:music? )
  (instrumentrange m instrument ))

% -------------------------------------------------------------------------------------------------
% the Lily test file calling function \naturalizeInstrumentRange  "instrument"  followed by sequential music
% -------------------------------------------------------------------------------------------------

%{
\score {
  \naturalizeInstrumentRange "bass clarinet eb"
  \new Staff \relative c' {
   c,,8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces

  }
}
\score {
 \new Staff \relative c' {
   c,,8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces
   c8  cis des d dis ees e eis fes f fis ges g gis aes a ais bes b bis ces

  }
}
%}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to