Autor Thema: Bläserstimmen auf ein System zusammenfassen  (Gelesen 4137 mal)

gbehrendt

  • Member
Bläserstimmen auf ein System zusammenfassen
« am: Samstag, 1. August 2015, 19:54 »
Hej.

Für die Partitur eines Orchesterwerks möchte ich bei den Bläsern bis zu drei/vier Stimmen in ein System zusammenfassen und zwar dergestalt, dass bei gleichem Rhythmus und Artikulation gemeinsame Hälse gesetzt werden, ansonsten mehrere Stimmen mit getrennten Hälse (oben/unten) dargestellt werden und bei unisono-Stellen die Töne nur einmal erscheinen. Wird es (nach meiner Einschätzung) zu komplex, bekommen einzelne Stimmen ihr eigenes System.

Ich habe mir schon ein bisschen den Kopf darüber zerbrochen, aber nichts zufriedenstellendes herausgefunden, und so will ich nun anstatt mit einer „dreckigen“ Methode das Rad neu zu erfinden lieber einmal nach dem state of the art fragen.

partcombine scheidet aus, weil es so recht nur mit zwei Stimmen umgehen kann und ich auch gern etwas mehr Kontrolle hätte (außerdem macht es Ärger mit quoteDuring). Die Stimmen liegen (für den Einzelstimmenauszug vorbereitet) in einzelnen Variablen vor und es kommt auch nicht in Frage, die ganze Passage mit expliziten Akkorden abzutippen. Was ich gern hätte, wäre, die Sprungstellen mit neu definierten Befehlen zu markieren, die ich per \tag nur auf die Partitur beziehe. \change Staff = ".." und \voiceOne bzw. \voiceTwo leisten da im Prinzip gute Dienste, aber wie kriege ich nun rhythmisch gleiche Noten aus verschiedenen Stimmen (Variablen) als Akkord mit einem Hals dargestellt, ohne mich auf partcombine zu verlassen? Kann man Voice-Kontexte fix als „akkordisch“/einzeln/stemUp/stemDown etc. definieren und die Musik in den Variablen dann dieser oder jener Voice zuordnen?

Danke für einen Tipp oder Hinweise auf funktionierende Work-arounds.
(Da die Frage relativ grundsätzlich ist, diesmal zunächst ohne Minimalbeispiel, aber mit Versionsangabe: 2.18.2.)
– Gereon

gbehrendt

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #1 am: Sonntag, 2. August 2015, 10:43 »
Hej.
Zum besseren Verständnis mal noch ein Minimalbeispiel und die konkrete Erklärung, was ich erreichen will, am Notentext:
Es sollen drei Holzbläser-Stimmen zusammen auf einem System dargestellt werden. Dabei orientiert sich die Mittelstimme rhythmisch mal an der Ober-, mal an der Unterstimme, sodass ich mich nicht von vornherein auf eine Halsrichtung festlegen kann. Sind alle drei Stimmen rhythmisch gleich, sollen sie auch alle einen gemeinsamen Hals bekommen. Wird der Inhalt dieses einen Systems zu unübersichtlich (oder wenn die 3. Oboe zum Englischhorn wechselt), kommt am Zeilenumbruch ein neues System dazu. Die Zuordnung Hals oben, Hals unten und eigenes System übernehme ich gern manuell mit abgekürzten Befehlen – im Einzelstimmenauszug darf aber von alledem nichts zu sehen sein.

Das klappt so weit mit dem folgenden Code ganz gut, nur:
Wie kriege ich es nun hin, dass die zugleich nach oben bzw. unten stehenden Noten nicht nur einfach übereinander gedruckt, sondern korrekt mit gemeinsamem Hals versehen (also als Akkord verstanden) werden, sodass es nicht nur mal zufällig klappt (1. und 3. Schlag), sondern auch mit in dieser Hinsicht schwierigeren Intervallen (Schlag 2 und 4)?
[Zum Entfernen doppelter Dynamik- und Artikulationsangaben im gemeinsamen System dachte ich an das Snippet 372, habe das für mich aber noch nicht implementiert.]

Habt vielen Dank für einen Tipp zum „Akkordformatieren“
– Gereon


\version "2.18.2."

% Staff-Beschriftung
einszweidrei = { \set Staff.instrumentName = \markup { \center-column { "1" "2" "3" } }
<>^\markup { kombiniert in Partitur } }
einszwei = { \set Staff.shortInstrumentName = \markup { \center-column { "1" "2" } } }
eins = { \set Staff.shortInstrumentName = "1" <>^\markup { unbearbeitet, z.B. Einzelstimmen } }
zwei = { \set Staff.shortInstrumentName = "2" }
drei = { \set Staff.shortInstrumentName = "3" }

% gemeinsame Halssetzung // Staff-Wechsel
oben = { \tag score { \voiceOne } }
unten = { \tag score { \voiceTwo } }
staffB = { \tag score { \break \einszwei \change Staff = "C" \oneVoice \drei } }

% Musik
oboeI = \relative c'' { \oben c4 b d2  |  d,8 f a d b a g f }
oboeII = \relative c'' { \oben a4 a \unten f f  |  a,2 a }
oboeIII = \relative c' { \unten e2 d4 e  |  \staffB f4. f8 r4 f }


\score {
<<
\new Staff = "A"  { << \einszweidrei  \oboeI  \\  \oboeII   \\  \oboeIII >>  | \break
\removeWithTag score { \eins \oboeI } }
\new Staff = "B" { s1*2  |  \removeWithTag score { \zwei \oboeII } }
\new Staff = "C" { s1*2  |  \removeWithTag score { \drei \oboeIII } }
>>

\layout {
ragged-right = ##t
indent = 0\cm
\override Staff.VerticalAxisGroup.remove-first = ##t
\override Score.BarNumber.break-visibility = #'#(#f #f #f)
\context { \Staff \remove "Time_signature_engraver" \RemoveEmptyStaves }
} }

fugenkomponist

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #2 am: Sonntag, 2. August 2015, 12:23 »
partcombine scheidet aus, weil es so recht nur mit zwei Stimmen umgehen kann und ich auch gern etwas mehr Kontrolle hätte (außerdem macht es Ärger mit quoteDuring).
Der Wunsch nach partcombine für mehr als zwei Stimmen wird immer mal wieder geäußert (auch hier im Forum) und ist auch schon als issue 2610 bekannt. Merkwürdigerweise gibts da aber kaum Diskussion, deshalb fürchte ich, dass da gerade nicht viel passiert.

Was genau meinst du denn mit „mehr Kontrolle“? Kennst du \partcombineApart etc.? Oder gehts um mehrere Systeme? Dazu gibt es hier zwei Threads. Das hier ist der erste, aber leider finde ich den zweiten gerade nicht mehr, selbst nach längerer Suche …

Edit: Ich war mir eigentlich ziemlich sicher, dass es hier einen Thread gibt. Jedenfalls scheint issue 3518 irgendwie damit zu tun zu haben, vielleicht war das also auch was, was ich auf der englischen Liste oder im issue tracker gesehen habe.
« Letzte Änderung: Sonntag, 2. August 2015, 12:27 von fugenkomponist »

harm6

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #3 am: Mittwoch, 5. August 2015, 15:06 »
Hallo Gereon,

ich habe mittlerweile ein paar hundert Code-Zeilen geschrieben, nur um Ende etwas zu bekommen was in jedem Punkt schlechter ist als der aktuelle partcombiner.

Die Schwierigkeiten für eine halbwegs automatisierte Lösung wachsen enorm sobald Spanner ins Spiel kommen wie Tie/Slur/cresc etc.


Insoweit hier eine manuelle Lösung:

\version "2.18.2."

id =
#(define-music-function (parser location strg mus)(string? ly:music?)
 #{ \context Voice = #strg $mus #})

I =
  \relative c'' { \id "1" { c4 b d2 | d,8 f a d b a g f } }
 
II =
  \relative c'' { \id "1" { a4 a } \id "2" { f f |  a,2 a } }
 
III =
  \relative c' {
    \id "2" { e2 d4 e }
    \break
    \oneVoice
    \change Staff = "B"
    %\id "3" { f4. f8 r4 f }
    f4. f8 r4 f
  }

 
\layout { indent = 0 ragged-right = ##t }

<<
\new Staff = "A"
  \new Voice
  <<
    \I
    \\
    \II
    \\
    \III
  >>
\new Staff = "B" { s1*2 }
>>


Gruß,
  Harm

gbehrendt

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #4 am: Freitag, 7. August 2015, 18:33 »
Hej,
diese manuelle Lösung ist genau das (und alles), was ich wollte! Ich hab gern selbst die Kontrolle darüber, wann die Stimmen wie zusammengefasst sind und jemand das System wechselt, anstatt ein Alles-oder-nichts-Ergebnis einer automatischen Funktion zu nehmen. Aber es ist natürlich eine ziemliche Kleinarbeit. Dennoch: danke! :-)

Allerdings bekomme ich jetzt jede Menge Warnungen:
Warnung: es kann kein Kontext zum Umschalten gefunden werden

und manchmal auch
Warnung: "Staff" kann nicht in "Fl2" geändert werden: kein Umschalten zum gleichen Kontexttypen: Staff,

obwohl ich schon vor jedem \change Staff sicherheitshalber s1*0 stehen hab, wie es mal irgendwo empfohlen war.
Und gibt es eine Präferenz, welche ID ich für Passagen vergebe, in denen alle Stimmen des Systems gemeinsame Hälse bekommen sollen? Einfach irgendeine, solange es für alle die gleiche ist, oder eine bestimmte?

– Gereon

harm6

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #5 am: Freitag, 7. August 2015, 19:02 »
Um die Fehlermeldungen beurteilen zu können, muß ich schon den Code sehen der sie verursacht. ;)

