Autor Thema: Barrelinie im Akkorddiagamm verändern  (Gelesen 4482 mal)

trulli

  • Gast
Barrelinie im Akkorddiagamm verändern
« am: Sonntag, 12. August 2012, 11:25 »
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)  )
        }
      }
    }
} }
« Letzte Änderung: Montag, 13. August 2012, 08:03 von trulli »

Be-3

  • Gast
Re: Barrelinie im Akkorddiagamm verändern
« Antwort #1 am: Sonntag, 12. August 2012, 13:36 »
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

trulli

  • Gast
Re: Barrelinie im Akkorddiagamm verändern
« Antwort #2 am: Sonntag, 12. August 2012, 14:41 »
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

  • Gast
Re: Barrelinie im Akkorddiagamm verändern
« Antwort #3 am: Sonntag, 12. August 2012, 16:09 »
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:

Variableneue Variable
BedeutungPunktBarréErläuterung
Punktradius bzw. Barrédickedot-radiusbarre-thicknesskann mit \override in den fret-diagram-details überschrieben werden
Defaultwertdefault-dot-radiusdefault-barre-thicknessStandardverhalten
internscale-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):
         (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-thickness

Achtung: 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-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:
                (scale-dot-radius (* size dot-radius))       
                (scale-barre-thickness (* size barre-thickness))    ; added barre-thickness-functionality


Voilà !  :)

Viele Grüße
Torsten





trulli

  • Gast
Re: Barrelinie im Akkorddiagamm verändern
« Antwort #4 am: Montag, 13. August 2012, 08:24 »
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

Be-3

  • Gast
Re: Barrelinie im Akkorddiagamm verändern
« Antwort #5 am: Montag, 13. August 2012, 11:46 »
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?
[...]
     (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.

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