Autor Thema: Partcombine mit gleichem Markup in beiden Stimmen  (Gelesen 2513 mal)

Thomas

  • Member
Partcombine mit gleichem Markup in beiden Stimmen
« am: Donnerstag, 13. Oktober 2016, 20:41 »
Hallo,

wenn man bei \partcombine in beiden Stimmen die gleiche Dynamik hat, wird diese nur einmal angezeigt. Wenn man aber das gleiche \markup verwendet, erscheint dieses doppelt. Kann man da was machen ohne extra \markup-Stimme?

Gruß Thomas

\version "2.18.2"

StimmeZwei = {
  c'1\f
  c'1^\markup{ "Text der nur einmal erscheinen soll" }
}

StimmeEins = {
  e'1\f
  e'1^\markup{ "Text der nur einmal erscheinen soll" }
}

\score {
  \StimmeEins
}

\score {
  \StimmeZwei
}

\score {
  \partcombine
  \StimmeEins
  \StimmeZwei
}

StimmeZweiB = {
  c'1\f
  c'1
}

StimmeEinsB = {
  e'1\f
  e'1
}

StimmeMarkup = {
  s1
  s1^\markup{ "Text der nur einmal erscheinen soll" }
}

\score {
  <<
    \StimmeEinsB
    \\
    \StimmeMarkup
  >>
}

\score {
  <<
    \StimmeZweiB
    \\
    \StimmeMarkup
  >>
}

\score {
  <<
    \partcombine
    \StimmeEinsB
    \StimmeZweiB
    \\
    \StimmeMarkup
  >>
}

Manuela

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #1 am: Donnerstag, 13. Oktober 2016, 21:01 »
StimmeEins = { \override TextScript.stencil = ##f
  e'1\f
  e'1^\markup{ "Text der nur einmal erscheinen soll" }
}

fällt mir so auf die Schnelle ein. Eigentlich wollte ich
\remove Text_engraververwenden, aber das gibt immer einen Fehler.

Update: Kommando retour, so verschwindet der ganze Text. Aber dass lässt sich sicher leicht beheben.
« Letzte Änderung: Donnerstag, 13. Oktober 2016, 21:03 von Manuela »

fugenkomponist

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #2 am: Donnerstag, 13. Oktober 2016, 21:38 »
Zwei Möglichkeiten:

1. Du \tagst die überzähligen TextScripts und filterst sie beim \partcombine raus. Vorteil: Sehr flexibel. Nachteil: Tipparbeit.
2. Du filterst sämtliche (!) TextScripts aus einer der beiden Stimmen raus. Vorteil: wenig Tipparbeit. Nachteil: Das betrifft auch die TextScripts, die nur in einer der beiden Stimmen auftreten.

Es hängt also von deinem Stück ab, welche Lösung du nutzen solltest. Hier ein Stück, für das Lösung 2 ungeeignet ist. In Takt 2 sieht man aber den Effekt von Lösung 1. Im Anhang siehst du das Ergebnis: Zeile 1 Stimme 1, Zeile 2 Stimme 2, Zeile 3 normales \partcombine, Zeile 4 Lösung 1, Zeile 5 Lösung 2.
\version "2.18.2"

StimmeEins = {
  \textLengthOn
  e'1\f
  e'1^\markup{ "Text in Stimme 1" }
  e'1^\markup{ "anderer Text in Stimme 1" }
  e'1
}

StimmeZwei = {
  \textLengthOn
  c'1\f
  c'1-\tag #'redundant ^\markup{ "Text in Stimme 2" }
  c'1
  c'1^\markup{ "anderer Text in Stimme 2" }
}

\score {
  \StimmeEins
}

\score {
  \StimmeZwei
}

% Standard-Verhalten
\score {
  \partcombine
  \StimmeEins
  \StimmeZwei
}

% \tag und \removeWithTag
% Vorteile: Kann auf beide Stimmen wirken, Entscheidung individuell
%   für einzelne TextScripts
% Nachteil: Falls alle TextScripts raus sollen, viel \tag-Tipparbeit
\score {
  \removeWithTag #'redundant
  \partcombine
  \StimmeEins
  \StimmeZwei
}

removeTextScripts =
#(define-music-function (parser location music) (ly:music?)
   (music-filter
    (lambda (m)
      (not (eq?
            'TextScriptEvent
            (ly:music-property m 'name))))
    music))

% Rausfiltern aller TextScripts
% Vorteil: weniger Tipparbeit
% Nachteil: filtert wirklich alle TextScripts raus, auch die, die nur
%   in Stimme 2 vorkommen und nicht in Stimme 1
\score {
  \partcombine
  \StimmeEins
  \removeTextScripts \StimmeZwei
}

Manuela

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #3 am: Donnerstag, 13. Oktober 2016, 23:28 »
Ich habe jetzt was mit Context probiert. Es kompiliert zwar, liefert jedoch Fehlermeldungen.

\version "2.18.2"
\layout {
 
  \context {
    \Voice
    \name FirstVoice
    \alias Voice
    \remove "Text_engraver"
    \remove "Dynamic_engraver"
  }
  \context {
    \Staff
    \accepts FirstVoice
  }
 
}
StimmeZwei = {
  c'1\f
  c'1^\markup{ "Text der nur einmal erscheinen soll" }
}

StimmeEins = { \shiftOff
  e'1\f
  e'1^\markup{ "Text der nur einmal erscheinen soll" }
}

\score {
  \StimmeEins
}

\score {
  \StimmeZwei
}

\score {
  \partcombine
  { \new FirstVoice
    \StimmeEins }
  \StimmeZwei
}

fugenkomponist

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #4 am: Donnerstag, 13. Oktober 2016, 23:35 »
Naja, das Problem bei deinem Ansatz ist: \partcombine nimmt zwei Stimmen und baut sie zu einer einzelnen zusammen. Es sind nicht mehr zwei Stimmen auf einem Staff, deswegen kann man schlecht einer den Text_engraver wegnehmen und der anderen nicht. LilyPond probiert das trotzdem und kommt zu dem Ergebnis, dass das TextScript innerhalb der Voice zu einem der beiden Akkordtöne gehört. Sowas ist aber bisher in LilyPond nicht unterstützt (ich seh ehrlich gesagt auch keinen Grund, warum es das tun sollte).

Deshalb ist glaub ich meine zweite Lösung besser geeignet für das gleiche Ergebnis. Die entfernt die TextScripts so richtig statt ihnen den Engraver so halb unterm Hintern wegzuziehen ;)

Manuela

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #5 am: Freitag, 14. Oktober 2016, 05:51 »
Sowas ist aber bisher in LilyPond nicht unterstützt (ich seh ehrlich gesagt auch keinen Grund, warum es das tun sollte).

Deshalb ist glaub ich meine zweite Lösung besser geeignet für das gleiche Ergebnis. Die entfernt die TextScripts so richtig statt ihnen den Engraver so halb unterm Hintern wegzuziehen ;)

Ich komme halt immer auf solche Ideen, wahrscheinlich weil mir gar nicht so klar ist, was ich tue  ;)

Diese Version kompiliert mit einer Warnung, ohne Fehlermeldung



\version "2.18.2"
\layout {
 
  \context {
    \Voice
    \name FirstVoice
    \alias Voice
    \override TextScript.stencil = ##f
    \remove "Dynamic_engraver"
  }
  \context {
    \Staff
    \accepts FirstVoice
  }
 
}
StimmeZwei = {
  c'1\f
  c'1^\markup{ "Text der nur einmal erscheinen soll" }
}

StimmeEins = { \shiftOff
  e'1\f
  e'1^\markup{ "Text der nur einmal erscheinen soll" }
}

\score {
  \StimmeEins
}

\score {
  \StimmeZwei
}

\score {
  \partcombine
  { \new FirstVoice
    \StimmeEins }
  \StimmeZwei
}

fugenkomponist

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #6 am: Freitag, 14. Oktober 2016, 09:44 »
Diese Version kompiliert mit einer Warnung, ohne Fehlermeldung
Dann schau mal, was passiert, wenn du Achtel statt Ganzen nimmst: „ignoring too many clashing note columns“ deutet darauf hin, daß mehrere Stimmen existieren und diese kollidieren. Und das ist auch genau, was passiert, nur sieht man es bei ganzen Noten nicht ;) \partcombine scheitert nämlich daran, die Stimmen zu einer zusammenzufügen.

Merke: Warnungen sind ernstzunehmen ;)

Edit: Ich seh grad, das ist auch das Problem bei deiner ersten Lösung. LilyPond erkennt, daß Akkorde da wären, eins mit, eins ohne TextScript. Kann das nicht, baut also wieder zwei Stimmen, die dann kollidieren.
« Letzte Änderung: Freitag, 14. Oktober 2016, 09:46 von fugenkomponist »

Manuela

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #7 am: Freitag, 14. Oktober 2016, 10:03 »
OK fugenkomponist, du hast recht  :)

Thomas

  • Member
Re: Partcombine mit gleichem Markup in beiden Stimmen
« Antwort #8 am: Freitag, 14. Oktober 2016, 19:40 »
Diese Lösung reicht mir. Danke.


\version "2.18.2"

removeTextScripts =
#(define-music-function (parser location music) (ly:music?)
   (music-filter
    (lambda (m)
      (not (eq?
            'TextScriptEvent
            (ly:music-property m 'name))))
    music))

% Rausfiltern aller TextScripts
% Vorteil: weniger Tipparbeit
% Nachteil: filtert wirklich alle TextScripts raus, auch die, die nur
%   in Stimme 2 vorkommen und nicht in Stimme 1
\score {
  \partcombine
  \StimmeEins
  \removeTextScripts \StimmeZwei
}