Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: MaestroGlanz am Donnerstag, 21. April 2016, 12:38
-
Ich bin ein Lilypond-Neuling und versuche gerade einfach nur zwei Zahlenwerte zu multiplizieren:
systemhoehe = 15pt
customratio = 1.5
seitenhoehe = (systemhoehe * customratio)
\paper{
%darum gehts:
paper-height = seitenhoehe
%Beiwerk:
indent=0\mm
oddFooterMarkup=##f
evenFooterMarkup=##f
oddHeaderMarkup=##f
evenHeaderMarkup = ##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f
print-page-number = ##f
left-margin = 0
right-margin = 0
top-margin = 0
bottom-margin = 0
-
systemhoehe = 15pt
Das ist keine gültige Zuweising. Grad keine Zeit, es auszuprobieren, aber 15\pt (mit Backslash) dürfte gehen, zumindest im \paper-Block.
seitenhoehe = (systemhoehe * customratio)
Für sowas verwendet LilyPond Scheme; da sähe diese Multiplikation dann folgendermaßen aus:
seitenhoehe = #(* systemhoehe customration)
Bin mir aber nicht sicher, ob das mit Längenangaben wie bei systemhoehe geht oder nur mit „einfachen Zahlen“. Heute Abend kann ich da nochmal draufschauen und rumprobieren, falls dies noch nicht dein Problem löst.
Ach ja, bitte gib immer deine verwendete LilyPond-Version an.
-
Er weigert sich das dann bei paper-height zu akzeptieren.
Allgemein scheint die Definition von Längen hier nicht zu stimmen.
Version ist "2.18.2"
Wo kann man denn so etwas nachlesen? Weil in der LilyPond – Notationsreferenz hab ich nicht viel hilfreiches gefunden.
-
Er weigert sich das dann bei paper-height zu akzeptieren.
Ohne zu wissen was Du gemacht hast kann niemand einen Verbesserungsvorsschlag unterbreiten.
Allgemein scheint die Definition von Längen hier nicht zu stimmen.
Keine Ahnung wovon Du sprichst.
Wo kann man denn so etwas nachlesen?
Was ist "etwas"?
-
Sorry für die unklaren Angaben. Hier erst mal mein Code (MnWE):
\paper {
#(define notengroesse 20)
#(define verhaeltnis 2)
% #(define (intToLength a) (a\pt)) %war ein Versuch
%set all margins
indent=0\mm
left-margin = 0\mm
right-margin = 0\mm
top-margin = -6\pt
bottom-margin = 0\mm
paper-height = #(* (*notengroesse vehaeltnis) (1\pt))
% paper-height = #(intToLength (*notengroesse vehaeltnis)) %Alternativvariante
paper-width = 300\pt
print-page-number = ##f
}
#(set-global-staff-size 20) %da soll später auch die Variable notengroesse rein. Das funktioniert im Übrigen nämlich auch nicht.
\repeat unfold 15 { c'4 c' c' c' }
Das meiste hab ich mir mit viel Mühe ergoogelt, aber ohne große Früchte bisher. Mit "etwas nachlesen" hab ich eine Einführung in die Macroprogrammierung in lilypond gemeint.
-
Ok, das hilft schon mal viel weiter ;) Statt #(define foo bar) kann man auch einfach foo = bar schreiben, zumindest für einfache Zahlen gar kein Problem. Damit ergibt sich einfach
notengroesse = 20
verhaeltnis = 15pt ist eine Variable (definiert in der Datei ly/paper-defaults-init.ly) , die in LilyPond wie alle anderen Variablen und Funktionen mit Backslash aufgerufen wird. In Scheme brauchst du diesen Backslash nicht; außerdem handelt es sich um eine Zahl (siehe Edit unten), eine Multiplikation ist also tatsächlich möglich. Du kannst also einfach
paper-height = #(* (* notengroesse verhaeltnis) pt)oder kürzer
paper-height = #(* notengroesse verhaeltnis pt)schreiben. Die Funktion * (Multiplikation) kann in Scheme beliebig viele Argumente bekommen.
#(set-global-staff-size notengroesse)funktioniert tatsächlich, aber nur, wenn notengroesse bekannt ist. Du hattest es im \paper-Block definiert, deshalb galt es außerhalb nicht. Abhilfe: Die Definition vor den \paper-Block schreiben.
Insgesamt ergibt sich (mal alles hierfür unwesentliche rausgekürzt):
\version "2.18.2"
notengroesse = 20
verhaeltnis = 15
\paper {
paper-height = #(* notengroesse verhaeltnis pt)
}
#(set-global-staff-size notengroesse)
\repeat unfold 15 { c'4 c' c' c' }
Edit:
Anscheinend wird im \paper-Block in mm gerechnet. \mm hat also den Wert 1, \pt nen entsprechend kleineren. Das kannst du dir auch per
#(begin
(display mm)
(newline)
(display pt))(im \paper-Block, außerhalb sind die Variablen mm und pt nicht bekannt) anzeigen lassen.
-
Das meiste hab ich mir mit viel Mühe ergoogelt, aber ohne große Früchte bisher. Mit "etwas nachlesen" hab ich eine Einführung in die Macroprogrammierung in lilypond gemeint.
Vielleicht ist hier was für dich dabei:
Scheme-in-LilyPond-Tutorials im LilyPond-Blog (http://lilypondblog.org/category/using-lilypond/advanced/scheme-tutorials/)
Offizielle LilyPond-„Erweitern“-Dokumentation (http://lilypond.org/doc/v2.18/Documentation/extending/index.de.html)
Offizielle Scheme/Guile-Dokumentation in der von LilyPond verwendeten Version 1.8 (https://www.gnu.org/software/guile/docs/docs-1.8/guile-ref/)
LilyPond-Quellcode, beinhaltet Definitionen von LilyPonds eigenen Funktionen in Scheme (http://lilypond.org/source.de.html)
-
Besten Dank, ab hier müsste ich alleine zum Ziel kommen. Macros in Lilypond sind definitiv schwieriger als in Latex.