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

Hauptmenü

Neueste Beiträge

#21
Fragen und Probleme aller Art / Antw:Ambitus feststellen? [gel...
Letzter Beitrag von harm6 - Dienstag, 5. Mai 2026, 21:49
Zitat von: Manuela am Sonntag,  3. Mai 2026, 12:55Unsereins ist schon froh, wenn er es überhaupt hinkriegt, auch wenn es umständlicher ist als nötig.  ;)

Hallo Manuela,

stell dein Licht nicht unter den Scheffel!
Dein Code hat gemacht was er sollte und das Problem ebenfalls gelöst.

Gruß,
  Harm
#22
Fragen und Probleme aller Art / Antw:Ambitus feststellen? [gel...
Letzter Beitrag von harm6 - Dienstag, 5. Mai 2026, 21:46
Ich würde die Definition einfach dazu packen:
#(define-public (ensure-list item-or-list-of-items)
  "Ensure the argument is a list. If it is not put it in one."
  (if (list? item-or-list-of-items)
      item-or-list-of-items
      (list item-or-list-of-items)))

Gruß,
  Harm
#23
Fragen und Probleme aller Art / Antw:LilyPond-Book per Funktio...
Letzter Beitrag von harm6 - Dienstag, 5. Mai 2026, 21:44
Hallo ingmar :)

wir sind hier in einem Bereich, in dem ich mich nicht so gut auskenne. Aber ich schreibe mal was ich zu wissen glaube...

Ein \book ist ein bestimmtes Format. Es kann music enthalten, ist aber selber keine Musik. Insoweit kann eine music-function auch kein \book ausgeben.

Um das \book auch zu drucken muss es prozessiert werden. Für toplevel-books gibts dafür den toplevel-book-handler, per default ist das print-book-with-defaults (siehe declarations-init.ly). Wenn eine scheme-function jetzt ein \book versucht auszugeben so ist es ja kein toplevel-book, sondern innerhalb der function gemacht. Deshalb funktioniert auch das nicht.

Um weiter zu kommen muss man das \book innerhalb der function prozessieren. Dafür kann man dann wiederum print-book-with-defaults verwenden. Allerdings ist eine scheme-function hier ebenfalls unnütz, denn man will die tatsächliche Rückgabe ja gar nicht, sondern nur die Ausführung des Druck-Befehls.
Deshalb void-function. Führt zu:

mymusicI = { c4 d e f g2 g2 a4 a a a g1 fis }
mymusicII = { c4 d e f g2 g2 a4 a a a g1 aes }

mybook = #(define-void-function (mus) (ly:music?)
  (print-book-with-defaults
    #{ \book { \bookpart { \score { \new Staff { \clef bass $mus } } } } #}))

\mybook \mymusicI
\mybook \mymusicII

HTH,
  Harm
#24
Fragen und Probleme aller Art / re: Ambitus feststellen? [gelö...
Letzter Beitrag von ingmar - Dienstag, 5. Mai 2026, 20:19
Hab mir inzwischen deine elegante Lösung angeschaut, harm – auch dafür vielen Dank!

Da ich noch mit einer veralterten LilyPond-Version arbeite, die ensure-list noch nicht kennt, werde ich temporär erstmal noch mit Manuelas Ansatz weiterarbeiten, der ja auch funktioniert; das werde ich dann aber später nachziehen.

Nochmal euch beiden herzlichen Dank für Eure Zeit! – Gruß, --ingmar

#25
Fragen und Probleme aller Art / LilyPond-Book per Funktion erz...
Letzter Beitrag von ingmar - Dienstag, 5. Mai 2026, 19:47
Ich versuche, eine scheme-Funktion dazu zu bewegen, ein LilyPond-Book auszugeben.

Verwende ich define-scheme-function, erhalte ich die Fehlermeldung "Falsche Ausdrucksart". Versucbe ichs mit define-music-function, erfahre ich schon mehr: "music-Funktion kann nicht ##<Book> ausgeben".

Tja! Aber warum nicht? Was kann ich da machen?

Hintergrund ist, dass ich mehrere PDF-Files in einer einzigen Lilypond-Datei ausgeben möchte (soweit kein Problem), die sich nur durch ein Detail unterscheiden, das ich gerne per Argument übergeben möchte.


Danke für eure Hilfe! : - )

mymusic = { c4 d e f g2 g2 a4 a a a g1 }

mybook = #(define-scheme-function (mymusic) (ly:music?) #{
\book { \bookpart { \score { \new Staff { \clef bass \mymusic }}} }
 #})

\mybook \mymusic
#26
Fragen und Probleme aller Art / re: Ambitus feststellen?
Letzter Beitrag von ingmar - Sonntag, 3. Mai 2026, 13:34
Zitat von: harm6 am Sonntag,  3. Mai 2026, 12:25Nicht verstanden habe ich allerdings warum der übliche Ambitus nicht hinreichend ist.

Weil er Analyse und Darstellung des Ergebnisses nicht trennt. (Ich hatte dazu hier schon was geschrieben..)

Ich schreibe sehr viel Noten, und manchmal taucht tatsächlich die Frage nach Tonumfängen der Einzelstimmen auf. Aber meine Frage lautet dann selten: "Welchen Tonumfang hat die vierte Stimme in diesem Stück?" Sie lautet häufiger: "Was sind die Tonumfänge der vierten Stimmen aller Einzelsätze in diesem File?" (und in Zukunft vielleicht auch mal "... in diesem Ordner?"). Dazu muss ich dann die Ergebnisse der Einzelanalysen jeder Stimme nicht in diese hineinschreiben, sondern sie irgendwie sammeln und gesondert auflisten.

Danke fürs Interesse!
--ingmar
#27
Fragen und Probleme aller Art / Antw:Ambitus feststellen? [gel...
Letzter Beitrag von Manuela - Sonntag, 3. Mai 2026, 12:55
Danke, Harm.

Unsereins ist schon froh, wenn er es überhaupt hinkriegt, auch wenn es umständlicher ist als nötig.  ;)
#28
Fragen und Probleme aller Art / Antw:Ambitus feststellen?
Letzter Beitrag von harm6 - Sonntag, 3. Mai 2026, 12:25
Hallo zusammen,

ich habe mir mal ein paar Gedanken gemacht. Nicht verstanden habe ich allerdings warum der übliche Ambitus nicht hinreichend ist.
Seis drum...
Gesucht habe ich eine Möglichkeit beim Aufruf der Funktion mit LilyPond Syntax das Ergebnis als Akkord, sequentielle bzw simultane Musik darzustellen. Sowie eine simple Methode nur den höchsten oder tiefsten Ton darzustellen.

Hier das Ergebnis:
\version "2.26.0"

#(define (make-note-event pitch duration)
  "Takes PITCH and DURATION and returns a NoteEvent."
  (make-music
   'NoteEvent
   'duration duration
   'pitch pitch))
 
#(define (bottom-top-notes music duration)
  "Takes MUSIC and returns lowest and highest note each with duration DURATION
as a plain list."
  (let* ((all-pitches (music-pitches music))
         (sorted-pitches (sort all-pitches ly:pitch<?)))
    (map
      (lambda (pitch) (make-note-event pitch duration))
      (list (car sorted-pitches) (last sorted-pitches)))))

extrema =
#(define-music-function (proc m music duration)
  ((procedure? identity) ly:music? ly:music? ly:duration?)
"Takes MUSIC and returns sequential music, simultaneous music or an event-chord
with duration DURATION, relying on the type M provides.
The optional PROC, supposed to be @code{first} or @code{last}, may be used to
get the bottom or top note only."
  (ly:music-set-property! m 'elements
    (ensure-list (proc (bottom-top-notes music duration))))
  m)
   
%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%

testMus = \relative { d' e fis g a b cis }
 
{ \extrema {} \testMus 4 }
%% Below, preceed with \new Staff to avoid implicit creation of two staves
{ \extrema <<>> \testMus 4 }
{ \extrema <> \testMus 4 }

%% Get only bottom or top note
{ \extrema #first {} \testMus 4 }
{ \extrema #last {} \testMus 4 }

Manuelas 'alle-pitches' ist im wesentlichen dasselbe wie das builtin 'music-pitches'. Lediglich ein reverse! in 'music-pitches' ist in unserem Fall überflüssig. Ich halte diesen hier unnötigen Schritt aber nicht für performance-kritisch.
'bottom-top-notes' gibt nur eine Liste von Noten zurück keine fertige Musik. Das hat den Vorteil, dass die Musikfunktion 'extrema', je nach Eingabe ({} oder <<>> oder <>) entscheidet was tatsächlich erscheint.
Ein optionales Argument dient der Möglichkeit nur den höchsten oder tiefsten Ton darzustellen.

HTH,
  Harm
#29
Fragen und Probleme aller Art / re: Ambitus feststellen? [gelö...
Letzter Beitrag von ingmar - Sonntag, 3. Mai 2026, 12:11
Ah, so geht das! : - )

Statt 'SequentialMusic nehmen wir 'EventChord. Ich hatte die ganze Doku nach "SequentialMusic" durchsucht, in der Hoffnung, dort irgendeinen Hinweis zu finden, aber Pustekuchen..

Danke für deine Hilfe, Manuela. – Ich werde jetzt wohl klarkommen.

Gruß,
--ingmar
#30
Fragen und Probleme aller Art / Antw:Ambitus feststellen?
Letzter Beitrag von Manuela - Sonntag, 3. Mai 2026, 06:58
Ich habe dieses kleine Programm gefunden, das aus einer Liste Akkorde macht. Momentan habe ich keine Zeit, vielleicht kannst du was damit anfangen
#(define (pitches->chord plist)
   (make-music
    'EventChord 'elements
    (if (list? plist)
        (map (lambda (p)
               (make-music
                'NoteEvent 'duration (ly:make-duration 0)
                'pitch p))
             plist)
        (make-music
         'NoteEvent 'duration (ly:make-duration 0)
         'pitch plist)
        )))

Update: Es ging anhand des Beispiels gar nicht so schwer, einen Akkord aus den Noten zu machen. Ich habe das Programm so erweitert, dass man die Notendauer des Akkords als Parameter eingeben kann.

\version "2.26.0"

myambitus =
#(define-music-function (mus dur)(ly:music? integer?)
   (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
     'EventChord 'elements
     (list
      (make-music
       'NoteEvent
       'duration
       (ly:make-duration dur)
       'pitch
       tief)
      (make-music
       'NoteEvent
       'pitch
       hoch
       'duration
       (ly:make-duration dur))))
    ))

mymus = \relative { c' c f,, }
{ \clef bass \myambitus \mymus #3 }

Und hier noch eine Variante, wo man eine Lilypond-Notendauer als Parameter eingibt (und nicht einen Zahlenwert)

\version "2.26.0"

myambitus =
#(define-music-function (mus dur)(ly:music? ly:duration?)
   (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
     'EventChord 'elements
     (list
      (make-music
       'NoteEvent
       'duration
       dur
       'pitch
       tief)
      (make-music
       'NoteEvent
       'pitch
       hoch
       'duration
       dur)))
    ))

mymus = \relative { c' c f,, }
{ \clef bass \myambitus \mymus #(ly:make-duration 0) }
{ \clef bass \myambitus \transpose c e \mymus 2. }