Allgemein > Fragen zu Funktionen
Akkordnamen unterstreichen (gelöst)
Manuela:
Arnold möge mir verzeihen ;)
Ich arbeite an einer Notation für Akkordeonbass und habe Workarounds gefunden, um Bezeichnungen für Akkorde mit Kleinbuchstaben und für die Bassnoten mit Großbuchstaben zu schreiben.
Für die Terzbässe brauche ich die Akkordnamen unterstrichen, auch dafür habe ich einen Workaround gefunden. Der Nachteil bei meiner Lösung ist, dass die Unterstriche nicht an die Schriftart und Namensbreite angepasst wird. Gibt es irgendeine Möglichkeit, z.B. \underline anzuwenden?
Hier mein Workaround:
--- Code: ---\version "2.19.52"
\language "deutsch"
chExceptionMusic = {
<c es g b d'>1-\markup { \super \fontsize #1 "m" }
<c>1-\markup { \null \hspace #-1.6 \fontsize #2 "_" }
<c d>1-\markup { \null \hspace #-3.5 \fontsize #1.2 "__" }
}
chExceptions = #( append
( sequential-music-to-chord-exceptions chExceptionMusic #t)
ignatzekExceptions)
chordnotes = \chordmode {
\set chordNameLowercaseMinor = ##t
\set chordNameExceptions = #chExceptions
c < c > < cis dis > c:m c:m9 c:m7 c:dim
}
\new ChordNames \chordnotes
--- Ende Code ---
fugenkomponist:
Du müßtest vermutlich chordRootNamer ersetzen. Hier eine angepaßte Version des defaults note-name->markup. Dafür mußte ich drei Hilfsfunktionen kopieren, die sind genau so im LilyPond-Code zu finden, ich komm bloß als Nutzer anscheinend nicht dran, weil sie per define statt define-public definiert sind (ich nehm zumindest an, daß das der Grund ist). Deshalb sieht das jetzt nach viel Text aus, ist aber eigentlich nur eine winzige Änderung ;)
--- Code: ---\version "2.19.53"
\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))))))
\chords {
c fis g:7
\set ChordNames.chordRootNamer = #note-name->underlined-markup
c fis g:7
}
--- Ende Code ---
Manuela:
Danke, das sieht echt super aus!
Die Lösung kann sogar mehr, unterstrichene Dominantseptakkorde werden in der Akkordeonnotation nicht gebraucht ;)
Wenn man dann noch folgendes einbaut:
--- Code: ---counterbass= \once \set ChordNames.chordRootNamer = #note-name->underlined-markup
\chords {
c fis g:7
\counterbass g
c fis g:7
}
--- Ende Code ---
dann kann man einzelne Chordnamen unterstreichen.
Manuela:
So, ich dachte, ich schaffe es alleine, die Funktion so umzustricken, dass statt C# beispielsweise Cis erscheint.
Und scheitere :(
Ich habe verschiedene Varianten probiert
--- Code: ---#(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)))))))
--- Ende Code ---
in die Funktion einzubauen, zB.
--- Code: ---#(define (note-name->underlined-markup pitch lowercase?)
"Return pitch markup for @var{pitch}."
(make-underline-markup
(make-line-markup
(list
(make-simple-markup
((chord-name->german-markup-text-alteration #f) pitch lowercase?))))))
--- Ende Code ---
was nur Fehlermeldungen ergibt.
Wahrscheinlich nur eine Kleinigkeit, aber meine (zugegebenermaßen nicht so tollen) Scheme-Kenntnisse rosten so schnell ein, wenn ich sie eine Weile nicht brauche, es ist erschreckend.
xr:
Hallo,
da ich mich ja gerade selbst durch die Syntax von Scheme kämpfe und versuche, Lilys Grob-Hierarchie zu verstehen, hätte ich mir deinen Code zumindest gern mal angeschaut.
Kannst du mal ein vollständiges Codebeispiel geben, das ich nicht erst aus den anderen Beispielen zusammenstückeln muss?
Grüße,
Xaver
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln