Autor Thema: Bedingte Erzeugung von Noten  (Gelesen 2027 mal)

viertel

  • Member
Bedingte Erzeugung von Noten
« am: Samstag, 11. Juli 2015, 23:55 »
Hallo

Warum funktioniert das "if" hier nicht:
\version "2.18.2"

genEins = ##t
notenEins =  \relative c' { c4 d e f }

#(if (eq? genEins #t) (begin #{
   \score { \notenEins \layout {} }
   #}))
#(if (eq? genEins #t) #{
   \score { \notenEins \layout {} }
   #})
#(if (eq? 1 1) #{
   \score { \notenEins \layout {} }
   #})
\score { \notenEins \layout {} }
\score { \notenEins \layout {} }
Die ersten drei Scores werden ignoriert, die letzen beiden werden erzeugt.

Anscheinend habe ich das Einfügen von Lilypond per #{...#} in Scheme nicht verstanden.
Oder die Schachtelung funktioniert generell nicht.
Fehler werden jedenfalls keine angezeigt.

Schon mal Danke für Tips.

harm6

  • Member
Re: Bedingte Erzeugung von Noten
« Antwort #1 am: Sonntag, 12. Juli 2015, 01:33 »
Zwei Probleme.

1.
#(if (eq? genEins #t) #{
   \score { \notenEins \layout {} }
   #})

erzeugt keine Ausgabe!
Dazu müßtest Du so vorgehen:

