+ (let* ((fit-string
+ (find (lambda (string)
+ (string-qualifies string (note-pitch note)))
+ free-strings)))
+ (if fit-string
+ (set-fret note fit-string)
+ (ly:warning "No string for pitch ~a (given frets ~a)"
+ (note-pitch note)
+ specified-frets))))
+ (sort unassigned-notes note-pitch>?))
+
+ string-fret-fingering-tuples)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; tablature
+
+;; 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
+ context string-number fret-number)
+ (let ((labels (ly:context-property context 'fretLabels)))
+ (make-vcenter-markup
+ (cond
+ ((= 0 (length labels))
+ (string (integer->char (+ fret-number (char->integer #\a)))))
+ ((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))
+ ".")))))
+
+;; Display the fret number as a number
+(define-public (fret-number-tablature-format
+ context string-number fret-number)
+ (make-vcenter-markup
+ (format "~a" fret-number)))
+
+;; The 5-string banjo has got a extra string, the fifth (duh), which
+;; starts at the fifth fret on the neck. Frets on the fifth string
+;; are referred to relative to the other frets:
+;; the "first fret" on the fifth string is really the sixth fret
+;; on the banjo neck.
+;; We solve this by defining a new fret-number-tablature function:
+(define-public (fret-number-tablature-format-banjo
+ context string-number fret-number)
+ (make-vcenter-markup
+ (number->string (cond
+ ((and (> fret-number 0) (= string-number 5))
+ (+ fret-number 5))
+ (else fret-number)))))
+
+;; Tab note head staff position functions
+;;
+;; Define where in the staff to display a given string. Some forms of
+;; tablature put the tab note heads in the spaces, rather than on the
+;; lines
+
+(define-public (tablature-position-on-lines context string-number)
+ (let* ((string-tunings (ly:context-property context 'stringTunings))
+ (string-count (length string-tunings))
+ (string-one-topmost (ly:context-property context 'stringOneTopmost))
+ (staff-line (- (* 2 string-number) string-count 1)))
+ (if string-one-topmost
+ (- staff-line)
+ staff-line)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; bar numbers
+
+(define-public ((every-nth-bar-number-visible n) barnum)
+ (= 0 (modulo barnum n)))
+
+(define-public ((modulo-bar-number-visible n m) barnum)
+ (and (> barnum 1) (= m (modulo barnum n))))
+
+(define-public ((set-bar-number-visibility n) tr)
+ (let ((bn (ly:context-property tr 'currentBarNumber)))
+ (ly:context-set-property! tr 'barNumberVisibility
+ (modulo-bar-number-visible n (modulo bn n)))))
+
+(define-public (first-bar-number-invisible barnum) (> barnum 1))
+
+(define-public (all-bar-numbers-visible barnum) #t)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; percent repeat counters
+
+(define-public ((every-nth-repeat-count-visible n) count context)
+ (= 0 (modulo count n)))
+
+(define-public (all-repeat-counts-visible count context) #t)