Autor Thema: Problem mit "rochade"  (Gelesen 3449 mal)

chf

  • Member
Problem mit "rochade"
« am: Dienstag, 17. Mai 2011, 17:44 »
Liebe Freunde,

am Ende der Kadenz (s. Schnipsel) soll das Taktmaß natürlich hinter dem Taktstrich stehen.
Das tut es aber nur, wenn ich \rochade für den nachfolgenden Teil auslasse...

Wie entkomme ich aus dieser Zwickmühle? Auf die "Vorankündigung" möchte ich ungern verzichten...
Gruß
chf

harm6

  • Member
Re:Problem mit "rochade"
« Antwort #1 am: Dienstag, 17. Mai 2011, 22:36 »
Hallo chf,

ich hab' mal etwas entworfen. Es ist nur ein work-around mit Nebenwirkungen, denn die zusätzlichen spacer und \grace müssen dann auch im Klavier eingefügt werden (und in andere Stimmen, falls welche da sind); und es ist nur dann sinnvoll, wenn der \break wirklich dort bleibt!
Die entscheidenden Änderungen erfolgen zwischen den "Prozent-Linien", ansonsten habe ich noch ein paar Kleinigkeiten verändert, u.a. der besseren Lesbarkeit wegen.

Gruß,
  Harm

harm6

  • Member
Re:Problem mit "rochade"
« Antwort #2 am: Donnerstag, 19. Mai 2011, 01:04 »
Hallo chf,

nachdem ich noch einen Tag drüber nachgedacht habe ist mir noch etwas besseres (mit weniger Nebenwirkungen) eingefallen.

Zunachst glaube ich, daß \rochade nur dazu dient zu Beginn der zweiten Zeile Taktangabe und Taktstrich zu vertauschen, \padTsBar regelt dann die Anstände neu (bitte teile mir mit falls ich mich da irre). Allerdings wirkt sich \rochade eben auch auf die Taktsetzung am Ende der ersten Zeile aus und ich habe keinen Weg gefunden das zu ändern (denn gerade dieses Verhalten wird ja durch \rochade erwirkt).

Also habe ich diese Befehle verworfen und das default-Verhalten am Ende der ersten Zeile belassen. Für den Beginn der Zweiten Zeile habe ich eine neue \rochadeII-Definition entworfen, indem ich die shift-at-line-begin-Definition aus /scm/output-lib.scm abgewandelt habe. Der einzige Wermutstropfen ist, daß man \grace aus dem Anfang der zweiten Zeile, welches benötigt wird um eine neue RehearsalMark zu setzen, im Klavier erneut setzen muß (ich habe mal einen PianoStaff hinzugenommen) (N.B. Das mit der erneuten RehearsalMark kann man allerdings auch anders regeln.)

Anwendung:
  \rochadeII #'(-2 . 3.5)  
  \time 4/4
  \bar "|:"
  -2 regelt die Position der TimeSignatur
  3.5 regelt die Position der BarLine

\version "2.12.3"

rochadeII =
#(define-music-function (parser location rochade)(pair?)
#{
        #(define (shift-TimeSignatur-at-line-begin g)
  "Shift the TimeSignatur, but only at the start of the line."
  (if (and (ly:item? g)
  (equal? (ly:item-break-dir g) RIGHT))
  (ly:grob-translate-axis! g $(car rochade) X)
      ))
      
      #(define (shift-BarLine-at-line-begin g)
  "Shift the BarLine, but only at the start of the line."
  (if (and (ly:item? g)
  (equal? (ly:item-break-dir g) RIGHT))
  (ly:grob-translate-axis! g $(cdr rochade) X)
      ))
      
      \once\override Staff.TimeSignature #'after-line-breaking = #shift-TimeSignatur-at-line-begin  
      \once\override Staff.BarLine #'after-line-breaking = #shift-BarLine-at-line-begin  
#})


one =
\relative c' {
        
  \clef tenor
  
  \override Staff.TimeSignature #'stencil = #'()
   \cadenzaOn
  \once \override Staff.OttavaBracket #'direction = #DOWN
  \set Staff.ottavation = #"8vb ad lib."
  \once \override Script #'script-priority = #-100
   bes'4\fermata^\markup {\fontsize #1.5 "frei" \fontsize #0 "  (Klav. tacet)"}
   a-- g--
  \ottava #0
  \clef bass
   \times 2/3 {es4 (d c)}
   \times 2/3 {d c bes}
   c8 [(bes!) as ges]
   \times 2/3 {bes! (\override Accidental #'transparent = ##f a) g(}
   \times 2/3 {a) [\once \override Accidental #'transparent = ##t g es]}
   as16 [(ges es!) d]
   \once \override Accidental #'transparent = ##f g [es! d (c)]
   bes4\fermata as-- ges--
  \set Staff.ottavation = #"8va ad lib."
   bes,\breve d e
  \once\override Score.RehearsalMark #'break-visibility = #'#(#t #t #f)
  \mark \markup \musicglyph #"scripts.ufermata"
  \cadenzaOff
  \break
  \set Score.currentBarNumber = #8
  \revert Staff.TimeSignature #'stencil
  \rochadeII #'(-2 . 3.5)
  \time 4/4
  \bar "|:"
   \grace s4
  \once \override Score.RehearsalMark #'extra-offset = #'(-2 . -2.5)
  \mark \markup \box \pad-markup #0.25 "B"
  \tempo \markup \fontsize #1.5 "erstes Zeitmaß"
    
  \autoBeamOn
  \ottava #0
  \once\override Rest #'X-extent = #'(-2 . 1)
   r2
  \once \override Accidental #'transparent = ##t
   e'4\mp
  \once \override Accidental #'transparent = ##t
   b'8 [b]
   d r r4 f,16 [(a) g gis] d'8 r
   r2 g,4 d'8 [d]
   f [f] r4 a,16\< [(c) ais b] f'8\! r
   f,4--\mf a-- g-- gis--
}


two =
{ \cadenzaOn s1*10 \cadenzaOff
        \rochadeII #'(-2 . 3.5)
         \grace s4
  \once \override Score.RehearsalMark #'extra-offset = #'(-2 . -2.5)
  \mark \markup \box \pad-markup #0.25 "B"
  \tempo \markup \fontsize #1.5 "erstes Zeitmaß"
  
   \repeat unfold 5 {c1}
}
 
\score  {
         <<
         \new Staff \one
         \new PianoStaff
 <<
 \new Staff { \relative c' { \two }}
 \new Staff { \relative c {\clef "bass" \two}}
 >>
         >>
  \layout {
  indent = 0
  }
}

Gruß,
  Harm
« Letzte Änderung: Donnerstag, 19. Mai 2011, 01:23 von harm6 »

harm6

  • Member
Re:Problem mit "rochade"
« Antwort #3 am: Donnerstag, 19. Mai 2011, 23:56 »
Hallo chf,

nach einem weiteren Tag des Nachdenkens hier noch ein paar weitere Verbesserungen und Änderungsmöglichkeiten: ;)

falls Du \rochadeII benutzen möchtest dann ersetze in

      \once\override Staff.TimeSignature #'after-line-breaking = #shift-TimeSignatur-at-line-begin 
      \once\override Staff.BarLine #'after-line-breaking = #shift-BarLine-at-line-begin 


Staff durch Score. Das erspart die erneute Angabe im Klavier.

Darüber hinaus habe ich \rochadeIIa entwickelt.
Diese Funktion kümmert sich nicht nur um die Position von Taktangabe und Taktstrich, sondern auch um den Abstand zum nachfolgenden Noten- bzw Pausenzeichen. Dazu war es allerdings nötig eine der anderen Methoden, eine RehearsalMark sowohl am Zeilenende als auch zu Beginn der neuen Zeile erscheinen zu lassen, anzuwenden, um die schon oben erwähnte \grace-Note loszuwerden. Dies erfolgt durch die Einführung der layOut-Stimme und Verschiebung des "Mark_engraver". (Diese Stimme könnte man natürlich jetzt auch für alles mögliche verwenden.)

Falls Du das Erscheinungsbild so akzeptabel findest, könntest Du auch \rochadeIII verwenden. In diesem Befehl sind die Werte einzementiert. (Entschlackt den Code, ist aber natürlich nicht mehr variabel. Ist im Moment auskommentiert.)

Ansonsten habe ich die Kadenz herausgezogen und eigens in eine Variable gepackt, um #(ly:export (skip-of-length soloKadenz)) setzen zu können. In diesem Zusammenhang zeigte sich auch der einzige bislang bemerkte Wermutstropfen: Wenn man #(ly:export (skip-of-length soloKadenz)) durch #(ly:export (mmrest-of-length soloKadenz)) ersetzt kommt es zu einem Fehlverhalten, welches mir nicht erklärlich ist.

\version "2.12.3"

%#(set-global-staff-size 15)

rochadeIIa =
#(define-music-function (parser location rochade)(list?)
#{
      #(define (shift-TimeSignatur-at-line-begin g)
       "Shift an item, but only at the start of the line."
          (if (and (ly:item? g)
   (equal? (ly:item-break-dir g) RIGHT))
   (ly:grob-translate-axis! g $(car rochade) X)
      ))
     
      #(define (shift-BarLine-at-line-begin g)
       "Shift an item, but only at the start of the line."
          (if (and (ly:item? g)
   (equal? (ly:item-break-dir g) RIGHT))
   (ly:grob-translate-axis! g $(cadr rochade) X)
      ))
       
      \once\override Score.TimeSignature #'after-line-breaking = #shift-TimeSignatur-at-line-begin 
      \once\override Score.BarLine #'after-line-breaking = #shift-BarLine-at-line-begin 
      \once\override Score.Rest #'X-extent = #(cons $(caddr rochade)  1)
      \once\override Score.Stem #'X-extent = #(cons $(caddr rochade)  1)
