   all nodes in the group."
   [node ctl-start ctl-vals]
   (ensure-connected!)
+  (ensure-node-active! node "Attempting to control a node that has been destroyed.")
   (let [node-id (to-synth-id node)]
-    (apply snd "/n_setn" node-id ctl-start (count ctl-vals) ctl-vals)))
+    (apply snd "/n_setn" node-id ctl-start (count ctl-vals) ctl-vals))
+  node)
 
 (defn node-get-control-range
   "Get a range of n controls starting at a given name or index.
   Returns a vector of values."
   [node name-index n]
   (ensure-connected!)
+  (ensure-node-active! node "Attempting to access a node that has been destroyed.")
   (let [res   (recv "/n_setn")
         cvals (do (snd "/s_getn" (to-synth-id node) (to-str name-index) n)
                   (:args (deref! res)))]

  (or (node-live? n)
      (node-loading? n)))

(defn node-free*
  "Free the specified nodes on the server. The allocated id is
  subsequently freed from the allocator via a callback fn listening
  for /n_end which will call node-destroyed."
  [node]
  {:pre [(server-connected?)]}
  (if (node-active? node)
    (snd "/n_free" (to-synth-id node))
    (inactive-node-modification-error
     (str "Trying to free a synth node that has been destroyed: " node)))
  node)

(defn- node-destroyed

  "Returns a data structure representing the current arrangement of
  groups and synthesizer instances residing on the audio server."
  ([] (group-node-tree* 0))
  ([node & [ctls?]]
     (ensure-connected!)
     (ensure-node-active! node "Attempting to view a node that has been destroyed.")
     (let [ctls? (if (or (= 1 ctls?) (= true ctls?)) 1 0)
           id    (to-synth-id node)]
       (let [reply-p (recv "/g_queryTree.reply")
             _       (snd "/g_queryTree" id ctls?)
             tree    (:args (deref! reply-p))]
