Wieder mal Stichnoten - hier: Vertikales Verschieben der Pause [GELÖST]

Begonnen von ingmar, Donnerstag, 25. Juli 2019, 14:08

« vorheriges - nächstes »

ingmar

mal wieder mein Lieblingsthema!

\version "2.19.83"

fluteNotes = \relative { d''8 d c b c c b a b a b a g4 a g1 }
oboeNotes = \relative { R1 c''4 d e f g1 }
 
\addQuote #"flute" \fluteNotes
\addQuote #"oboe" \oboeNotes

% Oboe, mit Flötenpart als Stichnoten:
\score { \new Staff \with { instrumentName = "Oboe" } <<
\new CueVoice { \set instrumentCueName = "Flöte" }
\cueDuring #"flute" #DOWN { s1 }
\oboeNotes
>>}

% Oboe, mit Flötenpart als Stichnoten:
\score { \new Staff \with { instrumentName = "Oboe" } <<
\new CueVoice { \set instrumentCueName = "Flöte" }
\cueDuring #"flute" #DOWN { s1 }
{ c'1\rest \quoteDuring #"oboe" { s1 *2 } }
>>}


Wir haben also eine Variable mit den Noten der Flöte und eine Variable mit den Noten der Oboe. Diese Variablen möchte ich nicht ändern!

Innerhalb der Oboenstimme möchte ich die Flötenstimme als Stichnoten zitieren. Wir sehen im ersten Beispiel, dass dabei der Flötenpart mit der Pause im Oboenpart kollidiert.

Frage: Wie verschiebe ich dort die Pause, ohne die Variable anzutasten?

Die Lilypond-Doku macht es sich sehr einfach, sie schreibt das Nötige in die Variable \oboeNotes hinein - genau das aber will ich nicht, schon, weil es dort IMHO einfach nichts hingehört.

Meine bisherigen Versuche verwenden dazu auch die Oboenstimme als Zitat (zweites Beispiel). Das funktioniert prima, verlangt aber dann die Längenangabe (hier "{ s1 *2 }"). Das finde ich sehr unschön; bei langen Parts mit vielen Taktwechseln geht hier ein fehlerträchtiges Auszählen los. Ich suche jedenfalls eine automatische Lösung.

Kollege Harms hatte hier eine Funktion allRestsToSkips vorgestellt, die ich versucht habe, so zu verändern, dass sie nicht nur Pausen, sondern auch Notenwerte in Skips verwandelt – und dass sie dazu nicht gewöhnliche Variablen mit Musik, sondern eine "Quote" erwartet (oder jedenfalls das Dingens, das \addQuote erzeugt).

Irgendwie komme ich damit nicht weiter, und bin vor allem auch nicht sicher, dass das wirklich funktionieren würde. Es gäbe sicher auch eine elegantere Lösung, etwa \quoteDuring so umzubauen, dass sie keine Längenangabe erwartet, oder ein optionaler Parameter bei \CueDuring im ersten Beispiel, der die Pausen der Hauptstimme verschiebt. - Leider alles zu schwierig für mich... : - (

Kann jemand helfen? : - )

Danke,
--ingmar

EDIT: Typo

Malte

Hallo ingmar,

es geht viel einfacher:
\version "2.19.83"

fluteNotes = \relative { d''8 d c b c c b a b a b a g4 a g1 }
oboeNotes = \relative { R1 c''4 d e f g1 }

\addQuote #"flute" \fluteNotes

\score {
  \new Staff \with { instrumentName = "Oboe" } <<
    \new CueVoice { \set instrumentCueName = "Flöte" }
    \cueDuring #"flute" #DOWN {
      \once \override Staff.MultiMeasureRest.staff-position = -6
      s1
    }
    \oboeNotes
  >>
}

Statt \cueDuring nur Spacer-Pausen (s1) mitzugeben, kann da alles mögliche andere passieren, z. B. Noten, Tempo-Angaben, aber auch \overrides. Der \override hier hat noch einen kleinen Trick: MultiMeasureRests leben ja im Voice-Kontext (hier der der Oboe), der \override steht aber in der (Cue)Voice der Flöte. Damit der \override in einer Stimme seine Wirkung auch in der anderen zeigt, muß ein höherer Kontext (hier Staff) mit angegeben werden, dann wirkt der auf dieser höheren Ebene.

Ich glaube aber, daß \cueDuring eigentlich ganz anders gedacht ist, und zwar so, daß du die Zitate direkt in die Definition von \oboeNotes packst. In einer Partitur kann man dann die Stichnoten per \killCues ausschalten.\version "2.19.83"

fluteNotes = \relative { d''8 d c b c c b a b a b a g4 a g1 }
\addQuote #"flute" \fluteNotes

oboeNotes = \relative {
  \cueDuring #"flute" #UP {
    \set CueVoice.instrumentCueName = "Flöte"
    R1
  }
  c''4 d e f g1
}


partitur = \new Staff \with {
  instrumentName = "Oboe"
} \new Voice \oboeNotes

\score {
  \partitur
}

\score {
  \killCues \partitur
  \layout {
    \context {
      \CueVoice
      \remove Instrument_switch_engraver
    }
  }
}

Es gibt hier zwei kleine Bugs, die der obige Code umgeht:

  • \killCues tötet nicht die InstrumentSwitch-Grobs (hier die Beschriftung ,,Flöte". Das würde er wahrscheinlich tun, wenn er die CueVoice-Kontexte als ganzes töten würde, stattdessen wird nur die zitierte Musik entfernt. Mein Workaround: Im \layout-Block den entsprechenden Engraver entfernen.
  • Beginnt eine Stimme direkt \cueDuring, so wird, weil schon eine CueVoice da ist, kein Voice-Kontext implizit erzeugt und auch die Oboen-Noten stehen in der CueVoice und damit in Stichnotengröße. Mein Workaround: Den Voice-Kontext mit \new Voice \oboenNoten explizit erstellen.

ingmar

Ah ja, das hilft. Danke!

Das Thema "Context" bringt nicht nur mich regelmäßig ins Straucheln.

Dass sich die Lilypond-Autoren vorgestellt hatten, die Stichnoten in den Einzelstimmen unterzubringen, hatte ich ja schon geschrieben - auch, dass ich der Ansicht bin, dass es dort einfach nicht hingehört, weil es eben nicht Teil des Notentextes, sondern der Darstellung des Notentextes ist.

Gruß, : - )
--ingmar

ingmar

#3
Hallo,


ein paar Änderungen werden noch nötig: Nicht nur die Ganztaktpausen, sondern auch andere Pausen sollten verschoben werden; da mehrere aufeinanderfolgen können, geht das nicht per \once, sondern mit einem anschließenden \revert – und der Vorgang muss auf die richtige Stimme beschränkt werden, um eventuelle Pausen in der zitierten Stimme in Ruhe zu lassen.


Aber dein Tip, Malte, hat in die richtige Richtung geführt. Danke!

--ingmar

[Edit]