Autor Thema: event function mit leerem Rückgabewert  (Gelesen 1792 mal)

fugenkomponist

  • Member
event function mit leerem Rückgabewert
« am: Samstag, 22. August 2015, 00:08 »
Hallo,

ich hätte gerne eine event function, die mal ein TextScriptEvent zurückgibt, mal nichts. Geht das und wenn ja, was ist „nichts“ bei events? Eine music function kann ja die halbwegs leere music expression #{ #} zurückgeben, aber das geht hier natürlich nicht. Mein nächster Versuch '() auch nicht.
\version "2.19.25"

comment =
#(define-event-function (text) (string?)
   (if (ly:get-option 'point-and-click)
       (make-music 'TextScriptEvent
         'text text)
       '()))

{ c'1 \comment "bla" }

Edit: Es gibt ein post-event namens PostEvents. Das ist mit dem folgenden schönen Kommentar versehen: „Container for several postevents. This can be used to package several events into a single one.  Should not be seen outside of the parser.“ Klingt also, als sollte/dürfte ich das nicht verwenden und es könnte was kaputt gehen, oder? Sonst wär das nämlich ganz einfach: (make-music 'PostEvents) zurückgeben. Aber vielleicht gibts ja noch eine bessere Variante?
« Letzte Änderung: Samstag, 22. August 2015, 00:29 von fugenkomponist »

harm6

  • Member
Re: event function mit leerem Rückgabewert
« Antwort #1 am: Samstag, 22. August 2015, 16:01 »
Ich hätte kein Problem damit
(make-music 'PostEvents)
zu benutzen.

Bin aber sehr mißtrauisch: Eine Abhängigkeit von point-and-click zu programmieren finde ich befremdlich.


Gruß,
  Harm

fugenkomponist

  • Member
Re: event function mit leerem Rückgabewert
« Antwort #2 am: Sonntag, 23. August 2015, 01:04 »
Danke für deine Antwort. Ich hab auch erst einmal kein Problem damit, solange es funktioniert; ich war mir bloß nicht sicher, wie ich den Kommentar verstehen soll ;)

Ja, ich hab auch ne Weile überlegt, ob ich mir ne eigene Option zulege; aber eigentlich sind alle Sachen, die ich bisher von point-and-click abhängig mache (z. B. farbige Zitate), nur während der Noteneingabe wichtig. Später kann ich die entsprechenden \includes auskommentieren und wenn ich zwischen drin mal die „saubere“ Partitur sehen will, ohne point-and-click kompilieren. Sprich: Der zusätzliche Aufwand einer oder mehrerer zusätzlicher Optionen lohnt sich für mich nicht, auch wenns korrekt wäre.
« Letzte Änderung: Sonntag, 23. August 2015, 01:05 von fugenkomponist »

harm6

  • Member
Re: event function mit leerem Rückgabewert
« Antwort #3 am: Sonntag, 23. August 2015, 16:36 »
Im übrigen sieht mir das so aus als wenn es in Richtung edition-engraver läuft.
Schau mal, ob das was für Dich ist, man muß ja nicht das Rad neu erfinden ...
https://github.com/openlilylib/openlilylib/tree/master/editorial-tools/edition-engraver

Gruß,
  Harm

fugenkomponist

  • Member
Re: event function mit leerem Rückgabewert
« Antwort #4 am: Sonntag, 23. August 2015, 17:18 »
Danke für den Hinweis; es geht aber nicht in die Richtung, ich wollte bloß „TODO“-Kommentare nicht nur im Code, sondern auch in der Partitur sichtbar haben (um den Kommentar leichter der Musik zuordnen zu können und ihn außerdem nicht zu vergessen). So nach dem Motto „an dieser Stelle gefällt mir die Instrumentierung noch nicht“ oder „das hier ne Oktave höher?“. Ich bin also mit meiner jetzigen Lösung ganz zufrieden, der Output muss ja nicht perfekt sein, sondern hauptsächlich auffällig ;)

Das gehört – wie die meisten Dinge, nach denen ich in letzter Zeit frage – zum Thema „ich will das Komponieren mit LilyPond vereinfachen“.
Das Komponieren ist z. B. auch der Grund, warum ich \replaceQuotes gerne so hätte, dass ich nicht nur in eine Richtung, sondern auch in die andere zitieren kann – gerade gestern hatte ich den Fall „Diese Linie in den Geigen [1./2. im Oktavabstand] könnte ich eigentlich noch mit Flöten doppeln.“ Vl. 2 zitiert Vl. 1 oktaviert, Fl. 1 zitiert Vl. 1, Fl. 2 zitiert Vl. 2; die Flöten stehen aber in der Partitur höher …

Edit: Ich habe jetzt noch eine Lösung gefunden, die kein PostEvents erzeugt; stattdessen definiere ich comment einmal als event- und einmal als void-function, wobei letztere genau nichts tut außer das Argument zu fressen:
\version "2.19.25"

#(if (ly:get-option 'point-and-click)
     (begin
      (define comment-color darkgreen)
      (define comment
        (define-event-function (text) (string?)
          (make-music 'TextScriptEvent
            'tweaks (list (cons 'color comment-color))
            'text text))))
     (define comment
       (define-void-function (text) (string?))))
« Letzte Änderung: Sonntag, 23. August 2015, 17:46 von fugenkomponist »