Autor Thema: Abstand eines Textobjektes ...  (Gelesen 2985 mal)

pjheinrich

  • Member
Abstand eines Textobjektes ...
« am: Dienstag, 25. Oktober 2011, 22:18 »
Liebe Forumgemeinde!

Ich stehe wiederum vor einem kleinen Problem im Lilypond. - In einer Chorpartitur, an der ich gerade schreibe habe ich - aus platztechnischen Gründen - die beiden solistischen Stimmen (S, A) im selben System wie den gesamten Chor (S, A, T, B auf 2 Systemen) notiert. - Dies funktioniert auch sehr gut, da die Solisten praktisch nie gleichzeitig mit dem Chor auftreten.

Um die Solostimmen zu kennzeichnen, möchte ich nun ein eingerahmtes Textfeld vor die betrefende Passage mit dem Hinweis "Solo" stellen. - Dies mache ich mit folgendem Code:

  R2.
  \once \override TextScript #'padding = #-8
  R ^ \markup { \box \small { Solo } }
  g4 d bes'

Das funktioniert auch ziemlich gut, allerdings gefällt mir die Positionierung optisch nicht. - Ich habe einen Ausschnitt aus der Partitur hier als Anhang beigefügt.

- Ist es möglich, dieses Textfeld so zu verschieben, dass es z.B. direkt vor dem Text des Soprans, also direkt vor "Scitote ..." steht?

Bei der Gelegenheit sind mir zwei weitere Fragen aufgekommen:

- Gibt es eine Möglichkeit die Pause die sich im Takt, wo der Sopran einsetzt, mit dem d1 "reibt" vertikal zu verschieben? (Erzeugt habe ich sie mittels der Notation "R2."...)

Und - wie man im etwas kleiner gestochenen obersten System erkennen kann, sind hier die Viertelpausen etwas zu weit oben. - Ich habe diese ursprünglich (das ist eine Trompetenstimme, welche im Code in B-Dur eingegeben wurde) als bes4\rest dorthin verrückt, wo ich sie haben wollte. - Da es sich aber um B-Tompeten handelt, habe ich nun mittels \transpose die Trompetenstimme einen Ganzton höher transponiert, dabei sind mir leider auch die Pausen (aber nur eben diese Viertelpausen und nicht die Ganztaktpausen, welche mit R2. erstellt wurden) "mitgewandert". Kann ich diese wieder - ohne jede einzelne ändern zu müssen - auf ihren "richtigen" Platz bekommen?

Einige werden sich nun denken, dass ich Prinzipiell die Viertelpausen auch mit R4 etc. im Code notieren sollte, allerdings habe ich mit mir eine "Notationsvereinbarung", welche aus der praktischen Überlegung der Übersichtlichkeit kommt: Pausieren zwei Stimmen gleichzeitig mit denselben Pausen, so reduziere ich diese immer auf je Pausenwert ein notiertes Symbol, welches dann in der Mitte des betreffenden Systems gesetzt wird. - Daraus ergibt sich meine letzte Frage: selbiges "vereinfachen" habe ich auch für die Zeilen mit den Ganztaktpausen vor. (Diese sind [noch] mit R2. notiert) - Gibt es eine Möglichkeit, wenn ich die Pausen in einer Stimme mittels s2. unsichtbar mache, dass ich die Ganztaktpause der anderen Stimme vertikal im Notensystem verschieben kann und sie gleichzeitig im Takt zentriert bleibt?

... ich weiß, das sind eine Menge fragen, aber ich habe leider den ganzen Tag schon mit Suchen verbracht, aber keine wirklich treffenden Antworten gefunden. Ich hoffe, ihr könnt mir weiterhelfen.

Liebe Grüße aus Lyon,
  pjheinrich

trulli

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #1 am: Dienstag, 25. Oktober 2011, 23:12 »
Hallo pjheinrich und herzlich Willkommen hier!

