Probleme mit \lyricmode in 2.19.61 [Gelöst]

Begonnen von iugin, Dienstag, 13. Juni 2017, 10:44

« vorheriges - nächstes »

iugin

Hallo miteinander

ich wieder... :)
Ich komme nicht wirklich draus mit \lyricmode.

Wie schon erwähnt, teile ich meine (grosse) Partituren in mehreren Files, die ich dann mittels \include zusammensetze.
Ein Beispiel:
File Text.ily:
\version "2.19.61"

\lyricmode {
  a -- b -- c
}

File Partitur.ily:
\version "2.19.61"

Music = {
  \new Voice = "music" {
  c c c
  }
}

\score {
  <<
    \new Staff \Music
    \new Lyrics \lyricsto "music" \include "Text.ily"
  >>
}

Beim Kompilieren funktioniert nicht. Wenn ich im File Text.ily \lyricmode wegnehme, dann geht.

Dieser Beispiel hingegen kompiliert:
\version "2.19.61"

Text =  \lyricmode {
  a -- b -- c
}

Music = {
  \new Voice = "music" {
  c c c
  }
}

\score {
  <<
    \new Staff \Music
    \new Lyrics \lyricsto "music" \Text
  >>
}

Wenn ich \lyricmode weg nehme, kompiliert trotzdem, wird aber kein Text gezeigt.

Dieser Beispiel funktioniert mit \lyricmode
\version "2.19.61"

Melody = \relative c' {
  \new Voice = "melody" {
c d e f |
  } 
}

Text = \lyricmode
{
bla bla bla bla
}


\score {
  <<
    \new Staff { \Melody }
    \new Lyrics \lyricsto "melody" { \Text }
  >>
}

Ohne \lyricmode kompiliert theoretisch nicht (das ist der Output der Console)
Starte lilypond 2.19.61 [Test.ly]...
»/tmp/Test.ly« wird verarbeitet
Analysieren...
/tmp/Test.ly:10:1: Fehler: not a note name: bla

bla bla bla bla
/tmp/Test.ly:10:5: Fehler: not a note name: bla
bla
    bla bla bla
/tmp/Test.ly:10:9: Fehler: not a note name: bla
bla bla
        bla bla
/tmp/Test.ly:10:13: Fehler: not a note name: bla
bla bla bla
            bla
Interpretation der Musik...
Vorverarbeitung der grafischen Elemente...
Ideale Seitenanzahl wird gefunden...
Musik wird auf eine Seite angepasst...
Systeme erstellen...
Layout nach »/tmp/lilypond-x6FbTF« ausgeben...
Konvertierung nach »Test.pdf«...
Löschen von »/tmp/lilypond-x6FbTF«...
schwerer Fehler: gescheiterte Dateien: "/tmp/Test.ly"
Wurde mit dem Return-Code 1 beendet.

die Partitur wird aber korrekt erstellt (trotz schwerer Fehler).

Ich habe hier das gefunden:
Zitat\lyricsto and \addLyrics have been 'harmonized'. Both now accept the same kind of delimited argument list that \lyrics and \chords accept. Backward compatibility has been added so music identifiers (i.e. \mus) are permitted as arguments. A convert-ly rule has been added that removes redundant uses of \lyricmode and rearranges combinations with context starters such that \lyricsto in general is applied last (i.e. like \lyricmode would be).
Trotzdem checke ich das Verhalten nicht wirklich.

Kann es mir jemand erklären?

Lieber Gruss und danke

Eugenio

Pusteblumi

#1
Hallo Eugenio,

der entscheidende Hinweis steht in
http://lilypond.org/doc/v2.19/Documentation/notation/common-notation-for-vocal-music#automatic-syllable-durations
ZitatDamit wird der Text an den Noten des benannten Voice-Kontextes ausgerichtet, der schon vorher existieren muss. Aus diesem Grund wird der Voice-Kontext normalerweise zuerst definiert, gefolgt vom Lyrics-Kontext. Der Gesangstext selber folgt dem \lyricsto-Befehl. Der \lyricsto-Befehl ruft den Gesangstextmodus automatisch auf, sodass man \lyricmode in diesem Fall auslassen kann.

Dein erstes Beispiel ergibt
\new Lyrics \lyricsto "music"  \lyricmode { a -- b -- c }

Du kannst also \lyricmode weglassen, weil durch \lyricsto schon klar ist, dass es um Gesangstext geht.
Dass es sogar einen Fehler ergibt, wenn man es nicht weglässt, wusste ich bis jetzt auch nicht. Mit LP 2.18.2 ging das noch.

\lyricmode brauchst du also nur,
1.) wenn vorher kein \lyricsto steht
oder
2.) wenn du eine Variable deklarieren willst, die Text anstatt Musik enthält.

