[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/measure.lisp gsharp/packages.lisp

Robert Strandh rstrandh at common-lisp.net
Mon Nov 28 04:25:36 UTC 2005


Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv20060

Modified Files:
	drawing.lisp measure.lisp packages.lisp 
Log Message:
More code towards a better spacing algorithm

Date: Mon Nov 28 05:25:35 2005
Author: rstrandh

Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.34 gsharp/drawing.lisp:1.35
--- gsharp/drawing.lisp:1.34	Mon Nov 21 23:40:48 2005
+++ gsharp/drawing.lisp	Mon Nov 28 05:25:34 2005
@@ -96,6 +96,41 @@
 	  collect (/ (nat-width method (measure-coeff measure) min-dist)
 		     compress))))
 
+(defun compute-elasticities (measures method)
+  (loop for measure in measures
+	do (loop with timelines = (timelines measure)
+		 for i from 0 below (flexichain:nb-elements timelines)
+		 for timeline = (flexichain:element* timelines i)
+		 do (setf (elasticity timeline)
+			  (expt (duration timeline) (spacing-style method))))))
+
+(defgeneric left-bulge (element pane))
+(defgeneric right-bulge (element pane))
+
+(defmethod left-bulge ((element element) pane)
+  0)  
+
+(defmethod right-bulge ((element element) pane)
+  0)  
+
+(defun compute-gaps (measures method pane)
+  (declare (ignore method))
+  (loop for measure in measures
+	do (loop for bar in (measure-bars measure)
+		 do (loop for (e1 e2) on (elements bar)
+			  for t1 = (timeline e1)
+			  do (cond ((null e2)
+				    (when (flexichain:flexi-last-p t1)
+				      (setf (smallest-gap t1)
+					    (max (smallest-gap t1)
+						 (right-bulge e1 pane)))))
+				   ((eq (flexichain:flexi-next t1)
+					(timeline e2))
+				    (setf (smallest-gap t1)
+					  (max (smallest-gap t1)
+					       (+ (right-bulge e1 pane)
+						  (left-bulge e2 pane))))))))))			  
+
 (defun draw-measure (pane measure min-dist compress x method draw-cursor)
   (let* ((width (/ (nat-width method (measure-coeff measure) min-dist)
 		   compress))
@@ -154,6 +189,8 @@
       (let ((yy y))
 	(gsharp-measure::new-map-over-obseq-subsequences
 	 (lambda (measures)
+	   (compute-elasticities measures method)
+	   (compute-gaps measures method pane)
 	   (let ((widths (compute-widths measures method)))
 	     (score-pane:with-vertical-score-position (pane yy)
 	       (draw-system pane measures (+ x (left-offset buffer) timesig-offset)


Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.15 gsharp/measure.lisp:1.16
--- gsharp/measure.lisp:1.15	Mon Nov 28 03:32:06 2005
+++ gsharp/measure.lisp	Mon Nov 28 05:25:34 2005
@@ -48,7 +48,7 @@
 
 (defrclass relement element
   ((duration :initform nil)
-   (timeline :accessor timeline)))
+   (timeline :accessor timeline)))   
 
 (defmethod duration :around ((element relement))
   (with-slots (duration) element
@@ -393,7 +393,10 @@
   ((start-time :initarg :start-time :reader start-time)
    (elements :initform '() :accessor elements)
    (duration :initarg :duration :reader duration)
-   (elasticity :accessor elasticity)))
+   (elasticity :accessor elasticity)
+   ;; the minimum x offset from this timeline to the next, or, if this
+   ;; is the last timeline, from this one to the end of the measure
+   (smallest-gap :initform 0 :accessor smallest-gap)))
 
 (defclass ranked-flexichain (flexichain:standard-flexichain flexichain:flexirank-mixin)
   ())
@@ -464,7 +467,7 @@
 (defmethod measures :before ((segment rsegment))
   (when (modified-p segment)
     (compute-measures segment (spacing-style (buffer-cost-method (buffer segment))))
-    (mapc #'compute-timelines (measures segment))
+    (mapc #'compute-timelines (slot-value segment 'measures))
     (setf (modified-p segment) nil)))
 
 (defmethod nb-measures ((segment rsegment))


Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.34 gsharp/packages.lisp:1.35
--- gsharp/packages.lisp:1.34	Mon Nov 21 23:40:48 2005
+++ gsharp/packages.lisp	Mon Nov 28 05:25:34 2005
@@ -133,7 +133,9 @@
 	   #:top-note #:bot-note #:top-note-pos #:bot-note-pos
 	   #:beam-groups #:final-stem-direction
 	   #:group-notes-by-staff #:final-relative-note-xoffset
-	   #:final-accidental #:final-relative-accidental-xoffset))
+	   #:final-accidental #:final-relative-accidental-xoffset
+	   #:timeline #:timelines #:elasticity
+	   #:smallest-gap))
 
 (defpackage :gsharp-postscript
   (:use :clim :clim-lisp)




More information about the Gsharp-cvs mailing list