Autor Thema: Taktnummern an frei wählbaren Stellen  (Gelesen 2634 mal)

viertel

  • Member
Taktnummern an frei wählbaren Stellen
« am: Mittwoch, 17. September 2014, 03:04 »
Hallo zusammen

Bin ich der Einzige mit diesem Notationswunsch?
Weder in der Notationsreferenz noch hier im Forum habe ich gefunden, WIE es geht. Lediglich einige Male in einem Nebensatz die Anmerkung "Anzeige der Taktnummer forcieren".

Und das ist dann auch schon meine Frage:
Wie kann ich Lilypond dazu bringen, an Takten meiner Wahl, z.B. nach langen Pausen, die Taktnummer auszugeben, egal, wo wir gerade in der Zeile sind. Eine Definition etwa so:
showBarNumber = ...
würde dann an entsprechender Stelle mit \showBarNumber die Taktnummer am nächsten Taktstrich ausgeben.

Oder bin ich nur unfähig, den entsprechenden Tip zu finden?

Danke schon mal

Das viertel

SteuLoh

  • Member
Re: Taktnummern an frei wählbaren Stellen
« Antwort #1 am: Mittwoch, 17. September 2014, 08:10 »
Hallo Viertel,

Weder in der Notationsreferenz noch hier im Forum habe ich gefunden, WIE es geht. Lediglich einige Male in einem Nebensatz die Anmerkung "Anzeige der Taktnummer forcieren".

dasmit dem suchen und finden ist so eine Sache.

Vielleicht ist das hier das Richtige:

http://lsr.di.unimi.it/LSR/Item?id=431






%% http://lsr.dsi.unimi.it/LSR/Item?id=431

num =
#(define-music-function (parser location musique) (ly:music?)
    #{
      \override Score.BarNumber.break-visibility = ##(#f #t #t)
      $musique
      \revert Score.BarNumber.break-visibility
    #})
 
{
  a2 a a a
  \num a a a a
  \num {a a a a}
  a a a a
}



Arnold

  • Member
Re: Taktnummern an frei wählbaren Stellen
« Antwort #2 am: Mittwoch, 17. September 2014, 09:47 »
Hallo,

ingendwo in diesem Forum war schon mal eine ähnliche Frage.
Bevor ich das suche, zuerst mein "einfaches" include (bar-number.ly):
%{
Barnumber Manipulation

%}
\version "2.16.0"

#(define (self-alignment-x-rcc grob) ;; 'rcc' = Right-Center-Center
   (let ((break-dir (ly:item-break-dir grob)))
     (case break-dir
       ((1)  RIGHT)     
       ((0)  CENTER)
       ((-1) CENTER)
       (else CENTER))))


showBarNumberP = #(define-music-function (parser location padding)
                                                         (number?)
#{
  \once \override Score.BarNumber #'break-visibility = #end-of-line-invisible
  \once \override Score.BarNumber #'padding = $padding
#})

showBarNumber = #(define-music-function (parser location) ()
#{
  \once \override Score.BarNumber #'break-visibility = #end-of-line-invisible
#})



\layout {
  \context { \Score
    \override BarNumber #'break-visibility = #begin-of-line-visible
    alternativeNumberingStyle = #'numbers-with-letters
    barNumberVisibility = #all-bar-numbers-visible
    \override BarNumber #'self-alignment-X = #self-alignment-x-rcc
  }
}
:
Hier dient \schowBarNumber dazu, die Taktzahlenanzeige zu forcieren. Außderdem werden die Taktzahlen am Zeilenanfang rechtsbündig ausgerichtet, innerhalb der Zeile dann aber mittig.

Und dann habe ich noch einen Scheme-Engraver, welcher automatisch die visibility-mask ändert, falls zuvor eine mindestes dreitaktige Ganztaktpause enschienen ist:
#(define (self-alignment-x-rcc grob) ;; 'rcc' = Right-Center-Center
   (let ((break-dir (ly:item-break-dir grob)))
     (case break-dir
       ((1)  RIGHT)     
       ((0)  CENTER)
       ((-1) CENTER)
       (else CENTER))))

