\global - Variable redundant??? :: GELÖST

Begonnen von coach@iKhwaya, Sonntag, 17. Mai 2020, 00:08

« vorheriges - nächstes »

coach@iKhwaya

Hallo ihr Lilienteichler!


\version "2.21.1"
\paper {
top-margin = 20

}
\include "Ressourcen.ly"

\header {
      title = \markup \column { "Non Rien" \vspace #1 }
      subtitle = \markup \column { "Band part" \vspace #1 }
      opus = \markup \column { "frei nach den 'Poppys'" \vspace #1 }
      copyright = "Copyright 2020 by Robert Dusemund and iKhwaya the Singing Band"
    }

global = {
  \time 4/4
  \key c \major
  \tempo 4=144
}

chordNames =  {
  \global
r1 r1 \FourBarRest \Akk_Refrain
}

rhodes = {

  \global <== redundant oder nicht?

r1 r1\Intro \Intro \Kb_Refrain \Kb_VerseB \Kb_Refrain \Kb_VerseB \Kb_Refrain \Intro \Intro \Kb_Refrain \Kb_Refrain \Outro
}



Das sollte meine Frage eigentlich erklären.

Und am Fuß fand ich noch das:


\layout { }
  \midi { }
  tempo 4= 100 <== widerspricht der Tempo-Angabe unter \global
}

Die Datei wird ohne Fehler kompiliert... ich bin nun etwas verwirrt...

ingmar

Zitat von: coach@iKhwaya am Sonntag, 17. Mai 2020, 00:08
Das sollte meine Frage eigentlich erklären.
Nö, tuts nicht. Das ist ein Codefragment plus einige unterschwellige, nicht ausgesprochene Vermutungen. Ein Minimalbeispiel ist es jedenfalls nicht.

Was findest du daran verwirrend?

Eine Variable wird definiert, zweimal in einer anderen Definition verwendet. Wie diese beiden anderen Definitionen dann eingesetzt werden, zeigst du uns allerdings nicht.

Werden sie vielleicht zur Erstellung einer Partitur verwendet? Oder auch für Einzelstimmen? Dann wäre es sehr klug, gleiche Tonarten und Taktarten sicherzustellen. Verwendet man sie beide in einer Partitur, ist die mehrfache Angabe aber auch nicht schädlich. Warum sollte sie?

Aber vielleicht haben diese Sätze gar nichts mit deinem Problem zu tun?

--ingmar

coach@iKhwaya

1. ich hab das "Teil" so gefunden.
2. ich wollte zeigen wo ich auf dieses \global gestoßen bin, und das sind etwa 3% vom Code, dachte das sei minimal genug.

Zur Präzision meiner Fragen: Ist dieses \global also was selbstdefiniertes? Ich dachte das sei eine notwendige Systemvariable, und dachte deshalb auch: warum innerhalb des Codes das noch jedes mal neu aufrufen?

Mit freundlichem Gruß
Robert

ingmar

nein, global ist eine Variable wie jede andere. Viele verwenden diesen Namen gerne; er scheint sich zu einer Art Konvention entwickelt zu haben für die Tempo-, Takt und ähnliche Angaben, die in allen Stimmen gebraucht werden. Ich benutze diesen Namen nie.

Sorry, wenn ich dich da angefahren hab! Aber es war (mir) wirklich nicht nachvollziehbar, wo es bei dir gezuckt hat.

--ingmar

ingmar

#4
Zitat von: coach@iKhwaya am Montag, 18. Mai 2020, 19:36
ich wollte zeigen wo ich auf dieses \global gestoßen bin, und das sind etwa 3% vom Code, dachte das sei minimal genug.
Nein, das ist kein Minimalbeispiel, wie es hier gefragt ist.
1. Oben gibt es eine Definitionen von paper. Da kann man sich denken, dass die nicht notwendig ist. Sowas ist sofort ein Kandidat fürs Weglassen.
2. Ganz Ähnliches gilt für header.
3. Dann kommt ein \include – das heißt, ein externes File wird eingebunden. Wie sich weiter unten zeigt, werden dort vermutlich Variablen definiert wie \Intro \Kb_Refrain \Kb_VerseB \Outro. Ohne die Definitionen dieser Variablen kann die Sache natürlich nicht kompilieren. An dieser Stelle ist dein File also sozusagen "zu minimal".

Also, wie sieht ein solches Minimalbeispiel aus, wonach hier ständig gefragt wird? Es soll dein Problem in knapper Form zeigen – indem alles Unwichtige weggelassen wird, so dass sich jeder dort sofort zurechtfinden kann, und ohne irgendwelche Seiteneffekte von Details, die mit der Sache nichts zu tun haben. Und: Das Beispiel soll kompilieren! Sonst muss ja jeder, der sich damit beschäftigt, erstmal versuchen, den Fehler zu finden. Und jeder einzelne deiner Helfer wieder von Neuem.


Gruß,
--ingmar

Manuela

global = {
  \time 4/4
  \key c \major
  \tempo 4=144
}


ist m.E. kein besonders guter Stil. Warum? Es werden mehrere Definitionsbereiche vermischt.

\key c \major und \time 4/4 betreffen den Context Staff, während \tempo 4=144 im Context Score beheimatet ist.

M.M. nach sollten Variable, die Objekte enthalten, die in unterschiedlichen Contexten beheimatet sind, nicht mehrfach verwendet werden. Es ist zwar kein Fehler, kann jedoch zur Verwirrung führen.

Leider taucht diese unsägliche \global Variable immer wieder in der Dokumentation auf, außerdem stiftet der Name zustätzlich Verwirrung, weil Neulinge aufgrund des Namens glauben, es handelt sich um eine Lilypond-systemweite Definition.
Danke für eure Hilfe
viele Grüße
-- Manuela

Arnold

Hallo coach@iKhawaya,

ich habe zwar noch nicht die Version 2.21.1 bei mir installiert, aber dein »Minimalbeispiel« könnte ich sicher nicht kompilieren!

  • Die Inlucde-Datei »Ressourcen.ly« fehlt dazu.
  • Deine Quelltextkommentare stören, da kein LILYPOND-Kommentar-Zeichen davor steht → %<== (Prozent voranstellen)
  • Ist denn tempo (ohne »\«) richtig? - das steht außerdem sonst im midi-Block und nicht danach
  • Sind paper- und header-Block (bzw. alle Einträge daraus) nötig, um dein Problem aufzuzeigen?
  • Baue ein Beispiel mit möglichst wenig Noten auf! Wann immer möglich in einer einzigen LY-Datei!

Aber jetzt noch Antworten auf das, was Du möglicherweise fragst:

  • Was sich hier global nennt, benenne ich meistens als Head. Um redundante Mehrfachdefinitionen zu vermeiden, sammelt man darin die »Startbedingungen«, welche für alle Einzelstimmen (eines mehrstimmigen Satzes) gelten. Ob man nun mehrere »Köpfe« je Ziel-Kontext definieren soll, die Tonart wegen transponierender Instrumente auch noch separieren soll (oder mittels \tag entfernbar machen soll) überlasse ich der praktischen Erfahrung. Ähnliche Variablen empfehlen sich für alle Tempi- und Tonartwechsel im Stück bzw. Satz. Nur, in der Tat, in einer Akkord-Zeile wirst Du die Festlegung von Tonart und Takt (und Auftakt-Länge) kaum benötigen.
  • Und in der Tat, \tempo im midi-Block als »angepasste Voreinstellung« und dann am Anfang der Stimme (als Überschreibung der Voreinstellung) wäre bei der Suche, wo das MIDI-Tempo zu ändern ist, schon hinderlich.

Arnold

P.S. Wenn Du dich durch das Erstellen eines Minimalbeispiels mit dem Problem auseinandersetzt, also viele Varianten ausprobierst um die Problemstelle einzukreisen, dann wirst Du auch häufig die Lösung selbst finden.

ingmar

Zitat von: Manuela am Dienstag, 19. Mai 2020, 08:14
M.M. nach sollten Variable, die Objekte enthalten, die in unterschiedlichen Contexten beheimatet sind, nicht mehrfach verwendet werden. Es ist zwar kein Fehler, kann jedoch zur Verwirrung führen.

Da bin ich sofort dabei! Vorschlag (ich mache es ähnlich, aber im Detail natürlich doch anders...): Definiere \staffglobals und \scoreglobals.

Gruß an alle,
--ingmar

Manuela

Zitat von: ingmar am Dienstag, 19. Mai 2020, 08:47
Definiere \staffglobals und \scoreglobals.

Hmm, diese Definitionen könnte man dann gleich in einen \layout Abschnitt schreiben und spart sich damit das Einfügen der Variablennamen.

Womit sich wieder einmal zeigt, viele Wege führen nach Rom  ;)
Danke für eure Hilfe
viele Grüße
-- Manuela

coach@iKhwaya

Danke Leute, ich weiß dann bescheid! Minimalbeispiele ohne verwirrende Verwirrungen .. boaaah "Mühsam ernährt sich das Eichhörnchen..." ;) ;D

ingmar

Zitat von: coach@iKhwaya am Dienstag, 19. Mai 2020, 10:16
boaaah "Mühsam ernährt sich das Eichhörnchen..." ;) ;D

Ja, jeder hier kennt das Problem und versteht das. Aber – darauf hatte oben auch Arnold hingewiesen – du wirst sehen: In vielen Fällen klären sich deine Fragen schon von selbst beim Erstellen des Minimalbeispiels. Dann hast du sicher etwas dazugelernt. Das ist wichtiger und besser als die schnelle Lösung, indem man andere für sich arbeiten lässt.

--ingmar