Autor Thema: Context definieren - muss ich wirklich alle enthaltenen Engraver ...? (gelöst)  (Gelesen 1847 mal)

Manuela

  • Member
Im Zuge meiner Liedersammlung habe ich einen Context für die 2. Stimme definiert:

smallerNoteHead=#-1.5
\layout {
\context {
    \name SecondVoice
    \type "Engraver_group"
    \alias Voice
    \consists "Note_heads_engraver"
    \consists "Text_engraver"
    \consists "Stem_engraver"
    \consists "Beam_engraver"
    \consists "Slur_engraver"
    \consists "Rest_engraver"
    \consists "Dots_engraver"
    \consists "Rhythmic_column_engraver"
    autoBeaming = ##f
    \override NoteCollision.merge-differently-dotted = ##t
    \override NoteCollision.merge-differently-headed = ##t
    \override NoteHead.font-size = #smallerNoteHead
    \override Stem.direction = #DOWN
    \override Slur.direction = #DOWN
    \override Tie.direction = #DOWN
    \override NoteColumn.horizontal-shift = #0
}
\context {
\Staff \accepts SecondVoice }
}

\new Staff
<< \new Voice \relative c'' { c d e }
\new SecondVoice \relative c'' { g f e }
>>

Ich dachte zunächst, mit der Angabe von \alias Voice werden alle in diesem Kontext enthaltenen Engraver automatisch übernommen. Und wurderte mich, dass kein Output erzeugt wurde  ;)

Habe ich irgendwas übersehen, gibt es eine Art "Engraver-Sammlung" für Voice oder andere Contexte?

Update: Wozu ist \alias Voice überhaupt gut? Der Code kompiliert auch ohne, habe ich gerade festgestellt.
« Letzte Änderung: Mittwoch, 14. September 2016, 12:15 von Manuela »

harm6

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver extra angeben?
« Antwort #1 am: Mittwoch, 14. September 2016, 10:48 »
Wenn Du einen neuen Context definierst, frage Dich zuvor ob Du wirklich einen neuen brauchst oder lediglich eine Variante eines bereits existierenden.
Dein aktuelles coding kreiert einen wirklich neuen, deshalb mußt Du Du auch dafür Sorge tragen, daß alle engraver und sonstiges drin sind.
Wenn ich mir Deine Setzungen so anschaue glaube ich aber eher, Du willst nur eine Voice-Variante.

Um eine Variante zu schaffen kopiere die Setzungen des originalen Context, das geht simpelst mit:

\context {
  \Voice
}

Dann benenne ihn:

\context {
  \Voice
  \name "SecondVoice"
}

Dann füge all Deine overrides und context Setzungen ein und lasse diese "SecondVoice" dann von jedem Context akzeptieren, bei dem Dir das geraten scheint.

Der \alias-Befehl bewirkt, daß ein override für einen bestimmten Context sich auch auf alle alias-Contexte auswirkt.

In folgendem Beispiel siehst Du den Stem farbig aber der override für NoteHead bleibt ohne Wirkung solabge der \alias-Befehl auskommentiert bleibt.

\version "2.18.2"

\layout {
  \context {
    \Voice
    \name "SecondVoice"
    %\alias "Voice"
    \override Stem.color = #cyan
  }
  \context {
    \Staff
    \accepts "SecondVoice"
  }
}

\new Staff
  \new SecondVoice {
    \override Voice.NoteHead.color = #red
    c'2
  }

HTH,
  Harm

fugenkomponist

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver extra angeben?
« Antwort #2 am: Mittwoch, 14. September 2016, 11:03 »
Da ich das gestern selbst grad erst gemacht hab (nur ganz einfach SmallStaff, ein Staff mit \magnifyStaff): mehr Beispiele und Erklärungen (auch zu \alias) gibts in Abschnitt 5.1.6 der Notationsreferenz und in der Datei ly/engraver-init.ly (die wird an anderer Stelle innerhalb eines \layout-Blocks eingebunden, falls sich jemand wundern wollte, warum da \context einfach so stehen kann).

Manuela

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver extra angeben?
« Antwort #3 am: Mittwoch, 14. September 2016, 11:58 »
Danke fugenkomponist  :). Genau das, was du beschrieben hast, wollte ich, eine Variante eines existierenden Contexts. In der Doku habe ich nur die Vorgangsweise gefunden, die ich geschildert habe.

Update: ist das beabsichtigt, dass in deinem Beispiel \override Voice.NoteHead.color = #red nicht funktioniert, weil es \override SecondVoice.NoteHead.color = #red heißen müsste, falls man den Notenkopf wirklich rot einfärben möchte?
« Letzte Änderung: Mittwoch, 14. September 2016, 12:00 von Manuela »

fugenkomponist

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver extra angeben?
« Antwort #4 am: Mittwoch, 14. September 2016, 12:06 »
Ja, das ist beabsichtigt, harm wollte damit die Funktion von \alias erklären, kommentier mal die \alias-Zeile ein und schau dann nochmal ;)

Manuela

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver extra angeben?
« Antwort #5 am: Mittwoch, 14. September 2016, 12:14 »
Genial!  ;) :D

Lilypond ist viel zu wenig bekannt.

Manuela

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver ...? (gelöst)
« Antwort #6 am: Mittwoch, 14. September 2016, 12:28 »
Noch eine Frage: hat es einen Grund, warum der Name "SecondVoice" in Hochkommata gefasst ist? Ich habe es gerade ausprobiert, es klappt auch ohne Hochkomma. Gehe ich richtig in der Annahme, dass man mit Hochkomma eine freiere Gestaltung der Namenswahl hat (Leerzeichen, Bindestriche, Ziffern...)?

fugenkomponist

  • Member
Re: Context definieren - muss ich wirklich alle enthaltenen Engraver ...? (gelöst)
« Antwort #7 am: Mittwoch, 14. September 2016, 12:56 »
Vermutlich ist das wie z. B. bei Variablennamen möglich, ja.

LilyPond lässt sehr viel Freiheiten in der Syntax. Statt \tempo "Allegro" kann man z. B. auch \tempo Allegro schreiben. Gleiches gilt z. B. für \clef, aber da muss man "treble_8" dann doch wieder zwingend in "" setzen. Mir ist auch nicht hundertprozentig klar, wann ein String und wann ein Symbol erwartet wird bzw. wann was möglich ist. Symbole (in Scheme z. B. 'Staff) und Strings (in Scheme z. B. "Staff") sind an vielen Stellen anscheinend austauschbar. Und es ist mir auch nicht ganz klar, obs nen Unterschied zwischen Symbolen und Strings ohne "" gibt (bzw. ob letztere existieren). Da müsste man mal in den Parser-Code schauen.

Leichter tut man sich vermutlich aber, wenn man Dinge, an denen Symbole ausreichen, entsprechend benennt (z. B. SmallStaff) und Dinge, an denen i. d. R. ein String stehen soll, auch in "" setzt, z. B. bei \tempo.

Um nochmal auf obiges zurückzukommen: Ein Symbol kann auch einen Namen mit Leerzeichen etc. haben, in Scheme kann das aber soweit ich weiß nicht direkt eingegeben werden, sondern nur mithilfe der Funktion string->symbol.

Edit: Es steht im Parser zu neuen Kontexten was von „NEWCONTEXT symbol […]“, wobei NEWCONTEXT konstant \new ist. Trotzdem ist aber \new "Staff" mit "" erlaubt. Komisch, das alles.
« Letzte Änderung: Mittwoch, 14. September 2016, 13:01 von fugenkomponist »