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 <m...@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