Notationsspezifisch > Noten für Gitarre
Barrelinie im Akkorddiagamm verändern
trulli:
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
--- Code: ---\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) )
}
}
}
} }
--- Ende Code ---
Be-3:
--- 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?
--- Ende Zitat ---
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ß.
--- Code: ---\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) )
}
}
}
} }
--- Ende Code ---
Hier Dein Coding mit der neuen Variablen barre-thickness und als Anhang die passende fret-diagrams.ly-Datei.
Viele Grüße
Torsten
trulli:
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
Be-3:
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:
--- Code: --- (define (make-straight-barre-stencil
fret-coordinate
start-string-coordinate
end-string-coordinate
half-thickness)
--- Ende Code ---
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:
--- Code: --- (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
--- Ende Code ---
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:
Variableneue VariableBedeutungPunktBarréErläuterungPunktradius bzw. Barrédickedot-radiusbarre-thicknesskann mit \override in den fret-diagram-details überschrieben werdenDefaultwertdefault-dot-radiusdefault-barre-thicknessStandardverhalteninternscale-dot-radiusscale-barre-thicknessÜbergabewert an die make-straight-barre-stencil-Funktion
barre-thickness
Zum Vergleich oben die "Vorbild"-Definition von dot-radius (völlig analog):
--- Code: --- (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
--- Ende Code ---
default-barre-thickness
Achtung: default-barre-thickness darf erst nach der Definiton von dot-radius stehen, weil dieser Wert benötigt wird!
--- Code: --- (default-barre-thickness
(assoc-get 'default-barre-thickness details dot-radius)) ; added barre-thickness-functionality
--- Ende Code ---
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-thickness
Als 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:
--- Code: --- (scale-dot-radius (* size dot-radius))
(scale-barre-thickness (* size barre-thickness)) ; added barre-thickness-functionality
--- Ende Code ---
Voilà ! :)
Viele Grüße
Torsten
trulli:
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.
--- Code: --- (define (make-straight-barre-stencil
fret-coordinate
start-string-coordinate
end-string-coordinate
half-thickness)
--- Ende Code ---
Danke und Grüße
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln