Autor Thema: Wie liest man die aktuelle Höhe einer StaffGroup aus?  (Gelesen 2106 mal)

harm6

  • Member
Wie liest man die aktuelle Höhe einer StaffGroup aus?
« am: Montag, 5. September 2011, 21:14 »
Hallo zusammen und hallo kilgore im besonderen!

Bei der Suche nach etwas ganz anderem bin ich über diesen bislang unbeantworteten Thread gestolpert. Da habe ich mich erinnert neulich an diesem Problem gearbeitet zu haben:

Der Code liefert zwei Funktionen:

 \space ist eine leicht veränderte Fassung von Comper's \stretchMMR
 \braceBar liefert die neue Klammer

Alles andere ist Zutat: Einregeln der Abstände, durchlaufende Taktzählung und das Ermöglichen problemloser Schlüssel-, Takt- und Tonart-Wechsel.

Leider muß \braceBar von Hand eingestellt werden, da es mir nicht gelungen ist diesen Wert zu automatisieren. Deshalb:

Wie kann ich die aktuelle Höhe einer StaffGroup auslesen?

\version "2.14.2"

rochadeAlpha = {
\override Score.BreakAlignment #'break-align-orders =
  #(make-vector 3 '(left-edge
          ambitus
          breathing-sign
          staff-bar
          clef
          key-cancellation   
          key-signature
          time-signature
          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))
}

move = {
        \rochadeAlpha
        \once \override Score.BarLine #'extra-offset = #'(-1 . 0)
        \once \override Score.SpanBar #'X-offset = #'-1
        \once \override Score.Clef #'extra-offset = #'(-1 . 0)
        \once \override Score.KeyCancellation #'extra-offset = #'(-1 . 0)
        \once \override Score.KeySignature #'extra-offset = #'(-1 . 0)
        \once \override Score.TimeSignature #'extra-offset = #'(-1 . 0)


onceTextLengthOn = {
        \once\override TextScript #'extra-spacing-width = #'(0 . 0)
        \once\override TextScript #'extra-spacing-height = #'(-inf.0 . +inf.0)
}

staffStop = {
        \onceTextLengthOn
        \stopStaff
        \cadenzaOn
}

staffStart = {
        \once\override Score.BarNumber #'break-visibility = #'#(#f #t #t)
        \startStaff
        \cadenzaOff
        \set Staff.forceClef = ##t
}

braceBar =
#(define-music-function (parser location braceExt)(number?)
  #{
      #(define ((braceBarLine markup) grob)
        (ly:stencil-combine-at-edge (ly:bar-line::print grob)
          X LEFT (grob-interpret-markup grob markup) 0.4 0))
       
      #(define braceMarkup
      (make-line-markup
        (list
          (make-with-dimensions-markup '(0 . 0) '(0 . 0)
            (make-translate-markup
            (cons 0 (+ 0.2 (/ $braceExt -10)))
              (make-left-brace-markup (+ $braceExt 20)))))))
 
      \once\override Score.BarLine #'hair-thickness = #'1.6
      \once \override Staff.BarLine #'stencil = #(braceBarLine braceMarkup)
      \once \override Score.Clef #'(space-alist next-note) = #'(extra-space . 0)
      \bar "|"
      \move
  #})

space =
#(define-music-function (parser location width) (number?)
                #{
                   \staffStop
                   \onceTextLengthOn
                   s1*1/1000000-\markup \with-dimensions #(cons 0 $width) #'(0 . 0) \null
                   \once \override Score.Clef #'font-size = #'2
                   \staffStart
                #})
               
%--------------------------- Test ----------------------------------------------

\paper {
        ragged-right = ##f
}

one =   
  \relative c'' {
          \key f \major
          a1 b c d
          \bar ":|"
%5     
          \space #8
          \braceBar #92
          \key d\major
          \time 2/2
          \grace s8 % trick to print the bar at correct position. TODO IN ALL VOICES !!
          \bar "|:"
          e4 e e e f4 f f f
          \bar ":|"
  }

two =   
  \relative c {
%1
          \clef bass
          \key f\major
          a1 b c d
%5
          \space #8
          \clef treble
          \key d\major
          \grace s8 % trick to print the bar at correct position. TODO IN ALL VOICES !!
          b'1 c
  }
 
three =   
  \relative c, {
%1
          \clef bass
          \key f\major
          a1 b c d
%5
          \space #8
          \key d\major
          \grace s8 % trick to print the bar at correct position. TODO IN ALL VOICES !!
          b1 c
  }

