Allgemein > Fragen zu Funktionen
Akkordnamen unterstreichen (gelöst)
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