Das Konstrukt << {} \\ {} >> setzt neue Voices, die von oben nach unten
\context Voice = "1"
\context Voice = "2"
\context Voice = "3"
...
sind.

Insoweit empfiehlt es sich wohl, das erstmal beizubehalten.

Allerdings kann man schon interessante Sachen mit kreativer Benennung erhalten:

\new Staff <<
    \new Voice = "a" \with { \override NoteHead #'color = #green }
     s1*4
    \new Voice = "b" \with { \override NoteHead #'color = #red }
     s1*4
    \new Voice = "c"
     s1*4
  \relative c' {
    \context Voice = "a" { \set tieWaitForNote = ##t c1~ }
    \context Voice = "b" { \set tieWaitForNote = ##t cis4 d dis e^~ }
    \context Voice = "a" { d2 c2 }
    \context Voice = "b" { f4 e fis g }
    \context Voice = "c" { e1 }
  } >>

:D


Gruß,
  Harm

gbehrendt

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #6 am: Freitag, 7. August 2015, 19:07 »
Ja, schon klar, aber dieses Großprojekt auf ein Minimalbeispiel herunterzubrechen, mache ich ein ander Mal. Der Output scheint von diesen Fehlermeldungen auch nicht betroffen zu sein.

Außerdem, das hatte ich gerade vergessen:
Um die Wirkung der \id-Funktion jetzt auf die Partitur zu beschränken, wollte ich einen Tag in die Definition einbauen und im Stimmenauszug nur den Inhalt ohne die context-Zuweisung setzen. Außerdem blende ich an unisono-Stellen die zweite, ohnehin zitierende Stimme aus, damit ich nicht ständig Primen gedruckt kriege, und ergänze dann händisch den Hinweis auf beide Instrumente.
In diesen beiden Fällen will ich unterschiedliche Wirkungen der Scheme-Funktionen für die Tags P und St haben und kriege damit offensichtlich Schwierigkeiten, weil ich nicht beide Argumente für die Ausgabe nutze:
id =
#(define-music-function (parser location strg mus ) (string? ly:music?)
   #{ \tag #'St $mus
\tag #'P \context Voice = #strg $mus
   #})
qQuoteDuring =
#(define-music-function (parser location what main-music ) (string? ly:music?)
   #{ \tag #'St \quoteDuring $what $main-music
\tag #'P $main-music
   #})

– Gereon

harm6

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #7 am: Freitag, 7. August 2015, 19:32 »
Bitte habe Verständnis, daß ich ein kompilierbares Minimalbeispiel einfordere ...

Zitat von: gbehrendt
id =
#(define-music-function (parser location strg mus ) (string? ly:music?)
   #{ \tag #'St $mus
\tag #'P \context Voice = #strg $mus
   #})
qQuoteDuring =
#(define-music-function (parser location what main-music ) (string? ly:music?)
   #{ \tag #'St \quoteDuring $what $main-music
\tag #'P $main-music
   #})

Es fehlt hier wie Du es anwendest.

Versetze mich und andere bitte in die Lage copy/paste/compile/watch-the-out-put in weniger als einer Minute durchzuführen. ;)

Gruß,
  Harm

gbehrendt

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #8 am: Montag, 12. Oktober 2015, 20:35 »
Hallo Harm (und andere),

bei der (ansonsten sehr gut funktionierenden) Lösung von oben mit \change Staff = "XY" usw. hat sich noch ein kleines Problem aufgetan, wenn ich inmitten einer Überbindung (tie) die Notenzeile wechsle: im ersten System erscheint der Bindebogen dann schon auf der neuen Notenzeile und damit nicht an der Note. Lässt sich das (z.B. mit Y-offset o.ä.) lösen, ohne den Bogen in allen Punkten manuell zu beschreiben?

Besten Dank für einen Vorschlag.
– Gereon

\version "2.18.2."

id =
#(define-music-function (parser location strg mus)(string? ly:music?)
 #{ \context Voice = #strg $mus #})

I =
  \relative c'' { \id "1" { c4 b d2~ |
      \break
    \oneVoice
    \change Staff = "B"
    d8 a f d b' a g f } }
 
II =
  \relative c'' { \id "1" { a4 a } \id "2" { f a |  a,2 a } }
 
III =
  \relative c' {
    e2 d4 f~
    f4. f8 r4 f
  }

 
\layout { indent = 0 ragged-right = ##t }

<<
\new Staff = "B" { s1*2 }
\new Staff = "A"
  \new Voice
  <<
    \I
    \\
%    \II
%    \\
    \III
  >>
>>

harm6

  • Member
Re: Bläserstimmen auf ein System zusammenfassen
« Antwort #9 am: Montag, 12. Oktober 2015, 23:24 »
Die NR 1.2.1 schreibt:
Zitat
Known issues and warnings
Switching staves when a tie is active will not produce a slanted tie.
Changing clefs or ottavations during a tie is not really well-defined. In these cases, a slur may be preferable.

Ist natürlich ein workaround, aber in der Tat gibt ein Slur ein besseres visuelles Ergebnis.

Gruß,
  Harm