Neueste Beiträge

#91
Fragen und Probleme aller Art / re: Länge eines Musikstücks?
Letzter Beitrag von ingmar - Samstag, 9. Mai 2026, 20:06
Vielen Dank für deine Arbeit, harm!

Zitat von: harm6 am Samstag,  9. Mai 2026, 14:18Falls Du allerdings Tempoveränderungen wirklich berücksichtigen willst oder auch die Passagen bei denen \unfoldRepeats nicht hinreichend wirkt, so wird es mit Sicherheit erheblich komplexer.

Ich glaube im Moment nicht, dass das die Mühe wert ist. Erst mal will ich deinen Code zum Laufen kriegen, stolpre aber doch über einen Fehler:

Starting lilypond 2.24.3 [book_forum(adapted).ly]...

Analysieren...ERROR: In procedure %resolve-variable:
Unbound variable: musicLength
Exited with return code 1.
#92
Fragen und Probleme aller Art / Antw:Länge eines Musikstücks?
Letzter Beitrag von harm6 - Samstag, 9. Mai 2026, 14:18
Hallo ingmar :)

für den Anfang:
#(define all-music
  ;; Collect and list relevant music
  (list musicA musicB musicC musicD))
 
#(define (all-unfolded-music music-list)
  ;; Unfold all music in MUSIC-LIST
  (map unfoldRepeats music-list))
 
#(define (all-music-lengths-list music-list)
  ;; Return a list of all lengths of the elements of MUSIC-LIST
  ;; as a list of moments.
  (map musicLength (all-unfolded-music music-list)))
 
#(define (certain-durations-amount music-list duration)
  ;; Return a list with the amount of multiples of DURATION for each element
  ;; of MUSIC-LIST
  (map
    (lambda (l)
      (ly:moment-main (/ l (ly:duration->number duration))))
  (all-music-lengths-list music-list)))
 

 
output =
#(define-scheme-function (music-list dur)(list? ly:duration?)
  ;; Return a formated markup expressing how many multiples of DURATION each
  ;; element of MUSIC-LIST contains. These element are counted: 1, 2, 3, ...
  (let* ((amounts (certain-durations-amount music-list dur)))
    #{
      \markup
        \column
          #(map
            (lambda (i p)
              (format #f "Musik #~a dauert wie ~a Noten der Länge ~a"
                i
                p
                (/ 1 (ly:duration->number dur))))
            (iota (length amounts) 1) amounts)
    #}))
   
\markup \output #all-music ##{ 4 #}

Falls Du allerdings Tempoveränderungen wirklich berücksichtigen willst oder auch die Passagen bei denen \unfoldRepeats nicht hinreichend wirkt, so wird es mit Sicherheit erheblich komplexer. Eventuell muss man auch komplett anders vorgehen.

Gruß,
  Harm
#93
Fragen und Probleme aller Art / Länge eines Musikstücks? [gelö...
Letzter Beitrag von ingmar - Samstag, 9. Mai 2026, 11:19
Bei der Vorbereitung eines Konzerts entsteht oft die Frage: Wie lang dauert eigentlich dieses oder jenes Stück? Da gibt es immer zwei Möglichkeiten: Einmal durchspielen (aber dann auf keinen Fall abbrechen...) oder ausrechnen – wenn man das Tempo weiß und die Länge kennt. Die Musik, mit der ich zu tun habe, hat keine echten Tempoänderungen, aber doch immer mal wieder Taktwechsel.

Ich stelle mir daher immer oft eine scheme-Funktion vor, der ich eine Voice oder einen Staff übergebe und die mir dessen Länge, am einfachsten wohl in Viertelnoten, zurückliefert. Dazu müsste sie einfach alle Noten und Pausen (und Spaces s1, s2, s4,...) zusammenzählen.

Tempoänderungen würd ich erstmal ignorieren – man könnte sie später durchaus noch berücksichtigen, so weit sie durch das Verhältnis zum Grundtempo definiert sind (ich muss erstmal schauen, wie ich das in meinen Partituren bisher gehandhabt habe). Aber ich denke, das kann später dazukommen, wenn es jemandem fehlt.

Und dann, natürlich, Wiederholungen (\repeat volta 2). Da sie nun dastehen, sollten sie per default wohl auch berücksichtigt werden (soll heißen, zweimal gezählt werden). Das ist natürlich nicht ganz trivial, bedenkt man die vielen Möglichkeiten mit \alternative, Dal Segno, Repeat unfold usw. Also entweder doch erstmal Wiederholungen ganz ignorieren (das ist OK, denn viele der Stücke mit Wiederholungen sind Tanzsätze, die sich schnell von Hand auszählen lassen). Oder, da \midi das Thema ja konsequent und richtig behandelt, sich irgendwie darauf stützen.

Da Manuela (sorry - zuerst hatte ich hier "Michaela" geschrieben. Hab es hier korrigiert, ist mir aber trotzdem peinlich...) vor kurzem schon ein Beispiel gegeben hat für das Durchgehen Note für Note, fehlt mir für eine erste Fassung eigentlich nur das Stück Code, das die Länge der Note/Pause liefert und eventuell für das Aufaddieren.

Kann jemand weiterhelfen? : - )

Danke! – und Gruß,
--ingmar


Codebeispiel:
\version "2.24.3"

musicA = \relative { % Length = 48
    c'4 d e f g2 g
    a4 a a a g1
    f4 f f f e2 e
    d4 d d d c e g2
    f4 f f f e2 e
    d4 d d d c1 }

musicB = \relative { % Length = 49
    \time 3/4
    R2. *2
    c'4 c d
    b4. c8 d4
    e4 e f
    e4. d8 c4
    d4 c b
    c4 c8 d e f
   
    g4 g g
    g4. f8 e4
    f4 f f
    f4. e8 d4
    e4 f8 e d c
    \time 4/4 
    e4. f8 g4 r\fermata
    \time 3/4 
    a8 f e4 d
    c2 r4
    \bar "|." }

musicC = \relative { % Length = 35
    \time 4/2
    R\breve
    r2 d'' d d
    es2 r d4 es d  c
    b8 c b a g4 r8 a b4 r8 d e4 fis
    g4 g8 fis g4
}

musicD = \relative { % Length including repetition = 328, without repetition (using alternative 2) = 236
    \language "english"
    \time 4/2
    g'2 b4. c8 d4 e d b
    a2 cs d4. d8 d4 d
    cs4( d2) cs4 d2 r
    b2 c4 d c c b b
    a4 a d4. c8 b4 g d'2

    r4 a e'4. d8 c4 c b b
    c4. b8 a4 g fs2 r
    g4 g8 g g2 r g4 c8 c
    c4 a b b a2 r
    r1 r2 a

    g4 a b2 a4 b c2
    b1 a2 r
    r1 r2 d4 d8 c
    b4. a8 g4 g fs2 r
    d'4 d8 c b4 b a a g2

    r1 e'2 d4 d
    d2 cs d2. r4
    \repeat volta 2 {
        r4 d2 c b a
        g2 fs4 fs8( g4) fs8 g2
        b4 g a2 g f4 f
        e2 g b4 c2( b4)
        c2 r4 b a c b cs
        d2 r4 d e2 d
        d2 r4 d g2. g,4
        g2 c e2. e4
        d2. d4 c b c c
        b4 g a2 r b
        a2 g a2. a4
    }
    \alternative {
        { g2. r4 }
        { g2. g4 a a g f g1\fermata }
    }
    \bar "||"
}


lengthA = "99" % \length \of \musicA \...

\markup "A – Länge in Vierteln:"
\markup \lengthA

(EDIT: Doppelten Satz entfernt.)
#94
Fragen und Probleme aller Art / Antw:Ambitus feststellen? [gel...
Letzter Beitrag von harm6 - Dienstag, 5. Mai 2026, 21:55
Zitat von: ingmar am 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


Ich hatte deinen verlinkten post früher schon gelesen, aber nicht recht verstanden. Ich hoffe das jetzt erreicht zu haben.

Mir will scheinen, das du eigentlich gar nichts gegen den Ambitus hast, so wie er momentan implementiert ist. Aber du wünschst dir eine ähnlich gelagerte Funktionalität mit anderem/breiteren Anwendungsmöglichkeiten.

Wenn wir das weiter diskutieren wollen sollten wir aber einen neuen thread aufmachen...

Gruß,
  Harm
#95
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
#96
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
#97
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
#98
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

#99
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
#100
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