#})

%{
rochadeIII =
#(define-music-function (parser location)()
#{
        #(define (shift-TimeSignatur-at-line-begin g)
         "Shift an item, but only at the start of the line."
          (if (and (ly:item? g)
   (equal? (ly:item-break-dir g) RIGHT))
   (ly:grob-translate-axis! g -2 X)
      ))
     
      #(define (shift-BarLine-at-line-begin g)
       "Shift an item, but only at the start of the line."
          (if (and (ly:item? g)
   (equal? (ly:item-break-dir g) RIGHT))
   (ly:grob-translate-axis! g 3.5 X)
      ))
       
      \once\override Score.TimeSignature #'after-line-breaking = #shift-TimeSignatur-at-line-begin 
      \once\override Score.BarLine #'after-line-breaking = #shift-BarLine-at-line-begin 
      \once\override Score.Rest #'X-extent = #(cons -2  1)
      \once\override Score.Stem #'X-extent = #(cons -2  1)
#})
%}

soloKadenz = \relative c' {
  \clef tenor
 
  \override Staff.TimeSignature #'stencil = #'()
  \cadenzaOn
  \once \override Staff.OttavaBracket #'direction = #DOWN
  \set Staff.ottavation = #"8vb ad lib."
  \once \override Script #'script-priority = #-100
  bes'4\fermata^\markup {\fontsize #1.5 "frei" \fontsize #0 "  (Klav. tacet)"}
  a-- g--
  \ottava #0
  \clef bass
  \times 2/3 {es4 (d c)}
  \times 2/3 {d c bes}
  c8 [(bes!) as ges]
  \times 2/3 {bes! (\override Accidental #'transparent = ##f a) g(}
  \times 2/3 {a) [\once \override Accidental #'transparent = ##t g es]}
  as16 [(ges es!) d]
  \once\override Accidental #'transparent = ##f
  g [es! d (c)]
  bes4\fermata as-- ges--
  \set Staff.ottavation = #"8va ad lib."
  bes,\breve d e
  \cadenzaOff
  \mark \markup \musicglyph #"scripts.ufermata"
  \break
}
 
soloVoice =
\relative c' {
        %\key cis\major
  \set Score.currentBarNumber = #8
  \revert Staff.TimeSignature #'stencil
  %\rochadeIII
  \rochadeIIa #(list -2  3.5 -2)
  \time 4/4
  \bar "|:"
  \autoBeamOn
  \ottava #0
  r2
  \once \override Accidental #'transparent = ##t
  e,4\mp
  \once \override Accidental #'transparent = ##t
  b'8 [b]
  d r r4 f,16 [(a) g gis] d'8 r
  r2 g,4 d'8 [d]
  f [f] r4 a,16\< [(c) ais b] f'8\! r
  f,4--\mf a-- g-- gis--
}

layOut =
{ #(ly:export (skip-of-length soloKadenz))
  \once \override Voice.RehearsalMark #'extra-offset = #'(3 . 1)
  \mark \markup \box \pad-markup #0.25 "B"
  \tempo \markup \fontsize #1.5 "erstes Zeitmaß"
 
  \repeat unfold 5 {s1}
}

piano =
{ #(ly:export (skip-of-length soloKadenz))

  % \once \override Voice.RehearsalMark #'extra-offset = #'(3 . 1)
  % \mark \markup \box \pad-markup #0.25 "B"
  % \tempo \markup \fontsize #1.5 "erstes Zeitmaß"
  \repeat unfold 5 {c1}
}

\score  {
        <<
        \new Staff %\with { fontSize = #-1 \override StaffSymbol #'staff-space = #(magstep -2)}
          <<
          \new Voice \with {
            \consists Mark_engraver
            \override RehearsalMark #'break-visibility = #'#(#t #t #f)
           }
           {\soloKadenz\soloVoice}
           
  \new Voice\with {
            \consists Mark_engraver
           }
           \layOut
  >>
        \new PianoStaff
<<
\new Staff
        { \relative c' { \piano }}

\new Staff
  { \relative c {\clef "bass" \piano}}
>>
        >>
  \layout {
  indent = 0
  %#(layout-set-staff-size 25)
      \context {
          \RemoveEmptyStaffContext
          %\override VerticalAxisGroup #'remove-first = ##t
      }
      \context {
          \Score
          \remove "Mark_engraver"
          %\override NonMusicalPaperColumn #'line-break-permission = ##f
      }
  }
}

Gruß,
  Harm

P.S. Meine rochade-Funktionen scheinen auch bei Veränderung der Tonart und bei allen möglichen Größenveränderungen keine unerwünschten Nebenwirkungen zu haben. Falls Dir doch welche auffallen sag Bescheid. ;)

chf

  • Member
Re:Problem mit "rochade"
« Antwort #4 am: Freitag, 20. Mai 2011, 18:18 »
Guten Abend, "harm",
und danke für die lange und gründliche Beschäftigung mit meinem Problem.
Ich habe lange gebastelt und immer wieder "schliff gebacken", aber jetzt endlich weiß ich, was mich noch stört:
ich möchte die Kadenz allein, ohne die leeren Klavierzeilen stehen haben. Die bringe ich leider nicht weg...
Wenn du das auch noch schaffst, bin ich (für diesmal) wunschlos glücklich.
Gruß
chf

harm6

  • Member
Re:Problem mit "rochade"
« Antwort #5 am: Freitag, 20. Mai 2011, 23:09 »
Hallo chf,

im Code meiner letzten Antwort sind eine ganze Reihe von Optionen auskommentiert. Unter anderem befindet sich im layout des score-Blocks eine Zeile die Du einfach nur einkommentieren mußt, dann verschwindet auch die leere Klavierzeile. Es muß dann so aussehen:

  \layout {
  indent = 0
  %#(layout-set-staff-size 25)
      \context {
          \RemoveEmptyStaffContext
          \override VerticalAxisGroup #'remove-first = ##t   %-Zeichen entfernt !!
      }
      \context {
          \Score
          \remove "Mark_engraver"
          %\override NonMusicalPaperColumn #'line-break-permission = ##f
      }
  }

Damit sollte es klappen.

Gruß,
  Harm

P.S.: Gerade viel mir noch auf, daß am Anfang der Kadenz 8vb ad lib. steht!! Das ist doch bestimmt ein Tippfehler!?
« Letzte Änderung: Freitag, 20. Mai 2011, 23:20 von harm6 »

RobUr

  • Member
Re:Problem mit "rochade"
« Antwort #6 am: Samstag, 21. Mai 2011, 00:40 »
Zitat von: harm6
P.S.: Gerade viel mir noch auf, daß am Anfang der Kadenz 8vb ad lib. steht!! Das ist doch bestimmt ein Tippfehler!?
Bestimmt nicht:
  • 8vb = ottava bassa = eine Oktave tiefer
  • 8va = ottava alta = eine Oktave höher

harm6

  • Member
Re:Problem mit "rochade"
« Antwort #7 am: Samstag, 21. Mai 2011, 01:19 »
@Robert:
Asche auf mein Haupt!!
8vb kannte ich nicht ... Und das als studierter Musiker ...  :o

chf

  • Member
Re:Problem mit "rochade"
« Antwort #8 am: Sonntag, 22. Mai 2011, 00:04 »
Hallo Harm,
es will mir nicht gelingen. Was übersehe ich? - Ich muss ein gewaltiges Brett vorm Kopf haben.
Schau bitte in deine e-mails, ich schicke dir die komplette Datei nochmal (nach meinem neuen Versuch).
Nachtgruß
chf

PS: "8vb" habe ich aus Platzmangel geschrieben, sonst schon "8va bassa"...

harm6

  • Member
Re:Problem mit "rochade"
« Antwort #9 am: Donnerstag, 26. Mai 2011, 11:59 »
Hallo zusammen,

nachdem ich meine obigen rochade-Funktionen öfters angewendet habe und dabei erkennen mußte, daß sie noch verbessert werden müßten, reifte in mir die Erkenntnis, daß es nicht sinnvoll sein kann fix auf fix zu setzen. Insoweit habe ich nach einem anderen Weg gesucht.
  Leider ist das Beispiel aus IR 3.1.22 nur bedingt hilfreich, da es das BreakAlignment überall gleich verändert.
  Etwas hilfreicher war ein Beitrag von Mats Bengtsson, obwohl hier ein Tipp- oder Kopierfehler vorliegt (Klammer zuviel) und eine veraltete Syntax benutzt wird (ich vermute 2.6.x).
  Desweiteren habe ich mich auf /scm/define-grobs.scm (-> BreakAlignment) gestützt.

Das Ergebnis, rochadeOmega, ist jetzt weitaus eleganter geworden und kann dann auch als Vorlage für ähnliche Vorhaben genutzt werden:
\version "2.12.3"

% http://www.mail-archive.com/lilypond-user@gnu.org/msg18418.html
% /scm/define-grobs.scm  ->BreakAlignment

%#(set-global-staff-size 15)

rochadeOmega = {
\once\override Score.BreakAlignment #'break-align-orders = #'#( ;;Vector!!
;; end of line
  (left-edge
  ambitus
  breathing-sign
  clef
  staff-bar
  key-cancellation
  key-signature
  time-signature
  custos)
;; middle of line
(left-edge
  ambitus
  breathing-sign
  clef
  time-signature
  staff-bar
  key-cancellation
  key-signature
  custos)
;; begin of line
(left-edge
  ambitus
  breathing-sign
  clef
  key-cancellation
  key-signature
  time-signature
  staff-bar
  custos))
 
\once \override Score.TimeSignature #'space-alist = #'(
(first-note fixed-space . 2.0)
(right-edge extra-space . 0.5)
(staff-bar minimum-space . 2.5))
}
 