#(define (volta-start-in-repeat-command rcl)
  (if (or (null? rcl)
          (not (pair? rcl))
          (not (pair? (car rcl))))
   #f
   (let ((cmd (caar rcl))
         (pos (cadar rcl)))
    (if (and (eq? cmd 'volta)
             (not (boolean? pos)))
     #t
     (volta-start-in-repeat-command (cdr rcl))))))

#(define (Barnumber_additional_visibility_engraver ctx)
  (let ((barnums-seen '())
        (barline-seen #f)
        (notehead-seen #f)
        (noteheads-found #f)
        (last-barnums '())
        (last-bar-barnumber #f)
        (show-barnumber-required #f)
        (show-by-volta-start #f))

    `((acknowledgers
       (grob-interface
        . ,(lambda (trans grob source)
            (let ((grob-name (ly:assoc-get 'name (ly:grob-property grob 'meta))))
             (if (eq? grob-name 'NoteHead)  (set! notehead-seen #t))
             (if (eq? grob-name 'BarNumber) (set! barnums-seen (cons grob barnums-seen)))
             (if (eq? grob-name 'BarLine)   (set! barline-seen #t))))))
      (start-translation-timestep
       . ,(lambda (trans)
           (let ((current-barnum (ly:context-property ctx 'currentBarNumber)))
            (set! barnums-seen '())
            (set! barline-seen #f)
            (set! notehead-seen #f))))
      (stop-translation-timestep
       . ,(lambda (trans)
           (let
            ((current-barnum (ly:context-property ctx 'currentBarNumber))
             (measure-pos (ly:context-property ctx 'measurePosition))
             (rep-cmds (ly:context-property ctx 'repeatCommands))
             (volta-starts (volta-start-in-repeat-command (ly:context-property ctx 'repeatCommands))))
            (if (volta-start-in-repeat-command (ly:context-property ctx 'repeatCommands))
             (set! show-by-volta-start #t))
            ; before the barline ...
            (if (and barline-seen
                     noteheads-found
                     (number? last-bar-barnumber)
                     (> (- current-barnum last-bar-barnumber) 1))
             (set! noteheads-found #f))
            (if (and barline-seen
                     (not noteheads-found)
                     (number? last-bar-barnumber)
                     (>= (- current-barnum last-bar-barnumber) 3))
             (set! show-barnumber-required #t))
             
            ; after the barline ...
            (if (and (not (null? barnums-seen))
                     show-barnumber-required
                     noteheads-found
                     (not (null? last-barnums))) (begin
              (for-each (lambda (g)
                (ly:grob-set-property! g 'break-visibility end-of-line-invisible)
                ; (ly:grob-set-property! g 'color red)
               ) last-barnums)
              (set! show-barnumber-required #f)))

            (if (and (not (null? barnums-seen))
                     show-by-volta-start) (begin
              (for-each (lambda (g)
                (ly:grob-set-property! g 'break-visibility end-of-line-invisible)
                ; (ly:grob-set-property! g 'color magenta)
               ) barnums-seen)
              (set! show-barnumber-required #f)
              (set! show-by-volta-start #f)))

            (if (not (null? barnums-seen)) (begin
              (set! last-barnums barnums-seen)
              (set! barnums-seen '())))

            (if barline-seen (begin
              (set! last-bar-barnumber current-barnum)
              (set! noteheads-found #f)
              (if notehead-seen (set! noteheads-found #t))))
            (if notehead-seen (set! noteheads-found #t))))))))

% \defineBarLine "S.|:-||" #'("||" "S.|:" " .|")
% \allowVoltaHook "||"
% \allowVoltaHook ".|:"
% \allowVoltaHook ".|:-||"
% \allowVoltaHook "S.|:"
% \allowVoltaHook "S.|:-||"

\layout {
  \context { \Score
    \consists #Parenthesis_on_cautionary_accidentals_purger
    \consists #Barnumber_additional_visibility_engraver
    restNumberThreshold = 0
    barNumberVisibility = #all-bar-numbers-visible
    \override BarNumber #'break-visibility = #begin-of-line-visible
    \override BarNumber #'self-alignment-X = #self-alignment-x-rcc
    % startRepeatType = ".|:-||"
    % startRepeatSegnoType = "S.|:-||"
  }
}

Das Setzen der Barline-Stile wie ich sie bevorzuge habe ich noch schnell auskommentiert. Und auch etwas wild aussehende Klammersetzungen im Scheme-Code habe ich zum Zeilenende hin zusammegefaßt - hoffentlich ohne Fehler.

P.S. Bei mir können die Antworten schon mal eine Woche auf sich warten lassen.

Arnold

viertel

  • Member
Re: Taktnummern an frei wählbaren Stellen
« Antwort #3 am: Samstag, 20. September 2014, 08:36 »
Hallo

Ich kam noch nicht dazu, für die Antworten zu danken.

Der Vorschlag von Steuloh funktioniert schon mal. Allerdings ist die Plazierung der Nummer verbesserungsbedürftig (mittig über Taktstrich und nicht nach oben verschieben), siehe Anhang.
Der Vorschlag von Arnold regelt wohl die horizontale Ausrichtung, aber ich stehe leider mit der Scheme-Lilypond-Syntax auf Kriegsfuß und krieg es nicht in Steulohs einfache Version integriert.

Allerdings hilft das
\override Score.BarNumber.self-alignment-X = #CENTER
auch schon mal. Und solange die Taktnummen nicht vierstellig werden ist das auch für die Nummern am Zeilenanfang ok.

trulli

  • Member
Re: Taktnummern an frei wählbaren Stellen
« Antwort #4 am: Samstag, 20. September 2014, 09:21 »
Hallo,

die Verschiebung der Taktnummern liegt an deinem gedrängten Notentext.

Entweder kannst du einzelne Takte verbreitern:
http://lsr.di.unimi.it/LSR/Item?id=629

Oder du kannst allgemein jedem Takt mehr Platz geben:
http://www.lilypond.org/doc/v2.18/Documentation/notation/changing-horizontal-spacing

Grüße

viertel

  • Member
Re: Taktnummern an frei wählbaren Stellen
« Antwort #5 am: Sonntag, 21. September 2014, 17:59 »
Der "gedrängte Text" stammt von Lilypond selbst. Ich habe nichts dazu getan, es ist die Standardaufbereitung.

Den Takten mehr Platz einzuräumen ist m.M.n. der falsche Weg. Wie viel Platz muß ich denn zugeben, damit die Taktnummer dazwischen paßt?

Eher müßte die Zahl selbst das Recht haben, andere grobs beiseite zu schieben, um seinen Platz direkt über dem Taktstrich zu verteidigen. Mit
\once \override Score.BarNumber.outside-staff-priority = #-100
passiert aber nichts.
Wo/wie muß ich das - wenn überhaupt möglich - einsetzen?

Optimal wäre natürlich, die Taktnummer mit \bar oder \mark anzufordern, und Lilypod "weiß", dann schon, was zu tun ist.

trulli

  • Member
Re: Taktnummern an frei wählbaren Stellen
« Antwort #6 am: Sonntag, 21. September 2014, 23:18 »
Wie viel Platz muß ich denn zugeben, damit die Taktnummer dazwischen paßt?

Hallo,
deine gewünschten Taktnummern an diesen Stellen sind ja keine übliche Schreibweise. Selbst wenn man die Taktnummern in deinem Beispiel weiter nach unten zwingt, sähe das viel zu gedrängt und unübersichtlich aus. Also würde ich die Takte einfach einzeln so verbreitern, dass das Layout ins Gesamtbild passt. Die Taktzahlen würde ich auch mittig ausrichten, das erleichtert das Lesen. Bei überladenem Layout macht Lily schon mal etwas Grafiksalat, aber das kann man in der Regel schnell beheben. Notensatz ist eine Kunst, das wird oft vergessen. Kein Programm ist ein Künstler.
Was deinen Code betrifft, so ist es hier üblich ein Minimalbeispiel als Code zu posten. Es gibt in einem langen Code einfach zu viele Abhängigkeiten und Schreibmöglichkeiten, als dass man mal schnell eine Lösung posten kann.

Grüße