Mit
Text = { a -- b -- c }
erstellst du eine Variable, die drei Töne namens a, b und c enthält. Der doppelte Bindestrich ergibt zufällig eine angehängte Artikulation.
Deshalb keine Fehlermeldung, aber es wird auch kein Text angezeigt, weil die Variable keinen Text enthält.

Text = { bla -- bla -- bla }
ergibt (ohne \lyricmode) Fehlermeldungen, weil "bla" kein Notenname sein kann.
\new Lyrics \lyricsto "melody" { \Text }
funktioniert im Nachhinein trotzdem, weil "bla" nicht als Notenname "missverstanden" wird.

Ich hoffe, das hilft dir weiter.

Viele Grüße,
Klaus


iugin

Hallo Klaus

danke für die Antwort!
Ja, das mit a -- b -- c ist wirklich ein blöder Beispiel gewesen... ich habe einfach was getippt, und nicht einmal gemerkt, dass sie Notennamen sind.
Was mich ein bisschen stört ist, dass wenn ich \lyricmode nicht weg lasse, eine Fehlermeldung bekomme...
Aber, wenn die Entwickler es so gemacht haben, gibt es sicher einen Grund... :)

Nochmals danke und einen lieben Gruss

Eugenio

harm6

Hallo,

ich hole mal etwas weiter aus. (ohne Gewähr für Vollständigkeit)

Basics:
Um LilyPond zu benutzen mußt Du Ihr in geeigneter Art und Weise mitteilen, was Du möchtest.
Um es dem Benutzer einfacher zu machen gibt es einige Voreinstellungen in LilyPond.

inputmodes:
Bei Benutzung eines inputmodes versteht LilyPond was Du ihr sagst.
Inputmodes sind: notemode, chordmode, figuremode, drummode, lyricmode

Default-inputmode ist notemode.

Also ist
{ cis'1 d' dis } equivalent zu \notemode { cis'1 d' dis }
Aber

{ foo -- bar buzz }
{ bd1 hh1 }
{ <2 4 5 7> }
{ c:7 }

geben Fehler aus, da der Inhalt dieser Ausdrücke im notemode nicht definiert sind.

Aber

\lyricmode { foo -- bar buzz }
\drummode { bd1 hh1 }
\figuremode { <2 4 5 7> }
\chordmode { c:7 }

wird verstanden.

Allerdings ist die Ausgabe noch zu regeln.

Ausgabe:
Der default ist die Voice - Staff - ... - Hierarchie.
Deshalb werden Eingaben in notemode und chordmode korrekt in Noten umgesetzt die anderen ergeben keinen sinnvollen output.
Dazu muß man den gewünschten Context angeben:

\new Staff \notemode { cis'1 d' dis }
\new Lyrics \lyricmode { foo -- bar buzz }
\new DrumStaff \drummode { bd1 hh1 }
\new FiguredBass \figuremode { <2 4 5 7> }
\new ChordNames \chordmode { c:7 }
\new Staff \chordmode { c:7 }


Dafür gibts teilweise auch shortcuts:

\lyrics { foo -- bar -- buzz }
\drums { bd1 hh1 }
\figures { <2 4 5 7> }
\chords { c:7 }


(Tatsächlich gabs früher auch \notes als shortcut, als das aber der default wurde ist es abgestellt worden. Heutzutage gibt es einen Fehler aus. Wenn man genau sucht findet man noch Relikte im lexer.)

lyricsto:
lyrcsto ist nun eigentlich weder inputmode noch regelt es den output, sondern ordnet den Noten des angegebenen Voice-context die Silben der Texteingabe zu.
Wie Klaus schon sagte ruft lyricsto lyricmode automatisch auf.
D.h. in

