Autor Thema: Generalbass: Nur Vorzeichen einklammern?  (Gelesen 1859 mal)

temuta

  • Member
Generalbass: Nur Vorzeichen einklammern?
« am: Sonntag, 27. Januar 2013, 21:26 »
Im Generalbass (\figuremode) kann man einzelne Ziffern/Zeichen in Klammern setzen, z.B. <[6]> oder <[_+]> oder <[6+]>. Was offenbar nicht geht, ist das Einklammern nur eines Vorzeichens in Verbindung mit einer nicht- eingeklammerten Ziffer (s. Bild 1). Der naheliegende Versuch <[_+]6> liefert übereinander und nicht nebeneinander stehendes Vorzeichen und Ziffer (siehe Bild 2). Hat jemand eine Idee, wie man das Nebeneinander von eingeklammertem Vorzeichen und Ziffer realisieren kann? Danke!

Be-3

  • Member
Re: Generalbass: Nur Vorzeichen einklammern?
« Antwort #1 am: Montag, 28. Januar 2013, 15:41 »
Hallo temuta,

willkommen im Forum!

Tatsächlich scheint es keine Möglichkeit zu geben, im Generalbaß nur die Versetzungszeichen einzuklammern. Accidental und Ziffer sind tatsächlich eine Ligatur bzw. ein einziger Stencil und es ist mir auf den ersten Blick (und auch nicht auf den zweiten) gelungen, da mit sinnvollem Aufwand etwas zu erweitern bzw. umzudefinieren.

Bleibt noch ein altbewährtes Allheilmittel: Wenn's nicht anders geht, nehmen wir einfach ein Markup, da kann man ja alles reinschreiben, was man möchte:

< \markup { ... } >

funktioniert auch im Generalbaß-Modus.
Problem: aus welchen Zeichensätzen in welchen Größen mit welchen Verschiebungen nach oben/unten/rechts/links müssen die Zeichen kommen und wie kommen die Klammern zustande?

Erkenntnisse: Der Aufbau wäre dann wie folgt:
  • Klammerung erfolgt nicht mit den Zeichen [ und ], sondern mittels \bracket-Befehl
  • je nach Versetzungszeichen verschiedene Größen (!)
  • je nach Versetzungszeichen verschiedene Anhebungen (!)
  • zwischen Versetzungszeichen und Ziffern ein kleiner Abstand
  • Für die horizontale Ausrichtung sind nur die Ziffern relevant
  • Ziffern in Größe \tiny aus dem \figure-Zeichenvorrat

Ich habe daraus den Markup-Befehl \brackacc zusammengeschustert, dem man als Argument nur die übliche Generalbaß-Notation zu übergeben braucht - Ausnahme: Ausdrücke mit \+ müssen in Anführungszeichen stehen.
Damit die Ausrichtung stimmt (Ziffern direkt untereinander bzw. unter der Note, ohne Berücksichtigung eventueller Versetzungszeichen), habe ich das geklammerte Versetzungszeichen und die Ziffer mit \combine "übereinandergelegt" und dann per \translate die Versetzungszeichen nach links (und etwas nach oben) verschoben.

Dein Beispiel kann man so als

< \markup \brackacc 6+ >

codieren.


\version "2.16.1"

