Mercurial > hg > amuse
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))))))