\version "2.19.15" % ------------------------------------------------------------------------------------------------- % useage % include this file --> \include "./instrument_ranges.ly" % best to save the file in the same folder as any other includes % 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 np 0) (define op (+ (* 14 o) (* n 2) (/ a 2))) ;; clarinet range e to f#' -1 2 0 to 2 3 0 (-10 to 35) (cond ((equal? instrument "clarinet" ) (if (< op -38) (begin (set! o (+ o 1))) ) (if (< op -24) (begin (set! o (+ o 1))) ) (if (< op -10) (begin (set! o (+ o 1))) ) (if ( > op 62) (begin (set! o (- o 1))) ) (if ( > op 48) (begin (set! o (- o 1))) ) (if ( > op 35) (begin (set! o (- o 1))) ) ) ; bass clarinet range eb to f' -1 2 -2 to 2 3 0 (-11 to 34) ((equal? instrument "bass clarinet eb" ) (if (< op -39) (begin (set! o (+ o 1))) ) (if (< op -25) (begin (set! o (+ o 1))) ) (if (< op -11) (begin (set! o (+ o 1))) ) (if ( > op 62) (begin (set! o (- o 1))) ) (if ( > op 48) (begin (set! o (- o 1))) ) (if ( > op 34) (begin (set! o (- o 1))) ) ) ; bass clarinet range c to f' -1 0 0 to 2 3 0 (-14 to 34) ((equal? instrument "bass clarinet c" ) (if (< op -42) (begin (set! o (+ o 1))) ) (if (< op -28) (begin (set! o (+ o 1))) ) (if (< op -14) (begin (set! o (+ o 1))) ) (if ( > op 62) (begin (set! o (- o 1))) ) (if ( > op 48) (begin (set! o (- o 1))) ) (if ( > op 34) (begin (set! o (- o 1))) ) ) ;; flute range c to c'' 0 0 0 to 2 3 0 (0 to 41) ((equal? instrument "flute") (if (< op -28) (begin (set! o (+ o 1))) ) (if (< op -14) (begin (set! o (+ o 1))) ) (if (< op 0) (begin (set! o (+ o 1))) ) (if ( > op 62) (begin (set! o (- o 1))) ) (if ( > op 48) (begin (set! o (- o 1))) ) (if ( > op 42) (begin (set! o (- o 1))) ) ) ;; alto range d to c'' 0 1 0 to 1 3 0 (2 to 36) ((equal? instrument "alto") (if (< op -28) (begin (set! o (+ o 1))) ) (if (< op -14) (begin (set! o (+ o 1))) ) (if (< op 0) (begin (set! o (+ o 1))) ) (if ( > op 62) (begin (set! o (- o 1))) ) (if ( > op 48) (begin (set! o (- o 1))) ) (if ( > op 34) (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 "alto" followed by sequential music % ------------------------------------------------------------------------------------------------- %{ \score { \naturalizeInstrumentRange "alto" \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 } } %}