<<
\new Voice = "v" { c'1 }
\new Lyrics \lyricsto "v" { foo }
>>

Ist lyricmode überflüssig.
Falls Du den Text aber vordefinierst mußt Du lyricmode verwenden, sonst versteht LilyPond nicht was Du ihr sagst.

txt = \lyricmode { foo }

<<
\new Voice = "v" { c'1 }
\new Lyrics \lyricsto "v" \txt
>>


Tatsächlich funktioniert auch:

<<
\new Voice = "v" { c'1 r d' }
\new Lyrics \lyricsto "v" { \lyricmode { foo bar } }
>>

Aber wozu sollte man so vorgehen.


HTH,
  Harm

P.S.
ZitatWas mich ein bisschen stört ist, dass wenn ich \lyricmode nicht weg lasse, eine Fehlermeldung bekomme...
Hier weiß ich nicht welches der zahlreichen Codings Du meinst...







iugin

Danke Harm!

Ja, was du schreibst ist mir inzwischen klar. Was ich nicht verstanden habe, ist warum alte Files die funktioniert haben, jetzt mit \lyricmode nicht mehr gehen.
Du schreibst:
ZitatHier weiß ich nicht welches der zahlreichen Codings Du meinst...
und genau ist das der Punkt. Du kannst, von meinem ersten Post, den ersten Beispiel nehmen, der mit den zwei Files: Text.ily und Partitur.ly
Im File Text.ily steht vor dem Text \lyricmode, und so hat es immer funktioniert. Jetzt geht es nicht mehr, ich bin gezwungen es zu entfernen.
Der Kompiler beschwert sich sonst massiv:
Starte lilypond 2.19.61 [Partitur.ly]...
»/tmp/Partitur.ly« wird verarbeitet
Analysieren...
/tmp/Text.ily:3:1: Fehler: syntax error, unexpected \lyricmode, expecting \sequential or \simultaneous or << or '{'

\lyricmode {
/tmp/Partitur.ly:10:3: Fehler: Fehler gefunden, musikalischer Ausdruck wird ignoriert
 
  <<
/tmp/Partitur.ly:14:1: Fehler: Haupt-Eingabe nicht beendet

}
schwerer Fehler: gescheiterte Dateien: "/tmp/Partitur.ly"
Wurde mit dem Return-Code 1 beendet.

Das ist was ich nicht verstehe: wieso ich es weg nehmen muss.
Der gleiche Beispiel, in einem File, wäre folgendes:
\version "2.19.61"

Music = {
  \new Voice = "music" {
  c c c
  }
}

Text =  {
  bla bla bla
}

\score {
  <<
    \new Staff \Music
    \new Lyrics \lyricsto "music" \Text
  >>
}

und da ist mir klar, wieso es nicht kompiliert: weil ohne \lyricmode kann Lilypond nichts anfangen, so war es auch immer.

Sorry, vielleicht habt ihr mir die Antwort schon deutlich geschrieben, und ich checke es einfach nicht...  :o

Lieber Gruss

Eugenio

harm6

Hallo Eugenio,

Zitat
Was ich nicht verstanden habe, ist warum alte Files die funktioniert haben, jetzt mit \lyricmode nicht mehr gehen.

Ich habe den entsprechenden patch nicht geschrieben, insoweit hier woran ich mich erinnere (von der mailing-list) bzw meine Vermutungen:

\lyricsto hat \lyricmode eingebaut.
Insoweit ist
\lyricsto "whatever" \lyricmode { text }
teilweise analog zu
\lyricmode \lyricmode { text }

\lyricsto "whatever" \lyricmode { text } hat früher keinen Fehler ausgegeben, sollte es aber getan haben.
Tatsächlich ergibt
\lyricmode \lyricmode { text }
schon immer einen Fehler, genauso wie
\chordmode \chordmode { c:7 }

Insoweit haben Konsistenzgründe wohl die Hauotrolle gespielt.

Zitat
Im File Text.ily steht vor dem Text \lyricmode, und so hat es immer funktioniert. Jetzt geht es nicht mehr, ich bin gezwungen es zu entfernen.

Nicht unbedingt.

Wie schon oben beschrieben kannst Du
\new Lyrics \lyricsto "music" { \include "Text.ily" }
verwenden.
Wobei Text.ily nur
\lyricmode  { foo -- bar -- buzz }
beinhaltet.
Das fügt zwar eine weitere Ebene an sequentieller Musik hinzu, ist aber ansonsten unproblematisch, afaik.

Im übrigen:
Ich bezweifel doch sehr, daß es mit Angabe der \version in Text.ily jemals finktioniert hat.

Gruß,
  Harm

iugin

Hallo Harm

du machst mein Samstagmorgen gut :)
Also: mit den Klammern funktioniert tatsächlich! Ich habe sie nie eingefügt, kein File hat sie. Mit den alten Versionen ging eben so.
Es geht, ich muss mein geliebter \lyricmode nicht entfernen!
Wieso eigentlich habe ich noch nicht ganz verstanden... ich muss deine Erklärung nochmals im Ruhe lesen :)
ZitatIm übrigen:
Ich bezweifel doch sehr, daß es mit Angabe der \version in Text.ily jemals finktioniert hat.
Ja, es ist immer gegangen. Ich generiere die Struktur der Partitur und alle Files mit einem Programm, und er fügt überall die \version-Angabe.

Also, fazit:
Text.ily
\version "2.19.61"

\lyricmode {
bla bla bla
}


Partitur.ly
\version "2.19.61"

Music = {
  \new Voice = "music" {
  c c c
  }
}

\score {
  <<
    \new Staff \Music
    \new Lyrics \lyricsto "music" { \include "Text.ily" }
  >>
}

läuft! Die Klammer waren das Problem!

Danke und einen lieben Gruss

Eugenio