Autor Thema: Alphabet in historischen Tabulaturen - ohne "j"  (Gelesen 1412 mal)

Friederich

  • Member
Alphabet in historischen Tabulaturen - ohne "j"
« am: Freitag, 18. September 2015, 23:51 »
Hallo,

manche historische Tabulaturen im Buchstabenformat verwenden aus Gründen der Übersichtlichkeit kein "j". Wie kann man letter-tablature-format umdefinieren, sodass es j auslässt? Ich habe diese Definition gefunden und verstehe, was sie macht, weiß aber nicht, wie ich sie ändern müsste...

#(define (letter-tablature-format str context event)
  (let*
      ((tuning (ly:context-property context 'stringTunings))
       (pitch (ly:event-property event 'pitch)))
    (make-whiteout-markup
     (make-vcenter-markup
      (string (integer->char
         (+ (char->integer #\a)
            (- (ly:pitch-semitones pitch)
            (list-ref tuning (- str 1))))))))))

Alternativ könnte ich natürlich "falsche" Töne eingeben, die dem korrekten Buchstaben entsprechen; eine sauberere Lösung wäre mir aber lieber  ;)

Vielen Dank und liebe Grüße,
Friederich

harm6

  • Member
Re: Alphabet in historischen Tabulaturen - ohne "j"
« Antwort #1 am: Samstag, 19. September 2015, 03:44 »
Schnell zusammenkopiert und angepasst, aber vielleicht reichts ja schon:

\version "2.19.26"

#(define number->mark-letter-vector (make-vector 25 #\a))

#(do ((i 0 (1+ i))
     (j 0 (1+ j)))
    ((>= i 26))
  (if (= i (- (char->integer #\j) (char->integer #\a)))
      (set! i (1+ i)))
  (vector-set! number->mark-letter-vector j
               (integer->char (+ i (char->integer #\a)))))

#(define number->mark-alphabet-vector
  (list->vector
    (map (lambda (i) (integer->char (+ i (char->integer #\a)))) (iota 26))))

#(define (number->markletter-string vec n)
  "Double letters for big marks."
  (let* ((lst (vector-length vec)))
    (if (>= n lst)
        (string-append (number->markletter-string vec (1- (quotient n lst)))
                       (number->markletter-string vec (remainder n lst)))
        (make-string 1 (vector-ref vec n)))))
       
       
#(define-public (my-fret-letter-tablature-format
                context string-number fret-number)
  (let ((labels (ly:context-property context 'fretLabels)))
    (make-vcenter-markup
     (cond
      ((= 0 (length labels))
       (number->markletter-string number->mark-letter-vector fret-number))
      ((and (<= 0 fret-number) (< fret-number (length labels)))
       (list-ref labels fret-number))
      (else
       (ly:warning (_ "No label for fret ~a (on string ~a);
only ~a fret labels provided")
                   fret-number string-number (length labels))
       ".")))))
       
       
\layout {
  \context {
    \Score
    tablatureFormat = #my-fret-letter-tablature-format
  }
}


\new TabVoice
  \relative {
    e' f fis g gis a ais b c cis d dis e f fis g gis a ais b
  }

HTH,
  Harm

Friederich

  • Member
Re: Alphabet in historischen Tabulaturen - ohne "j"
« Antwort #2 am: Montag, 21. September 2015, 07:44 »
Vielen Dank, funktioniert  :D