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