lilypond-user
[Top][All Lists]
Advanced

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

Re: how to automatically add ovtaves to some pitches


From: Stefan Thomas
Subject: Re: how to automatically add ovtaves to some pitches
Date: Sat, 28 Nov 2020 17:15:53 +0100

Dear Mark,
thanks for Your tip. I have now a working solution.
But I would like to do it in another way, with
whenPitchAbove =
#(define-scheme-function
   (pitch proc)
   (ly:pitch? procedure?)
   (lambda (m)
     (let ((p (ly:music-property m 'pitch)))
       (if (and (ly:pitch? p) (ly:pitch<? pitch p))
         (proc m)
         m))))
I don't understand what 'proc' could be and what it shouldn't.
Nevertheless, the following code works:
%%%% SNIPPET

\version "2.20.0"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (pitch>? p1 p2)
(ly:pitch<? p2 p1))

#(define (pitch-octavize p limit-pitch sym)
(let* ((above? (eq? sym 'above))
       (compare? (if above? pitch>? ly:pitch<?))
       (octavize (if above? 1- 1+)))    
  (let loop ((new-pitch p))
    (if (compare? new-pitch limit-pitch)
      (loop (ly:make-pitch (octavize (ly:pitch-octave new-pitch))
                           (ly:pitch-notename new-pitch)
                           (ly:pitch-alteration new-pitch)))
      new-pitch))))

   
customOutOfRange = #(define-music-function (parser location low-pitch high-pitch func music)
                      (ly:pitch? ly:pitch? ly:music-function? ly:music?)
"Apply func to notes, out of range `low-note `high-note"                      
 (if (ly:pitch<? low-pitch high-pitch)
    (music-map
      (lambda (evt)
        (let ((p (ly:music-property evt 'pitch)))
          (if (and (ly:pitch? p)
                   (or (ly:pitch<? p low-pitch)
                       (ly:pitch<? high-pitch p)))
            #{ $func $evt #}
            evt)))
      music)
    music))



makeOctavesOutOfRange = #(define-music-function (parser location low-pitch high-pitch music)
                         (ly:pitch? ly:pitch? ly:music?)
"otavation of notes out of range `low-note `high-note"
(let ((octaveBelow
        (define-music-function (parser location evt)(ly:music?)
          #{ \context Voice << { $evt }  { \transpose c c, $evt } >>  #})))
  #{ \customOutOfRange $low-pitch $high-pitch #octaveBelow $music #}))


%% it works!

music = \relative c' {
  c4 d e f
  g a b c
  d e f g a b c2
}



music =  { \makeOctavesOutOfRange c' c'' \music  }
\new Staff \music
%%%%%%%%% END OF SNIPPET

Am Sa., 28. Nov. 2020 um 16:02 Uhr schrieb Mark Knoop <mark@opus11.net>:
At 14:53 on 28 Nov 2020, Stefan Thomas wrote:
> Dear community,
> I wanted to add an octavation only to specific pitches. I hope that
> the following snippet shows better what I want. Unfortunately it
> doesn't work.
> %%%%%%%%%%%% SNIPPET
> \version "2.20.0"
>
> % a pitch filter
> whenPitchAbove =
> #(define-scheme-function
> (pitch proc)
> (ly:pitch? procedure?)
> (lambda (m)
> (let ((p (ly:music-property m 'pitch)))
> (if (and (ly:pitch? p) (ly:pitch<? pitch p))
> (proc m)
> m))))
> % add octave below
> okT = #(define-music-function (x) (ly:music?)
> #{
> \context Voice <<        $x \transpose c' c { $x } >>
> #})
>
> global = {
> \time 6/8  \clef "treble_8"  }
> Music =  {
> \global dis'' fis' a' d'' fis' a' dis'' fis' e'' f'
> dis'' fis' a' d'' fis' a' dis'' fis' e'' f' }
>
> MusicWithOnlySomeOctaves = {
> \musicMap \whenPitchAbove c''  \okT \Music
> }
> %%%%%%%%%%%% END OF THE SNIPPET %%%%%%%%%%%%%%%%%%%%%%

Have a look at the \customOutOfRange function in this snippet

http://lsr.di.unimi.it/LSR/Item?id=773

>> At 10:51 on 28 Nov 2020, Stefan Thomas wrote:
>>>* Dear community,*
>>>* I would like to add automatically an octabe to certain pitches, e.g.*
>>>* higher than d''.*
>>>* I have in mind something like this:*
>>>* %%%%%%%%%% SNIPPET*
>>>* \version "2.18.2"*
>>>* global = {*
>>>* \time 6/8  \clef "treble_8"  }*
>>>* okT = #(define-music-function (x) (ly:music?)*
>>>*        #{*
>>>*  \context Voice <<        $x \transpose c' c { $x } >>*
>>>*        #})*
>>>* Music =  {*
>>>* \global dis'' fis' a' d'' fis' a' dis'' fis' e'' f'*
>>>* dis'' fis' a' d'' fis' a' dis'' fis' e'' f' }*
>>>* MusicWithOctaves = {*
>>>* \global \okT dis'' fis' a' d'' fis' a'  \okT dis'' fis' \okT e'' f'*
>>>* \okT dis'' fis' a' \okT d'' fis' a' \okT dis'' fis' \okT e'' f'*
>>>* }*
>>>* %%%%%%%%%% END SNIPPET*
>>>* I thought it could be done with musicMap but I can't get it to work.*
>>>* Has someone a hint for me?*
>> http://lsr.di.unimi.it/LSR/Item?id=445
--
Mark Knoop

reply via email to

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