% TEST -------------------------------------------------------------------------

\paper {
        indent = 30
        short-indent =30
}

\layout {
      \context {
          \Score
          \override NonMusicalPaperColumn #'line-break-permission = ##f
      }
}

\relative c' {
        \set Staff.instrumentName = "default:  "
        \time 3/4
        \key d\major
       
        d2. e
        \break
        \time 2/4
        \key ces\major
        \bar "|:"
        fis'2
        \bar ":|"
        g
        \time 1/2
        \key d\major
        \bar "|:"
        a
        \bar ":|"
        g a g g g
        \bar "|."
}

\relative c' {
        \set Staff.instrumentName = "rochadeOmega:  "
        \time 3/4
        \key d\major
       
        d2. e
        \break
        \rochadeOmega
        \time 2/4
        \key ces\major
        \bar "|:"
        fis'2
        \bar ":|"
        g
        \rochadeOmega
        \time 1/2
        \key d\major
        \bar "|:"
        a
        \bar ":|"
        g a g g g
        \bar "|."
}

@chf
Ich habe Dein file insofern noch mal neu bearbeitet und Dir zugeschickt.
comper's original-rochade ist somit überflüssig geworden.

Gruß,
  Harm

chf

  • Member
Re:Problem mit "rochade"
« Antwort #10 am: Montag, 30. Mai 2011, 19:50 »
Tausend Dank!
(s. auch Priv. Mittlgn.)