Allgemein > Fragen zu Funktionen

Akkordnamen unterstreichen (gelöst)

<< < (2/3) > >>

Manuela:
Ok, hier ein vollständiges Beispiel


--- Code: ---\version "2.19.52"

\language "deutsch"

% copied from scm/chord-name.scm
#(define (conditional-string-downcase str condition)
   (if condition
       (string-downcase str)
       str))

% copied from scm/chord-generic-names.scm
#(define (conditional-kern-before markup bool amount)
   "Add AMOUNT of space before MARKUP if BOOL is true."
   (if bool
       (make-line-markup
        (list (make-hspace-markup amount)
          markup))
       markup))

% copied from scm/chord-name.scm
#(define (accidental->markup alteration)
   "Return accidental markup for ALTERATION."
   (if (= alteration 0)
       (make-line-markup (list empty-markup))
       (conditional-kern-before
        (alteration->text-accidental-markup alteration)
        (= alteration FLAT) 0.094725)))

% copied from scm/chord-name.scm, renamed, added make-underline-markup
#(define (note-name->underlined-markup pitch lowercase?)
   "Return pitch markup for @var{pitch}."
   (make-underline-markup
    (make-line-markup
     (list
      (make-simple-markup
       (conditional-string-downcase
        (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch))
        lowercase?))
      (accidental->markup (ly:pitch-alteration pitch))))))

#(define ((chord-name->german-markup-text-alteration B-instead-of-Bb) pitch lowercase?)
   (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))
   (let* ((name (ly:pitch-notename pitch))
          (alt-semitones  (pitch-alteration-semitones pitch))
          (n-a (if (member (cons name alt-semitones) `((6 . -1) (6 . -1)))
                   (cons 7 (+ (if B-instead-of-Bb 1 1) alt-semitones))
                   (cons name alt-semitones))))
     (make-line-markup
      (list
       (make-simple-markup
        (conditional-string-downcase
         (vector-ref #("C" "D" "E" "F" "G" "A" "H" "B") (car n-a))
         lowercase?))
       (let ((alteration (/ (cdr n-a) 2)))
         (cond
          ((and (equal? lowercase? #f) (= alteration FLAT) (= (car n-a) 7)) (make-simple-markup ""))
          ((and (= alteration FLAT) (or (= (car n-a) 5) (= (car n-a) 2) )) (make-simple-markup "s"))
          ((= alteration FLAT) (make-simple-markup "es"))
          ((and (= alteration DOUBLE-FLAT) (or (= (car n-a) 5)(= (car n-a) 2) )) (make-simple-markup "ses"))
          ((= alteration DOUBLE-FLAT) (make-simple-markup "eses"))
          ((= alteration SHARP) (make-simple-markup "is"))
          ((= alteration DOUBLE-SHARP) (make-simple-markup "isis"))
          (else empty-markup)))))))

counterbass= \once \set ChordNames.chordRootNamer = #note-name->underlined-markup
#(define germanChords (chord-name->german-markup-text-alteration #t))

\chords {
  c fis g:7
  \set ChordNames.chordRootNamer = #note-name->underlined-markup
  c fis g:7
  \unset ChordNames.chordRootNamer
  cis
  \counterbass es:7
  des:9
  es
}

--- Ende Code ---

xr:
Wenn ich das richtig verstehe, soll #(define ((chord-name->german-markup-text-alteration B-instead-of-Bb) pitch lowercase?) die Vorzeichen in ausgeschriebene deutsche Bezeichnungen umwandeln? Also F# -> Fis.
Bei mir wird die Methode aber gar nicht aufgerufen.

Manuela:

--- Zitat von: xr am Freitag, 24. Februar 2017, 10:37 ---Wenn ich das richtig verstehe, soll #(define ((chord-name->german-markup-text-alteration B-instead-of-Bb) pitch lowercase?) die Vorzeichen in ausgeschriebene deutsche Bezeichnungen umwandeln? Also F# -> Fis.

--- Ende Zitat ---

Ja, das ist die Funktion dafür.


--- Zitat von: xr am Freitag, 24. Februar 2017, 10:37 ---Bei mir wird die Methode aber gar nicht aufgerufen.

--- Ende Zitat ---

Genau, ich habe sie deswegen eingefügt, damit der passende Code gleich zur Verfügung steht und nicht erst mühsam gesucht werden muss.

Die beiden Aufrufe


--- Code: ---#note-name->underlined-markup
--- Ende Code ---

und


--- Code: ---chord-name->german-markup-text-alteration
--- Ende Code ---

sollten zu einem Aufruf zusammengesetzt werden, der beides macht: unterstreichen und deutsche Akkordnamen verwenden.

xr:
Ich habe die Funktion note-name->underlined-markup so erweitert, dass die Namen direkt ins markup geschrieben werden.
Die Inline Funktion handle-sharp-flat könnte man natürlich auch auslagern.


--- Code: ---#(define (note-name->underlined-markup pitch lowercase?)
   "Return pitch markup for @var{pitch}."

   (define handle-sharp-flat (lambda (m)
       
       (let* (
            (n (ly:pitch-alteration pitch))
            (name (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch)))
            (isEorA  (not(equal? (member name '( "E" "A" )) #f)))
            )

            (cond
                (isEorA
                    (cond
                        ((= n 0)
                            "")
                        ((= n 1/2)
                            "is")
                        ((= n 1)
                            "isis")
                        ((= n -1/2)
                            "s")
                        ((= n -1)
                            "ses")))
                (else
                    (cond
                        ((= n 0)
                            "")
                        ((= n 1/2)
                            "is")
                        ((= n 1)
                            "isis")
                        ((= n -1/2)
                            "es")
                        ((= n -1)
                            "eses")))
            )
       ))
   )
   
   (let* (
        (new-markup
            (make-underline-markup
                (make-line-markup
                    (list
                        (make-simple-markup
                        (conditional-string-downcase
                        (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename pitch))
                        lowercase?)
                        )
                        (make-simple-markup (handle-sharp-flat  pitch ))
                    )
                )
       
            )
        ))
       new-markup
   )
)

--- Ende Code ---

Mein Auseinanderreißen der Klammern entspricht zwar nicht der Schemekonvention, aber bei hintereinander klebenden Klammern suche ich mir bei Fehlern immer einen Wolf.

Gruß,
Xaver

EDIT: Ach ja, das "H" müsste man natürlich auch noch abfragen

harm6:
Hallo,

mir ist im ganzen Thread nicht richtig klar geworden was eigentlich unterstrichen werden soll und wie es nachher aussehen soll.

Insoweit im Anhang ein png (erstellt mit markup-commands)

Wie sollen moll-Akkorde gedruckt werden? Klein oder mit einem Zeichen für moll ("m" oder "-" oder ...)?
Zusätzliche Bässe groß oder klein?
Wie weit soll das Unterstreichen ausgedehnt werden?

Gruß,
  Harm


Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln