Autor Thema: Taktart a la Orff  (Gelesen 5995 mal)

marno

  • Member
Taktart a la Orff
« am: Mittwoch, 25. November 2015, 19:58 »
Hallo lily-Fans,

da ich mich zum allerersten Mal an das Forum wende, möchte ich ein paar einführende Sätze verlieren.

Seit etwa einem halben Jahr kenne ich lilypond (2.18.2) und in dieser Zeit habe ich bereits etliche Stücke für unseren Chor bearbeitet. Das kommt sehr gut an, weil so nicht nur hervorragend lesbare Notenblätter, sondern quasi nebenbei, zu jeder Stimme Sounddateien (MIDI) für das Üben zu hause entstehen. Unsere Proben können damit viel effektiver ablaufen.

Für die Eingabearbeit benutze ich frescobaldi, das ich für sehr gelungen halte. Damit hat man einfache Stücke auch ziemlich schnell in ganz passable Form gebracht. Es kommt aber immer häufiger vor, daß vermeintliche Nebensächlichkeiten regelrecht ausufern. Bisher habe ich für meine "Probleme" stets Lösungen gefunden. Manchmal bestimmt auf wenig elegantem Weg, aber eben mit brauchbarem Ergebnis.

Das Lesen der Lilypond-Handbücher hat mich oft nicht weiter gebracht, weil bei vielen Erläuterungen gleich die nächste Frage auftaucht. Dagegen habe ich hier in dem Forum schon so viel an Einblicken gewinnen können, daß es mir ein großes Bedürfnis ist, den Protagonisten größtes Lob und Anerkennung auszusprechen. Ich bin immer wieder erstaunt, mit welch profunder Kenntnis Antworten gegeben werden, die oft schon sehr in die Tiefe gehen. Selbst in Beiträgen, die mit meinem jeweils augenblicklichen Problem gar nichts zu tun haben, erlebe ich immer wieder Erleuchtungen.

Nun zu meinem Anliegen.

Ich würde gern die Taktart in der Orffschen Schreibweise verwenden. Eine Lösung habe ich mir ja schon aus gefundenen Schnipseln zusammen gebaut. Nur gefällt mir das Ergebnis noch nicht so richtig. Die drei Elemente Ziffer, Schrästrich und Note lassen sich ja nicht beliebig anordnen, weil es sonst Kollisionen gibt. Meine ad hoc Lösung hänge ich als Minimalbeispiel mal mit ran.

Es wäre schön, wenn ich eine Anregung bekäme, wie ich mich dem perfekten Aussehen weiter annähern kann.

Vielen Dank im Voraus

Matthias
« Letzte Änderung: Mittwoch, 25. November 2015, 20:10 von marno »

fugenkomponist

  • Member
Re: Taktart a la Orff
« Antwort #1 am: Mittwoch, 25. November 2015, 20:18 »
Hallo Matthias,

willkommen im Forum! Bitte gib immer ein Minimalbeispiel an. Inspiriert durch Snippet 642 hab ich folgende Lösung für dich:
\version "2.19.30"

