]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/translation-functions.scm
Merge branch 'translation' into stable/2.16
[lilypond.git] / scm / translation-functions.scm
index cc94b67acfbeb2aae9c3364d577e937b4d89d5c5..33acfbc7b42178a6f2c5ca585a989d73d6c27bdf 100644 (file)
@@ -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)