Autor Thema: Ossia und Bezeichner  (Gelesen 3723 mal)

AischaW

  • Member
Ossia und Bezeichner
« am: Freitag, 9. April 2010, 23:09 »
Hallo zusammen !

Ich bin ganz neu dabei und blättere auch fleißig in den Tutorials etc. aber ich bin hier total hängen geblieben, darum brauche ich eure Hilfe:

Ich bekomme das Ossia-System hier nicht mehr über den Staff .
Ich versuche mit Bezeichnern zu arbeiten. Am liebsten wäre mir, eine Variable für alignAboveContext = (var) zu haben, damit ich das ganze Ossia-Ding nicht häufiger schreiben muss, sondern laut tutorial mit ossiaStart und Stop behandeln kann. Aber ich habe nicht nur einen Score, sondern ca 20, dafür nur kurze Melodiezeilen mit Text
Nachdem ich mich durch die Struktur "durchgebissen" habe und es ohne Variable schon hinbekommen habe (für einen score - und sogar mal mit Variable, aber das ist wieder weg  :-\ , frage ich mich, wo ich mich denn nun wieder verhaspelt habe und wie ich eine schöne übersichtliche Vorlage erstellen kann, damit ich mich bald der eigentlichen Arbeit zuwenden kann, die Melodien aufzuschreiben. Vielleicht könnt ihr mir weiterhelfen, ich blicke noch nicht so gut durch, wie das hier mit Variablen funktioniert, da war doch mal was mit globalen Variablen und deklarieren in Funktionen, aber wie ist das hier in Lilypond?
Aber vielleicht ist meine ganze Struktur auch nicht so optimal, wer kann mir weiterhelfen?


schönen Gruß, Aischa



Anbei meine Lily-datei


\version "2.12.3"
%global = { \time 4/4 \key c \major}
\header {
   title = " "
}
 %%% Variablen %%%%
JelalTextI= \lyricmode { al le mei -- ne Ent -- chen, schwim -- men auf dem See }
JelalTextII= \lyricmode { Köpf -- chen un -- ter  Was -- ser, Schwänz -- chen in die Höh' }
% JelalTextIII, ...IV, ...V, ...
% Def.

\paper {
}


%JelalNr = "JelalI"    % Variable für alignAboveContext und die Melodiezeile
         %so sollen die Melodien aufgelistet werden JelalI, JelalII, JelalIII etc...

%Bezeichner für Staffzeile über Notensystem
JelalNummer =    \mark { \markup { \rounded-box { \bold JelalNr }} }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   \new Staff = ossia \with {
      \remove "Time_signature_engraver"
      \override Clef #'transparent = ##t
      fontSize = #-3
      alignAboveContext = JelalNr % <--- das hätte ich gerne
      \override StaffSymbol #'staff-space = #(magstep -3)
      \override StaffSymbol #'thickness = #(magstep -3)
   }   
   { \stopStaff s1*1 }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
   MelodieI =  \relative c' {
      %\JelalNummer % Testausgabe
      c4 b c2
      <<
         { e4 f e2 }
         \context Staff = ossia {\startStaff e4 g8 f e2 \stopStaff}
      >>
      g4 a g2     c4 b c2
      <<
         { g4 a g2 }
         \context Staff = ossia {\startStaff g4 e8 f g2 \stopStaff}
      >>
      e4 d c2
   }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 
     %%%%%%%%%%%%%%%%%%%%%%%%%%
     MelodieII =  \relative c' {
        c4 b c2
        <<
        { e4 f e2 }
        \context Staff = ossia {\startStaff e4 g8 f e16 \stopStaff}
        >>
        g4 a g2     c4 b c2
     }
     %%%%%%%%%%%%%%%%%%%%%%%%
     
     \score {
        
        \new Staff = \JelalNr <<
           \new Voice = "Jelal" { \MelodieI  }
           \new Lyrics \lyricsto "Jelal" { \JelalTextI }
           >>
        }
     %%%%%%%%%%%%%%%%%
     JelalNr = "JelalII"        % neue MelodieZeile
   
     \score {
        
     \new Staff = \JelalNr <<
        \new Voice = "Jelal" { \MelodieII }
        \new Lyrics \lyricsto "Jelal" { \JelalTextII }
        >>
     }
     % \score III, IV, V, .... ca 20

