annotate 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
rev   line source
d@74 1 (in-package "AMUSE-SEGMENTATION")
d@74 2
d@136 3 (defmethod boundary-time (segmenter (object anchored-period))
d@74 4 (if (segments-beforep segmenter)
d@74 5 (onset object)
d@74 6 (cut-off object)))
d@136 7 (defmethod boundary-time (segmenter (object moment))
d@74 8 object)
d@74 9
d@74 10 ;;;;;;;;;;;;;;;;;;;;;;;
d@74 11 ;;; Seriously made-up stuff (= dodgy)
d@74 12
d@74 13 (defun map-segmenters (composition &key (start-boundary-segmenter nil) (end-boundary-segmenter nil))
d@74 14 (cond
d@74 15 ((and start-boundary-segmenter end-boundary-segmenter)
d@161 16 #+nil (%map-non-contiguous-segmenters composition start-boundary-segmenter end-boundary-segmenter)
d@161 17 ;; hacky fix for broken code
d@161 18 (remove-duplicates (nconc (%map-start-segmenter composition start-boundary-segmenter)
d@161 19 (%map-end-segmenter composition end-boundary-segmenter))
d@161 20 :test #'period=))
d@74 21 (start-boundary-segmenter
d@74 22 (%map-start-segmenter composition start-boundary-segmenter))
d@74 23 (end-boundary-segmenter
d@74 24 (%map-end-segmenter composition end-boundary-segmenter))
d@74 25 (t (error "Map-segmenters called with no segmenters"))))
d@74 26
d@74 27 (defun %map-start-segmenter (composition segmenter)
d@74 28 (let ((segments))
d@74 29 (sequence:dosequence (event composition (progn
d@74 30 (setf (duration (car segments))
d@74 31 (duration (time- (cut-off composition)
d@74 32 (onset (car segments)))))
d@74 33 (reverse segments)))
d@74 34 (when (> (boundary-strength segmenter event composition) 0)
d@74 35 (when segments
d@74 36 (setf (duration (car segments))
d@74 37 (duration (time- (boundary-time segmenter event)
d@74 38 (onset (car segments))))))
d@161 39 (push (make-instance 'standard-anchored-period
d@74 40 :time (timepoint (boundary-time segmenter event)))
d@74 41 segments)))))
d@74 42
d@74 43 (defun %map-end-segmenter (composition segmenter)
d@161 44 (let ((segments (list (make-instance 'standard-anchored-period :time (timepoint composition)))))
d@74 45 (sequence:dosequence (event composition (reverse (cdr segments)))
d@74 46 (when (> (boundary-strength segmenter event composition) 0)
d@74 47 (setf (duration (car segments))
d@74 48 (duration (time- (boundary-time segmenter event)
d@74 49 (onset (car segments)))))
d@161 50 (push (make-instance 'standard-anchored-period
d@74 51 :time (timepoint (boundary-time segmenter event)))
d@74 52 segments)))))
d@74 53
d@74 54 (defun %map-non-contiguous-segmenters (composition start-boundary-segmenter end-boundary-segmenter)
d@74 55 ;; FIXME: crappy queue implementation
d@74 56 ;; FIXME: This only returns paired starts and ends. Should we
d@74 57 ;; process unpaired boundaries?
d@74 58 (let ((segments) (starts))
d@74 59 (sequence:dosequence (event composition (reverse segments))
d@74 60 (when (> (boundary-strength start-boundary-segmenter event composition) 0)
d@161 61 (if starts
d@161 62 (setf (cdr (last starts))
d@161 63 (list (boundary-time start-boundary-segmenter event)))
d@161 64 (setf starts (list (boundary-time start-boundary-segmenter event)))))
d@74 65 (when (> (boundary-strength end-boundary-segmenter event composition) 0)
d@74 66 (when starts
d@161 67 (push (make-instance 'standard-anchored-period
d@74 68 :interval (amuse::duration (time- (boundary-time end-boundary-segmenter event)
d@74 69 (car starts)))
d@74 70 :time (timepoint (pop starts)))
d@74 71 segments))))))
d@74 72