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+)))