Allgemein > Allgemeine Diskussion

Lilypond und Musikanalyse

(1/2) > >>

ewipond:
Hallo allerseits!

Ich wollte mal fragen, ob man Lilypond dazu überreden kann, neben dem Notenausdruck auch statistische Angaben über das verwendete Notenmaterial anzugeben.(möglicherweise in einer extra-datei). Also z.B eine Liste der Noten/Pausen mit den dazugehörenden rythmischen Positionen oder der Grad der Polyphonie zu einem bestimmen Zeitpunkt usw. Das wäre für viele Aspekte einer Musikanalyse ganz schön hilfreich.

Ich weiß, dass es die Funktion \displayMusic gibt, die die ganze Noteneingabe strukturiert in der console darstellt, aber es ist mir leider nicht gelungen, das Prinzip dahinter zu durchschauen (es gibt da ziemlich viele Klammern).

Vieleicht gibt es schon vorhandene interne Funktionen, die eh schon eine Auflistung des Materials machen, die man aufrufen kann???

Einen schönen Tag noch!

ewipond:
Reinhold Kainhofer hat eine mega-clevere Lösung entwickelt:
Man kann offenbar eigene engraver schreiben, die zwar nichts an der Partitur ändern, dafür aber bestimmte Informationen an die Console senden!



--- Zitat ---Thanks to Han-Wen's new scheme engraver possibilities, you can now implement
your own engraver (in this case it's simply a listener) in Scheme, which just
listens for all note and rest events and prints them out to the console as
they are caught (they are already in the correct time order)...

Attached is a simple example (actually just the regtest stripped down a little
and adjusted where needed), where I don't bother to nicely format the
duration/pitch. Currently, the duration/pitch is simply dumped as it is. In
your case, you probably want to print it out in a format that can be read into
your favorite statistics program. I'll leave that up to you ;-)

Cheers,
Reinhold

PS: Wouldn't it be great to have a simple statistics engraver, which only
counts how many notes, rests, articulations, etc. a score has?

--- Ende Zitat ---

und hier der Code:

--- Code: ---\version "2.13.11"

%%%% Helper functions, which simply print out the observed rest/note events
%%%% in a nice format:
#(define (format-rest engraver event)
  (let* ((context (ly:translator-context engraver))
         (moment (ly:context-current-moment context))
         (duration (ly:event-property event 'duration)))
    ; TODO: Format the duration and the moment
    (ly:message "REST event of duration ~a at ~a\n" duration moment)
    ; or dump the whole event to see what information is available:
    ; (ly:message "REST event at ~a: ~a\n" moment event)
  )
)

#(define (format-note engraver event)
  (let* ((context (ly:translator-context engraver))
         (moment (ly:context-current-moment context))
         (duration (ly:event-property event 'duration))
         (pitch (ly:event-property event 'pitch)))
    ; TODO: Format the duration, pitch and the moment
    (ly:message "NOTE event of duration ~a, pitch ~a at ~a\n" duration pitch moment)
    ; or dump the whole event to see what information is available:
    ; (ly:message "NOTE event at ~a: ~a\n" moment event)
  )
)


%%%% The actual engraver definition: We just install some listeners so we
%%%% are notified about all notes and rests. We don't create any grobs or
%%%% change any settings.

\layout {
  \context {
    % I add this to the score, so all voices are caught. You can also only add
    % the engraver to selected voices to get the statistics split down.
    \Score
    \consists
    #(list
      (cons 'listeners
       (list
        (cons 'rest-event format-rest)
        (cons 'note-event format-note)
       ))
    )
  }
}


\relative c' {
  c8[ r c]
}


--- Ende Code ---


Grüße

ewipond:
Nachtrag: nachzulesen in der mailing-list unter "scheme-function to export a note-list?"

RobUr:
Hallo ewipond,

herzlichen Dank für die Beiträge! Ich war kürzlich selbst über Reinholds Mailing gestolpert und dachte so beim Überfliegen, dass es bei deinem Problem helfen könnte. Ich war nur gerade auf der Jagd nach einer Lösung für ein anderes Problem, wobei ich Posts, die 2.13.x betreffen, momentan noch eher unbewusst hintenan stelle …

Womöglich kann dir folgendes eventuell eine Zusatzhilfe sein: du kannst die Terminalausgabe selbstverständlich in eine Datei umleiten, um sie dann in Ruhe zu betrachten, ohne aus Versehen das Konsolenfenster zu schließen. Ruf’ Lily auf der Konsole (oder per Script) mit dem Parameter -dlogfile=dateiname auf, also z.B.

--- Code: ---lilypond -dlogfile=analyse B-A-C-H.ly
=> erstellt "analyse.log", "B-A-C-H.ps" und "B-A-C-H.pdf"
– – – – – – – – – –
lilypond -dlogfile=analyse.log B-A-C-H.ly
=> erstellt "analyse.log.log", "B-A-C-H.ps" und "B-A-C-H.pdf"

--- Ende Code ---
In diesem Fall wird gleichzeitig die Terminalausgabe unterdrückt. Viele weitere Parameter anzeigen lassen mit: lilypond -help oder lilypond -dhelp

Wichtig zu wissen ist aber in jedem Fall die Möglichkeit, künftig eigene Engraver in Scheme schreiben zu können – sofern man damit vertraut ist. Ich bin darin nicht wirklich firm, aber es ergeben sich daraus völlig neue Ansätze, und Lilys „Umfang des Machbaren“ potenziert sich mit einem Mal! Ich werde wohl etwas mehr Zeit in scheme programming investieren müssen ;)  – dann nutzbar aber erst ab v2.14.

Grüße, Robert

ewipond:
Hallo Robert,

ja danke für den Tipp, ich hatte mich schon mit Unix rumgeschlagen( ohne davon wirklich Ahnung zu haben). Es würde gehen mit:

2>&1 | tee filename.txt
(inclusive terminal text)

>& filename.txt
(ohne terminal text)
beide nach lilypond  datei.ly

ist aber natürlich so viel praktischer.(mit Bindestrich zwischen -dlog und file.).

Der engraver ist wirklich super und läßt sich ohne Probleme erweitern, ich habe ihn z.B auf tie-events angesetzt - das geht prima. Das Beste ist, daß er zu jedem Event die aktuelle Score Position mitgeliefert - das war ja das größte Problem und zudem gibt es eine Unterscheidung zwischen normalen- und grace-notes.
Als nächstes werde ich die Infos formatieren und in python weiterverarbeiten.
Mal schauen was dabei rauskommt...

schönen Abend noch
Ewald

PS.: was ist denn mit den \paper formatierungen in 2.13 (after-title-space und so). Die sind wohl verschütt gegangen bis 2.14?

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln