view tools/segmentation/methods.lisp @ 330:2fbff655ba47 tip

Removed cpitch-adj and cents SQL columns
author Jeremy Gow <jeremy.gow@gmail.com>
date Mon, 21 Jan 2013 11:08:11 +0000
parents 676283afe8fb
children
line wrap: on
line source
(in-package "AMUSE-SEGMENTATION")

(defmethod boundary-time (segmenter (object anchored-period))
  (if (segments-beforep segmenter)
      (onset object)
      (cut-off object)))
(defmethod boundary-time (segmenter (object moment))
  object)

;;;;;;;;;;;;;;;;;;;;;;;
;;; Seriously made-up stuff (= dodgy)

(defun map-segmenters (composition &key (start-boundary-segmenter nil) (end-boundary-segmenter nil))
  (cond
    ((and start-boundary-segmenter end-boundary-segmenter)
     #+nil (%map-non-contiguous-segmenters composition start-boundary-segmenter end-boundary-segmenter)
     ;; hacky fix for broken code
     (remove-duplicates (nconc (%map-start-segmenter composition start-boundary-segmenter)
			       (%map-end-segmenter composition end-boundary-segmenter))
			:test #'period=))
    (start-boundary-segmenter
     (%map-start-segmenter composition start-boundary-segmenter))
    (end-boundary-segmenter
     (%map-end-segmenter composition end-boundary-segmenter))
    (t (error "Map-segmenters called with no segmenters"))))

(defun %map-start-segmenter (composition segmenter)
  (let ((segments))
    (sequence:dosequence (event composition (progn
					      (setf (duration (car segments))
						    (duration (time- (cut-off composition)
								     (onset (car segments)))))
					      (reverse segments)))
      (when (> (boundary-strength segmenter event composition) 0)
	(when segments
	  (setf (duration (car segments))
		(duration (time- (boundary-time segmenter event)
				 (onset (car segments))))))
	(push (make-instance 'standard-anchored-period
			     :time (timepoint (boundary-time segmenter event)))
	      segments)))))

(defun %map-end-segmenter (composition segmenter)
  (let ((segments (list (make-instance 'standard-anchored-period :time (timepoint composition)))))
    (sequence:dosequence (event composition (reverse (cdr segments)))
      (when (> (boundary-strength segmenter event composition) 0)
	(setf (duration (car segments))
	      (duration (time- (boundary-time segmenter event)
			       (onset (car segments)))))
	(push (make-instance 'standard-anchored-period
			     :time (timepoint (boundary-time segmenter event)))
	      segments)))))

(defun %map-non-contiguous-segmenters (composition start-boundary-segmenter end-boundary-segmenter)
  ;; FIXME: crappy queue implementation
  ;; FIXME: This only returns paired starts and ends. Should we
  ;; process unpaired boundaries?
  (let ((segments) (starts))
    (sequence:dosequence (event composition (reverse segments))
      (when (> (boundary-strength start-boundary-segmenter event composition) 0)
	(if starts
	    (setf (cdr (last starts))
		  (list (boundary-time start-boundary-segmenter event)))
	    (setf starts (list (boundary-time start-boundary-segmenter event)))))
      (when (> (boundary-strength end-boundary-segmenter event composition) 0)
	(when starts
	  (push (make-instance 'standard-anchored-period
			       :interval (amuse::duration (time- (boundary-time end-boundary-segmenter event)
								 (car starts)))
			       :time (timepoint (pop starts)))
		segments))))))