[gsharp-cvs] CVS gsharp

crhodes crhodes at common-lisp.net
Fri Jul 27 22:31:04 UTC 2007


Update of /project/gsharp/cvsroot/gsharp
In directory clnet:/tmp/cvs-serv8910

Modified Files:
	drawing.lisp 
Log Message:
Better tie drawing:

Tie direction is taken from the final stem direction of the first note.  
This is not actually right, but it's incrementally better than ignoring 
the stem directions completely.

Draw a stub tie forward if no matching note is found.  (This needs to 
happen for unpaired backwards ties too, but the way DRAW-TIES is 
currently structured makes that mildly tricky.)


--- /project/gsharp/cvsroot/gsharp/drawing.lisp	2007/07/27 16:47:50	1.80
+++ /project/gsharp/cvsroot/gsharp/drawing.lisp	2007/07/27 22:31:04	1.81
@@ -361,6 +361,30 @@
 	do (compute-measure-coordinates measure x y force)
 	do (incf x (size-at-force (elasticity-function measure) force))))
 
+(defun draw-tie (pane bars n1 n2)
+  ;; FIXME: we'll want to draw ties between (nothing) and n2 eventually
+  (declare (type note n1) (type (or note null) n2))
+  (let ((x1 (+ (final-absolute-note-xoffset n1) (score-pane:staff-step 1.5)))
+	(x2 (if (typep n2 'note)
+		(- (final-absolute-note-xoffset n2) (score-pane:staff-step 1.5))
+		(+ (final-absolute-note-xoffset n1) (score-pane:staff-step 4.5))))
+	(pos (note-position n1)))
+    (if (eq (final-stem-direction (cluster n1)) :up)
+	(score-pane:with-vertical-score-position (pane (staff-yoffset (staff n1)))
+	  (if (gsharp-cursor::cursors (slice (car bars)))
+	      (score-pane:draw-tie-down pane x1 x2 (if (oddp pos) (1- pos) pos))
+	      (score-pane:with-light-glyphs pane
+		(score-pane:draw-tie-down pane x1 x2 (if (oddp pos) (1- pos) pos)))))
+	(score-pane:with-vertical-score-position (pane (staff-yoffset (staff n1)))
+	  (if (gsharp-cursor::cursors (slice (car bars)))
+	      (score-pane:draw-tie-up pane x1 x2 (if (oddp pos) (1+ pos) pos))
+	      (score-pane:with-light-glyphs pane
+		(score-pane:draw-tie-up pane x1 x2 (if (oddp pos) (1+ pos) pos))))))))
+
+(defun notes-tieable (n1 n2)
+  (and (= (pitch n1) (pitch n2))
+       (eq (staff n1) (staff n2))
+       (eq (accidentals n1) (accidentals n2))))
 
 ;;; draw the ties in BARS starting at BAR and at most LENGTH bars
 (defun draw-ties (pane bars bar length)
@@ -373,22 +397,15 @@
 					repeat length
 					collect bar))
 	  for (e1 e2) on elements
-	  do (when (and (typep e1 'cluster) (typep e2 'cluster) (not (null e2)))
+	  do (when (typep e1 'cluster)
 	       (loop for n1 in (notes e1)
 		     do (when (tie-right n1)
-			  (loop for n2 in (notes e2)
+			  (loop for n2 in (and (typep e2 'cluster) (notes e2))
 				do (when (and (tie-left n2)
-					      (= (pitch n1) (pitch n2))
-					      (eq (staff n1) (staff n2))
-					      (accidentals n1) (accidentals n2))
-				     (let ((x1 (+ (final-absolute-note-xoffset n1) (score-pane:staff-step 1.5)))
-					   (x2 (- (final-absolute-note-xoffset n2) (score-pane:staff-step 1.5)))
-					   (pos (note-position n1)))
-				       (score-pane:with-vertical-score-position (pane (staff-yoffset (staff n1)))
-					 (if (gsharp-cursor::cursors (slice (car bars)))
-					     (score-pane:draw-tie-up pane x1 x2 (if (oddp pos) (1+ pos) pos))
-					     (score-pane:with-light-glyphs pane
-					       (score-pane:draw-tie-up pane x1 x2 (if (oddp pos) (1+ pos) pos))))))))))))))
+					      (notes-tieable n1 n2))
+				     (draw-tie pane bars n1 n2)
+				     (return))
+				finally (draw-tie pane bars n1 nil))))))))
 
 (defun draw-system (pane measures)
   (with-new-output-record (pane)




More information about the Gsharp-cvs mailing list