X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Ftranslation-functions.scm;h=33acfbc7b42178a6f2c5ca585a989d73d6c27bdf;hb=d8d7985d6027b374744a7c88250b856c4ef7e619;hp=2d36c7b30392ddd3c74db0f9c095d1f6189f72a1;hpb=2b7031fef767c63fcb61cb0b3f1b864d7001ba86;p=lilypond.git diff --git a/scm/translation-functions.scm b/scm/translation-functions.scm index 2d36c7b303..33acfbc7b4 100644 --- a/scm/translation-functions.scm +++ b/scm/translation-functions.scm @@ -276,13 +276,17 @@ dot placement entries." along with @var{minimum-fret}, @var{maximum-stretch}, and @var{tuning}. Returns a list of @code{(string fret finger) lists." + + (define restrain-open-strings (ly:context-property context + 'restrainOpenStrings + #f)) (define specified-frets '()) (define free-strings (iota (length tuning) 1)) (define (calc-fret pitch string tuning) "Calculate the fret to play @var{pitch} on @var{string} with @var{tuning}." - (- (ly:pitch-semitones pitch) (ly:pitch-semitones (list-ref tuning (1- string))))) + (* 2 (- (ly:pitch-tones pitch) (ly:pitch-tones (list-ref tuning (1- string)))))) (define (note-pitch note) "Get the pitch (in semitones) from @var{note}." @@ -296,7 +300,7 @@ if no fingering is present." (map (lambda (art) (let* ((num (ly:event-property art 'digit))) - (if (and (eq? 'fingering-event (ly:event-property art 'class)) + (if (and (ly:in-event-class? art 'fingering-event) (number? num) (> num 0)) (set! finger-found num)))) @@ -326,7 +330,8 @@ if no string-number is present." #t (map (lambda (specced-fret) (or (eq? 0 specced-fret) - (eq? 0 fret) + (and (not restrain-open-strings) + (eq? 0 fret)) (>= maximum-stretch (abs (- fret specced-fret))))) specified-frets)))) @@ -334,7 +339,10 @@ if no string-number is present." "Can @var{pitch} be played on @var{string}, given already placed notes?" (let* ((fret (calc-fret pitch string tuning))) - (and (or (eq? fret 0) (>= fret minimum-fret)) + (and (or (and (not restrain-open-strings) + (eq? fret 0)) + (>= fret minimum-fret)) + (integer? fret) (close-enough fret)))) (define (open-string string pitch) @@ -349,7 +357,10 @@ the current tuning?" tuning))) (if (< this-fret 0) (ly:warning (_ "Negative fret for pitch ~a on string ~a") - (car pitch-entry) string)) + (car pitch-entry) string) + (if (not (integer? this-fret)) + (ly:warning (_ "Missing fret for pitch ~a on string ~a") + (car pitch-entry) string))) (delete-free-string string) (set! specified-frets (cons this-fret specified-frets)) (list-set! string-fret-fingers @@ -408,7 +419,7 @@ the current tuning?" (ly:context-property context 'handleNegativeFrets 'recalculate))) - (cond ((or (>= this-fret 0) + (cond ((or (and (>= this-fret 0) (integer? this-fret)) (eq? handle-negative 'include)) (set-fret! pitch-entry string finger)) ((eq? handle-negative 'recalculate) @@ -686,7 +697,7 @@ same manner are @code{listeners} with the subordinate symbols being event classes, and @code{acknowledgers} and @code{end-acknowledgers} with the subordinate symbols being interfaces." (let loop ((forms forms)) - (if (pair? forms) + (if (cheap-list? forms) `(list ,@(map (lambda (form) (if (pair? (car form))