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 <[email protected]>:
> 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
>