view methods.lisp @ 19:2f331bbdfab8

Added preliminary support for time- and key-signatures and for tempi darcs-hash:20061213155334-f76cc-a1ece6adfd1e6292e1f67418ddb3f38a56ad2233.gz
author David Lewis <d.lewis@gold.ac.uk>
date Wed, 13 Dec 2006 15:53:34 +0000
parents 70e76c1c87b7
children 6eb54ad3b8b4
line wrap: on
line source
(cl:in-package #:amuse) 

(defmethod chromatic-pitch ((pitch-designator chromatic-pitch))
  pitch-designator)

(defmethod chromatic-pitch-number ((pitch-designator chromatic-pitch))
  (%chromatic-pitch-number pitch-designator))

(defmethod chromatic-pitch-number ((pitch-designator pitch))
  (%chromatic-pitch-number (chromatic-pitch pitch-designator)))

(defmethod span ((pitch-interval-designator pitch-interval))
  (%pitch-interval-span pitch-interval-designator))

(defmethod duration ((period-designator period))
  (%period-interval period-designator))

(defmethod timepoint ((moment-designator moment))
  (%moment-time moment-designator))

(defmethod beat-units-per-bar ((time-signature basic-time-signature))
  (%basic-time-signature-numerator time-signature))

(defmethod beat-units ((time-signature basic-time-signature))
  (%basic-time-signature-denominator time-signature))

(defmethod key-signature-sharps ((key-signature basic-key-signature))
  (%basic-key-signature-sharp-count key-signature))

(defmethod bpm ((tempo tempo))
  (%tempo-bpm tempo))

;; Time protocol

(defmethod time+ ((object1 moment) (object2 period))
  (make-moment (+ (timepoint object1) (duration object2))))

(defmethod time+ ((object1 period) (object2 moment)) ;?
  (time+ object2 object1))

(defmethod time+ ((object1 period) (object2 period))
  (make-floating-period (+ (duration object1)
			   (duration object2))))

(defmethod time+ ((object1 moment) (object2 moment))
  (error 'undefined-action :operation 'time+ :datatype (list (class-of object1) (class-of object2))))

(defmethod time- ((object1 moment) (object2 moment))
  (make-anchored-period (timepoint object2)
			(- (timepoint object1)
			   (timepoint object2))))

(defmethod time- ((object1 moment) (object2 period))
  (make-moment (- (timepoint object1) (duration object2))))

(defmethod time- ((object1 period) (object2 moment)) ;?
  (error 'undefined-action
	 :operation 'time-
	 :datatype (list (class-of object1) (class-of object2))))

(defmethod time- ((object1 period) (object2 period))
  (make-floating-period (- (duration object2)
			   (duration object1))))

;; these ones are less certain. I've just put them in, but think I
;; should remove them and force the user to specify what they mean
;; when they give objects that are both moments *and* periods to these
;; functions.

(defmethod time- ((object1 anchored-period) (object2 anchored-period)) ;? 
  (time- (moment object1) (moment object2)))

(defmethod time- (object1 (object2 anchored-period)) ;?
  (time- object1 (moment object2)))

(defmethod time- ((object1 anchored-period) object2) ;?
  (time- (moment object1) object2))

(defmethod time> ((object1 moment) (object2 moment))
  (> (timepoint object1) (timepoint object2)))

(defmethod time= ((object1 moment) (object2 moment))
  (= (timepoint object1) (timepoint object2)))

(defmethod duration> ((object1 period) (object2 period))
  (> (duration object1) (duration object2)))

(defmethod duration= ((object1 period) (object2 period))
  (= (duration object1) (duration object2)))

(defmethod duration* ((object1 period) (object2 number))
  (make-floating-period (* (duration object1) object2)))

(defmethod duration* ((object1 number) (object2 period))
  (duration* object2 object1))

(defmethod duration/ ((object1 period) (object2 number))
  (make-floating-period (/ (duration object1) object2)))

;; Pitch protocol

(defmethod pitch+ ((object1 pitch-designator)
		   (object2 pitch-designator))
  (error 'undefined-action :operation 'pitch+
	 :datatype (list (class-of object1) (class-of object2))))

(defmethod pitch+ ((object1 pitch-designator)
		   (object2 pitch-interval)) ; or should I check the
					     ; pitch/interval types?
  (make-chromatic-pitch (+ (chromatic-pitch object1)
			   (span object2))))

(defmethod pitch+  ((object1 pitch-interval)
		    (object2 pitch-designator)) ;?
  (pitch+ object2 object1))

(defmethod pitch+ ((object1 pitch-interval)
		   (object2 pitch-interval))
  (make-pitch-interval (+ (span object1)
			  (span object2))))

(defmethod pitch- ((object1 pitch-designator)
		   (object2 pitch-designator))
  (make-pitch-interval (- (chromatic-pitch object1)
			  (chromatic-pitch object2))))

(defmethod pitch- ((object1 pitch-designator)
		   (object2 pitch-interval))
  (make-chromatic-pitch (- (chromatic-pitch object1)
			   (span object2))))

(defmethod pitch- ((object1 pitch-interval)
		   (object2 pitch-interval))
  (make-pitch-interval (- (span object1)
			  (span object2))))

(defmethod pitch- ((object1 pitch-interval)
		   (object2 pitch-designator))
  (error 'undefined-action :operation 'pitch-
	 :datatype (list (class-of object1) (class-of object2))))

(defmethod pitch> ((object1 pitch-designator)
		   (object2 pitch-designator))
  (> (chromatic-pitch object1)
     (chromatic-pitch object2)))

(defmethod pitch= ((object1 pitch-designator)
		   (object2 pitch-designator))
  (= (chromatic-pitch object1)
     (chromatic-pitch object2)))

(defmethod interval> ((object1 pitch-interval)
		   (object2 pitch-interval))
  (> (span object1)
     (span object2)))

(defmethod interval= ((object1 pitch-interval)
		   (object2 pitch-interval))
  (= (span object1)
     (span object2)))



;; Allen

(defmethod meets ((object1 anchored-period)
		  (object2 anchored-period))
  (or (time= (cut-off object1) (onset object2))
      (time= (cut-off object2) (onset object1))))

(defmethod before ((object1 anchored-period)
		   (object2 anchored-period))
  (time< (cut-off object1) (onset object2)))

(defmethod overlaps ((object1 anchored-period)
		     (object2 anchored-period))
  (or (and (time> (cut-off object1) (onset object2))
	   (time< (onset object1) (onset object2)))
      (and (time> (cut-off object1) (cut-off object2))
	   (time< (onset object1) (cut-off object2)))))

(defmethod during ((object1 anchored-period)
		   (object2 anchored-period))
  (and (time> (onset object1) (onset object2))
       (time< (cut-off object2) (cut-off object2))))

(defmethod starts ((object1 anchored-period)
		   (object2 anchored-period))
  (time= (onset object1) (onset object2)))

(defmethod ends ((object1 anchored-period)
		 (object2 anchored-period))
  (time= (cut-off object1) (cut-off object2)))

;; ...and

(defmethod period-intersection ((object1 anchored-period)
				(object2 anchored-period))
  (cond
    ((disjoint object1 object2)
     ;; if they don't overlap, return nil, not a negative-valued
     ;; period
     nil)
    (t
     (let ((new-onset (max (onset object1)
			   (onset object2))))
       (make-anchored-period new-onset
			     (time- (min (cut-off object1)
					 (cut-off object2))
				    new-onset))))))