#(define-markup-command (brackacc layout props arg) (markup?)
  "Figured Bass: Accidental in brackets"
   (let* ((acc (string-regexp-substitute "[0-9]" "" (markup->string arg)  ))
          (fig (string-regexp-substitute "[\\!+-]" "" (markup->string arg) ))
          (rse (case (string->symbol acc)
                 ((-) '(-1.7 . 0.3))
                 ((--) '(-2.0 . 0.3))
                 ((!) '(-1.5 . 0.8))
                 ((+) '(-1.7 . 0.8))
                 ((++) '(-2.0 . 0.45))
                 ((\+) '(-1.9 . 0))
                 (else '(0 . 0))))
          (sze (case (string->symbol acc)
                 ((-) -5)
                 ((--) -5)
                 ((!) -5)
                 ((+) -5)
                 ((++) -1)
                 ((\+) -2)
                 (else 0)))
          (mgl (case (string->symbol acc)
                 ((-) "accidentals.flat")
                 ((--) "accidentals.flatflat")
                 ((!) "accidentals.natural")
                 ((+) "accidentals.sharp")
                 ((++) "accidentals.doublesharp")
                 ((\+) "plus")
                 (else " "))))
  (interpret-markup layout props
    (markup #:number #:combine
                       #:translate rse #:bracket #:fontsize sze #:musicglyph mgl
                       #:tiny fig))))


% TEST-CODE

\paper { line-width = #100 indent = 0 }

<<
  \relative c { \clef bass a2 a a a a a a a a a a a }
  \figures {
    < \markup \brackacc 6-- >2
    < 6-- >
    < 4 \markup \brackacc 6- >
    < 4 6- >
    < \markup \brackacc 6! >
    < 6! > \break
    < \markup \brackacc 6+ >
    < 6+ >
    < \markup \brackacc 6++ >
    < 6++ >
    < \markup \brackacc "6\+" >
    < 6\+ >
  }
>>

Viele Grüße
Torsten
« Letzte Änderung: Dienstag, 29. Januar 2013, 19:44 von Be-3 »

temuta

  • Member
Re: Generalbass: Nur Vorzeichen einklammern?
« Antwort #2 am: Dienstag, 29. Januar 2013, 19:15 »
Hallo Torsten,

das ist großartig! Auf eine solche (im Quelltext sehr kompliziert aussehende Lösung) wäre ich nie gekommen, dazu fehlt mir die Insider-Kenntnis. Und es klappt wirklich perfekt. Vielen, vielen Dank!

Viele Grüße
Burkard aka temuta

Be-3

  • Member
Re: Generalbass: Nur Vorzeichen einklammern?
« Antwort #3 am: Dienstag, 29. Januar 2013, 19:46 »
Auf eine solche (im Quelltext sehr kompliziert aussehende Lösung) wäre ich nie gekommen, [...]

Hallo Burkard,

eine solche Lösung ist auch nicht unbedingt notwendig. Es war nur ein Versuch von mir, die Angelegenheit komfortabel nutzbar zu machen.
Im wesentlichen kommt es auf die Erkenntnis an, daß man auch im Generalbaß-Modus Markup eingeben kann.
Und als Markup kann man alle Zeichen beliebig kombinieren und positionieren.

"In Handarbeit" sähe das Beispiel (#)6 so aus:

\markup \number \combine
  \translate #'(-1.7 . 0.8) \bracket \fontsize #-5 \sharp
  \tiny "6"

Mit \markup wird in den "Markup-Modus" umgeschaltet.
\number setzt die Schrift, die auch für die Generalbaß-Ziffern verwendet wird.
\combine legt die beiden nachfolgenden Markup-Elemente "übereinander" (das habe ich so gemacht, um das Versetzungseichen per \translate nach links schieben zu können, und zwar über den linken Zeichenrand hinaus - das ist wichtig für die richtige Positionierung der Ziffer.
Das erste Markup-Element besteht aus dem \translate-Befehl, der das folgende geklammerte # nach links und etwas nach oben verschiebt, dem \bracket-Befehl (nicht den Zeichen [ und ], die sehen anders aus!) und schließlich dem per \fontsize #-5 verkleinerten \sharp (das Kreuz).
Die \tiny "6" ist die 6 in der richtigen Größe.

Das war eigentlich "schon" alles. Wie Du siehst, besteht das Hauptproblem darin, das Markup so aussehen zu lassen, wie auch die "normale" Generalbaßbezifferung aussehen würde.
Das fängt an bei den richtigen Zeichen und Zeichengrößen und geht bis zu den passenden Abständen und Verschiebungen.

Bei der Gelegenheit ist mir gerade aufgefallen, daß meine \brackacc-Funktion noch ein überflüssiges #:concat enthielt, das noch aus ersten Versuchen (ohne \combine) stammte.
Habe ich oben in meinem ursprünglichen Posting jetzt abgeändert (geht ja noch...).

Viele Grüße
Torsten
« Letzte Änderung: Dienstag, 29. Januar 2013, 19:52 von Be-3 »

temuta

  • Member
Re: Generalbass: Nur Vorzeichen einklammern?
« Antwort #4 am: Dienstag, 29. Januar 2013, 20:55 »
Hallo Torsten,
danke, das verstehe ich schon sehr viel eher! Als "Newbie" hatte ich mich z.B. mit den beiden Befehlen \combine und \translate noch nicht auseinandergesetzt. Ich denke, dass das auch an anderer Stelle hilfreich zum Einsatz kommen kann. Nochmals danke sehr!
Viele Grüße,
Burkard