From dlewis at common-lisp.net Mon Apr 20 15:04:47 2009 From: dlewis at common-lisp.net (dlewis) Date: Mon, 20 Apr 2009 11:04:47 -0400 Subject: [gsharp-cvs] CVS gsharp Message-ID: Update of /project/gsharp/cvsroot/gsharp In directory cl-net:/tmp/cvs-serv25231 Modified Files: buffer.lisp cursor.lisp drawing.lisp gui.lisp melody.lisp packages.lisp score-pane.lisp Log Message: Basic time signature support. Only some sigs supported and spacing is basic. Key and time signatures now share a staffwise-elements slot in the stave. --- /project/gsharp/cvsroot/gsharp/buffer.lisp 2008/02/09 16:58:35 1.59 +++ /project/gsharp/cvsroot/gsharp/buffer.lisp 2009/04/20 15:04:47 1.60 @@ -208,8 +208,8 @@ ;; there might be more than one key signature in the bar, ;; and they might have changed their relative order as a ;; result of the edit. - (setf (key-signatures staff) - (sort (key-signatures staff) + (setf (staffwise-elements staff) + (sort (staffwise-elements staff) (lambda (x y) (gsharp::starts-before-p x (bar y) y)))))))))) (defmethod add-element :after ((element element) (bar bar) position) --- /project/gsharp/cvsroot/gsharp/cursor.lisp 2008/11/19 16:05:13 1.8 +++ /project/gsharp/cvsroot/gsharp/cursor.lisp 2009/04/20 15:04:47 1.9 @@ -166,10 +166,10 @@ (when (> (pos cursor) position) (incf (pos cursor))))) -(defmethod add-element :after ((keysig key-signature) bar position) - (let ((staff (staff keysig))) - (setf (key-signatures staff) - (merge 'list (list keysig) (key-signatures staff) +(defmethod add-element :after ((element staffwise-element) bar position) + (let ((staff (staff element))) + (setf (staffwise-elements staff) + (merge 'list (list element) (staffwise-elements staff) (lambda (x y) (gsharp::starts-before-p x (bar y) y)))))) (defmethod remove-element :before ((element element) (bar cbar)) --- /project/gsharp/cvsroot/gsharp/drawing.lisp 2008/11/19 16:05:13 1.87 +++ /project/gsharp/cvsroot/gsharp/drawing.lisp 2009/04/20 15:04:47 1.88 @@ -162,6 +162,13 @@ (score-pane:staff-step 5) (score-pane:staff-step 2))) +(defmethod right-bulge ((timesig time-signature) pane) + ;; FIXME: this is probably wrong; it should either compute the bulge + ;; properly, or else approximate using (length - 0.5) * + ;; typical-width-of-component + (* (length (time-signature-components timesig)) + (score-pane:staff-step 5))) + (defmethod right-bulge ((keysig key-signature) pane) ;; FIXME: shares much code with DRAW-ELEMENT (KEY-SIGNATURE). (let ((old-keysig (keysig keysig))) @@ -697,7 +704,7 @@ (defun draw-beam-group (pane elements) (let ((e (car elements))) - (when (typep e 'key-signature) + (when (typep e 'staffwise-element) (assert (null (cdr elements))) (return-from draw-beam-group (draw-element pane e (final-absolute-element-xoffset e))))) @@ -1115,3 +1122,15 @@ for x from x by (score-pane:staff-step 2.5) while (eq (aref (alterations keysig) pitch) :sharp) do (score-pane:draw-accidental pane :sharp x (+ line yoffset))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Time signature element + +(defmethod draw-element (pane (timesig time-signature) &optional (flags t)) + (declare (ignore flags)) + (let ((staff (staff timesig)) + (x (final-absolute-element-xoffset timesig))) + (score-pane:with-vertical-score-position (pane (staff-yoffset staff)) + (dolist (component (time-signature-components timesig)) + (score-pane:draw-time-signature-component pane component x))))) \ No newline at end of file --- /project/gsharp/cvsroot/gsharp/gui.lisp 2008/11/19 16:05:13 1.96 +++ /project/gsharp/cvsroot/gsharp/gui.lisp 2009/04/20 15:04:47 1.97 @@ -955,10 +955,28 @@ (define-gsharp-command com-insert-keysig () (insert-keysig)) -(defmethod remove-element :before ((keysig key-signature) (bar bar)) - (let ((staff (staff keysig))) - (setf (key-signatures staff) - (remove keysig (key-signatures staff))) +(defun insert-timesig (numerator denominator) + (let* ((cursor (current-cursor)) + (staff (car (staves (layer cursor)))) + (timesig (make-instance 'time-signature + :staff staff + :components + (list (if denominator + (cons numerator denominator) + numerator))))) + (insert-element timesig cursor) + (forward-element cursor) + timesig)) + +(define-gsharp-command (com-insert-timesig :name t) + ((numerator '(integer 1 8) :prompt "Numerator") + (denominator '(integer 1 8) :prompt "Denominator")) + (insert-timesig numerator denominator)) + +(defmethod remove-element :before ((element staffwise-element) (bar bar)) + (let ((staff (staff element))) + (setf (staffwise-elements staff) + (remove element (staffwise-elements staff))) (gsharp-measure::invalidate-everything-using-staff (current-buffer) staff))) ;;; FIXME: this isn't quite right (argh) for the case of two --- /project/gsharp/cvsroot/gsharp/melody.lisp 2007/10/22 11:45:37 1.1 +++ /project/gsharp/cvsroot/gsharp/melody.lisp 2009/04/20 15:04:47 1.2 @@ -78,8 +78,17 @@ ((clef :accessor clef :initarg :clef :initform (make-clef :treble)) (%keysig :accessor keysig :initarg :keysig :initform (make-array 7 :initial-element :natural)) - (key-signatures :accessor key-signatures :initform nil))) - + (staffwise-elements :accessor staffwise-elements :initform nil))) + +(defgeneric key-signatures (staff) + (:method ((s fiveline-staff)) + (remove-if #'(lambda (x) (not (typep x 'key-signature))) + (staffwise-elements s)))) +(defgeneric time-signatures (staff) + (:method ((s fiveline-staff)) + (remove-if #'(lambda (x) (not (typep x 'time-signature))) + (staffwise-elements s)))) + (defmethod initialize-instance :after ((obj fiveline-staff) &rest args) (declare (ignore args)) (with-slots (%keysig) obj @@ -309,9 +318,13 @@ (:documentation "make the key signature N alterations flatter by removing some sharps and/or adding some flats")) -(defclass key-signature (element) - ((%staff :initarg :staff :reader staff) - (%alterations :initform (make-array 7 :initial-element :natural) +(defclass staffwise-element (element) + ((%staff :initarg :staff :reader staff))) +(defmethod slots-to-be-saved append ((s-e staffwise-element)) + '(%staff)) + +(defclass key-signature (staffwise-element) + ((%alterations :initform (make-array 7 :initial-element :natural) :initarg :alterations :reader alterations))) (defun make-key-signature (staff &rest args &key alterations) @@ -320,7 +333,7 @@ (apply #'make-instance 'key-signature :staff staff args)) (defmethod slots-to-be-saved append ((k key-signature)) - '(%staff %alterations)) + '(%alterations)) (defmethod more-sharps ((sig key-signature) &optional (n 1)) (let ((alt (alterations sig))) @@ -357,6 +370,20 @@ ((eq (aref alt 4) :natural) (setf (aref alt 4) :flat)) ((eq (aref alt 0) :natural) (setf (aref alt 0) :flat)) ((eq (aref alt 3) :natural) (setf (aref alt 3) :flat)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Time signature +;; * no make function (no type checking) +;; * slots-to-be-saved only 'cos it's there +;; * What accessors do we need (if any)? +;; * Should I copy the (keysig) functionality from gui.lisp? + +(defclass time-signature (staffwise-element) + ((%components :initarg :components :reader time-signature-components + :initform nil))) +(defmethod slots-to-be-saved append ((t-s time-signature)) + '(%components)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; --- /project/gsharp/cvsroot/gsharp/packages.lisp 2008/11/19 16:05:13 1.67 +++ /project/gsharp/cvsroot/gsharp/packages.lisp 2009/04/20 15:04:47 1.68 @@ -41,6 +41,7 @@ #:draw-stem #:draw-right-stem #:draw-left-stem #:draw-ledger-line #:draw-bar-line #:draw-beam #:staff-step #:draw-notehead #:draw-accidental #:draw-clef #:draw-rest #:draw-dot + #:draw-time-signature-component #:draw-flags-up #:draw-flags-down #:draw-tie-up #:draw-tie-down #:with-score-pane #:with-vertical-score-position @@ -55,7 +56,8 @@ (:shadow #:rest) (:export #:clef #:name #:lineno #:make-clef #:staff #:fiveline-staff #:make-fiveline-staff - #:key-signatures + #:key-signatures #:time-signatures + #:staffwise-elements #:lyrics-staff #:make-lyrics-staff #:gsharp-condition #:pitch #:accidentals #:dots #:note #:make-note @@ -91,7 +93,9 @@ #:clef #:f-position #:b-position #:bottom-line #:keysig #:staff-pos #:xoffset #:read-everything #:read-buffer-from-stream + #:staffwise-element #:key-signature #:make-key-signature + #:time-signature #:time-signature-components #:alterations #:more-sharps #:more-flats #:line-width #:lines-per-page #:min-width #:spacing-style #:right-edge #:left-offset --- /project/gsharp/cvsroot/gsharp/score-pane.lisp 2007/09/18 21:19:03 1.39 +++ /project/gsharp/cvsroot/gsharp/score-pane.lisp 2009/04/20 15:04:47 1.40 @@ -170,6 +170,35 @@ (with-output-as-presentation (stream object 'clef) (draw-clef stream name x staff-step))) +;;;;;;;;;;;;;;;;;; time signature + +(defun draw-time-signature-component (stream component x) + (flet ((component-name (c) + (ecase c + (1 :time-signature-1) + (2 :time-signature-2) + (3 :time-signature-3) + (4 :time-signature-4) + (5 :time-signature-5) + (6 :time-signature-6) + (7 :time-signature-7) + (8 :time-signature-8)))) + (etypecase component + ((integer 1 8) + (let* ((design (sdl::ensure-design *font* (component-name component)))) + (sdl::draw-shape stream *font* design x (staff-step -2)) + (bounding-rectangle-width design))) + ((cons (integer 1 8) (integer 1 8)) + (destructuring-bind (num . den) component + (let* ((num-name (component-name num)) + (den-name (component-name den)) + (ndesign (sdl::ensure-design *font* num-name)) + (ddesign (sdl::ensure-design *font* den-name))) + (sdl::draw-shape stream *font* num-name x (staff-step -4)) + (sdl::draw-shape stream *font* den-name x (staff-step 0)) + (max (bounding-rectangle-width ndesign) + (bounding-rectangle-width ddesign)))))))) + ;;;;;;;;;;;;;;;;;; rest (defun draw-rest (stream duration x staff-step)