anchor.diff:      (if playing
           (progn (stop item) nil)
           (progn (play item) t))))
  +
  +(defun pdefs-playing (&optional (clock *clock*))
  +  "Get a list of the names of all pdefs playing on CLOCK."
  +  (loop :for i :in (slot-value clock 'tasks)
  +     :collect (slot-value (slot-value i 'item) 'key)))
  
positive.code: (defun absolute-beats-to-unix-time (beats clock)
    "Convert a clock's number of beats to a unix time. Number of beats is only guaranteed to be accurate if it's greater than the clock's when-tempo-changed slot."
    (+ (slot-value clock 'unix-time-at-tempo) (dur-time (- beats (slot-value clock 'when-tempo-changed)) (tempo clock))))
  
  (defun make-clock (&optional (tempo 1) tasks)
    "Create a clock. The clock automatically starts running in a new thread."
  
negative.code:   "Get the current universal time with microseconds."
    (timestamp-to-universal (local-time:now)))
  
  (defun cl-collider-now () ;; FIX: pull request this to byulparan/scheduler??
    "Get the current unix time in the same format as byulparan/scheduler."
    (timestamp-to-cl-collider (local-time:now)))
  
  (defclass task ()
    ((gensym :initform (gensym))
     (clock :initarg :clock :initform *clock*)
     (item :initarg :item :initform nil)
     (start-time :initarg :start-time :initform nil)
     (next-time :initarg :next-time :initform nil)
     (nodes :initarg :nodes :initform (list))))
  
  (defparameter *clock* nil)
  