Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: ingmar am Donnerstag, 25. Juli 2019, 14:08

Titel: Wieder mal Stichnoten - hier: Vertikales Verschieben der Pause [GELÖST]
Beitrag von: ingmar am Donnerstag, 25. Juli 2019, 14:08
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 (http://lilypond.org/doc/v2.19/Documentation/notation/writing-parts#formatting-cue-notes) 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 (https://lilypondforum.de/index.php/topic,474.msg2797.html#msg2797) 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
Titel: Antw:Wieder mal Stichnoten - hier: Vertikales Verschieben der Pause
Beitrag von: Malte am Freitag, 26. Juli 2019, 09:54
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:
Titel: re: Wieder mal Stichnoten - hier: Vertikales Verschieben der Pause
Beitrag von: ingmar am Freitag, 26. Juli 2019, 12:23
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
Titel: re: Wieder mal Stichnoten - hier: Vertikales Verschieben der Pause
Beitrag von: ingmar am Mittwoch, 21. August 2019, 20:17
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]