-;; The TabNoteHead tablatureFormat callback.
-;; Compute the text grob-property
-(define-public (fret-number-tablature-format string context event)
+;; The TabNoteHead tablatureFormat callbacks.
+
+;; Calculate the fret from pitch and string number as letter
+;; The fret letter is taken from 'fretLabels if present
+(define-public (fret-letter-tablature-format string-number context event)
+ (let* ((tuning (ly:context-property context 'stringTunings))
+ (pitch (ly:event-property event 'pitch))
+ (labels (ly:context-property context 'fretLabels))
+ (fret (- (ly:pitch-semitones pitch)
+ (list-ref tuning (- string-number 1)))))
+ (make-vcenter-markup
+ (cond
+ ((= 0 (length labels))
+ (string (integer->char (+ fret (char->integer #\a)))))
+ ((and (<= 0 fret) (< fret (length labels)))
+ (list-ref labels fret))
+ (else
+ (ly:warning "No label for fret ~a (~a on string ~a);
+only ~a fret labels provided"
+ fret pitch string-number (length labels))
+ ".")))))
+
+;; Calculate the fret from pitch and string number as number
+(define-public (fret-number-tablature-format string-number context event)