Autor Thema: Vorzeichen in Chordnames ändern  (Gelesen 7512 mal)

hosios

  • Gast
Vorzeichen in Chordnames ändern
« am: Freitag, 15. Juli 2011, 17:45 »
Hallo,

Ich würde gerne wissen wie ich die Vorzeichen nur im Chordname conetxt ändern kann.

Ich habe mich ne weile mit folgenden snipet beschäftigt,

http://lsr.dsi.unimi.it/LSR/Item?id=750

aber ich weiss nicht genau wo ich das in meinem Dokument reinstellen soll. habe mehrere versuche gemacht, ohne Erfolg.

Ich stelle ein Buch zusammen mit ungefähr 100 Kinderlieder für den Gitarrenunterricht. Und gebrauche dazu Calibri für Liedtexte, und möchte gerne Cambria für Griffe brauchen, aber die Vorzeichen sehen da überhaupt nicht gut / aus. siehe Bild:

Das erste Vorzeichen ist der Originale Output und das Zweite habe ich mit Gimp verändert wie ich das ungefähr haben möchte.

Ist das möglich?

Danke
Paul

trulli

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #1 am: Freitag, 15. Juli 2011, 23:28 »
Hallo Paul,

erstmal herzlich willkommen hier . :)

In Lily kann man eigentlich alles ändern  - man muss nur wissen wie....

Anbei mal ein paar Lösungsansätze, die vielleicht für dich passen:
Die ersten beiden Akkorde sind das Bild, das du schon kennst. Die nächsten Akkorde kommen mit hochgestellten Versetzungszeichen, die du mit \germanChords einstellen kannst. Drittens schließlich eine Definition, wie du sie schon gefunden hast. Diese Definition steht vor dem Noten- (oder Akkord-)text und wird hier mit \set chordRootNamer = #my-chord-name->pop-markup angestellt (ich habe einfach das Meiste aus dem Snippet übernommen).

Layout ist ja immer Geschmackssache - ich bin selbst Gitarrist und finde große Versetzungszeichen besser lesbar. GermanChords gefällt mir daher am besten...

Grüße von Trulli

\version "2.12.3"



#(define (my-chord-name->pop-markup pitch)
  (let* ((alt (ly:pitch-alteration pitch)))
  (make-line-markup
    (list
      (make-simple-markup (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch)))
      ;; If it's natural, do nothing
      (if (= alt 0)
        (make-line-markup (list empty-markup))
        (if (= alt FLAT)
          ;; Otherwise, handle adding the flat symbol
          (make-line-markup
            (list
              (make-hspace-markup 0.1)
              (make-small-markup (make-raise-markup 0.7
                (make-text-markup "b")))
            ))
          ;; or handle adding the sharp symbol
          (make-line-markup
            (list
              (make-hspace-markup 0.1)
              (markup (make-raise-markup 0.7
                (make-text-markup "#")))
            ))
        )))))
)


 
    \chords {
     
      cis1^\mark normal | bes
     
      \germanChords
     
      cis1^\mark german | beses
     
      \set chordRootNamer = #my-chord-name->pop-markup
     
      cis^\mark Definition | bes
       
       
      }
   

trulli

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #2 am: Freitag, 15. Juli 2011, 23:31 »
P.S.: Hier gibt es auch eine Gitarrenecke. Ich bitte den Mod deine Beiträge dorthin zu verschieben.

hosios

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #3 am: Samstag, 16. Juli 2011, 00:03 »
Hallo, vielen Dank für deine Antwort.

Ja, das hilft mir schon ein Schritt weiter.

die zweite Lösung gefällt mir am besten, jeztz fehlt nur noch das zeichen ungefähr 20% kleiner zu machen. Das würde perfekt sein. (du hast recht, das ist Geschmacksache, aber ich mag es doch etwas kleiner.)
Die dritte Lösung gefällt mir nicht, denn die Zeichen sehen dann nicht musikalisch aus.

Das mit der Gitarrenecke ist auch kein problem. bin hier seit gestern erst "zuhause".
 :)

Paul

hosios

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #4 am: Samstag, 16. Juli 2011, 00:23 »
Nun, ich habe da jetzt ein Problem.

die Vorzeichen klappen schon mit \germanChords, aber. ich bekomme dann ein H anstatt B. Wir brauchen hier in Paraguay nicht das deutsche System, sondern das englische. da muss doch irgendwie ein Mittelpunkt sein. :)

