Update of /project/gsharp/cvsroot/gsharp In directory clnet:/tmp/cvs-serv31804
Modified Files: buffer.lisp drawing.lisp gui.lisp measure.lisp packages.lisp score-pane.lisp Log Message: Implement octaviated treble clefs. This isn't terribly general, I concede; the clef protocol might need to be rethought. However, it does capture functionality which was previously expressed in multiple places in the functions B-POSITION, F-POSITION and BOTTOM-LINE.
--- /project/gsharp/cvsroot/gsharp/buffer.lisp 2006/02/28 23:42:12 1.35 +++ /project/gsharp/cvsroot/gsharp/buffer.lisp 2006/03/02 09:21:34 1.36 @@ -43,21 +43,29 @@ ;;; The bottom line of the staff is number 1. (defgeneric lineno (clef))
+;;; for key signature drawing calcluations. FIXME: in fact the layout +;;; of key signatures isn't the same across all clefs. +(defgeneric b-position (clef)) +(defgeneric f-position (clef)) + +;;; the note number of the bottom line of this clef. +(defgeneric bottom-line (clef)) + (defclass clef (gsharp-object name-mixin) ((print-character :allocation :class :initform #\K) (lineno :reader lineno :initarg :lineno :type (or (integer 2 6) null))))
(defun make-clef (name &key lineno) - (declare (type (member :treble :bass :c :percussion) name) + (declare (type (member :treble :treble8 :bass :c :percussion) name) (type (or (integer 2 6) null) lineno)) (when (null lineno) (setf lineno (ecase name - (:treble 2) - (:bass 6) - (:c 4) - (:percussion 3)))) + ((:treble :treble8) 2) + (:bass 6) + (:c 4) + (:percussion 3)))) (make-instance 'clef :name name :lineno lineno))
(defmethod print-gsharp-object :after ((c clef) stream) @@ -71,6 +79,26 @@ #'read-clef-v3 *gsharp-readtable-v3*)
+(defmethod b-position ((clef clef)) + (ecase (name clef) + (:bass (- (lineno clef) 4)) + ((:treble :treble8) (+ (lineno clef) 2)) + (:c (- (lineno clef) 1)))) + +(defmethod f-position ((clef clef)) + (ecase (name clef) + (:bass (lineno clef)) + ((:treble :treble8) (+ (lineno clef) 6)) + (:c (+ (lineno clef) 3)))) + +(defmethod bottom-line ((clef clef)) + (- (ecase (name clef) + (:treble 32) + (:bass 24) + (:c 28) + (:treble8 25)) + (lineno clef))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Staff --- /project/gsharp/cvsroot/gsharp/drawing.lisp 2006/03/02 03:27:33 1.64 +++ /project/gsharp/cvsroot/gsharp/drawing.lisp 2006/03/02 09:21:34 1.65 @@ -40,19 +40,13 @@ :x ,(+ x1 10) :staff-step ,(lineno (clef staff))) :stream pane) - (let ((yoffset (ecase (name (clef staff)) - (:bass (- (lineno (clef staff)) 4)) - (:treble (+ (lineno (clef staff)) 2)) - (:c (- (lineno (clef staff)) 1))))) + (let ((yoffset (b-position clef))) (loop for pitch in '(6 2 5 1 4 0 3) for line in '(0 3 -1 2 -2 1 -3) for x from (+ x1 10 (score-pane:staff-step 8)) by (score-pane:staff-step 2) while (eq (aref (alterations (keysig staff)) pitch) :flat) do (score-pane:draw-accidental pane :flat x (+ line yoffset)))) - (let ((yoffset (ecase (name (clef staff)) - (:bass (lineno (clef staff))) - (:treble (+ (lineno (clef staff)) 6)) - (:c (+ (lineno (clef staff)) 3))))) + (let ((yoffset (f-position clef))) (loop for pitch in '(3 0 4 1 5 2 6) for line in '(0 -3 1 -2 -5 -1 -4) for x from (+ x1 10 (score-pane:staff-step 8)) by (score-pane:staff-step 2.5) @@ -639,8 +633,7 @@ (yoffset (- (gsharp-drawing::staff-yoffset staff)))) (if (typep staff 'fiveline-staff) (let* ((clef (clef staff)) - (bottom-line (- (ecase (name clef) (:treble 32) (:bass 24) (:c 28)) - (lineno clef))) + (bottom-line (bottom-line clef)) (lnote-offset (score-pane:staff-step (- last-note bottom-line)))) (draw-line* pane x (+ sy (- (+ (score-pane:staff-step 12) yoffset))) --- /project/gsharp/cvsroot/gsharp/gui.lisp 2006/03/01 00:15:42 1.57 +++ /project/gsharp/cvsroot/gsharp/gui.lisp 2006/03/02 09:21:34 1.58 @@ -175,9 +175,8 @@
(defmethod note-position ((note note)) (let ((clef (clef (staff note)))) - (+ (- (pitch note) - (ecase (name clef) (:treble 32) (:bass 24) (:c 28))) - (lineno clef)))) + (- (pitch note) + (bottom-line clef))))
(defmethod display-element ((frame gsharp) pane) (when (handler-case (cur-cluster) @@ -1015,7 +1014,7 @@ (lambda (so-far mode) (complete-from-possibilities so-far - '(:treble :bass :c :percussion) + '(:treble :treble8 :bass :c :percussion) '() :action mode :predicate (constantly t) --- /project/gsharp/cvsroot/gsharp/measure.lisp 2006/02/15 02:44:48 1.27 +++ /project/gsharp/cvsroot/gsharp/measure.lisp 2006/03/02 09:21:34 1.28 @@ -119,9 +119,8 @@
(defmethod note-position ((note note)) (let ((clef (clef (staff note)))) - (+ (- (pitch note) - (ecase (name clef) (:treble 32) (:bass 24) (:c 28))) - (lineno clef)))) + (- (pitch note) + (bottom-line clef))))
;;; given a list of notes, return the one that is at the top (defun top-note (notes) --- /project/gsharp/cvsroot/gsharp/packages.lisp 2006/03/01 00:15:42 1.47 +++ /project/gsharp/cvsroot/gsharp/packages.lisp 2006/03/02 09:21:34 1.48 @@ -196,7 +196,8 @@ #:add-staff-to-layer #:remove-staff-from-layer #:stem-direction #:undotted-duration #:duration - #:clef #:keysig #:staff-pos #:xoffset #:read-everything + #:clef #:f-position #:b-position #:bottom-line + #:keysig #:staff-pos #:xoffset #:read-everything #:read-buffer-from-stream #:key-signature #:alterations #:more-sharps #:more-flats #:line-width #:min-width #:spacing-style #:right-edge #:left-offset --- /project/gsharp/cvsroot/gsharp/score-pane.lisp 2006/02/26 22:18:39 1.21 +++ /project/gsharp/cvsroot/gsharp/score-pane.lisp 2006/03/02 09:21:34 1.22 @@ -249,7 +249,10 @@
(define-pixmap-recording (draw-clef (name)) (ecase name - (:treble +glyph-g-clef+) + ;; FIXME: while using the same glyph for :TREBLE and :TREBLE8 is + ;; fine from a musical point of view, some differentiation (by + ;; putting an italic 8 underneath, for instance) would be good. + ((:treble :treble8) +glyph-g-clef+) (:bass +glyph-f-clef+) (:c +glyph-c-clef+)))