1) Verschiebung von Text
Es gibt dafür einige Möglichkeiten: z.B. kannst du gleichzeitig nach rechts/links und oben/unten mit
\once \override TextScript #'extra-offset = #'( 3 . 2 )verschieben. In der Klammer ist der erste Wert die links/rechts Verschiebung und der zweite Wert oben/unten Verschiebung. Natürlich sind auch negative Werte erlaubt. Mit ein bisschen probieren findest du schnell eine passende Lösung.
Bei der Methode ist aber Vorsicht geboten, weil sie schnell zu Kollisionen führen kann! Besonders dann, wenn du die Formatierung deiner Partitur änderst.

2) Verschiebung zentrierter Pausen
geht mit
(\once) \override MultiMeasureRest #'staff-position = #-2

Grüße von Trulli

P.S.: weitere nützliche Aussagen dazu wird bestimmt noch unser Partiturprofi Rob machen können... :)
« Letzte Änderung: Dienstag, 25. Oktober 2011, 23:14 von trulli »

harm6

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #2 am: Dienstag, 25. Oktober 2011, 23:27 »
Hallo pjheinrich,

zunächst mal bitte ich Dich immer ein kurzes, kompilierbares Code-Beispiel mit Angabe der version zu posten. Die Berarbeitung der Anfrage geht dann schneller, leichter und besser. Die Version ist wichtig, da sich manchmal gravierende Änderungen von der einen zur anderen ergeben. Ein Bild ist schön aber Code ist besser.;)

Zu Deinen Fragen:

Zitat
- Ist es möglich, dieses Textfeld so zu verschieben, dass es z.B. direkt vor dem Text des Soprans, also direkt vor "Scitote ..." steht?

Je nachdem wie Dein Code aussieht geht es auch anders, aber folgendes funktioniert auf jeden Fall ('padding kannst Du dann rausnehmen):
\relative c' {
        \once\override Voice.MultiMeasureRestText #'extra-offset = #'(1 . 1)
        R1-\markup \box "Solo"
}
@trulli
\once \override TextScript #'extra-offset = #'( 3 . 2 ) funktioniert nicht, wenn der Text an eine MultiMeasureRest gehängt wird.

Zitat
Gibt es eine Möglichkeit die Pause die sich im Takt, wo der Sopran einsetzt, mit dem d1 "reibt" vertikal zu verschieben?

Pausen bzw Mehrtaktpausen kann man so verschieben:
\relative c' {
        \override Voice.Rest #'staff-position = #6
        r2 s2
        \override Voice.MultiMeasureRest #'staff-position = #-6
        R1
}

Diese Möglichkeit wende ich in mehrstimmigen Stücken, die evtl. transponiert werden müssen, immer an. Eine Möglichkeit eine Pause, die mit a4\rest codiert wurde zu verschieben fällt mir zumindest im Moment nicht ein.

Zitat
Pausieren zwei Stimmen gleichzeitig mit denselben Pausen, so reduziere ich diese immer auf je Pausenwert ein notiertes Symbol, welches dann in der Mitte des betreffenden Systems gesetzt wird. - Daraus ergibt sich meine letzte Frage: selbiges "vereinfachen" habe ich auch für die Zeilen mit den Ganztaktpausen vor. (Diese sind [noch] mit R2. notiert) - Gibt es eine Möglichkeit, wenn ich die Pausen in einer Stimme mittels s2. unsichtbar mache, dass ich die Ganztaktpause der anderen Stimme vertikal im Notensystem verschieben kann und sie gleichzeitig im Takt zentriert bleibt?

Schau mal hier hin. Dieses snippet gilt allerdings gerade nicht für MultiMeasureRest, aber vielleicht kann man es anpasen

HTH,
  Harm
« Letzte Änderung: Dienstag, 25. Oktober 2011, 23:29 von harm6 »

trulli

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #3 am: Mittwoch, 26. Oktober 2011, 10:21 »
\once \override TextScript #'extra-offset = #'( 3 . 2 ) funktioniert nicht, wenn der Text an eine MultiMeasureRest gehängt wird.

Danke harm6 - wieder was gelernt!  :)

harm6

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #4 am: Mittwoch, 26. Oktober 2011, 19:37 »
Hallo,

Zitat
Da es sich aber um B-Tompeten handelt, habe ich nun mittels \transpose die Trompetenstimme einen Ganzton höher transponiert, dabei sind mir leider auch die Pausen (aber nur eben diese Viertelpausen und nicht die Ganztaktpausen, welche mit R2. erstellt wurden) "mitgewandert". Kann ich diese wieder - ohne jede einzelne ändern zu müssen - auf ihren "richtigen" Platz bekommen?

Mir ist da doch noch was eingefallen.

Ich habe dieses Snippet verändert.

\version "2.14.2"

% -> http://old.nabble.com/transposing-and-changePitch-td27384032.html#a27384032
 
transposeRestsOnly = #(define-music-function (parser location music) (ly:music?)
(let loop ((x music))
  (let ((e (ly:music-property x 'element))
        (es (ly:music-property x 'elements)))
    (cond
      ((eq? 'EventChord (ly:music-property x 'name))
        (if (and (pair? es)
                   (eq? 'RestEvent (ly:music-property (car es) 'name)))
           (set! x (make-sequential-music (list
                      #{\transpose c e, $x #})))))
      (else
         (if (ly:music? e) (ly:music-set-property! x 'element (loop e)))
         (if (pair? es)(ly:music-set-property! x 'elements (map loop es))))))
  x))
 

music = \relative c' {
        \key c\major
        a'4 b c d
        r r r r
        a\rest b\rest c\rest d\rest
}
 
\score {
        \new StaffGroup <<
        \new Staff \transpose c c \music
        \new Staff \transpose c a \music
        \new Staff \transpose c a \transposeRestsOnly \music
        >>
}

Damit kannst Du die Pausen, die mit z.B. a4\rest codiert wurden zurücktransponieren. Normal gesetzte Pausen z.B. {r4} bleiben unbehelligt. Leider habe ich keine akzeptable Eingabe für die Funktion gefunden. Du mußt also in die Funktion gehen und bei #{\transpose c e, $x #} den roten Wert anpassen. Das führt natürlich dazu, daß man das nicht in ein include-file stecken kann und wenn man die Funktion mehrmals pro file braucht muß man eine umbenannte, zusätzliche Version benutzen. Vielleicht weiß jemand anderes wie man das verbessert. Es ist aber immer noch besser als jede einzelne Pause von Hand zu korrigieren.
Aufgrund dieser Schwierigkeiten bin ich gänzlich davon abgekommen Pausen als a4\rest zu definieren, sondern benutze immer das schon oben beschriebene Verfahren mittels 'staff-position.

HTH,
  Harm

P.S. Es wäre besser für solch ein Problem (welches mit dem Thema des Threads ja nichts mehr zu tun hat) einen neuen Thead angefangen zu haben. ;)

RobUr

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #5 am: Mittwoch, 26. Oktober 2011, 21:53 »
Hallo pjheinrich,

es ist ja fast alles schon beantwortet … Grundsätzlich solltest Du wirklich pro Frage einen eigenen Thread starten.

Zunächst zum eigentlichen Thema: Nicht alles, was Text ist, ist automatisch ein „Textobjekt“. Lily unterscheidet viele verschiedene grafische Objekte, die ihren Typ nicht deshalb ändern, nur weil Text darin vorkommt. Hier einmal die für den Anfang wichtigsten:
  • TextScript: Ein ganz normales Objekt, das an einer Note oder einer normalen Pause (keine Ganztaktpause!) verankert ist, z.B. c^"Ich bin Text." Auf diese Weise kann jegliches Markup verankert werden, z.B. c8^\markup { \note #"2." #UP }. Ist das jetzt automatisch ein „Notenobjekt“? Wohl kaum. Es bleibt TextScript und muss als solches angesprochen werden.
  • Script: Alle (vordefinierten) Artikulationszeichen, z.B. \fermata oder \prall.
  • DynamicText: Alle (vordefinierten) Dynamikzeichen, z.B. \ppp oder \mf.
  • MultiMeasureRestText: Wie TextScript, aber an Ganztaktpausen verankert.
  • RehearsalMark: Objekte, die mittels \mark eingegeben werden, z.B. \mark "Allegro." oder
    \mark \markup { \note #"1" #1 " = " \note #"1." #1 }
  • LyricText: Eine Silbe als Liedtext unterlegt. Bindestriche sind vom Typ LyricHyphen, Fülllinien vom Typ LyricExtender.
Es muss eben immer das richtige Objekt angesprochen werden, bevor man haareraufend versucht, eine Viertelpause per \override NoteHead #'extra-offset = #'(0 . -2) zu verschieben ;)

Zitat von: pjheinrich
Ist es möglich, dieses Textfeld so zu verschieben, dass es z.B. direkt vor dem Text des Soprans, also direkt vor "Scitote ..." steht?
Ja, ist es. Ich rate allerdings davon ab, dieses in eine Zeile mit dem Liedtext zu rücken. Ich würde es immer in Notennähe platzieren (siehe Clip). Im Normalfall (eine Stimme pro Zeile) steht diese Angabe immer über der Zeile, da gäbe es ohnehin keine Kollision mit Liedtext. Solche Angaben werden also an der Note verankert, z.B. (g4^"SOLO.") und dann per \once \override TextScript #'extra-offset = #'(-3 . 0) verschoben. Eleganter geht es, eine eigene Variable nebst eigener Verschiebefunktion zu definieren:
% Variable definieren:
solo = \markup { \bold "SOLO." }

% TextScript verschieben; Benutzung: \tsOffset #'(X . Y)
tsOffset = #(define-music-function (parser location X-Y) (pair?)
#{
\once \override TextScript #'Y-extent = #'(0 . 0)
\once \override TextScript #'extra-offset = #$X-Y
#})

% Variable und Funktion im Einsatz:
\relative c'' { \tsOffset #'(-3 . 0) g4^\solo }

Zitat von: pjheinrich
Gibt es eine Möglichkeit die Pause die sich im Takt, wo der Sopran einsetzt, mit dem d1 "reibt" vertikal zu verschieben?
Auch diese Möglichkeit gibt es, deswegen ist die Antwort auf die Frage: ja. Auf alle anderen Fragen lautet die Antwort übrigens auch: ja. Bitte formuliere Fragen künftig entsprechend. Du möchtest sicher wissen, wie man das macht ;) Wurde ja bereits gezeigt.

Zitat von: pjheinrich
Gibt es eine Möglichkeit, […] dass ich die Ganztaktpause der anderen Stimme vertikal im Notensystem verschieben kann und sie gleichzeitig im Takt zentriert bleibt?
Ja, selbe Vorgehensweise. Wenn Ganztaktpausen überwiegend gemeinsam auftreten und nur punktuell verschoben werden müssen, ist es am besten, die vertikale Position in beiden beteiligten Stimmen per \override MultiMeasureRest #'staff-position = #0 für alle festzulegen und einzelne gezielt mittels Eigenbaufunktion an die richtige Stelle zu schieben:
% Ganztaktpause verschieben; Benutzung: \mmrOffset #Y
mmrOffset = #(define-music-function (parser location Y) (number?)
#{
\once \override MultiMeasureRest #'staff-position = #$Y
#})

% im Einsatz:
\relative c' { \mmrOffset #-7 R2. }
0 ist dabei die Standardposition für ganze und Ganztaktpausen, in diesem Fall identisch mit dem Wert +2. Intern hat die mittlere Notenlinie den Wert 0, auf den sich positive und negative Werte beziehen. -7 bewirkt also einen Versatz von 7 Tonstufen nach unten, gerechnet ab der mittleren Linie.

Hier ist jetzt noch der komplette Code mit allen angesprochenen Funktionen:
\version "2.14.2"

\include "deutsch.ly"

%%% ANFANG "gemeinsame Pausen"-Script (LSR #336) %%%
#(define (rest-score r)
  (let ((score 0)
(yoff (ly:grob-property-data r 'Y-offset))
(sp (ly:grob-property-data r 'staff-position)))
    (if (number? yoff)
(set! score (+ score 2))
(if (eq? yoff 'calculation-in-progress)
    (set! score (- score 3))))
    (and (number? sp)
(<= 0 2 sp)
(set! score (+ score 2))
(set! score (- score (abs (- 1 sp)))))
    score))

#(define (merge-rests-on-positioning grob)
  (let* ((can-merge #f)
(elts (ly:grob-object grob 'elements))
(num-elts (and (ly:grob-array? elts)
(ly:grob-array-length elts)))
(two-voice? (= num-elts 2)))
    (if two-voice?
(let* ((v1-grob (ly:grob-array-ref elts 0))
       (v2-grob (ly:grob-array-ref elts 1))
       (v1-rest (ly:grob-object v1-grob 'rest))
       (v2-rest (ly:grob-object v2-grob 'rest)))
  (and
   (ly:grob? v1-rest)
   (ly:grob? v2-rest)          
   (let* ((v1-duration-log (ly:grob-property v1-rest 'duration-log))
  (v2-duration-log (ly:grob-property v2-rest 'duration-log))
  (v1-dot (ly:grob-object v1-rest 'dot))
  (v2-dot (ly:grob-object v2-rest 'dot))
  (v1-dot-count (and (ly:grob? v1-dot)
     (ly:grob-property v1-dot 'dot-count -1)))
  (v2-dot-count (and (ly:grob? v2-dot)
     (ly:grob-property v2-dot 'dot-count -1))))
     (set! can-merge
   (and
    (number? v1-duration-log)
    (number? v2-duration-log)
    (= v1-duration-log v2-duration-log)
    (eq? v1-dot-count v2-dot-count)))
     (if can-merge
;; keep the rest that looks best:
(let* ((keep-v1? (>= (rest-score v1-rest)
      (rest-score v2-rest)))
(rest-to-keep (if keep-v1? v1-rest v2-rest))
(dot-to-kill (if keep-v1? v2-dot v1-dot)))
   ;; uncomment if you're curious of which rest was chosen:
   ;;(ly:grob-set-property! v1-rest 'color green)
   ;;(ly:grob-set-property! v2-rest 'color blue)
   (ly:grob-suicide! (if keep-v1? v2-rest v1-rest))
   (if (ly:grob? dot-to-kill)
       (ly:grob-suicide! dot-to-kill))
   (ly:grob-set-property! rest-to-keep 'direction 0)
   (ly:rest::y-offset-callback rest-to-keep)))))))
    (if can-merge
#t
(ly:rest-collision::calc-positioning-done grob))))
%%% ENDE "gemeinsame Pausen"-Script %%%

% Ganztaktpause verschieben; Benutzung: \mmrOffset #Y
mmrOffset = #(define-music-function (parser location Y) (number?)
#{
\once \override MultiMeasureRest #'staff-position = #$Y
#})

% TextScript verschieben; Benutzung: \tsOffset #'(X . Y)
tsOffset = #(define-music-function (parser location X-Y) (pair?)
#{
\once \override TextScript #'Y-extent = #'(0 . 0)
\once \override TextScript #'extra-offset = #$X-Y
#})

solo = \markup { \bold "SOLO." }
tutti = \markup { \bold "TUTTI." }

Global = {
\time 3/4
\key b \major
\override MultiMeasureRest #'staff-position = #0
s2.*5
}

SopranNoten = \relative c'' {
R2.*2
\tsOffset #'(-3 . 0) g4^\solo d b' b8 a a4 r
c4 c4. es8
}

SopranText = \lyricmode {
Sci -- to -- te quo -- ni -- am Do -- mi -- nus
}

AltNoten = \relative c'' {
R2.*2
\mmrOffset #-7 R2.
\mmrOffset #-7 R2.
\tsOffset #'(-5 . 0) a4_\tutti a4. c8
}

AltText = \lyricmode {
Do -- mi -- nus
}

\score {
\context Staff = "Frauen"
<<
\context Voice = "Sopran" {
\voiceOne
<< \Global \SopranNoten >>
}
\context Lyrics = "SopranText" \with {
alignAboveContext = "Frauen"
} \lyricsto "Sopran" \SopranText

\context Voice = "Alt" {
\voiceTwo
<< \Global \AltNoten >>
}
\context Lyrics = "AltText" \with {
alignBelowContext = "Frauen"
} \lyricsto "Alt" \AltText
>>

\layout {
\context {
\Score
autoBeaming = ##f
}
\context {
\Staff
\override RestCollision #'positioning-done = #merge-rests-on-positioning
}
\context {
\Lyrics
\override LyricHyphen #'minimum-distance = #1
}
}
}

Grüße, Robert

pjheinrich

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #6 am: Donnerstag, 27. Oktober 2011, 14:30 »
Liebe Kollegen!

Herzlichen Dank schon einmal für Eure zahlreichen Antworten. - Ich bin gerade dabei mein "Werk" mit Euren Vorschlägen u. oder Snippets zu verbessern bzw. "auszustatten".

Nun bin ich allerdings auf ein weiteres Problem gestoßen, welches mich schon seit einiger Zeit nervt, nämlich: das Layout. Ich habe im Anhang euch nun die kompilierbaren Lilypond-Files (in einer *.zip-Datei) angefügt bzw. ein *.pdf von der bisherigen Partitur. Hier sind 8 Seiten an Noten vorhanden, allerdings finde ich die Aufteilung der Systeme etwas "eigenwillig". - Wie kann man Lilypond dazu bringen, dass es beispielsweise ab Seite 5 jede Seite ebenfalls mit 3 Notensystemgruppen wie "befüllt"? - So sieht das Layout meiner Meinung nach etwas unschön aus.

Mir wäre es lieber, dass z.B. auf der letzten Seite nur eine Notensystemgruppe abgedruckt ist, dann könnte ich den Platz darunter für zusätzliche Angaben (etwa einer deutschen Übersetzung des Textes etc.) nutzen ...

Prinzipiell bin ich ein echter Lilypondfan, nur ist das Erlernen hier wahrlich fast schon wieder eine eigene "Kunst" :)

Liebe Grüße aus Lyon,
  pjheinrich

P.S.: Ich habe auch noch ein (leider nicht sehr schönes) Midi-File des Stückes angefügt und wollte mich bei Euch erkundigen, wie es Euch gefällt? ... oder wirkt es etwas "dilletantisch"? (Ich selbst bin noch am überlegen, ob ich es nicht noch einen Ganzton nach unten transponieren soll, damit es der Sopran etwas einfacher hat ... allerdings geht dann auch irgendwie die "Strahlkraft" verloren.)

ding-dong

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #7 am: Freitag, 28. Oktober 2011, 09:04 »
das hat ja nun wirklich nichts mehr zu tun mit der ursprünglichen fragestellung (Abstand eines Textobjektes ...), oder!?

pjheinrich

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #8 am: Freitag, 28. Oktober 2011, 21:45 »
das hat ja nun wirklich nichts mehr zu tun mit der ursprünglichen fragestellung (Abstand eines Textobjektes ...), oder!?

Nein, in der Tat. Ich war nur unsicher darueber, ob ich einen neuen Thread starten sollte, da ich irgendwie das Gefuehl habe, das Forum mit Fragen zu "löchern" ... aber wahrscheinlich ist es sinnvoller, einen neuen Thread zu öffnen!

lg
 pjheinrich

ding-dong

  • Member
Re: Abstand eines Textobjektes ...
« Antwort #9 am: Freitag, 28. Oktober 2011, 22:50 »
hallo pjheinrich

Zitat
Ich war nur unsicher darueber, ob ich einen neuen Thread starten sollte, da ich irgendwie das Gefuehl habe, das Forum mit Fragen zu "löchern" ... aber wahrscheinlich ist es sinnvoller, einen neuen Thread zu öffnen!

unbedingt - es geht auch darum, die themen zu trennen; wenn man z.b. einen beitrag zu textobjekten sucht, sollte dieser sich damit befassen.

sucht man etwas über seiteneinteilung ist es angenehmer, wenn man beiträge zu diesem thema findet und sich nicht durch 20 oder mehr beiträge/antworten quälen muss, die nichts damit zu tun haben.

und nicht zuletzt: je präziser die frage, desto genauer die antworten! sollte eine einfache antwort nicht möglich sein, wird sicher darauf hingewiesen, was es noch zu beachten gibt!

gruss
ding-dong

ps: und wenn wir uns gelöchert fühlen antworten wir einfach nicht mehr …