Autor Thema: Multiplikation zweier Werte - zwei Zahlen mutliplizieren  (Gelesen 2435 mal)

MaestroGlanz

  • Member
Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« 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
 

fugenkomponist

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #1 am: Donnerstag, 21. April 2016, 14:54 »
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.
Zitat
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.

MaestroGlanz

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #2 am: Donnerstag, 21. April 2016, 16:08 »
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.

harm6

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #3 am: Donnerstag, 21. April 2016, 22:52 »
Zitat
Er weigert sich das dann bei paper-height zu akzeptieren.
Ohne zu wissen was Du gemacht hast kann niemand einen Verbesserungsvorsschlag unterbreiten.

Zitat
Allgemein scheint die Definition von Längen hier nicht zu stimmen.
Keine Ahnung wovon Du sprichst.

Zitat
Wo kann man denn so etwas nachlesen?
Was ist "etwas"?

MaestroGlanz

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #4 am: Freitag, 22. April 2016, 19:22 »
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.

fugenkomponist

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #5 am: Freitag, 22. April 2016, 22:23 »
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 = 15
pt 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.
« Letzte Änderung: Freitag, 22. April 2016, 22:27 von fugenkomponist »

fugenkomponist

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #6 am: Freitag, 22. April 2016, 22:36 »
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
Offizielle LilyPond-„Erweitern“-Dokumentation
Offizielle Scheme/Guile-Dokumentation in der von LilyPond verwendeten Version 1.8
LilyPond-Quellcode, beinhaltet Definitionen von LilyPonds eigenen Funktionen in Scheme

MaestroGlanz

  • Member
Re: Multiplikation zweier Werte - zwei Zahlen mutliplizieren
« Antwort #7 am: Freitag, 22. April 2016, 22:50 »
Besten Dank, ab hier müsste ich alleine zum Ziel kommen. Macros in Lilypond sind definitiv schwieriger als in Latex.