(define (get-numeric-from-key keystring)
"Get the numeric value from a key of the form k:val"
- (string->number (substring keystring 2 (string-length keystring))))
+ (let* ((entry (substring keystring 2 (string-length keystring)))
+ (numeric-entry (string->number entry)))
+ ;; throw an error, if `entry' can't be transformed into a number
+ (if numeric-entry
+ numeric-entry
+ (ly:error
+ "Unhandled entry in fret-diagram \"~a\" in \"~a\""
+ entry
+ keystring))))
(define (numerify mylist)
"Convert string values to numeric or character"
((or (eq? my-code 'open)(eq? my-code 'mute))
(set! xo-list (cons* my-item xo-list)))
((eq? my-code 'barre)
- (set! barre-list (cons* (cdr my-item) barre-list)))
+ (if (every number? (cdr my-item))
+ (set! barre-list (cons* (cdr my-item) barre-list))
+ (ly:error
+ "barre-indications should contain only numbers: ~a"
+ (cdr my-item))))
((eq? my-code 'capo)
(set! capo-fret (cadr my-item)))
((eq? my-code 'place-fret)
(cons minfret
(let ((upfret (- (+ minfret my-fret-count) 1)))
(if (> maxfret upfret) maxfret upfret)))))
- (set! capo-fret (1+ (- capo-fret minfret)))
+ (if (not (zero? (apply min capo-fret (map cadr dot-list))))
+ (set! capo-fret (1+ (- capo-fret minfret))))
;; subtract fret from dots
(set! dot-list (subtract-base-fret (- (car fret-range) 1) dot-list)))
(acons 'fret-range fret-range
bottom-control-point-height cp-right-width)))
;; order of bezier control points is:
- ;; left cp low, right cp low, right end low, left end low
- ;; right cp high, left cp high, left end high, right end high.
+ ;; left cp low, left cp low, right cp low, right end low
+ ;; right cp high, left cp high
- (list left-lower-control-point
+ (list
+ left-end-point
+ left-lower-control-point
right-lower-control-point
right-end-point
- left-end-point
+
right-upper-control-point
- left-upper-control-point
- left-end-point
- right-end-point)))
+ left-upper-control-point)))
(define (draw-strings)
"Draw the string lines for a fret diagram with
(* size end-string-coordinate)
(* size fret-coordinate)
(* size bezier-height)
- (* size bezier-thick)))
- (box-lower-left
- (stencil-coordinates
- (+ (* size fret-coordinate) half-thickness)
- (- (* size start-string-coordinate) half-thickness)))
- (box-upper-right
- (stencil-coordinates
- (- (* size fret-coordinate)
- (* size bezier-height)
- half-thickness)
- (+ (* size end-string-coordinate) half-thickness)))
- (x-extent (cons (car box-lower-left) (car box-upper-right)))
- (y-extent (cons (cdr box-lower-left) (cdr box-upper-right))))
+ (* size bezier-thick))))
(make-bezier-sandwich-stencil
bezier-list
- (* size bezier-thick)
- x-extent
- y-extent)))
+ (* size bezier-thick))))
(define (draw-dots dot-list)
"Make dots for fret diagram."
(output-list '())
(new-props '())
(details (merge-details 'fret-diagram-details props '()))
- (items (string-split definition-string #\;)))
+ ;; remove whitespace-characters from definition-string
+ (cleared-string (remove-whitespace definition-string))
+ (items (string-split cleared-string #\;)))
(let parse-item ((myitems items))
(if (not (null? (cdr myitems)))
(let ((test-string (car myitems)))
(set! details
(acons 'dot-position dot-position details))))
(else
- (let ((this-list (string-split test-string #\-)))
+ (let* ((this-list (string-split test-string #\-))
+ (fret-number (string->number (car this-list))))
+ ;; If none of the above applies, `fret-number' needs to be a
+ ;; number. Throw an error, if not.
+ (if (not fret-number)
+ (ly:error
+ "Unhandled entry in fret-diagrams \"~a\" in \"~a\""
+ (car this-list)
+ test-string))
(if (string->number (cadr this-list))
(set! output-list
(cons-fret
(if (equal? (cadr this-list) "x" )
(set! output-list
(cons-fret
- (list 'mute (string->number (car this-list)))
+ (list 'mute fret-number)
output-list))
(set! output-list
(cons-fret
- (list 'open (string->number (car this-list)))
+ (list 'open fret-number)
output-list)))))))
(parse-item (cdr myitems)))))
;; add the modified details