Das archivierte Lilypond-Forum von 2017 ist hier als Lese-Archiv wieder verfügbar!

Hauptmenü

Ambitus feststellen?

Begonnen von ingmar, Dienstag, 21. April 2026, 14:01

Vorheriges Thema - Nächstes Thema

ingmar

Wir hatten hier ja schon eine Diskussion zum Thema "Wie kriege ich den Ambitus in die 2. Zeile?" (dazu weiterführend, hier aber nicht relevant, siehe noch "Ambitus 2. Zeile: Lösung funktioniert nicht mit 2.25.x")

Da mir die Frage nach höchstem und tiefsten Ton immer wieder mal begegnet, möchte ich das Thema doch nochmal aufgreifen. Allerdings geht es mir hier gar nicht um die Darstellung eines Tonumfangs, sondern nur um eine Funktion, der eine Voice oder ein Staff übergeben wird und die den höchsten (und mit Minimaländerung den tiefsten) vorkommenden Ton zurückgibt.

Also sowas wie:
myVoice = \relativ {
  c'4 d e f g2 g
a4 a a a g1
a4 a a a g1
f4 f f f e2 e
d4 d d d c1
}
hi = \highest \myVoice
lo = \lowest \myVoice

%hi = { c' }
%lo = { a' }
   
\score { <<
   \new Staff = "Umfang" <<
      \new Voice = "Melodie" { << \hi \lo >> }
   >>
>> }

Was mir halt fehlt, sind die beiden Funktionen \highest und \lowest. In Harms sehr umfangreichem Code (siehe oben verlinkten Thread) finde ich mich leider trotz heftigen Bemühens nicht zurecht; man muss sich ja eigentlich nur den Startton merken und dann bei jedem weiteren Ton mit diesem neuen Ton überschreiben oder eben nicht, und am Schuss den letzten Stand zurückgeben.

Also brauchen wir
   (lambda (p1 p2)
           (ly:pitch<? p2 p1))

... aber für das Drumherum
bin ich offenbar zu dumm ...

Sicher kann mir jemand von Euch auf die Sprünge helfen..? : - )

Herzlichen Dank!
--ingmar


Manuela

#1
Meinst sowas wie diese Funktion?

\version "2.25.80"

musicextrema =
#(define-music-function (mus)(ly:music?)
   (let*
    (
      (alle-pitches
       (let loop ((mus mus) (pitches '()))
         (let ((p  (ly:music-property mus 'pitch)))
           (if (ly:pitch? p)
               (cons p pitches)
               (let ((elt (ly:music-property mus 'element)))
                 (fold loop
                       (if (ly:music? elt)
                           (loop elt pitches)
                           pitches)
                       (ly:music-property mus 'elements)))))))
      (alle-sortiert (sort alle-pitches ly:pitch<?))
      (tief (car alle-sortiert))
      (hoch (car (reverse alle-sortiert)))
      )
    ;     (display tief )(display hoch)
    ;     (write-me "alle pitches----> " (list? alle-pitches))
    (make-music
     'SequentialMusic
     'elements
     (list
      (make-music
       'NoteEvent
       'duration
       (ly:make-duration 2)
       'pitch
       tief)
      (make-music
       'NoteEvent
       'pitch
       hoch
       'duration
       (ly:make-duration 2))))
    ))

mymus = \relative { c' c c, c,, }
{ \clef bass \musicextrema \mymus }

Mit wenig Aufwand kannst du aus diesem Code die gewünschten Funktionen basteln.
Danke für eure Hilfe
viele Grüße
-- Manuela