#(define-public (format-time-sig-note grob)
   (let* ((frac (ly:grob-property grob 'fraction))
          (num (if (pair? frac) (car frac) 4))
          (den (if (pair? frac) (cdr frac) 4))
          (m #{
            \markup \concat {
              \number #(number->string num)
              \raise #-0.5 \huge "/"
              \small \note #(number->string den) #DOWN
            }
            #}))
     (grob-interpret-markup grob m)))


global = {
  \time 4/4
  s1
  \time 3/1
  s1*3
  \time 5/8
  s8*5
  \time 2/2
  s1
}

noten = \relative {
  c'4 c c c
  c1 c c
  c8 c c c c
  c2 c
}

<<
  \new Dynamics \with {
    \consists Time_signature_engraver
    \override TimeSignature.stencil = #format-time-sig-note
  } \global
  \new Staff \with {
    \remove Time_signature_engraver
  } << \global \noten >>
>>
Damit sind noch keine punktierten Noten als Nenner möglich (also quasi 9/4 als 3/2. darstellen), aber falls du das brauchst, kann ich das noch entsprechend anpassen.

Ich seh grad, dass du weitergeschrieben hast, während ich meine Antwort formuliert habe, ich schau gleich mal, was sich da noch geändert hat.

Edit: Hier hat harm eine Lösung für punktierte Nenner angeboten, die man entsprechend anpassen kann.
« Letzte Änderung: Mittwoch, 25. November 2015, 20:25 von fugenkomponist »

fugenkomponist

  • Member
Re: Taktart a la Orff
« Antwort #2 am: Mittwoch, 25. November 2015, 20:21 »
Die drei Elemente Ziffer, Schrästrich und Note lassen sich ja nicht beliebig anordnen, weil es sonst Kollisionen gibt.
Das versteh ich nicht ganz. \hspace, \raise etc. bieten dir doch viele Möglichkeiten, was genau meinst du?
Zitat
Es wäre schön, wenn ich eine Anregung bekäme, wie ich mich dem perfekten Aussehen weiter annähern kann.
Ich habe oben den Schrägstrich größer und die Noten kleiner gesetzt und den Abstand zwischen den einzelnen Teilen verkleinert, meinst du was in der Richtung?

marno

  • Member
Re: Taktart a la Orff
« Antwort #3 am: Mittwoch, 25. November 2015, 21:31 »
Vielen Dank für die prompte Antwort.

Meine eigene (mich nicht ganz befriedigende) Lösung erscheint mir mal wieder ziemlich umständlich. Das Erscheinungsbild war für mich durch die nicht weiter zu verkleinernden Abstände zwischen Ziffer, Strich und Note gestört. Mit "#:translate '(X . Y)" ging die Note bzw. Ziffer nicht näher an den Strich zu rücken, weil mein gemalter Schrägstrich um sich herum das ganze (umschließende) Rechteck okkupiert hat.

Mit Deinem Beispiel bin ich deutlich zufriedener. Auf dem Schlauch habe ich vor allem bei dem Schrägstrich gestanden. Einfach den slash aus dem Zeichensatz zu benutzen, ist natürlich viel sinnvoller.

Die Ergänzung für punktierte Noten bekomme ich mit Hilfe des Beispiels von harm sicher selbst noch reingebastelt.

Also nochmal vielen Dank

fugenkomponist

  • Member
Re: Taktart a la Orff
« Antwort #4 am: Mittwoch, 25. November 2015, 21:45 »
Mit "#:translate '(X . Y)" ging die Note bzw. Ziffer nicht näher an den Strich zu rücken, weil mein gemalter Schrägstrich um sich herum das ganze (umschließende) Rechteck okkupiert hat.
Es gibt den markup-Befehl \hspace, der auch negative Zahlen akzeptiert. Was ich aber gemacht hab, ist \concat zu verwenden. Dadurch werden die verschiedenen Teile eines markups ohne Platz hintereinandergesetzt, was in diesem Fall schon ausgereicht hat (da brauchte ich keine negativen Abstände).

marno

  • Member
Re: Taktart a la Orff
« Antwort #5 am: Samstag, 28. November 2015, 14:58 »
Hallo Fugenkomponist und andere Experten,

ich bin es nochmal, weil ich jetzt doch nicht weiter komme. Wie es eben so oft der Fall ist, wächst mit der Lösung eines jeden Problems ein neues nach.

Die Frage nach der Verwendung punktierter Noten im Nenner hatte ich mir so noch gar nicht gestellt. Jetzt aber bemerke ich, daß dies ein wesentlicher Aspekt ist. Der Hinweis auf den Beitrag  von harm6 in einem anderen thread bringt leider nur für ausgewählte Fälle die Lösung, weil die Angabe von z.B. "\time 3/4" nicht unterscheiden läßt, ob nun eine Drei im Zähler mit einer Viertelnote im Nenner oder eine Eins im Zähler mit einer punktierten Halbnote im Nenner dargestellt werden soll. Ohne eine diesbezügliche zusätzliche Information, läßt sich diese Frage ja gar nicht klären.

Für eine allgemeine Verwendbarkeit müßte also diese Zusatzangabe mit ausgewertet werden. Ob sowas überhaupt machbar ist oder von den Lilypond-Machern implementiert werden müßte, kann ich nicht einschätzen. Schon gar nicht wüßte ich, wie man es anstellen könnte.

Kann mir dazu jemand ein Licht aufstecken??

Herzlichen Dank im Voraus

harm6

  • Member
Re: Taktart a la Orff
« Antwort #6 am: Samstag, 28. November 2015, 19:55 »
Zitat von: marno
Für eine allgemeine Verwendbarkeit ...

Hier verstehe ich nicht genau was Du meinst.
Wenn Du 3/4 haben willst (also mit Ziffern), dann verwende die Definition nicht:

\version "2.19.17"

#(define (format-time-sig-with-note grob)
   (let* ((frac (ly:grob-property grob 'fraction))
          (num (if (pair? frac) (car frac) 4))
          (den (if (pair? frac) (cdr frac) 4)))
         
         
    (cond ((and (integer? (/ num 3))
             (integer? (/ den 2)))
           (grob-interpret-markup grob
                (markup
                  #:override '(baseline-skip . 0.5)
                  #:column
                    (#:number (number->string (/ num 3))
                     #:override '(style . default)
                     #:note
                       (string-append (number->string (/ den 2)) ".")
                       DOWN))))
          ((and (integer? (/ num 2))
             (integer? (/ den 2)))
           (grob-interpret-markup grob
                (markup
                  #:override '(baseline-skip . 0.5)
                  #:column
                    (#:number (number->string (/ num 2))
                     #:override '(style . default)
                     #:note
                       (number->string (/ den 2))
                       DOWN))))
           (else (ly:time-signature::print grob))))
     )
     
fancyTimeSig =
\once \override Staff.TimeSignature.stencil = #format-time-sig-with-note

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Some sample music
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\relative c' {
   
  \fancyTimeSig
  \time 9/4
  \repeat unfold 9 c4
 
  \time 3/4
  \repeat unfold 3 c4
 
  \bar"|."
}

Oder: (braucht aber eine neue devel-Version)

\version "2.19.32"

\relative c' {
   
  \override Staff.TimeSignature.stencil = #format-time-sig-with-note
  \time 9/4
  \repeat unfold 9 c4
 
  \once \revert Staff.TimeSignature.stencil
  \time 3/4
  \repeat unfold 3 c4
 
 
  \time 3/4
  \repeat unfold 3 c4
 
  \bar"|."
}

Oder entgeht mir irgendwas?

Gruß,
  Harm

marno

  • Member
Re: Taktart a la Orff
« Antwort #7 am: Samstag, 28. November 2015, 20:42 »
Halllo Harm,

erstmal vielen Dank, daß Du Dich der Sache angenommen hast.

Wenn ich Deinem Vorschlag gemäß die Funktion weglasse, habe ich aber im Nenner eine Vier stehen und nicht, wie gewünscht, das Symbol einer Viertelnote. Es soll aber in jedem Fall die Form Nenner als Zahl und Zähler als Notensymbol erscheinen. Gibt es dafür eine Möglichkeit??

Gruß Marno


harm6

  • Member
Re: Taktart a la Orff
« Antwort #8 am: Samstag, 28. November 2015, 21:47 »
Ok, danke für Deine Erläuterung, ich hoffe ich habe es jetzt besser verstanden.

Wie wärs mit:
\version "2.18.2"

#(define ((format-time-sig-with-note trim?) grob)
   (let* ((frac (ly:grob-property grob 'fraction))
          (num (if (pair? frac) (car frac) 4))
          (den (if (pair? frac) (cdr frac) 4)))
         
    (cond ((and (integer? (/ num 3))
                (integer? (/ den 2)))
           (grob-interpret-markup grob
                (markup
                  #:override '(baseline-skip . 0.5)
                  #:column
                    (#:number (number->string (if trim? (/ num 3) num))
                     #:override '(style . default)
                     #:note
                       (if trim?
                          (string-append (number->string (/ den 2)) ".")
                          (number->string den))
                       DOWN))))
          ((and (integer? (/ num 2))
                (integer? (/ den 2)))
           (grob-interpret-markup grob
                (markup
                  #:override '(baseline-skip . 0.5)
                  #:column
                    (#:number (if trim? (number->string (/ num 2) num))
                     #:override '(style . default)
                     #:note
                       (if trim? 
                           (number->string (/ den 2))
                           (number->string den))
                       DOWN))))
           (else (ly:time-signature::print grob)))))
     
fancyTimeSig =
#(define-music-function (parser location trm)(boolean?)
"Print a @code{TimeSignature} with a note as denominator.  If @var{trm} is set
@code{#t} the values are trimmed, i.e. 3/4 becomes 1/dotted-half-note."
#{
  \temporary \override Staff.TimeSignature.stencil =
    #(format-time-sig-with-note trm)
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Some sample music
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\relative c' {
   
  \fancyTimeSig ##f
  \time 9/4
  \repeat unfold 9 c4
 
  \once \fancyTimeSig ##t
  \time 3/4
  \repeat unfold 3 c4
 
  %% hier gilt die ursprüngliche Setzung wieder, \temporary wegen
  \time 3/4
  \repeat unfold 3 c4
 
  \bar"|."
}

HTH,
  Harm
« Letzte Änderung: Samstag, 28. November 2015, 23:23 von harm6 »

marno

  • Member
Re: Taktart a la Orff
« Antwort #9 am: Samstag, 28. November 2015, 22:03 »
Hallo Harm,

im ersten Ansatz bin ich begeistert. Es scheint mein Problem zu lösen. Ich muß mir zwar alles noch genauer ansehen, weil ich ja schließlich auch jedes Detail verstehen will, um zukünftig solche Problemchen selbst lösen zu können. Aber mit meiner ersten Spielerei mit Deinem Ansatz scheinen meine Wünsche erfüllt.

Ein Problem sehe ich evtl. noch, weil ich in einigen Orffschen Stücken auch Stellen gesehen habe, in denen im Nenner eine doppelte Ganznote steht. Da könnte es sein, daß ich doch noch mal bei Euch anklopfen muß.

Auf jeden Fall komme ich so erstmal weiter. Vielen Dank

Marno

harm6

  • Member
Re: Taktart a la Orff
« Antwort #10 am: Samstag, 28. November 2015, 23:02 »
Zitat von: marno
Ein Problem sehe ich evtl. noch, weil ich in einigen Orffschen Stücken auch Stellen gesehen habe, in denen im Nenner eine doppelte Ganznote steht.

Hab' ich noch nie gesehen^^
Kannst Du ein Bild posten? Handyfoto würde schon reichen.

Gruß,
  Harm
« Letzte Änderung: Samstag, 28. November 2015, 23:23 von harm6 »

marno

  • Member
Re: Taktart a la Orff
« Antwort #11 am: Sonntag, 29. November 2015, 19:37 »
Hallo Harm,

leider habe ich zur Zeit kein weiteres Notenmaterial zur Hand, um noch mehr Beispiele liefern zu können. Ich habe aber bereits Stücke gesehen, wo nicht nur doppelte Ganznoten im Nenner zu finden sind, sondern auch punktierte doppelte (was ja schließlich auch nur konsequent ist, wenn man sich, wie der Herr Orff, eine andere Notierung hat einfallen lassen).

Ich habe nun auch schon festgestellt, das Lilypond für die doppelten eine abweichende Behandlung ausführt, bei der Dein Lösungsansatz nicht zum gewünschten Ergebnis führt. Andere Nennerwerte als 1, 2, 4, 8 ... sind ja erstens nicht zugelassen und das Symbol der doppelten scheint ja auch wo anders her zu kommen, als die restlichen Noten.

Mit Deinem Vorschlag von gestern kann ich zwar erstmal mein aktuell anstehendes Problem lösen. Aber schön wäre es schon, da man nunmal sowieso schon an dieser Problematik arbeitet, wenn dabei auch eine allgemeingültige, praktikable Lösung heraus käme.

Gäbe es da noch was zu machen??

Vielen Dank im Voraus

Marno

harm6

  • Member
Re: Taktart a la Orff
« Antwort #12 am: Dienstag, 1. Dezember 2015, 00:23 »
Vielen Dank für die Bilder, sie haben mir sehr weiter geholfen.

Zitat von: marno
schön wäre es schon, da man nunmal sowieso schon an dieser Problematik arbeitet, wenn dabei auch eine allgemeingültige, praktikable Lösung heraus käme.

Da LilyPond tatsächlich keine längere als die Ganze Note für den Grundschlag der Taktangabe akzeptiert, kann es nur einen workaround geben.
Ich hab dann mal tief in die Trickkiste gegriffen:

\version "2.18.2"

#(use-modules (ice-9 regex))

my-format-procedure =
#(define-scheme-function (parser location args)(pair?)
#{
  \markup
    \concat {
      \number $(car args)
      \raise #-0.9 \huge "/"
      \small
      \override #'(style . default)
      \note $(cdr args) #DOWN
    }
#})

%% alternative:
%{
my-format-procedure =
#(define-scheme-function (parser location args)(pair?)
#{
  \markup
    \override #'(baseline-skip . 0.5)
    \column {
      \number $(car args)
      \override #'(style . default)
      \note $(cdr args) #DOWN
    }
#})
%}
#(define ((format-time-sig-with-note frac trim?) grob)
  (let* ((num (if (pair? frac) (car frac) 4))
         (den (if (pair? frac) (cdr frac) 4))
         (args
           (cond ((string? den)
                    (cons (number->string num)
                          den))
                 ((and (integer? (/ num 3))
                       (integer? (/ den 2)))
                    (cons (number->string (if trim? (/ num 3) num))
                          (if trim?
                              (string-append (number->string (/ den 2)) ".")
                              (number->string den))))
                 ((and (integer? (/ num 2))
                       (integer? (/ den 2)))
                    (cons (number->string (if trim? (/ num 2) num))
                          (number->string (if trim? (/ den 2) den))))
                 (else
                    (cons (number->string num)
                          (number->string den))))))
    (grob-interpret-markup grob #{ \my-format-procedure $args #})))
 
time =
#(define-music-function (parser location trm vals)((boolean? #t) pair?)
 
  ;; c/p from define-makups.scm
  (define log2
    (let ((divisor (log 2)))
      (lambda (z) (inexact->exact (/ (log z) divisor)))))
     
  ;; c/p from define-makups.scm
  (define (parse-simple-duration duration-string)
    "Parse the `duration-string', e.g. ''4..'' or ''breve.'',
  and return a (log dots) list."
    (let ((match (regexp-exec (make-regexp "(breve|longa|maxima|[0-9]+)(\\.*)")
                              duration-string)))
      (if (and match (string=? duration-string (match:substring match 0)))
          (let ((len (match:substring match 1))
                (dots (match:substring match 2)))
            (list (cond ((string=? len "breve") -1)
                        ((string=? len "longa") -2)
                        ((string=? len "maxima") -3)
                        (else (log2 (string->number len))))
                  (if dots (string-length dots) 0)))
          (ly:error (_ "not a valid duration string: ~a") duration-string))))
         
  (let* ((den (cdr vals))
         (num (car vals)))
       (if (string? den)
           (let* ((parsed (parse-simple-duration den)))
             ;; TODO lazy bump ...
             (cond ((and (= -1 (car parsed)) (zero? (cadr parsed)))
                      (set! den 1)
                      (set! num (* 2 num)))
                   ((and (= -1 (car parsed)) (= 1 (cadr parsed)))
                      (set! den 1)
                      (set! num (* 3 num)))
                   ((and (= -2 (car parsed)) (zero? (cadr parsed)))
                      (set! den 1)
                      (set! num (* 4 num)))
                   ((and (= -2 (car parsed)) (= 1 (cadr parsed)))
                      (set! den 1)
                      (set! num (* 6 num)))
                   (else (ly:error "not smart enough to handle ~a" den)))))
       
  #{
    \temporary \override Staff.TimeSignature.stencil =
      #(format-time-sig-with-note vals trm)
    $(make-music
      'TimeSignatureMusic
      'beat-structure '()
      'denominator den
      'numerator num)
  #}))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\relative c' {
   
  \override Staff.TimeSignature.Y-offset = 5
 
  \time 9/4
  \repeat unfold 9 c4
 
  \time 3/4
  \repeat unfold 3 c4
 
  \time ##f 3/4
  \repeat unfold 3 c4
 
  \time 7/4
  \repeat unfold 7 c4
 
  \time 12/2
  \repeat unfold 4 c1.
 
  \time #'(3 . "breve.")
  \repeat unfold 3 c\breve.
 
 
  \time #'(3 . "longa")
  \repeat unfold 3 c\longa
 
  \time #'(4 . "longa.")
  \repeat unfold 4 c\longa.
 
  \time #(cons 4 "breve")
  \clef bass
  f\breve-> c-> d-> c->
 
  \bar"|."
}

Schau mal, ob Du damit klar kommst, bin zu müde, um noch Dokumentation dazu zu schreiben ;)


HTH,
  Harm

marno

  • Member
Re: Taktart a la Orff
« Antwort #13 am: Dienstag, 1. Dezember 2015, 19:34 »
Hallo Harm6,

einfach prima. Ich muß Dir meinen herzlichsten Dank und auch tiefen Respekt ausdrücken. Ich habe mit Deiner Lösung intensiv herumprobiert und kann beim besten Willen nichts feststellen, was noch einen Wunsch offen ließe.

Gruß Marno