\score {
        %\new PianoStaff
        \new GrandStaff
        <<
          \new Staff
          <<
            \new Voice \one
          >>
             
          \new Staff \two
          \new Staff \three
        >>
        \layout { }
}

Gruß,
  Harm

Arnold

  • Member
Re: Wie liest man die aktuelle Höhe einer StaffGroup aus?
« Antwort #1 am: Donnerstag, 15. September 2011, 14:36 »
Hallo,

die erste Frage ist vielleicht nicht, wo man diesen Wert findet, sondern wann man diesen den erst auslesen kann.

Ohne gleich eine Lösung anbieten zu können:
- Beim »parsen« des Notationstextes sicherlich noch nicht.
- Beim »abspielen« sicher auch noch nicht.
- Auch mit einer »before-line-breaking«-Prozedur sicher auch noch nicht
- Wohl erst mit einer »after-line-breaking«-Prozedur.

Oder der Wert wird nicht von Anfang an mitgegeben, sondern mit einer GUILE-Funktion erst beim Ausleiten der Druckdaten vom »Grob« aus gesucht.
Ich habe allerdings bisher nur Versuche mit horizontalen Notenkopfpositionen relativ zum Notenhals gemacht - je nach (automatisch gewähltem) 'stemup' oder 'stemdown' mußte zwischen zwei forab übermittelten Werten (zum Notenkopf einge-tweak-t) entschieden werden.

Im Repository gibt es eine Funktion, die als »before-line-breaking« eingehängt, die Grob-Struktur nach oben auflistet. Diese hat mir schon nützliche Dienste geleistet.

Ich hoffe, diese Hinweise helfen etwas weiter.

harm6

  • Member
Re: Wie liest man die aktuelle Höhe einer StaffGroup aus?
« Antwort #2 am: Sonntag, 18. September 2011, 02:08 »
Hallo Arnold,

vielen Dank für Deine Hinweise!

Die Höhe einer StaffGroup auszulesen ist dann ganz einfach, wenn man sich an den SystemStartBar hält. Aber es löst das Problem nicht.

Um den Code zu vereinfachen habe ich ein anderes Beispiel genommen: Das BreathingSign soll durch eine Linie ersetzt werden, die sich über alle Systeme einer StaffGroup erstreckt. (Im Moment wieder manuel eingestellt)

Die Höhe der aktuellen StaffGroup kann ich durch die start-bar-callback-Definition ablesen (start-bar-size). Diesen Wert habe ich dann benutzt um den SystemStartBar um die eigene Höhe zu verschieben.

Aber ich kann ihn auch wirklich nur benutzen, um den SystemStartBar zu manipulieren bzw ich verstehe nicht wie ich auf diesen Wert zugreifen kann, wenn ich die Linie für das BreathingSign bestimmen will.

Alle bisherigen Versuche führten zu einem Speicherzugriffsfehler.

Im übrigen denke ich, daß die »before-line-breaking«-Prozedur nicht zum Ziel führen wird. »after-line-breaking« mag funktionieren. Ich bin jetzt immer über »stencil« gegangen.

\version "2.14.2"

\header {
        title = \markup \vspace #5
}

#(define (start-bar-callback grob)
   (let* ((start-bar (ly:system-start-delimiter::print grob))
          (start-bar-extent (ly:stencil-extent start-bar Y))
          (start-bar-size (interval-length start-bar-extent))
          (start-bar-red (ly:stencil-in-color start-bar 1 0 0)))
   (ly:stencil-translate-axis start-bar-red start-bar-size Y)))

% führt zu:
% \override Score.SystemStartBar #'stencil = #start-bar-callback

bs =
#(define-music-function (parser location ext)(number?)
#{      
#(define breathing-sign-markup
      (make-line-markup 
        (list 
          "\\bs"
            (make-with-dimensions-markup '(0 . 0) '(0 . 0)
              (make-with-color-markup blue
                (make-draw-line-markup (cons 0 $ext)))))))

        \override BreathingSign #'text = #breathing-sign-markup
        \breathe
#})

%-------------------------- Test -----------------------------------------------

one = {
        \relative c' {
        \override Score.SystemStartBar #'stencil = #start-bar-callback

        a2 b c\bs #-13.0 d \break
        a,, b'' c\bs #-22.5 d
        }
}

two = {
        \relative c {
        \clef bass
        a2 b c d
        a'' b,, c d
        }
}
\score {
        \new StaffGroup <<
           \new Staff \one
           \new Staff \two
           >>
}

Gruß,
  Harm