« Letzte Änderung: Freitag, 9. April 2010, 23:27 von AischaW »

derHindemith

  • Member
Re:Ossia und Bezeichner
« Antwort #1 am: Samstag, 10. April 2010, 09:32 »
Was du beschreibst ist wahrscheinlich mit Scheme möglich, aber mit Scheme habe ich keine Ahnung.

AischaW

  • Member
Re:Ossia und Bezeichner
« Antwort #2 am: Samstag, 10. April 2010, 09:57 »
Was du beschreibst ist wahrscheinlich mit Scheme möglich, aber mit Scheme habe ich keine Ahnung.

Danke für die schnelle Antwort.
Wie würdest du sonst das Blatt strukturieren? Es geht darum, ein Gedicht, das in gesungener Form traditioneller Weise weitergegeben wird, alle paar Zeilen seine Melodie ändert und manchmal schöne Variationen hat. Diese dachte ich, in Ossia-Systeme zu packen. Und jede neue Melodie bekommt eine Zeile in einem Score. Aber vielleicht ist diese neue Score Variante nicht so optimal. Könnte man mit \break arbeiten und dann wäre die Ossia-Bezeichnung gültig für das ganze Score. Ich frage mich nur, ob es dann neue Schwierigkeiten geben könnte, wenn ich dann noch die Verse dazu schreiben möchte.
Vielleicht hast du oder jemand anders noch einen Vorschlag dazu für mich?
Ich will mich für dieses Projekt jetzt auch nicht weiter in Scheme einarbeiten, vielleicht später mal. Vielleicht...

Oder kann mir jemand anders einen Schnipsel dafür zurechtmachen?

Bin gespannt auf eure Vorschläge

Danke

Aischa

RobUr

  • Member
Re:Ossia und Bezeichner
« Antwort #3 am: Sonntag, 11. April 2010, 00:34 »
Hallo und herzlich willkommen im Forum, Aischa!

Zu Variablen in Lily sei folgendes erläutert:
Bevor eine Variable verwendet werden kann, muss sie zunächst definiert und mit Inhalt versehen werden. Das hast du schon richtig erkannt. Die weitere Benutzung und Änderung des zugewiesenen Wertes folgt aber einem recht simplen Schema, das uns einen Strich durch die Rechnung macht: der Wert der Variablen in der Variablen (also bei Verschachtelung) bleibt so lange erhalten, bis die Variable incl. der anderen Variablen neu definiert wird! Der zuerst zugewiesene Wert wird also bis zum Ende durchgereicht, sofern die verschachtelten Variablen nicht gänzlich umdefiniert werden.

Es passiert unterm Strich folgendes:
  • JelalNr = "JelalEins" → Die Variable mit dem Bezeichner JelalNr wird angelegt und erhält den Wert JelalEins.
  • JelalNummer = \markup { \bold \JelalNr } → Die Variable mit dem Bezeichner JelalNummer wird angelegt und erhält zusammen mit dem Wert aus JelalNr den Wert \markup { \bold JelalEins }.
  • JelalNr = "JelalZwei" → Der bereits angelegten Variablen JelalNr wird der neue Wert JelaZwei zugewiesen.
  • MelodieZwei = \relative { \mark \JelalNummer c d e f } → Die Variable JelalNummer wird aufgerufen, hat aber immer noch den vorher zugewiesenen Wert \markup { \bold JelalEins }
Variablen in der Variable werden also leider nicht dynamisch ersetzt, wie wir uns das wünschen.