harm6

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #5 am: Samstag, 16. Juli 2011, 02:41 »
Hallo Paul,

wie trulli schon sagte:

Zitat
In Lily kann man eigentlich alles ändern  - man muss nur wissen wie....

manchmal ist es aber etwas aufwendiger:

\version "2.14.1"

#(define (pitch-alteration-semitones pitch)
  (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))
 
#(define (conditional-string-downcase str condition)
  (if condition
      (string-downcase str)
      str))
 
#(define (conditional-kern-before markup bool amount)
  (if bool
      (make-line-markup
       (list (make-hspace-markup amount)
     markup))
      markup))
     
     
#(define (accidental->markup alteration)
  (if (= alteration 0)
      (make-line-markup (list empty-markup))
      (conditional-kern-before
       (alteration->text-accidental-markup alteration)
       (= alteration FLAT) 0.2)))

#(define ((chord-name->germanMarkup B-instead-of-Bb)
     pitch lowercase?)
  (let* ((name (ly:pitch-notename pitch))
         (alt-semitones  (pitch-alteration-semitones pitch))
(n-a (if (member (cons name alt-semitones) `((6 . -1) (6 . -2)))
  (cons 6 (+ (if B-instead-of-Bb 1 0) alt-semitones))
  (cons name alt-semitones))))
    (make-line-markup
     (list
      (make-simple-markup
       (conditional-string-downcase
(vector-ref #("C" "D" "E" "F" "G" "A" "B") (car n-a))
lowercase?))
      (markup #:fontsize -3 #:raise 1.5
       (accidental->markup (/ (cdr n-a) 2)))))))

myChords = {
  \set chordRootNamer = #(chord-name->germanMarkup #f)
}

%------------------------- Test ------------------------------------------------

\paper {
indent = 20
short-indent = 20
}

\chords {
       
\mark \markup  { \null \raise #5 \bold "myChords" }
       
        \myChords
           
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
     
\mark\markup { \vspace #4 \raise #5 \bold "normal    " }

     \unset chordRootNamer
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
}

Den Code habe ich aus den internen lilypond-Dateien (chord-name.scm etc) entnommen und modifiziert. Das ganze ist jetzt nicht besonders elegant und im Code gibts noch einiges was man bestimmt rausnehmen könnte, aber es funktioniert.
Wenn Dir das Erscheinungsbild noch nicht zusagt kannst Du in dieser Code-Zeile aus der obigen Definition

(markup #:fontsize -3 #:raise 1.5

die Werte noch anpassen.

Gruß,
  Harm

P.S. Das LSR-Snippet funktioniert unter 2.14.1 nicht mehr (und ich habe bislang nicht erforscht warum nicht). Das LSR benutzt noch 2.12.2 und da funktioniert so einiges nicht mehr mit der neuen stable.
@trulli:
Deinen obigen Vorschlag habe ich ebenfalls nicht ans laufen bekommen.
« Letzte Änderung: Samstag, 16. Juli 2011, 02:47 von harm6 »

hosios

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #6 am: Samstag, 16. Juli 2011, 04:07 »
Wow! Ihr seid wirklich gut.

Auf so einen Code würde ich noch lange nicht gekommen sein.

Das ist genau was ich wollte. Perfekt!

Ich habe die werte auf size -2.5 und raise 1.2 gestellt. und das sieht super aus. :D

Vielen, vielen Dank.


PS.: Ich werde bestimmt auch noch mehr Fragen haben. Werde mich jetzt mal wieder etwas mit Lieder reintippen beschäftigen.


trulli

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #7 am: Samstag, 16. Juli 2011, 08:36 »
@trulli:
Deinen obigen Vorschlag habe ich ebenfalls nicht ans laufen bekommen.

Hallo harm6,

ich deinen auch nicht.  :D

Da wurde doch einiges in 2.14. verändert. Und ich hänge noch so an meinem 2.12.  ::)

Gruß

harm6

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #8 am: Sonntag, 17. Juli 2011, 00:50 »
Hallo zusammen,

hier noch eine vereinfachte Fassung:

#(define (myChordNames  pitch lowercase?)

   (define (pitch-alteration-semitones pitch)
     (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))
     
   (define (conditional-kern-before markup bool amount)
     (if bool
         (make-line-markup
          (list (make-hspace-markup amount)
          markup))
         markup))
     
   (define (accidental->markup alteration)
     (if (= alteration 0)
         (make-line-markup (list empty-markup))
         (conditional-kern-before
          (alteration->text-accidental-markup alteration)
          (= alteration FLAT) 0.2)))
     
   (let* ((name (ly:pitch-notename pitch))
          (alt-semitones  (pitch-alteration-semitones pitch))
          (n-a (cons name alt-semitones)))
     (make-line-markup
      (list
       (make-simple-markup
         (vector-ref #("C" "D" "E" "F" "G" "A" "B") (car n-a)))
       (make-fontsize-markup -3
        (make-raise-markup 1.5
         (accidental->markup (/ (cdr n-a) 2))))))))   
         
myChords = {
  \set chordRootNamer = #myChordNames
}

%------------------------- Test ------------------------------------------------

\paper {
indent = 20
short-indent = 20
}

\chords {
       
\mark \markup  { \null \raise #5 \bold "myChords" }
       
        \myChords
           
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
     
\mark\markup { \vspace #4 \raise #5 \bold "normal    " }

     \unset chordRootNamer
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
}

Ich habe allerdings keine Ahnung warum ich lowercase? nicht aus der Definition löschen kann, denn es erfüllt keine Funktion mehr. Tatsächlich kann man auch bla-blub oder ??? hinschreiben, ohne daß sich irgendwas ändert!! Ich habe dazu mal eine Frage im englischen Forum gestellt. Mal sehen was dabei herauskommt.

@trulli:
Wenn ich bla-blub oder irgenwas anderes reinschreibe bekomme ich sowohl das LSR-Snippet als auch Deinen obigen Vorschlag ans laufen. Insofern interessiert es mich ob die myChordNames-Definition in 2.12.3 kompiliert, wenn man lowercase? einfach löscht. Ich wäre Dir dankbar, wenn Du das mal testen könntest, da ich nur noch 2.14.1 auf dem Rechner habe.

Gruß,
  Harm

trulli

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #9 am: Sonntag, 17. Juli 2011, 12:31 »
Ich wäre Dir dankbar, wenn Du das mal testen könntest, da ich nur noch 2.14.1 auf dem Rechner habe.

Kein Problem. Erstmal kennt 2.12.3 gar kein \vspace. Wenn ich das durch \hspace ersetze bekomme ich diese Fehlerausgabe:
Wrong number of arguments to #<procedure myChordNames (pitch lowercase?)>
Auch bla-blub oder blu-blab funktioniert nicht.  ;D

Ich weiß zu wenig vom Definieren als dass ich da weiterhelfen könnte...

harm6

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #10 am: Sonntag, 17. Juli 2011, 16:06 »
Hallo zusammen,

meine Anfrage auf der englischen Seite
ergab folgende Erkenntnis:

Die Syntax  des chordRootNamer wurde in 2.14. geändert. Er erwartet jetzt zwei Argumente. Das zweite eröffnet die Möglichkeit Kleinbuchstaben für die Akkordnamen zu verwenden. Das LSR-Snippet, trulli' Vorschlag und auch mein eigener ignorieren diese Möglichkeit allerdings. Insoweit ist die Angabe eines zweiten Arguments völlig sinnfrei. Da lilypond aber an dieser Stelle etwas erwartet, muß etwas da stehen. Das kann auch computer-sind-blöd sein. Hab' ich getestet! ;D

Für 2.12.3 sollte mein Vorschlag also so funktionieren:

\version "2.12.3"
#(define (myChordNames pitch)

   (define (pitch-alteration-semitones pitch)
     (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))
     
   (define (conditional-kern-before markup bool amount)
     (if bool
         (make-line-markup
          (list (make-hspace-markup amount)
          markup))
         markup))
     
   (define (accidental->markup alteration)
     (if (= alteration 0)
         (make-line-markup (list empty-markup))
         (conditional-kern-before
          (alteration->text-accidental-markup alteration)
          (= alteration FLAT) 0.2)))
     
   (let* ((name (ly:pitch-notename pitch))
          (alt-semitones  (pitch-alteration-semitones pitch))
          (n-a (cons name alt-semitones)))
     (make-line-markup
      (list
       (make-simple-markup
         (vector-ref #("C" "D" "E" "F" "G" "A" "B") (car n-a)))
       (make-fontsize-markup -3
        (make-raise-markup 1.5
         (accidental->markup (/ (cdr n-a) 2))))))))   
         
myChords = {
  \set chordRootNamer = #myChordNames
}

%------------------------- Test ------------------------------------------------

\paper {
indent = 20
short-indent = 20
}

\chords {
       
\mark \markup  { \null \raise #5 \bold "myChords" }
       
        \myChords
           
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
     
     \mark\markup {\column {\bold "normal    " " " }}

     \unset chordRootNamer
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
}

@trulli:
Vielleicht kannst Du das nochmal testen. Tut mir leid, daß ich \vspace dringelassen hatte. Ich hatte schon in 2.12.3 eine Definition dafür, die ich routinemäßig benutzt habe, sodaß ich vergessen habe sie rauszunehmen.

Für 2.14.1 ergeben sich folgende Definitionen:

LSR-Snippet-upgrade:
\version "2.14.1"

% http://lsr.dsi.unimi.it/LSR/Item?id=750

% correct markup for "b" and "#" (use symbols from current font...)
chordFlat = \markup { \hspace #0.2 \fontsize #-1 \raise #0.3 "b" }
chordSharp = \markup { \hspace #0.1 \fontsize #-1 \raise #0.3 "#" }

% define custom chords
myPopChordsMusic =
{
    <c es ges bes>-\markup { "m" \super { "7/" \chordFlat "5" } }
    <c e g bes dis'>-\markup { \super { "7/" \chordSharp "9" } }
    % ... define all other possible chords here...
}

% Add to existing exceptions
myPopChordsAdd = #(append (sequential-music-to-chord-exceptions myPopChordsMusic #t) ignatzekExceptions)

% fix accidentals with some Scheme (using the current font's symbols)
#(define (my-chord-name->pop-markup pitch bla-blub) ;<===================== !!!!!!!!!!!!!!!!!!!!!!
  (let* ((alt (ly:pitch-alteration pitch)))
  (make-line-markup
    (list
      (make-simple-markup (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch)))
      ;; If it's natural, do nothing
      (if (= alt 0)
        (make-line-markup (list empty-markup))
        (if (= alt FLAT)
          ;; Otherwise, handle adding the flat symbol
          (make-line-markup
            (list
              (make-hspace-markup 0.3)
              (make-small-markup (make-raise-markup 0.7
                (make-text-markup "b")))
            ))
          ;; or handle adding the sharp symbol
          (make-line-markup
            (list
              (make-hspace-markup 0.1)
              (make-small-markup (make-raise-markup 0.7
                (make-text-markup "#")))
            ))
        )))))
)

\new Score
{
    \new ChordNames
    {
        % for demonstration purposes, use Arial as font
        % this does not look very nice, but shows the functionality

        \override ChordNames . ChordName  #'font-name = #"Arial"

        % use our new chord definitions (including the new accidentals)

        \set chordNameExceptions = #myPopChordsAdd

        % use our new markup chord naming functions to get the new accidentals

        \set chordRootNamer = #my-chord-name->pop-markup

        \chordmode { cis1:m7.5-  des1:7.9+ }
    }
}


% % use like this:
%
% {
%     popChords =
%     {
%         \set chordNameExceptions = #myPopChordsAdd
%         \set chordRootNamer = #my-chord-name->pop-markup
%     }
% }
%
% % or like this:
%
% \layout
% {
%     \context
%     {
%         \Score
%         chordNameExceptions = #myPopChordsAdd
%         chordRootNamer = #my-chord-name->pop-markup
%     }
% }
%}

Fassung trulli:
\version "2.14.1"

#(define (my-chord-name->pop-markup pitch ???)
  (let* ((alt (ly:pitch-alteration pitch)))
  (make-line-markup
    (list
      (make-simple-markup (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch)))
      ;; If it's natural, do nothing
      (if (= alt 0)
        (make-line-markup (list empty-markup))
        (if (= alt FLAT)
          ;; Otherwise, handle adding the flat symbol
          (make-line-markup
            (list
              (make-hspace-markup 0.1)
              (make-small-markup (make-raise-markup 0.7
                (make-text-markup "b")))
            ))
          ;; or handle adding the sharp symbol
          (make-line-markup
            (list
              (make-hspace-markup 0.1)
              (markup (make-raise-markup 0.7
                (make-text-markup "#")))
            ))
        )))))
)


 
    \chords {
     
      cis1^\mark normal | bes
     
      \germanChords
     
      cis1^\mark german | beses
     
      \set chordRootNamer = #my-chord-name->pop-markup
     
      cis^\mark Definition | bes
       
      }

Meine Fassung wie oben.


Viele Grüße,
  Harm

trulli

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #11 am: Montag, 18. Juli 2011, 11:45 »
Da lilypond aber an dieser Stelle etwas erwartet, muß etwas da stehen. Das kann auch computer-sind-blöd sein. Hab' ich getestet! ;D

Mein Vorschlag: I-love-Lily   8)

Alle Versionen laufen problemlos durch harm6, Klasse! Da ich jetzt Frescobaldi mit den wichtigsten Lily-Versionen habe, ging der Test schnell und problemlos.

Da die wichtigsten Probleme gelöst sind, kommen wir damit wieder zu unserem beliebten Thema Feintuning. Ich würde in die Definition in jedem Fall die Möglichkeit der horizontalen Verschiebung mit einbauen, weil mir die Versetzungzeichen zu dicht an den Buchstaben stehen: (make-hspace-markup 0.3)

Ich habe in dem folgenden Code (nach harm6 mit meiner hspace Ergänzung) mal eine Einstellung gemacht, die ich optisch gut finde. Wie so oft gibt es keine Referenz für die Darstellung von Gitarren-Akkorden. Jeder Verlag kocht ein eigenes Süppchen. Am häufigsten kommen Ausdrücke ohne Versetzungszeichen vor, z.B. Fism. Dann gibt es das: F#m und schließlich (ans Real-book angelehnt) dasselbe mir einem hochgestellten Veretzungszeichen. Im Real-book sehen die Kreuze auch anders aus, so ähnlich wie in diesem Snippet.

Die Qual der Wahl....

\version "2.14.1"

#(define (myChordNames  pitch lowercase?)

   (define (pitch-alteration-semitones pitch)
     (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))
     
   (define (conditional-kern-before markup bool amount)
     (if bool
         (make-line-markup
          (list (make-hspace-markup amount)
          markup))
         markup))
     
   (define (accidental->markup alteration)
     (if (= alteration 0)
         (make-line-markup (list empty-markup))
         (conditional-kern-before
          (alteration->text-accidental-markup alteration)
          (= alteration FLAT) 0.2)))
     
   (let* ((name (ly:pitch-notename pitch))
          (alt-semitones  (pitch-alteration-semitones pitch))
          (n-a (cons name alt-semitones)))
     (make-line-markup
      (list
       
       (make-simple-markup
         (vector-ref #("C" "D" "E" "F" "G" "A" "B") (car n-a)))
       (make-hspace-markup 0.3)
       (make-fontsize-markup -2
        (make-raise-markup 1.2
         (accidental->markup (/ (cdr n-a) 2))))))))   
         
myChords = {
  \set chordRootNamer = #myChordNames
}

%------------------------- Test ------------------------------------------------

\paper {
                indent = 20
                short-indent = 20
}

\chords {
       
\mark \markup  { \null \raise #5 \bold "myChords" }
       
        \myChords
           
        c cis d dis e f fis g gis a ais b c
     \break
        c b bes a aes g ges f e ees d des c
     \break
}

Gutes Tunen wünscht Trulli  :)

harm6

  • Gast
Re: Vorzeichen in Chordnames ändern
« Antwort #12 am: Mittwoch, 20. Juli 2011, 00:37 »
@trulli

Zitat
Jeder Verlag kocht ein eigenes Süppchen.

Und nicht nur das. Je nach Sprache in der man sich bewegt ergeben sich weitere Variationen. Deutsch, englisch, französisch, italienisch etc. Auf die Schnelle fallen mir sechs Möglichkeiten ein, den a-moll-Akkord zu schreiben. Und wenn ich drüber nachdenken würde ...
Ich persönlich habe gelernt zu lesen was ich vorgesetzt bekomme. Spannend am Thema finde vor allem zu lernen wie ich lilypond dazu bewegen kann zu tun was ich sage.  ;)

Gruß,
  Harm