Probleme mit Instrumentenname, bei Stimmen mit Vorschlag zu Beginn.

Begonnen von mobby83, Donnerstag, 15. November 2018, 01:26

« vorheriges - nächstes »

mobby83

Hallo,

ich habe ein für mich neues Problem, dass offensichtlich an Vorschlägen in den Noten liegt(?).
Sobald die Noten mit einem Vorschlag beginnen, wird der Befehl "\set Staff.instrumentName = \markup { "Rhythmus" }" nicht vor die erste Notenzeile geschrieben

Woran liegt das? Wo liegt mein Fehler oder ist das ein Bug?


mit Problem, mit Vorschlag

\version "2.18.2"

TrEins = \drummode {
  \time 2/2
  \tempo "Marcia" 2 = 112

  \acciaccatura tommh8 (sn4.)\ff sn8 \acciaccatura tommh8 (sn4) \acciaccatura tommh8 (sn4)
}
 
\score {
  \new DrumStaff = Tr <<
  \set Staff.instrumentName = \markup { "Rhythmus" }
  \new DrumVoice { \TrEins }
  >>
}


ohne Problem, ohne Vorschlag

\version "2.18.2"

TrEins = \drummode {
  \time 2/2
  \tempo "Marcia" 2 = 112

  sn4. \ff sn8 \acciaccatura tommh8 (sn4) \acciaccatura tommh8 (sn4)
}
 
\score {
  \new DrumStaff = Tr <<
  \set Staff.instrumentName = \markup { "Rhythmus" }
  \new DrumVoice { \TrEins }
  >>
}

harm6

Einerseits ist das eine Auswirkung von issue 34.
Dieser bug ist so berüchtig, daß ich gar nicht nachschlagen muß.

Andererseits ist es eine Unsitte den instrumentName mittels \set Staff... zu setzen.
Mir ist klar, daß das in den docs immer noch so vorkommt. Aber es wäre auch schon schön, wenn mal mehr Leute sich bereit fänden solche Sachen zu patchen. Wär auch ein guter Einstieg, das patch-Verfahren zu lernen.
Ja ich kann das auch machen und dann hab ich anschließend keine Zeit mehr für wichtigeres :(

Aber genug der Klage. Hier der korrekte Weg: instrumentName gehört in den \with-Block

  \new DrumStaff = Tr \with { instrumentName = \markup { "Rhythmus" } } ...


HTH,
  Harm

mobby83

Super vielen Dank!

Es gibt bei Lilypond immer wieder erstaunlich viele Wege zum Ziel zu kommen. Die \with Funktion hatte ich sogar schon einmal genutzt, aber wieder erfolgreich vergessen.

Was macht das \with anders und wieso sollte ich es verwenden?

harm6

"instrumentName" ist ein context-property. Sowohl \set Staff.instrumentName = ... als auch \with { instrumentName = .. setzen dieses property.
Damit der Text den man diesem property zugewiesen hat am Anfang des ersten Staffs dieses contexts auch gedruckt wird muß dieses context-propery bei der Initiierung dieses Contexts auch inhaltlich abrufbar sein.
\with garantiert das.
Wenn man \set Staff. verwendet kann das nicht garantiert werden.
Als banales Beispiel:
\new Staff { c'1 \set Staff.instrumentName = "zz" c' }
Hier kommt die Setzung des property viel zu spät.
Andere Beispiele sind nicht ganz so offensichtlich. Nehmen wir Dein eigenes. Du verwendest simultaneous-music, d.h. << ... >>
In einer Stimme steht nur \set Staff.instrumentName = \markup { "Rhythmus" }
In der anderen eine DrumVoice die mit acciaccatura anfängt.
Somit wird das instrumentName-property zum Zeitpunkt null gesetzt, aber die acciaccatura fängt noch vorher an!

Um das zu beleuchten kann man meine kleine Funktion ctxMom verwenden. Im folgenden Code habe ich dein Beispiel nur in soweit verändert als daß ich innerhalb << ... >> explizite und benannte DrumVoices geschrieben habe.


ctxMom =
  \applyContext
  #(lambda (ctx)
    (format #t "\nin context ~a: ~a" ctx (ly:context-current-moment ctx)))

TrEins = \drummode {
  \time 2/2
  \tempo "Marcia" 2 = 112

  \acciaccatura tommh8 (sn4.)\ff sn8 \acciaccatura tommh8 (sn4) \acciaccatura tommh8 (sn4)
}
 

\score {
  \new DrumStaff = Tr <<
  \new DrumVoice = "foo" { \ctxMom \set Staff.instrumentName = \markup { "Rhythmus" } }
  \new DrumVoice = "bar" { \ctxMom \TrEins }
  >>
}


Terminal output:
in context #<Context DrumVoice=bar () >: #<Mom 0G-1/8>
in context #<Context DrumVoice=foo () >: #<Mom 0>


Die DrumVoice=bar fängt an zum Zeitpunkt #<Mom 0G-1/8>, erst danach wird der instrumentName gesetzt, zum Zeitpunkt #<Mom 0>
Also zu spät.


Du kannst das tatsächlich auf verschieden Arten fixen.

(1)
Verwende sequential-music, d.h. { ... }
{
  \set Staff.instrumentName = \markup { "Rhythmus" }
  \new DrumVoice { \TrEins }
}

Würde funktioniert haben, denn jetzt kommt die acciaccatura wirklich erst nachdem der instrumentName gesetzt wurde.

Allerdings will man ja manchmal direkt von Beginn simultaneous-music haben. Man kann jetzt natürlich anfangen zu schachteln:
{ ... << ... >> } oder so ähnlich.
Ist aber sehr umständlich.

(2)
Stelle sicher, daß wirklich überall grace-synchronisation erfolgt:

\score {
  \new DrumStaff = Tr <<
  \new DrumVoice = "foo" { \set Staff.instrumentName = \markup { "Rhythmus" }  \grace s8 }
  \new DrumVoice = "bar" { \TrEins }
  >>
}

Ist aber sehr umständlich.

(3)
Verwende \with und alles ist in Butter :)


Gruß,
  Harm


mobby83

Danke für die ausführliche Antwort.  :D

Ich spiele mit deinen Beispielen grade etwas rum. Vielleicht hab ich dann noch eine Frage.