Länge eines Musikstücks? [gelöst]

Begonnen von ingmar, Samstag, 9. Mai 2026, 11:19

Vorheriges Thema - Nächstes Thema

harm6

Ich habe `output` noch kürzen können:
#(use-modules (lily display-lily))

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
        \override #'(baseline-skip . 3)
        \column
          #(map
            (lambda (i p)
              (format #f "Musik #~a dauert wie ~a Noten der Länge \"~a\""
                i
                (if (integer? p)
                    p
                    (format #f "~a (gerundet)"
                      (exact->inexact (/ (round (* p 100)) 100))))
                (duration->lily-string dur)))
            (iota (length amounts) 1) amounts)
    #}))
Gerundet aber drin gelassen ;)

Gruß,
  Harm

harm6

Zitat von: ingmarWeil, ich denke schon länger darüber nach, dass LilyPond wie wohl kein anderes "Notenschreibprogramm" viel mehr kann als Noten schreiben. Man könnte zum Beispiel richtige Statistik betreiben,

Manches davon würde mit einem engraver besser gehen als mit einer function, zumindest um sich Statistik anzeigen zu lassen.
Wir haben ja bereits event-listener.ly
https://lilypond.org/doc/v2.24/Documentation/notation-big-page#saving-music-events-to-a-file
Schon mal versucht?

Gruß,
  Harm

ingmar


ingmar

#18
Also, harms Code funktioniert, und ich hatte schon vor zwei Wochen oder sowas "gelöst" an den Titel geschrieben. Danke nochmal!

Aber wenn ich ganz ehrlich bin: Ich hatte mir gewünscht, einfach eine Zahl geliefert zu bekommen, kein Markup. Denn ich möchte das Ergebnis selbst in mein eigenes Markup einbauen. Ich hab mich einen Abend lang daran versucht, die schön verpackte Zahl wieder auszuziehen, sozusagen, aber dabei hab ich doch immer wieder seltsame Fehler produziert, bis ichs dann fürs erste aufgesteckt habe.

Ich denke eigentlich, dass ich sowas Einfaches hinkriegen müsste und werd mich dann gelegentlich nochmal mit neuem Mut drangeben...

Meinen Use Case hatte ich anfangs beschrieben: Die Aufführungsdauer ausrechnen. Bei sowas kommt es aber nicht auf Nachkommastellen an, ein vereinbartes Tempo wird weder präzise getroffen noch ohne Schwankungen gehalten, und hinzu kommen die Details der Schlussgestaltung: Ritardando? Fermate? Raumnachhall? – Runden oder Nichtrunden sind daher in meinen Zusammenhängen doch ein wenig akademisch..

Gruß, danke,
--ingmar


Manuela

Wäre dir mit dem folgenden Code geholfen, Ingmar?

\version "2.26.0"

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 "||"
}

allemeinemusic = {
  \unfoldRepeats {
    \musicA \musicB \musicC \musicD
  }
}

#(define (mus-dauer mus duration)
   (let* ((l (ly:music-length mus))
          (dauer (if (string<? "2.24.4" (lilypond-version))
                     (ly:moment-main (/ l (ly:duration->number duration)))
                     (ly:moment-main (ly:moment-div l (ly:duration-length duration)))))
          )
     (write-me "Dauer ------------------> " dauer)
     (write-me "Basis ------------------> " duration)
     dauer
     ))

\markup #(ly:number->string (mus-dauer allemeinemusic #{ 8 #} ))

Das Markup am Schluss nur zur Verdeutlichung des Ergebnisses, man könnte noch einbauen, wie lange eine Note dauern sollte beim vorgegebenen Tempo, dann könnte man die Zeitdauer ausrechnen
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

So, ich habe es mit meinen beschränkten Scheme-Kenntnissen geschafft, die Minuten auszurechnen, wenn man die Zahl der Schläge pro Minute vorgibt.

Die Definitionen sind die gleichen wie im darüber stehenden Post, die wiederhole ich nicht nochmal.


#(define (mus-zeit mus duration beat)
   (let* ((l (ly:music-length mus))
          (dauer (if (string<? "2.24.4" (lilypond-version))
                     (ly:moment-main (/ l (ly:duration->number duration)))
                     (ly:moment-main (ly:moment-div l (ly:duration-length duration)))))
          (minuten  (exact->inexact (/ dauer beat)))
          )
     (write-me "Dauer ------------------> " dauer)
     (write-me "Basis ------------------> " duration)
     (write-me "Minuten ----------------> " minuten)
     minuten
     ))

\markup \concat {
  "Die Musik dauert "
  #(ly:number->string (mus-zeit allemeinemusic #{ 4 #} 120 ))
  " Minuten"
}
Danke für eure Hilfe
viele Grüße
-- Manuela

ingmar