Autor Thema: make-engraver  (Gelesen 1710 mal)

Manuela

  • Member
make-engraver
« am: Dienstag, 30. August 2016, 17:21 »
Hi,

Lilypond überrascht mich immer wieder  ;)

Beim Stöbern im Forum bin ich auf folgenden Thread gestoßen: Indexnummer eines Staff

der folgenden Code enthält

\version "2.19.37"

\layout {
  \context {
    \Voice
    \consists
    #(let ((notes '()))
       (make-engraver
        (listeners
         ((note-event engraver event)
          (set! notes (cons event notes))))
        ((finalize engraver)
         (write-me "\nHow-many-notes? " (length notes))
         (set! notes '()))))
  }
}

\score {
  \new Staff \repeat unfold 13 c''1
}


was ich sehr interessant finde. Nun frage ich mich, wie ich es anstellen muss, um auf die Eigenschaft dieses Engravers zuzugreifen, z.B. mitten im Staff die aktuelle Notenzahl abfragen? Wahrscheinlich geht es eh ganz einfach, und ich stehe wieder mal auf der Seife...

Arnold

  • Member
Re: make-engraver
« Antwort #1 am: Mittwoch, 31. August 2016, 10:57 »
Hallo Manuela,

wenn Du Dir den »Engraver« als »Arbeiter (-Programm)« vorstellest, dann ist es der Engraver, welcher die "Events" einsammelt und die »Kontexte« befragt oder bearbeitet - und so quasi nebenbei kann er auch noch seiner »Hauptaufgabe« nachgehen und Grobs erstellen (und diese anderen Engravern zur Kenntnis senden).

Demnach kann z. Bsp. ein Engraver (im Staff-Kontext für die Notenzeile, ...) alle Note-Events registrieren und intern zählen. Nur eine SMS wird er schwerlich senden können, wenn der einmilionste Note-Event erschienen ist.

Also, Manuela, würdest Du bitte noch genauer beschreiben, welche »Aktionen« Dir vorschweben (und wann diese der Engraver ausführen soll).

Arnold

Manuela

  • Member
Re: make-engraver
« Antwort #2 am: Mittwoch, 31. August 2016, 13:04 »
Demnach kann z. Bsp. ein Engraver (im Staff-Kontext für die Notenzeile, ...) alle Note-Events registrieren und intern zählen. Nur eine SMS wird er schwerlich senden können, wenn der einmilionste Note-Event erschienen ist.

Eine SMS wäre lustig  ;)

Was mir vorschwebt wäre ungefähr dies:

\version "2.19.37"

\layout {
  \context {
    \Voice
    \consists
    #(let ((notes '()))
       (make-engraver
        (listeners
         ((note-event engraver event)
          (set! notes (cons event notes))))
        ((finalize engraver)
         (write-me "\nHow-many-notes? " (length notes))
         (set! notes '()))))
  }
}

\score {
  \new Staff { \repeat unfold 13 c''1
  #(write-me "How-many-notes?"  notecounterengraver.number)
  \repeat unfold 10 d1
  #(write-me "How-many-notes? "  notecounterengraver.number)
...usw
}


Ich hoffe, es ist jetzt etwas klarer, was ich meine.