]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/parser-clef.scm
Imported Upstream version 2.14.2
[lilypond.git] / scm / parser-clef.scm
index b3de9fc405876ce6fe7212b2e3d158210cded146..a731e7459e7e6a38e6f796998d3f3b12b3852122 100644 (file)
@@ -1,8 +1,19 @@
-;;;; clef.scm -- Clef settings
+;;;; This file is part of LilyPond, the GNU music typesetter.
 ;;;;
-;;;; source file of the GNU LilyPond music typesetter
+;;;; Copyright (C) 2004--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;
-;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; LilyPond is free software: you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation, either version 3 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; LilyPond is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 
 ;; (name . (glyph clef-position octavation))
@@ -63,6 +74,7 @@
     ("petrucci-c5" . ("clefs.petrucci.c5" 4 0))
     ("petrucci-f3" . ("clefs.petrucci.f" 0 0))
     ("petrucci-f4" . ("clefs.petrucci.f" 2 0))
+    ("petrucci-f5" . ("clefs.petrucci.f" 4 0))
     ("petrucci-f" . ("clefs.petrucci.f" 2 0))
     ("petrucci-g" . ("clefs.petrucci.g" -2 0))))
 
     ("clefs.petrucci.g" . -4)))
 
 (define-public (make-clef-set clef-name)
-  "Generate the clef setting commands for a clef with name CLEF-NAME."
+  "Generate the clef setting commands for a clef with name @var{clef-name}."
   (define (make-prop-set props)
     (let ((m (make-music 'PropertySet)))
       (map (lambda (x) (set! (ly:music-property m (car x)) (cdr x))) props)
   (let ((e '())
        (c0 0)
        (oct 0)
-       (match (string-match "^(.*)([_^])([0-9]+)$" clef-name)))
+       (match (string-match "^(.*)([_^])([1-9][0-9]*)$" clef-name)))
     (if match
        (begin
          (set! clef-name (match:substring match 1))
          (set! oct
                (* (if (equal? (match:substring match 2) "^") -1 1)
                   (- (string->number (match:substring match 3)) 1)))))
-    (set! e (assoc clef-name supported-clefs))
-    (if (pair? e)
+    (set! e (assoc-get clef-name supported-clefs))
+    (if e
        (let* ((musics (map make-prop-set
-                           `(((symbol . clefGlyph) (value . ,(cadr e)))
+                           `(((symbol . clefGlyph) (value . ,(car e)))
                              ((symbol . middleCClefPosition)
                               (value . ,(+ oct
-                                           (caddr e)
-                                           (cdr (assoc (cadr e) c0-pitch-alist)))))
-                             ((symbol . clefPosition) (value . ,(caddr e)))
+                                           (cadr e)
+                                           (assoc-get (car e) c0-pitch-alist))))
+                             ((symbol . clefPosition) (value . ,(cadr e)))
                              ((symbol . clefOctavation) (value . ,(- oct))))))
               (recalc-mid-C (make-music 'ApplyContext))
               (seq (make-music 'SequentialMusic
                       (sort (map car supported-clefs) string<?)))
          (make-music 'Music)))))
 
+(define-public (make-cue-clef-set clef-name)
+  "Generate the clef setting commands for a cue clef with name
+@var{clef-name}."
+  (define (make-prop-set props)
+    (let ((m (make-music 'PropertySet)))
+      (map (lambda (x) (set! (ly:music-property m (car x)) (cdr x))) props)
+      m))
+  (let ((e '())
+       (c0 0)
+       (oct 0)
+       (match (string-match "^(.*)([_^])([1-9][0-9]*)$" clef-name)))
+    (if match
+       (begin
+         (set! clef-name (match:substring match 1))
+         (set! oct
+               (* (if (equal? (match:substring match 2) "^") -1 1)
+                  (- (string->number (match:substring match 3)) 1)))))
+    (set! e (assoc-get clef-name supported-clefs))
+    (if e
+       (let* ((musics (map make-prop-set
+                           `(((symbol . cueClefGlyph) (value . ,(car e)))
+                             ((symbol . middleCCuePosition)
+                              (value . ,(+ oct
+                                           (cadr e)
+                                           (assoc-get (car e) c0-pitch-alist))))
+                             ((symbol . cueClefPosition) (value . ,(cadr e)))
+                             ((symbol . cueClefOctavation) (value . ,(- oct))))))
+              (recalc-mid-C (make-music 'ApplyContext))
+              (seq (make-music 'SequentialMusic
+                               'elements (append musics (list recalc-mid-C))))
+              (csp (make-music 'ContextSpeccedMusic)))
+         (set! (ly:music-property recalc-mid-C 'procedure) ly:set-middle-C!)
+         (context-spec-music seq 'Staff))
+       (begin
+         (ly:warning (_ "unknown clef type `~a'") clef-name)
+         (ly:warning (_ "supported clefs: ~a")
+                     (string-join
+                      (sort (map car supported-clefs) string<?)))
+         (make-music 'Music)))))
+
+
+(define-public (make-cue-clef-unset)
+  "Reset the clef settings for a cue clef."
+  (define (make-prop-unset props)
+    (let ((m (make-music 'PropertyUnset)))
+      (set! (ly:music-property m (car props)) (cdr props))
+      m))
+  (let* ((musics (map make-prop-unset
+                       `((symbol . cueClefGlyph)
+                         (symbol . middleCCuePosition)
+                         (symbol . cueClefPosition)
+                         (symbol . cueClefOctavation))))
+        (recalc-mid-C (make-music 'ApplyContext))
+        (seq (make-music 'SequentialMusic
+                         'elements (append musics (list recalc-mid-C))))
+        (csp (make-music 'ContextSpeccedMusic)))
+    (set! (ly:music-property recalc-mid-C 'procedure) ly:set-middle-C!)
+    (context-spec-music seq 'Staff)))
+
+
+;; a function to add new clefs at runtime
+(define-public (add-new-clef clef-name clef-glyph clef-position octavation c0-position)
+  "Append the entries for a clef symbol to supported clefs and
+@code{c0-pitch-alist}."
+  (set! supported-clefs
+        (acons clef-name (list clef-glyph clef-position octavation) supported-clefs))
+  (set! c0-pitch-alist
+        (acons clef-glyph c0-position c0-pitch-alist)))