         [overtone.sc.machinery.allocator]
         [overtone.helpers lib]))
 
-(defonce output-bus-count* (atom nil))
-(defonce input-bus-count*  (atom nil))
-(defonce audio-bus-count*  (atom nil))
-(defonce buffer-count*     (atom nil))
-(defonce sample-rate*      (atom nil))
+(defonce output-bus-count*   (atom nil))
+(defonce input-bus-count*    (atom nil))
+(defonce audio-bus-count*    (atom nil))
+(defonce buffer-count*       (atom nil))
+(defonce sample-rate*        (atom nil))
+(defonce sample-dur*         (atom nil))
+(defonce control-rate*       (atom nil))
+(defonce control-dur*        (atom nil))
+(defonce radians-per-sample* (atom nil))
 
 (defonce __SERVER-INFO__
   (defsynth snd-server-info

      res)))

(defn server-sample-rate
  "Returns the sample rate of the server. This number is cached for a given
  running server for the duration of boot"
  []
  (if-let [rate @sample-rate*]
    rate
    (let [info (server-info)]
      (reset! sample-rate* (:sample-rate info)))))

(defn server-num-output-buses
  "Returns the number of output buses accessible by the server. This number may

                response-id)))

(defn server-info
  "Fetches a bunch of useful server info. Has to trigger and poll a
  synth to fetch data. See #'server-num-output-buses,
  #'server-num-input-buses, #'server-num-audio-buses and
  #'server-num-buffers #'server-sample-rate, #'server-sample-dur,
  #'server-control-rate, #'server-control-dur for fast cached versions
  of the static values in this info map. Note, the number of running
  synths will also include the synth used to obtain this information."
  []
  (ensure-connected!)
  (let [prom        (promise)
