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