Zitat
$(if (eq? genEins #t) #{
   \score { \notenEins \layout {} }
   #})

Aber so ganz astrein ist LilyPod's Verhalten hier noch nicht ...

2.
Wenn Du "notenEins" direkt nach ihrer Definition aufrufst klappt es nicht. LilyPond wartet, ob etwa ein \addlyrics angeschlossen wird. Erst wenn der nächste Ausdruck als "nicht vom Typ addlyrics" erkannt ist arbeitet der parser weiter, aber dann ist "notenEins" bereits aufgerufen worden und wird folgerichtig als unbekannt betrachtet.
David Kastrup könnte das besser erklären ...
Siehe auch:
https://liarchiv.joonet.de/index.php?topic=2008.msg11039

Du brauchst etwas dazwischen, z.B.:

\version "2.18.2"

genEins = ##t
notenEins =  \relative c' { cis4 d e f }

foo = "bla"

$(if (eq? genEins #t) (begin #{ \score { \notenEins \layout {} } #}))

Gruß,
  Harm

viertel

  • Member
Re: Bedingte Erzeugung von Noten
« Antwort #2 am: Sonntag, 12. Juli 2015, 05:28 »
Hallo Harm

Danke für die Antwort.

Der $ macht also den Unterschied.
Das zweite Problem mit der "unfertigen " Variablendefinition tritt nur in dem Minibeispiel zutage. Im "richtigen" Code gibt es natürlich noch mehr Definitionen, so daß genEins auf jeden Fall bereit ist für die Verwendung.

viertel

  • Member
Re: Bedingte Erzeugung von Noten
« Antwort #3 am: Samstag, 25. Juli 2015, 23:28 »
Ich muß noch mal auf dieses Problem zurück kommen.

Es funktioniert, so daß ich aus einer Gesamtdatei über die genXxxx Variablen die zu erzeugenden Stimmen auswählen kann.
Bis mich eine Stimme in den Wahnsinn trieb.
Hier das auf das Notwendigste reduzierte Codestück, das sich bei mir weigert:
\version "2.18.2"

\header { title = "Warum geht das nicht ?" }

genElek = ##t

Elek = {
\clef treble
\time 2/4
\key c \major
\relative c' {
c4 d e f
}
\bar "|."
}

$(if (eq? genElek #t) #{
\new Staff {
\Elek
\layout { }
}
#} )

Kommentiere ich jedoch die if-Zeile und ihr Gegensrück aus, läuft es.
Wie gesagt, mit dieser if-Technik kann ich aus einem größeren Werk einzelne Stimmen erzeugen. Aber dieses Elek ist störrisch.
Setze ich die \Elek-Variable in einer anderen Stimme ein, so streikt diese Stimme ebenfalls. Aber an dem Namen Elek liegt es nicht, Hhhh spinnt genauso.
Ich habe schon die Sequenz neu eingetippt um unsichtbare Zeichen auszuschließen. Fehlanzeige.
Welches Ei habe ich mir da gelegt bzw. was übersehe ich?

Ich Esel hatte vergessen, die Fehlermeldung mit anzuhängen:
Starte lilypond-windows.exe 2.18.2 [F2.ly]...
»D:/Daten/LilyPond/Oklahoma/F2.ly« wird verarbeitet
Analysieren...
D:/Daten/LilyPond/Oklahoma/F2.ly:19:17: Fehler: Ungültige Fluchtsequenz: »\Elek«

                \Elek
D:/Daten/LilyPond/Oklahoma/F2.ly:19:17: Fehler: Zeichenkette nicht erkannt, weder Textbeschriftung noch \lyricmode

                \Elek
D:/Daten/LilyPond/Oklahoma/F2.ly:20:17: Fehler: syntax error, unexpected \layout

                \layout { }
D:/Daten/LilyPond/Oklahoma/F2.ly:17:1: Fehler: Fehler in #{ ... #}

$(if (eq? genElek #t) #{
D:/Daten/LilyPond/Oklahoma/F2.ly:18:9: Fehler: Fehler gefunden, musikalischer Ausdruck wird ignoriert

        \new Staff {
schwerer Fehler: gescheiterte Dateien: "D:/Daten/LilyPond/Oklahoma/F2.ly"
Wurde mit dem Return-Code 1 beendet.

Danke schon mal vom 1/4
« Letzte Änderung: Sonntag, 26. Juli 2015, 02:53 von viertel »

harm6

  • Member
Re: Bedingte Erzeugung von Noten
« Antwort #4 am: Montag, 27. Juli 2015, 10:06 »
Eigentlich sagt die Fehlemeldung schon alles ;)

Zitat
D:/Daten/LilyPond/Oklahoma/F2.ly:19:17: Fehler: Ungültige Fluchtsequenz: »\Elek«
      
                \Elek

Zumindest im Minimalbeispiel ist die Definition für Elek noch nicht "fertig", siehe auch meinen post oben.

Wenn man etwas "dazwischen" schiebt, wie hier:

\version "2.18.2"

\header { title = "Warum geht das nicht ?" }

Elek = {
\clef treble
\time 2/4
\key c \major
\relative c' {
c4 d e f
}
\bar "|."
}

genElek = ##t

$(if (eq? genElek #t) #{
\new Staff {
\Elek
\layout { }
}
#} )

kommt die zweite Fehlermeldung deutlicher zum tragen:

Zitat
D:/Daten/LilyPond/Oklahoma/F2.ly:20:17: Fehler: syntax error, unexpected \layout
      
                \layout { }

Du kannst kein \layout in einen Staff packen!

Das ergibt nunmal einen Fehler, genau wie:

\new Staff { c''1 \layout { } }
Gruß,
  Harm

viertel

  • Member
Re: Bedingte Erzeugung von Noten
« Antwort #5 am: Montag, 27. Juli 2015, 10:49 »
Manchmal muß man anscheinend den gleichen Fehler 2x machen, bis es sich im Hirn festsetzt.
Das Setzen der Elek Variablen ist tatsächlich die letzte Variable, die ich setze. Ein Dummy=##t danach, und die Sache funktioniert.

Das mit dem \layout innerhalb des Staff war ein Montagefehler für das Minimalbeispiel. Kam so im Original nicht vor.

Vielen Dank, ich war schon am Verzweifeln :)