Um den neuen Wert aus JelalNr in JelalNummer hineinzubekommen, müssten wir JelalNummer noch einmal definieren:
JelalNummer = \markup { \bold \JelalNr } → Dadurch wird der zuletzt in JelalNr gespeicherte Wert (mittlerweile JelalZwei) angewandt.

Man sollte generell sehr aufpassen, wenn bereits angelegte Variablen neue Werte zugewiesen bekommen. Man verheddert sich leicht und verrennt sich im eigenen Code. Es ist wesentlich einfacher, eine neue Variable mit eindeutigem Bezeichner anzulegen. Benutzerdefinierte Variablen in Lily sind nicht im programmiertechnischen Sinne zu verstehen, sondern eher als Platzhalter, um Strukturen übersichtlicher zu gestalten (eben genau für solche Fälle, um z.B. umfangreiche Noten- und Textpassagen im \score-Block einzufügen, ohne dort Noten und Text notieren zu müssen).

Auf die Schnelle habe ich deinen Code umgebaut, damit die Ossiazeilen wieder über der eigentlichen Zeile sitzen. Es ist aber noch nicht so, dass man den Codeblock dafür nur einmal zu notieren braucht – er muss vorerst in den jeweiligen \score-Blöcken eingefügt werden. Hast du schon einmal darüber nachgedacht, die einzelnen Liedabschnitte mit allen zugehörigen Variablen in separate Dateien auszulagern und diese per \include in eine zentrale Datei einzubinden?

\version "2.12.3"

%global = { \time 4/4 \key c \major}

\header {
title = ""
}

%%%% Variablen %%%%
JelalTextI = \lyricmode {
Ja und nein, nein und ja, ja und nein, nein und ja, ja und nein, nein und ja.
}

JelalTextII = \lyricmode {
Nein und ja, ja und nein, nein und ja, ja und nein.
}

% JelalTextIII, ...IV, ...V, ...
% Def.

\paper { }

% Variable für alignAboveContext und die Melodiezeile
% so sollen die Melodien aufgelistet werden JelalI, JelalII, JelalIII etc.

%% Folgende Zeile legt die Variable "JelalNr" an und weist ihr den Wert "Jelal I" zu. Dieser bleibt erhalten, bis ein neuer Wert zugewiesen wird.
JelalNr = "Jelal I"

% Bezeichner für Staffzeile über Notensystem

