Deutsches Lilypond Forum (Archiv)
Allgemein => Hilfe beim Einstieg in Lilypond => Thema gestartet von: ingmar am Sonntag, 22. November 2015, 17:13
-
In diesem (https://liarchiv.joonet.de/index.php?topic=2121.0) Thread listet fugenkomponist die wichtigsten Datentypen, die einem im Alltag so begegnen:
boolean? number? string? symbol? integer? list? null? markup? scheme? symbol-list? void? ly:context? ly:duration? ly:event? ly:grob? ly:moment? ly:music? ly:pitch?
...unter den meisten dieser Typen kann ich mir auch durchaus etwas vorstellen. In einigen Fällen wird mir nun auch die Syntax klarer - also der Unterschied zwischen A = { c } (ly:music), A = c (ly:pitch), A = "c" (string). Bis jetzt hätte ich mich nicht getraut, etwa A = c zu schreiben, weil ich vermutet hätte, dass Lilypond versucht, c als Variable aufzulösen. Ich hab also immer string und ly:music ausprobiert, und oft haben beide nicht funktioniert, und ich wusste nicht weiter.
Aber viele weitere Feinheiten bleiben dennoch offen - was ist zum Beispiel der Unterschied zwischen null und void? Oder was sind symbol, ly:event und ly:moment?
In der Notationsreferenz Version A.19 steht die Liste im Anhang A.21, in der Version davor ist es noch Anhang A.20. Aber viel mehr steht dort leider auch nicht. Wo sollte ich weiterlesen?
gruß,
--ingmar
-
null? ist (so wie ich das verstehe) kein richtiges Typprädikat, sondern gibt zurück, ob eine Liste leer ist. Es hat also nichts mit void und auch nicht mit null-Pointern (bekannt aus anderen Sprachen wie C/C++ oder Java) zu tun. Hier die Dokumentation. (https://www.gnu.org/software/guile/docs/docs-1.8/guile-ref/List-Predicates.html#List-Predicates)
Ein Symbol ist so eine Art Name, der nicht aufgelöst wird, geschrieben als 'name (mit '). In LilyPond werden z. B. grob properties so erreicht:
(ly:grob-set-property! meingrob 'color blue)Der Vorteil gegenüber Strings ist die bessere Vergleichbarkeit, weil jedes Symbol nur einmal im Speicher liegt (anders als mehrere verschiedene Strings mit gleichem Inhalt). Hier die Dokumentation, die das noch viel ausführlicher erklärt. (https://www.gnu.org/software/guile/docs/docs-1.8/guile-ref/Symbols.html#Symbols)
ly:event? ist ein PostEvent, z. B. #{ -. #} (ArticulationEvent als Staccato). Man kann nicht nur Musikfunktionen schreiben (per define-music-function), die ly:music? zurückgeben, sondern eben auch Eventfunktionen (z. B. eine Funktion pizz, die ein TextScript setzt und per c\pizz aufgerufen wird).
ly:moment? ist ein Zeitpunkt (manchmal auch eine Zeitdauer, weshalb ich nicht ganz versteh, wozu es ly:duration gibt). So sind z. B. measureLength und measurePosition beide vom Typ ly:moment?.
Ne ausführlichere Dokumentation hab ich bisher auch nicht gefunden. Für die Scheme-eigenen Datentypen kann man halt in die oben verlinkte Dokumentation schauen, LilyPond-Datentypen hab ich einfach irgendwie mit der Zeit kennengelernt. (Mir ist aber z. B. immer noch nicht klar, was ein ly:prob? ist …)
-
Noch eine andere Frage im Zusammenhang damit. Ein leerer String sieht ja so aus: "". Wie würde ein leerer musikalischer Ausdruck aussehen (d.h. einer, der keine Wirkung hat)? Ich brauche das manchmal. Aber { } führt bei mir immer zu Fehlern.
--ingmar
-
Aber { } führt bei mir immer zu Fehlern.
Hast du mal ein Beispiel? Folgendes funktioniert z. B. nämlich einwandfrei:\version "2.19.33"
leer = { }
\relative {
c' d \leer e f
}
-
Ja, das war wieder ein Fall von Suchen - Suchen - Suchen - Im Forum fragen - Lösung kommt von alleine.
Du hast recht, es funktioniert wunderbar. Mein Fehler war gewesen, den Ausdruck { } innerhalb von Scheme zu verwenden, und das war natürlich falsch. Es hätte #{ #} sein müssen.
Danke, Gruß,
--ingmar
-
Oder auch:
(make-music 'Music)
Gruß,
Harm
-
harm6:Oder auch:
(make-music 'Music)
Danke, das vervollständigt das Bild.
Aber im Ernst würde ich immer #{ #} verwenden, weil da jeder sofort sieht, was gemeint ist. Mit mehr Scheme-Hintergrund würde ich das vielleicht anders sehen, aber heute ziehe ich die leeren Klammern vor.
Gruß,
--ingmar
-
Ergänzend lässt sich vielleicht noch sagen, dass
(make-music 'Music)
und
#{ #}
in Scheme tatsächlich äquivalent sind.
{ }
in LilyPond (nicht Scheme) dagegen ist SequentialMusic, um genau zu sein
(make-music 'SequentialMusic 'elements '())
In Scheme kriegt man den per
#{ { } #}
Falls das jetzt zu unübersichtlich war: Einfach mal die Ausgabe des folgenden Codes anschauen ;)\version "2.19.33"
\displayMusic #(make-music 'Music)
\displayMusic ##{ #}
\displayMusic { }
\displayMusic ##{ { } #}
Edit: Das war mir auch neu, wieder was gelernt :)