Hallo Leute,
ich möchte die Dicke der Barrelinie in einem Akkorddiagramm ändern. Sie soll genau so dick sein, wie der Durchmesser der Dots.
Die Funktion barre-thickness gibt es leider nicht. Kann ich vielleicht etwas mit einem einfachen \override erreichen?
Danke und Grüße von Trulli
\version "2.14.1"
\relative c'' {
a^\markup { \override #'(size . 2.1)
{
{
\override #'(fret-diagram-details . (
(orientation . landscape)
(barre-type . straight))) {
\fret-diagram-verbose #'((place-fret 1 2 1)
(place-fret 2 2 1)
(barre 2 1 2) )
}
}
}
} }
Zitat von: trulli am Sonntag, 12. August 2012, 11:25
Die Funktion barre-thickness gibt es leider nicht. Kann ich vielleicht etwas mit einem einfachen \override erreichen?
Hallo Trulli,
wenn man sich die Definitionen anschaut, sieht man, daß die Dicke der (straitght)-Barré-Linie fest mit dem Radius der Dots verknüpft ist (immer halbe Breite). Man kann also nicht durch ein
\override nicht die Dicke der Barré-Linie ändern, ohne auch die Punkte zu verändern.
Glücklicherweise hat harm6 für die Punkt-Einklammerung schon eine eigene
fret-diagrams.ly-Datei bereitgestellt, und wenn man schon eine eigene Version dieser ursprünglichen
.scm-Datei hat, fällt die Hemmschwelle für einen weiteren Eingriff relativ niedrig aus... ;)
Ich habe mal eine Variable
barre-thickness eingeführt, die im Prinzip analog zu
dot-radius arbeitet. Defaultmäßig erhält sie die Werte von
dot-radius, d. h. wenn man
barre-thickness nicht angibt, verhält sich alles so wie gehabt.
Achtung: wenn die Linie so dick sein soll wie die Punkte, muß
barre-thickness doppelt so groß sein wie
dot-radius (denn das ist ja nur der Radius, nicht der Durchmesser der Punkte).
Ein kleiner Zuschlag (siehe Beispiel) kommt noch hinzu, weil die Linienstärke der Punkt-Outline auch noch berücksichtigt werden muß.
\version "2.14.1"
\include "fret-diagrams.ly"
\relative c'' {
a^\markup { \override #'(size . 2.1)
{
{
\override #'(fret-diagram-details . (
(orientation . landscape)
(barre-thickness . 0.55) ; neu: barre-thickness
(barre-type . straight))) {
\fret-diagram-verbose #'((place-fret 1 2 1)
(place-fret 2 2 1)
(barre 2 1 2) )
}
}
}
} }Hier Dein Coding mit der neuen Variablen
barre-thickness und als Anhang die passende
fret-diagrams.ly-Datei.
Viele Grüße
Torsten
Hi Torsten,
super, vielen Dank!
Ich gebe zu, dass ich bereits an der von harm geänderten fret-diagramm-Datei herumgefummelt habe. Aber ich habe einfach zu wenig Ahnung davon, was ich da mache... und nach etlichen fehlgeschlagenen Versuchen habe ich aufgegeben. Jetzt schaue ich mir natürlich an, was du geändert hast, aber ich weiß jetzt schon, dass ich es in ein paar Wochen nicht mehr ohne Weiteres nachvollziehen kann. Darum speichere ich so etwas immer in Dateien mit entsprechenden Kommentaren.
Ich bin eben doch mehr der User als der Programmierer...
Danke und Grüße
Hallo Trulli,
als kleine Hilfe zum Verständnis der Code-Änderungen und vor allem des Weges dorthin ein paar Hinweise zu meinem Lösungsweg:
Schritt 1: Welche Funktion zeichnet die Barré-Linie und was bestimmt ihre Dicke?make-straight-barre-stencil ist für den "straight-Barré" zuständig und hat neben Bundnummer, Start- und Endsaitennummer als letzten Parameter
half-thickness, der die Dicke der Linie bestimmt:
(define (make-straight-barre-stencil
fret-coordinate
start-string-coordinate
end-string-coordinate
half-thickness)
Ziel: Diese Definition unverändert lassen, um das Standardverhalten nicht zu beeinflussen.
Schritt 2: Welcher Wert wird beim Aufruf dieser Funktion als half-thickness übergeben?Interessant für uns ist der Aufruf von
make-straight-barre-stencil für den Fall von
barre-type = 'straight:
Dieser Aufruf ist in der Definition von
draw-barre enthalten, und wir sehen, daß als letzter Parameter
scale-dot-radius übergeben wird. Daher meine Behauptung, die Barré-Dicke sei fest mit dem Punktradius verknüpft.
Lösung: wir übergeben stattdessen eine neue, eigene Variable
scale-barre-thickness:
(barre-stencil
(cond
((eq? barre-type 'straight)
(make-straight-barre-stencil
barre-fret-coordinate
barre-start-string-coordinate
barre-end-string-coordinate
; scale-dot-radius)) ; replaced
scale-barre-thickness)) ; added barre-thickness-functionality
Schritt 3: Welche neuen Variable brauchen wir?Nun wissen wir, daß die der Funktion
make-straight-barre-stencil übergebene neue Variable
scale-barre-thickness definieren müssen und daß wir für den
\overrride "von außen" gerne eine neue Variable
barre-thickness hätten, die bei Bedarf analog zu
dot-radius gesetzt weden kann.
Wenn
barre-thickness nicht explizit überschrieben wird, soll sie als Default den Wert von
dot-radius erhalten. Dies kann enteder der explizit übergebene Wert von
dot-radius sein oder wiederum dessen Defaultwert.
Als letztes müssen wir noch dafür sorgen, daß
scale-barre-thickness eine Wertzuweisung entsprechend des ursprünglichen
scale-dot-radius erhält.
Wir haben es also insgesamt mit drei neuen Variablen zu tun:
| Variable | neue Variable | |
| Bedeutung | Punkt | Barré | Erläuterung |
| Punktradius bzw. Barrédicke | dot-radius | barre-thickness | kann mit \override in den fret-diagram-details überschrieben werden |
| Defaultwert | default-dot-radius | default-barre-thickness | Standardverhalten |
| intern | scale-dot-radius | scale-barre-thickness | Übergabewert an die make-straight-barre-stencil-Funktion |
barre-thicknessZum Vergleich oben die "Vorbild"-Definition von
dot-radius (völlig analog):
(dot-radius
(assoc-get
'dot-radius details default-dot-radius)) ; needed for draw-dots
; and draw-barre
[...]
(barre-thickness ; added barre-thickness-functionality
(assoc-get ; added barre-thickness-functionality
'barre-thickness details default-barre-thickness)) ; needed for straight draw-barre
default-barre-thicknessAchtung:
default-barre-thickness darf erst
nach der Definiton von dot-radius stehen, weil dieser Wert benötigt wird!
(default-barre-thickness
(assoc-get 'default-barre-thickness details dot-radius)) ; added barre-thickness-functionality
Als Defaultwert von
default-barre-thickness übergeben wir also den nun schon bekannten Wert von
dot-radius - das bedeutet, den eventuell mit
\override überschriebenen Wert von
dot-radius oder eben dessen Defaultwert.
Damit ist sichergestellt, daß sich alles absolut standardkonform verhält, wenn
barre-thickness nicht explizit gesetzt wird.
scale-barre-thicknessAls letzte Variable schließlich muß
scale-barre-thickness noch analog zu
scale-dot-radius gesetzt werden, dann steht unserem alternativen Aufruf von
make-straight-barre-stencil nichts mehr im Wege:
(scale-dot-radius (* size dot-radius))
(scale-barre-thickness (* size barre-thickness)) ; added barre-thickness-functionality
Voilà ! :)
Viele Grüße
Torsten
Hi Torsten,
danke für die ausführliche Erklärung! Ich kann alles sehr gut nachvollziehen. Woher wusstest du so genau, was du machen musst?
Hätte es eigentlich auch gereicht die nachstehende Definition zu ändern, d.h. aus half-thickness eine Art full-thickness zu machen? Das hätte dann natürlich das Standardverhalten geändert... was ich aber nicht schlimm gefunden hätte, weil ich den Barre-Standard noch nie irgendwo gesehen habe.
(define (make-straight-barre-stencil
fret-coordinate
start-string-coordinate
end-string-coordinate
half-thickness)
Danke und Grüße
Zitat von: trulli am Montag, 13. August 2012, 08:24
Woher wusstest du so genau, was du machen musst?
Zitat von: trulli am Montag, 13. August 2012, 08:24
Hätte es eigentlich auch gereicht die nachstehende Definition zu ändern, d.h. aus half-thickness eine Art full-thickness zu machen?
[...]
(define (make-straight-barre-stencil
fret-coordinate
start-string-coordinate
end-string-coordinate
half-thickness)
Im Prinzip ja (viele Wege führen nach Rom). Ausschlaggebend war für mich, daß es sich bei
half-thickness um einen "durchlaufenden Posten" handelt: Es wird damit nichts gemacht, außer ihn an die (nun wirklich allgemeine) Funktion
make-line-stencil als Liniendicke weiterzugeben:
(make-line-stencil
half-thickness
(car start-point)
(cdr start-point)
(car end-point)
(cdr end-point))))
Man hätte also innerhalb von
make-straight-barre-stencil den Wert des übergebenen Parameters
half-thickness ignorieren und an
make-line-stencil einen festen Wert übergeben können.
Doch halt - so fest darf er auch nicht sein, die von Dir vorgeschlagene
full-thickness will ja auch erst errechnet werden, denn sie hängt ja vom
dot-radius ab.
Ergo: "Rechnen" muß man sowieso, da kann man auch gleich die Möglichkeit einbauen nach Wunsch eine
barre-thickness zu setzen. So hab ich's gemacht und sie quasi als angepaßte Kopie von
dot-radius angelegt. Ist praktisch der selbe Aufwand wie die Breite in
make-straight-barre-stencil unflexibel zu setzen.
Zitat von: trulli am Montag, 13. August 2012, 08:24
Das hätte dann natürlich das Standardverhalten geändert... was ich aber nicht schlimm gefunden hätte, weil ich den Barre-Standard noch nie irgendwo gesehen habe.
So gesehen muß ich Dir recht geben. Mit "Standardverhalten" meinte ich allerdings das Standardverhalten von LilyPond und keinesfalls, daß es sich dabei um die übliche Notationspraxis handelt.
Ich wundere mich auch etwas über die beiden Dots im (geraden) Barré, die ich noch nie so gesehen habe. Wenn man sie wegläßt, erkennt er nicht richtig den niedrigsten Bund, wenn man nur einen setzt sieht's blöd aus.
Hat aber auch nicht viel zu sagen, denn ich habe mit Gitarren nur ganz am Rande zu tun und deshalb auch nicht übermäßig viele Gitarrennoten gesehen.
Viele Grüße
Torsten