%% Folgende Zeile legt die Variable "JelalNummer" an und weist ihr das Markup incl. dem Wert aus "JelalNr" ("Jelal I") zu. Dieser bleibt erhalten, bis zuerst "JelalNr" und anschließend "JelalNummer" neu definiert wurden!
JelalNummer = \mark \markup { \rounded-box { \bold \JelalNr } }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MelodieI = \relative c' {
\mark \markup { \rounded-box { \bold "Jelal I" } }
<<
{ c4 b c2 }
\context Staff = ossia { \stopStaff s1*1 }
>>
<<
{ e4 f e2 }
\context Staff = ossia {
\startStaff e4 g8 f e2 \stopStaff
}
>>
g4 a g2     c4 b c2
<<
{ g4 a g2 }
\context Staff = ossia {
\startStaff g4 e8 f g2 \stopStaff
}
>>
e4 d c2
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MelodieII =  \relative c' {
\mark \markup { \rounded-box { \bold "Jelal II" } }
<<
{ c4 b c2 }
\context Staff = ossia { \stopStaff s1*1 }
>>
<<
{ e4 f e2 }
\context Staff = ossia { \startStaff e4 g8 f e16 \stopStaff }
>>
g4 a g2     c4 b c2
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JelalNr = "JelalI"
\score {
<<
\new Staff = ossia \with {
\remove "Time_signature_engraver"
\override Clef #'transparent = ##t
fontSize = #-3
alignAboveContext = \JelalNr % <--- das hätte ich gerne
\override StaffSymbol #'staff-space = #(magstep -3)
\override StaffSymbol #'thickness = #(magstep -3)
}
\new Staff = \JelalNr <<
\new Voice = "Jelal" { \MelodieI }
\new Lyrics \lyricsto "Jelal" { \JelalTextI }
>>
>>
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JelalNr = "JelalII" % neue MelodieZeile
\score {
<<
\new Staff = ossia \with {
\remove "Time_signature_engraver"
\override Clef #'transparent = ##t
fontSize = #-3
alignAboveContext = \JelalNr % <--- das hätte ich gerne
\override StaffSymbol #'staff-space = #(magstep -3)
\override StaffSymbol #'thickness = #(magstep -3)
}
\new Staff = \JelalNr <<
\new Voice = "Jelal" { \MelodieII }
\new Lyrics \lyricsto "Jelal" { \JelalTextII }
>>
>>
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% \score III, IV, V, .... ca 20

Viele Grüße, Robert

AischaW

  • Member
Re:Ossia und Bezeichner
« Antwort #4 am: Sonntag, 11. April 2010, 09:20 »
Hallo und herzlich willkommen im Forum, Aischa!

Zu Variablen in Lily sei folgendes erläutert:
Bevor eine Variable verwendet werden kann, muss sie zunächst definiert und mit Inhalt versehen werden. Das hast du schon richtig erkannt. Die weitere Benutzung und Änderung des zugewiesenen Wertes folgt aber einem recht simplen Schema, das uns einen Strich durch die Rechnung macht: der Wert der Variablen in der Variablen (also bei Verschachtelung) bleibt so lange erhalten, bis die Variable incl. der anderen Variablen neu definiert wird! Der zuerst zugewiesene Wert wird also bis zum Ende durchgereicht, sofern die verschachtelten Variablen nicht gänzlich umdefiniert werden.

Es passiert unterm Strich folgendes:
  • JelalNr = "JelalEins" → Die Variable mit dem Bezeichner JelalNr wird angelegt und erhält den Wert JelalEins.
  • JelalNummer = \markup { \bold \JelalNr } → Die Variable mit dem Bezeichner JelalNummer wird angelegt und erhält zusammen mit dem Wert aus JelalNr den Wert \markup { \bold JelalEins }.
  • JelalNr = "JelalZwei" → Der bereits angelegten Variablen JelalNr wird der neue Wert JelaZwei zugewiesen.
  • MelodieZwei = \relative { \mark \JelalNummer c d e f } → Die Variable JelalNummer wird aufgerufen, hat aber immer noch den vorher zugewiesenen Wert \markup { \bold JelalEins }
Variablen in der Variable werden also leider nicht dynamisch ersetzt, wie wir uns das wünschen.

Um den neuen Wert aus JelalNr in JelalNummer hineinzubekommen, müssten wir JelalNummer noch einmal definieren:
JelalNummer = \markup { \bold \JelalNr } → Dadurch wird der zuletzt in JelalNr gespeicherte Wert (mittlerweile JelalZwei) angewandt.

Man sollte generell sehr aufpassen, wenn bereits angelegte Variablen neue Werte zugewiesen bekommen. Man verheddert sich leicht und verrennt sich im eigenen Code. Es ist wesentlich einfacher, eine neue Variable mit eindeutigem Bezeichner anzulegen. Benutzerdefinierte Variablen in Lily sind nicht im programmiertechnischen Sinne zu verstehen, sondern eher als Platzhalter, um Strukturen übersichtlicher zu gestalten (eben genau für solche Fälle, um z.B. umfangreiche Noten- und Textpassagen im \score-Block einzufügen, ohne dort Noten und Text notieren zu müssen).

Auf die Schnelle habe ich deinen Code umgebaut, damit die Ossiazeilen wieder über der eigentlichen Zeile sitzen. Es ist aber noch nicht so, dass man den Codeblock dafür nur einmal zu notieren braucht – er muss vorerst in den jeweiligen \score-Blöcken eingefügt werden. Hast du schon einmal darüber nachgedacht, die einzelnen Liedabschnitte mit allen zugehörigen Variablen in separate Dateien auszulagern und diese per \include in eine zentrale Datei einzubinden?

\version "2.12.3"

%global = { \time 4/4 \key c \major}

\header {
title = ""
}

%%%% Variablen %%%%
JelalTextI = \lyricmode {
Ja und nein, nein und ja, ja und nein, nein und ja, ja und nein, nein und ja.
}

JelalTextII = \lyricmode {
Nein und ja, ja und nein, nein und ja, ja und nein.
}

% JelalTextIII, ...IV, ...V, ...
% Def.

\paper { }

% Variable für alignAboveContext und die Melodiezeile
% so sollen die Melodien aufgelistet werden JelalI, JelalII, JelalIII etc.

%% Folgende Zeile legt die Variable "JelalNr" an und weist ihr den Wert "Jelal I" zu. Dieser bleibt erhalten, bis ein neuer Wert zugewiesen wird.
JelalNr = "Jelal I"

% Bezeichner für Staffzeile über Notensystem

%% Folgende Zeile legt die Variable "JelalNummer" an und weist ihr das Markup incl. dem Wert aus "JelalNr" ("Jelal I") zu. Dieser bleibt erhalten, bis zuerst "JelalNr" und anschließend "JelalNummer" neu definiert wurden!
JelalNummer = \mark \markup { \rounded-box { \bold \JelalNr } }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MelodieI = \relative c' {
\mark \markup { \rounded-box { \bold "Jelal I" } }
<<
{ c4 b c2 }
\context Staff = ossia { \stopStaff s1*1 }
>>
<<
{ e4 f e2 }
\context Staff = ossia {
\startStaff e4 g8 f e2 \stopStaff
}
>>
g4 a g2     c4 b c2
<<
{ g4 a g2 }
\context Staff = ossia {
\startStaff g4 e8 f g2 \stopStaff
}
>>
e4 d c2
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MelodieII =  \relative c' {
\mark \markup { \rounded-box { \bold "Jelal II" } }
<<
{ c4 b c2 }
\context Staff = ossia { \stopStaff s1*1 }
>>
<<
{ e4 f e2 }
\context Staff = ossia { \startStaff e4 g8 f e16 \stopStaff }
>>
g4 a g2     c4 b c2
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JelalNr = "JelalI"
\score {
<<
\new Staff = ossia \with {
\remove "Time_signature_engraver"
\override Clef #'transparent = ##t
fontSize = #-3
alignAboveContext = \JelalNr % <--- das hätte ich gerne
\override StaffSymbol #'staff-space = #(magstep -3)
\override StaffSymbol #'thickness = #(magstep -3)
}
\new Staff = \JelalNr <<
\new Voice = "Jelal" { \MelodieI }
\new Lyrics \lyricsto "Jelal" { \JelalTextI }
>>
>>
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
JelalNr = "JelalII" % neue MelodieZeile
\score {
<<
\new Staff = ossia \with {
\remove "Time_signature_engraver"
\override Clef #'transparent = ##t
fontSize = #-3
alignAboveContext = \JelalNr % <--- das hätte ich gerne
\override StaffSymbol #'staff-space = #(magstep -3)
\override StaffSymbol #'thickness = #(magstep -3)
}
\new Staff = \JelalNr <<
\new Voice = "Jelal" { \MelodieII }
\new Lyrics \lyricsto "Jelal" { \JelalTextII }
>>
>>
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% \score III, IV, V, .... ca 20

Viele Grüße, Robert


Absolut Super, danke für die Antwort! Damit kann ich weiterarbeiten, vielen vielen Dank!!! :)