lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Tweaking in an engraver


From: Peter Gentry
Subject: RE: Tweaking in an engraver
Date: Sun, 19 Jul 2015 18:12:31 +0100

The OP described wanting to tweak a note property depending on its pitch. Now I 
may be missing something but do you need to create
an engraver for this.

My instrumentranges.ly examines note pitch an based on a suplied criterion 
changes notehead colour and style - is this the sort of
thing you had in mind.

\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 np 0)
(define op (+ (+ (+ (* 14 o) ) (* n 2) ) (/ a 2)))


;; clarinet range e to f'  -1 2 0  to 1 3 0  (-11 to 20)
(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 34)  (begin (set! o (- o 1))) )
)
; bass clarinet range eb to f'  -1 1 2  (-1 2 -2)  to 1 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 1 2  (-1 2 -2)  to 1 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 f'  0 0 0   to 1 3 0  (0 to 34)

((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 34)  (begin (set! o (- o 1))) )
) 
;; alto range d to f'  0 1 0   to 1 3 0

 ((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 ) 
   (  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
               (acons 'style 'harmonic
                 (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  "flute"  
followed by sequential music
% 
-------------------------------------------------------------------------------------------------


\score {
  \naturalizeInstrumentRange "flute"
  \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
     
  }
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]