]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/translation-functions.scm
Fix 763 Fretboards don't transpose properly
[lilypond.git] / scm / translation-functions.scm
index 0f4e4ce31a2ce2c2604037b8665fd7aeab2cbfb8..eefa9c0806a3b18088219b88cf413e7bccf45e5f 100644 (file)
@@ -2,44 +2,42 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;; metronome marks
 (define-public (format-metronome-markup text dur count context)
-  (let* ((hide_note (eq? #t (ly:context-property context 'tempoHideNote)))
-        (note-mark (if (and (not hide_note) (ly:duration? dur))
+  (let* ((hide-note (eq? #t (ly:context-property context 'tempoHideNote))))
+    (metronome-markup text dur count hide-note)))
+
+(define-public (metronome-markup text dur count hide-note)
+  (let* ((note-mark (if (and (not hide-note) (ly:duration? dur))
                       (make-smaller-markup
                       (make-note-by-number-markup (ly:duration-log dur)
                                                   (ly:duration-dot-count dur)
                                                   1))
                      #f))
-         (note-markup (if (and note-mark (number? count) (> count 0) )
+         (note-markup (if (and (not hide-note) (number? count) (> count 0) )
                         (make-concat-markup (list
                           (make-general-align-markup Y DOWN note-mark)
                           (make-simple-markup " ")
-                          (make-simple-markup  "=")
+                          (make-simple-markup "=")
                           (make-simple-markup " ")
                           (make-simple-markup (number->string count))))
-                        #f))
+                      #f))
          (text-markup (if (not (null? text))
                         (make-bold-markup text)
                         #f)))
     (if text-markup
-      (if note-markup
+      (if (and note-markup (not hide-note))
         (make-line-markup (list text-markup
           (make-concat-markup (list (make-simple-markup "(")
                                     note-markup
                                     (make-simple-markup ")")))))
-        (make-line-markup (list text-markup))
-      )
+        (make-line-markup (list text-markup)))
       (if note-markup
         (make-line-markup (list note-markup))
-        #f
-      )
-    )
-  )
-)
+        (make-null-markup)))))
 
 (define-public (format-mark-alphabet mark context)
   (make-bold-markup (make-markalphabet-markup (1- mark))))
                      ))
                  string-frets)
        (vector->list desc)))
+    
+  (define (get-predefined-fretboard predefined-fret-table tuning pitches)
+;   (_i "Search through @var{predefined-fret-table} looking for a predefined
+;fretboard with a key of @var{(tuning . pitches)}.  The search will check
+;both up and down an octave in order to accomodate transposition of the
+;chords.")
+   (define (get-fretboard key)
+    (let ((hash-handle
+           (hash-get-handle predefined-fret-table key)))
+     (if hash-handle
+         (cdr hash-handle)  ; return table entry
+         '())))
+
+   (let ((test-fretboard (get-fretboard (cons tuning pitches))))
+    (if (not (null? test-fretboard))
+        test-fretboard
+        (let ((test-fretboard 
+               (get-fretboard
+                (cons tuning (map (lambda (x) (shift-octave x 1)) pitches)))))
+         (if (not (null? test-fretboard))
+             test-fretboard
+             (get-fretboard 
+              (cons tuning (map (lambda (x) (shift-octave x -1)) pitches))))))))
 
 ;; body.
   (let*
               (acons 'string-count (length tunings) details)))
     (set! (ly:grob-property grob 'dot-placement-list)
         (if predefined-frets
-            (let ((hash-handle 
-                    (hash-get-handle
+            (let ((predefined-fretboard 
+                    (get-predefined-fretboard
                       predefined-frets
-                      (cons tunings pitches))))
-              (if hash-handle 
-                  (cdr hash-handle)  ;found default diagram
+                      tunings
+                      pitches)))
+              (if (null? predefined-fretboard)
                   (string-frets->dot-placement 
-                        string-frets my-string-count)))
+                        string-frets my-string-count)  ;no predefined diagram
+                  predefined-fretboard)) ;found default diagram
             (string-frets->dot-placement string-frets my-string-count)))))
 
 (define-public (determine-frets-mf notes string-numbers
   (define (note-pitch a)
     (ly:event-property a 'pitch))
 
-  (define (note-pitch<? a b)
-    (ly:pitch<? (note-pitch a)
-               (note-pitch b)))
+  (define (note-pitch>? a b)
+    (ly:pitch<? (note-pitch b)
+               (note-pitch a)))
 
   (define (note-finger ev)
     (let* ((articulations (ly:event-property ev 'articulations))
                           specified-frets))
                           
               )))
-   (sort notes note-pitch<?))
+   (sort notes note-pitch>?))
 
   string-fret-fingering-tuples)